#ifndef EIGEN_STDVECTOR_MODULE_H
#define EIGEN_STDVECTOR_MODULE_H

#if defined(_GLIBCXX_VECTOR) || defined(_VECTOR_)
#error you must include Eigen/StdVector before std::vector
#endif

#ifndef EIGEN_GNUC_AT_LEAST
#ifdef __GNUC__
  #define EIGEN_GNUC_AT_LEAST(x,y) ((__GNUC__>=x && __GNUC_MINOR__>=y) || __GNUC__>x)
#else
  #define EIGEN_GNUC_AT_LEAST(x,y) 0
#endif
#endif

#define vector std_vector
#include <vector>
#undef vector

namespace Eigen {

template<typename T> class aligned_allocator;

// meta programming to determine if a class has a given member
struct ei_does_not_have_aligned_operator_new_marker_sizeof {int a[1];};
struct ei_has_aligned_operator_new_marker_sizeof {int a[2];};

template<typename ClassType>
struct ei_has_aligned_operator_new {
    template<typename T>
    static ei_has_aligned_operator_new_marker_sizeof
    test(T const *, typename T::ei_operator_new_marker_type const * = 0);
    static ei_does_not_have_aligned_operator_new_marker_sizeof
    test(...);

    // note that the following indirection is needed for gcc-3.3
    enum {ret =  sizeof(test(static_cast<ClassType*>(0)))
              == sizeof(ei_has_aligned_operator_new_marker_sizeof) };
};

#ifdef _MSC_VER

  // sometimes, MSVC detects, at compile time, that the argument x
  // in std::vector::resize(size_t s,T x) won't be aligned and generate an error
  // even if this function is never called. Whence this little wrapper.
  #define _EIGEN_WORKAROUND_MSVC_STD_VECTOR(T) Eigen::ei_workaround_msvc_std_vector<T>
  template<typename T> struct ei_workaround_msvc_std_vector : public T
  {
    inline ei_workaround_msvc_std_vector() : T() {}
    inline ei_workaround_msvc_std_vector(const T& other) : T(other) {}
    inline operator T& () { return *static_cast<T*>(this); }
    inline operator const T& () const { return *static_cast<const T*>(this); }
    template<typename OtherT>
    inline T& operator=(const OtherT& other)
    { T::operator=(other); return *this; }
    inline ei_workaround_msvc_std_vector& operator=(const ei_workaround_msvc_std_vector& other)
    { T::operator=(other); return *this; }
  };

#else

  #define _EIGEN_WORKAROUND_MSVC_STD_VECTOR(T) T

#endif

}

namespace std {

#define EIGEN_STD_VECTOR_SPECIALIZATION_BODY \
  public:  \
    typedef T value_type; \
    typedef typename vector_base::allocator_type allocator_type; \
    typedef typename vector_base::size_type size_type;  \
    typedef typename vector_base::iterator iterator;  \
    explicit vector(const allocator_type& __a = allocator_type()) : vector_base(__a) {}  \
    vector(const vector& c) : vector_base(c) {}  \
    vector(size_type num, const value_type& val = value_type()) : vector_base(num, val) {} \
    vector(iterator start, iterator end) : vector_base(start, end) {}  \
    vector& operator=(const vector& __x) {  \
      vector_base::operator=(__x);  \
      return *this;  \
    }

template<typename T,
         typename AllocT = std::allocator<T>,
         bool HasAlignedNew = Eigen::ei_has_aligned_operator_new<T>::ret>
class vector : public std::std_vector<T,AllocT>
{
  typedef std_vector<T, AllocT> vector_base;
  EIGEN_STD_VECTOR_SPECIALIZATION_BODY
};

template<typename T,typename DummyAlloc>
class vector<T,DummyAlloc,true>
  : public std::std_vector<_EIGEN_WORKAROUND_MSVC_STD_VECTOR(T),
                           Eigen::aligned_allocator<_EIGEN_WORKAROUND_MSVC_STD_VECTOR(T)> >
{
  typedef std_vector<_EIGEN_WORKAROUND_MSVC_STD_VECTOR(T),
                     Eigen::aligned_allocator<_EIGEN_WORKAROUND_MSVC_STD_VECTOR(T)> > vector_base;
  EIGEN_STD_VECTOR_SPECIALIZATION_BODY

  void resize(size_type __new_size)
  { resize(__new_size, T()); }

  #if defined(_VECTOR_)
  // workaround MSVC std::vector implementation
  void resize(size_type __new_size, const value_type& __x)
  {
    if (vector_base::size() < __new_size)
      vector_base::_Insert_n(vector_base::end(), __new_size - vector_base::size(), __x);
    else if (__new_size < vector_base::size())
      vector_base::erase(vector_base::begin() + __new_size, vector_base::end());
  }
  void push_back(const value_type& __x)
  { vector_base::push_back(__x); }
  iterator insert(iterator __position, const value_type& __x)
  { return vector_base::insert(__position,__x); }
  iterator insert(iterator __position, size_type __n, const value_type& __x)
  { return vector_base::insert(__position, __n, __x); }
  #elif defined(_GLIBCXX_VECTOR) && EIGEN_GNUC_AT_LEAST(4,1)
  // workaround GCC std::vector implementation
  // Note that before gcc-4.1 we already have: std::vector::resize(size_type,const T&),
  // no no need to workaround !
  void resize(size_type __new_size, const value_type& __x)
  {
    if (__new_size < vector_base::size())
      vector_base::_M_erase_at_end(this->_M_impl._M_start + __new_size);
    else
      vector_base::insert(vector_base::end(), __new_size - vector_base::size(), __x);
  }
  #else
  using vector_base::resize;
  #endif

};

}

#endif // EIGEN_STDVECTOR_MODULE_H
