update
This commit is contained in:
		| @@ -0,0 +1,51 @@ | ||||
| // This file is part of Eigen, a lightweight C++ template library | ||||
| // for linear algebra. | ||||
| // | ||||
| // Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr> | ||||
| // Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com> | ||||
| // | ||||
| // This Source Code Form is subject to the terms of the Mozilla | ||||
| // Public License v. 2.0. If a copy of the MPL was not distributed | ||||
| // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||
|  | ||||
| #ifndef EIGEN_STDDEQUE_H | ||||
| #define EIGEN_STDDEQUE_H | ||||
|  | ||||
| #ifndef EIGEN_STDDEQUE_MODULE_H | ||||
| #error "Please include Eigen/StdDeque instead of including this file directly." | ||||
| #endif | ||||
|  | ||||
| #include "details.h" | ||||
|  | ||||
| /** | ||||
|  * This section contains a convenience MACRO which allows an easy specialization of | ||||
|  * std::deque such that for data types with alignment issues the correct allocator | ||||
|  * is used automatically. | ||||
|  */ | ||||
| #define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...)                                                \ | ||||
|   namespace std {                                                                                 \ | ||||
|   template <>                                                                                     \ | ||||
|   class deque<__VA_ARGS__, std::allocator<__VA_ARGS__> >                                          \ | ||||
|       : public deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > {                        \ | ||||
|     typedef deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > deque_base;                 \ | ||||
|                                                                                                   \ | ||||
|    public:                                                                                        \ | ||||
|     typedef __VA_ARGS__ value_type;                                                               \ | ||||
|     typedef deque_base::allocator_type allocator_type;                                            \ | ||||
|     typedef deque_base::size_type size_type;                                                      \ | ||||
|     typedef deque_base::iterator iterator;                                                        \ | ||||
|     explicit deque(const allocator_type& a = allocator_type()) : deque_base(a) {}                 \ | ||||
|     template <typename InputIterator>                                                             \ | ||||
|     deque(InputIterator first, InputIterator last, const allocator_type& a = allocator_type())    \ | ||||
|         : deque_base(first, last, a) {}                                                           \ | ||||
|     deque(const deque& c) : deque_base(c) {}                                                      \ | ||||
|     explicit deque(size_type num, const value_type& val = value_type()) : deque_base(num, val) {} \ | ||||
|     deque(iterator start_, iterator end_) : deque_base(start_, end_) {}                           \ | ||||
|     deque& operator=(const deque& x) {                                                            \ | ||||
|       deque_base::operator=(x);                                                                   \ | ||||
|       return *this;                                                                               \ | ||||
|     }                                                                                             \ | ||||
|   };                                                                                              \ | ||||
|   } | ||||
|  | ||||
| #endif  // EIGEN_STDDEQUE_H | ||||
| @@ -0,0 +1,50 @@ | ||||
| // This file is part of Eigen, a lightweight C++ template library | ||||
| // for linear algebra. | ||||
| // | ||||
| // Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com> | ||||
| // | ||||
| // This Source Code Form is subject to the terms of the Mozilla | ||||
| // Public License v. 2.0. If a copy of the MPL was not distributed | ||||
| // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||
|  | ||||
| #ifndef EIGEN_STDLIST_H | ||||
| #define EIGEN_STDLIST_H | ||||
|  | ||||
| #ifndef EIGEN_STDLIST_MODULE_H | ||||
| #error "Please include Eigen/StdList instead of including this file directly." | ||||
| #endif | ||||
|  | ||||
| #include "details.h" | ||||
|  | ||||
| /** | ||||
|  * This section contains a convenience MACRO which allows an easy specialization of | ||||
|  * std::list such that for data types with alignment issues the correct allocator | ||||
|  * is used automatically. | ||||
|  */ | ||||
| #define EIGEN_DEFINE_STL_LIST_SPECIALIZATION(...)                                               \ | ||||
|   namespace std {                                                                               \ | ||||
|   template <>                                                                                   \ | ||||
|   class list<__VA_ARGS__, std::allocator<__VA_ARGS__> >                                         \ | ||||
|       : public list<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > {                       \ | ||||
|     typedef list<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > list_base;                 \ | ||||
|                                                                                                 \ | ||||
|    public:                                                                                      \ | ||||
|     typedef __VA_ARGS__ value_type;                                                             \ | ||||
|     typedef list_base::allocator_type allocator_type;                                           \ | ||||
|     typedef list_base::size_type size_type;                                                     \ | ||||
|     typedef list_base::iterator iterator;                                                       \ | ||||
|     explicit list(const allocator_type& a = allocator_type()) : list_base(a) {}                 \ | ||||
|     template <typename InputIterator>                                                           \ | ||||
|     list(InputIterator first, InputIterator last, const allocator_type& a = allocator_type())   \ | ||||
|         : list_base(first, last, a) {}                                                          \ | ||||
|     list(const list& c) : list_base(c) {}                                                       \ | ||||
|     explicit list(size_type num, const value_type& val = value_type()) : list_base(num, val) {} \ | ||||
|     list(iterator start_, iterator end_) : list_base(start_, end_) {}                           \ | ||||
|     list& operator=(const list& x) {                                                            \ | ||||
|       list_base::operator=(x);                                                                  \ | ||||
|       return *this;                                                                             \ | ||||
|     }                                                                                           \ | ||||
|   };                                                                                            \ | ||||
|   } | ||||
|  | ||||
| #endif  // EIGEN_STDLIST_H | ||||
| @@ -0,0 +1,51 @@ | ||||
| // This file is part of Eigen, a lightweight C++ template library | ||||
| // for linear algebra. | ||||
| // | ||||
| // Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr> | ||||
| // Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com> | ||||
| // | ||||
| // This Source Code Form is subject to the terms of the Mozilla | ||||
| // Public License v. 2.0. If a copy of the MPL was not distributed | ||||
| // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||
|  | ||||
| #ifndef EIGEN_STDVECTOR_H | ||||
| #define EIGEN_STDVECTOR_H | ||||
|  | ||||
| #ifndef EIGEN_STDVECTOR_MODULE_H | ||||
| #error "Please include Eigen/StdVector instead of including this file directly." | ||||
| #endif | ||||
|  | ||||
| #include "details.h" | ||||
|  | ||||
| /** | ||||
|  * This section contains a convenience MACRO which allows an easy specialization of | ||||
|  * std::vector such that for data types with alignment issues the correct allocator | ||||
|  * is used automatically. | ||||
|  */ | ||||
| #define EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(...)                                                 \ | ||||
|   namespace std {                                                                                   \ | ||||
|   template <>                                                                                       \ | ||||
|   class vector<__VA_ARGS__, std::allocator<__VA_ARGS__> >                                           \ | ||||
|       : public vector<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > {                         \ | ||||
|     typedef vector<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > vector_base;                 \ | ||||
|                                                                                                     \ | ||||
|    public:                                                                                          \ | ||||
|     typedef __VA_ARGS__ value_type;                                                                 \ | ||||
|     typedef vector_base::allocator_type allocator_type;                                             \ | ||||
|     typedef vector_base::size_type size_type;                                                       \ | ||||
|     typedef vector_base::iterator iterator;                                                         \ | ||||
|     explicit vector(const allocator_type& a = allocator_type()) : vector_base(a) {}                 \ | ||||
|     template <typename InputIterator>                                                               \ | ||||
|     vector(InputIterator first, InputIterator last, const allocator_type& a = allocator_type())     \ | ||||
|         : vector_base(first, last, a) {}                                                            \ | ||||
|     vector(const vector& c) : vector_base(c) {}                                                     \ | ||||
|     explicit 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;                                                                                 \ | ||||
|     }                                                                                               \ | ||||
|   };                                                                                                \ | ||||
|   } | ||||
|  | ||||
| #endif  // EIGEN_STDVECTOR_H | ||||
| @@ -0,0 +1,82 @@ | ||||
| // This file is part of Eigen, a lightweight C++ template library | ||||
| // for linear algebra. | ||||
| // | ||||
| // Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr> | ||||
| // Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com> | ||||
| // | ||||
| // This Source Code Form is subject to the terms of the Mozilla | ||||
| // Public License v. 2.0. If a copy of the MPL was not distributed | ||||
| // with this file, You can obtain one at http://mozilla.org/MPL/2.0/. | ||||
|  | ||||
| #ifndef EIGEN_STL_DETAILS_H | ||||
| #define EIGEN_STL_DETAILS_H | ||||
|  | ||||
| #ifndef EIGEN_ALIGNED_ALLOCATOR | ||||
| #define EIGEN_ALIGNED_ALLOCATOR Eigen::aligned_allocator | ||||
| #endif | ||||
|  | ||||
| namespace Eigen { | ||||
|  | ||||
| // This one is needed to prevent reimplementing the whole std::vector. | ||||
| template <class T> | ||||
| class aligned_allocator_indirection : public EIGEN_ALIGNED_ALLOCATOR<T> { | ||||
|  public: | ||||
|   typedef std::size_t size_type; | ||||
|   typedef std::ptrdiff_t difference_type; | ||||
|   typedef T* pointer; | ||||
|   typedef const T* const_pointer; | ||||
|   typedef T& reference; | ||||
|   typedef const T& const_reference; | ||||
|   typedef T value_type; | ||||
|  | ||||
|   template <class U> | ||||
|   struct rebind { | ||||
|     typedef aligned_allocator_indirection<U> other; | ||||
|   }; | ||||
|  | ||||
|   aligned_allocator_indirection() {} | ||||
|   aligned_allocator_indirection(const aligned_allocator_indirection&) : EIGEN_ALIGNED_ALLOCATOR<T>() {} | ||||
|   aligned_allocator_indirection(const EIGEN_ALIGNED_ALLOCATOR<T>&) {} | ||||
|   template <class U> | ||||
|   aligned_allocator_indirection(const aligned_allocator_indirection<U>&) {} | ||||
|   template <class U> | ||||
|   aligned_allocator_indirection(const EIGEN_ALIGNED_ALLOCATOR<U>&) {} | ||||
|   ~aligned_allocator_indirection() {} | ||||
| }; | ||||
|  | ||||
| #if EIGEN_COMP_MSVC | ||||
|  | ||||
| // 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_STL_SUPPORT(T) \ | ||||
|   std::conditional_t<Eigen::internal::is_arithmetic<T>::value, T, Eigen::internal::workaround_msvc_stl_support<T> > | ||||
|  | ||||
| namespace internal { | ||||
| template <typename T> | ||||
| struct workaround_msvc_stl_support : public T { | ||||
|   inline workaround_msvc_stl_support() : T() {} | ||||
|   inline workaround_msvc_stl_support(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 workaround_msvc_stl_support& operator=(const workaround_msvc_stl_support& other) { | ||||
|     T::operator=(other); | ||||
|     return *this; | ||||
|   } | ||||
| }; | ||||
| }  // namespace internal | ||||
|  | ||||
| #else | ||||
|  | ||||
| #define EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T) T | ||||
|  | ||||
| #endif | ||||
|  | ||||
| }  // namespace Eigen | ||||
|  | ||||
| #endif  // EIGEN_STL_DETAILS_H | ||||
		Reference in New Issue
	
	Block a user