StdVector.h revision c981c48f5bc9aefeffc0bcb0cc3934c2fae179dd
1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009 Gael Guennebaud <gael.guennebaud@inria.fr> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2009 Hauke Heibel <hauke.heibel@googlemail.com> 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_STDVECTOR_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_STDVECTOR_H 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include "Eigen/src/StlSupport/details.h" 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This section contains a convenience MACRO which allows an easy specialization of 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * std::vector such that for data types with alignment issues the correct allocator 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * is used automatically. 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(...) \ 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace std \ 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ \ 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<> \ 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath class vector<__VA_ARGS__, std::allocator<__VA_ARGS__> > \ 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public vector<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > \ 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { \ 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef vector<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > vector_base; \ 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: \ 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef __VA_ARGS__ value_type; \ 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef vector_base::allocator_type allocator_type; \ 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef vector_base::size_type size_type; \ 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef vector_base::iterator iterator; \ 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit vector(const allocator_type& a = allocator_type()) : vector_base(a) {} \ 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename InputIterator> \ 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) : vector_base(first, last, a) {} \ 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector(const vector& c) : vector_base(c) {} \ 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit vector(size_type num, const value_type& val = value_type()) : vector_base(num, val) {} \ 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector(iterator start, iterator end) : vector_base(start, end) {} \ 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector& operator=(const vector& x) { \ 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector_base::operator=(x); \ 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; \ 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } \ 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; \ 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace std { 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_STD_VECTOR_SPECIALIZATION_BODY \ 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: \ 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef T value_type; \ 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename vector_base::allocator_type allocator_type; \ 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename vector_base::size_type size_type; \ 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename vector_base::iterator iterator; \ 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename vector_base::const_iterator const_iterator; \ 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit vector(const allocator_type& a = allocator_type()) : vector_base(a) {} \ 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename InputIterator> \ 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) \ 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : vector_base(first, last, a) {} \ 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector(const vector& c) : vector_base(c) {} \ 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit vector(size_type num, const value_type& val = value_type()) : vector_base(num, val) {} \ 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector(iterator start, iterator end) : vector_base(start, end) {} \ 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector& operator=(const vector& x) { \ 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector_base::operator=(x); \ 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; \ 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename T> 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath class vector<T,EIGEN_ALIGNED_ALLOCATOR<T> > 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public vector<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T), 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> > 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef vector<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T), 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> > vector_base; 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STD_VECTOR_SPECIALIZATION_BODY 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void resize(size_type new_size) 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { resize(new_size, T()); } 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined(_VECTOR_) 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // workaround MSVC std::vector implementation 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void resize(size_type new_size, const value_type& x) 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (vector_base::size() < new_size) 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector_base::_Insert_n(vector_base::end(), new_size - vector_base::size(), x); 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if (new_size < vector_base::size()) 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector_base::erase(vector_base::begin() + new_size, vector_base::end()); 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void push_back(const value_type& x) 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { vector_base::push_back(x); } 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using vector_base::insert; 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath iterator insert(const_iterator position, const value_type& x) 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return vector_base::insert(position,x); } 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void insert(const_iterator position, size_type new_size, const value_type& x) 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { vector_base::insert(position, new_size, x); } 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#elif defined(_GLIBCXX_VECTOR) && (!(EIGEN_GNUC_AT_LEAST(4,1))) 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /* Note that before gcc-4.1 we already have: std::vector::resize(size_type,const T&). 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * However, this specialization is still needed to make the above EIGEN_DEFINE_STL_VECTOR_SPECIALIZATION trick to work. */ 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void resize(size_type new_size, const value_type& x) 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector_base::resize(new_size,x); 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#elif defined(_GLIBCXX_VECTOR) && EIGEN_GNUC_AT_LEAST(4,2) 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // workaround GCC std::vector implementation 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void resize(size_type new_size, const value_type& x) 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (new_size < vector_base::size()) 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector_base::_M_erase_at_end(this->_M_impl._M_start + new_size); 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector_base::insert(vector_base::end(), new_size - vector_base::size(), x); 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // either GCC 4.1 or non-GCC 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // default implementation which should always work. 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void resize(size_type new_size, const value_type& x) 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (new_size < vector_base::size()) 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector_base::erase(vector_base::begin() + new_size, vector_base::end()); 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if (new_size > vector_base::size()) 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath vector_base::insert(vector_base::end(), new_size - vector_base::size(), x); 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_STDVECTOR_H 127