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_STDDEQUE_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_STDDEQUE_H 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 147faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#include "details.h" 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * This section contains a convenience MACRO which allows an easy specialization of 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * std::deque such that for data types with alignment issues the correct allocator 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * is used automatically. 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...) \ 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace std \ 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ \ 242b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang template<> \ 252b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang class deque<__VA_ARGS__, std::allocator<__VA_ARGS__> > \ 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > \ 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { \ 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef deque<__VA_ARGS__, EIGEN_ALIGNED_ALLOCATOR<__VA_ARGS__> > deque_base; \ 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: \ 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef __VA_ARGS__ value_type; \ 312b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef deque_base::allocator_type allocator_type; \ 322b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef deque_base::size_type size_type; \ 332b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang typedef deque_base::iterator iterator; \ 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit deque(const allocator_type& a = allocator_type()) : deque_base(a) {} \ 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename InputIterator> \ 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) : deque_base(first, last, a) {} \ 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque(const deque& c) : deque_base(c) {} \ 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit deque(size_type num, const value_type& val = value_type()) : deque_base(num, val) {} \ 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque(iterator start, iterator end) : deque_base(start, end) {} \ 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque& operator=(const deque& x) { \ 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque_base::operator=(x); \ 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; \ 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } \ 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; \ 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// check whether we really need the std::deque specialization 482b8756b6f1de65d3f8bffab45be6c44ceb7411fcMiao Wang#if !EIGEN_HAS_CXX11_CONTAINERS && !(defined(_GLIBCXX_DEQUE) && (!EIGEN_GNUC_AT_LEAST(4,1))) /* Note that before gcc-4.1 we already have: std::deque::resize(size_type,const T&). */ 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace std { 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_STD_DEQUE_SPECIALIZATION_BODY \ 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: \ 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef T value_type; \ 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename deque_base::allocator_type allocator_type; \ 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename deque_base::size_type size_type; \ 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename deque_base::iterator iterator; \ 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename deque_base::const_iterator const_iterator; \ 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit deque(const allocator_type& a = allocator_type()) : deque_base(a) {} \ 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename InputIterator> \ 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque(InputIterator first, InputIterator last, const allocator_type& a = allocator_type()) \ 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : deque_base(first, last, a) {} \ 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque(const deque& c) : deque_base(c) {} \ 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit deque(size_type num, const value_type& val = value_type()) : deque_base(num, val) {} \ 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque(iterator start, iterator end) : deque_base(start, end) {} \ 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque& operator=(const deque& x) { \ 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque_base::operator=(x); \ 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return *this; \ 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<typename T> 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath class deque<T,EIGEN_ALIGNED_ALLOCATOR<T> > 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public deque<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T), 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> > 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef deque<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T), 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Eigen::aligned_allocator_indirection<EIGEN_WORKAROUND_MSVC_STL_SUPPORT(T)> > deque_base; 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STD_DEQUE_SPECIALIZATION_BODY 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void resize(size_type new_size) 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { resize(new_size, T()); } 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined(_DEQUE_) 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // workaround MSVC std::deque implementation 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void resize(size_type new_size, const value_type& x) 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (deque_base::size() < new_size) 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque_base::_Insert_n(deque_base::end(), new_size - deque_base::size(), x); 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if (new_size < deque_base::size()) 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque_base::erase(deque_base::begin() + new_size, deque_base::end()); 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void push_back(const value_type& x) 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { deque_base::push_back(x); } 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void push_front(const value_type& x) 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { deque_base::push_front(x); } 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using deque_base::insert; 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath iterator insert(const_iterator position, const value_type& x) 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { return deque_base::insert(position,x); } 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void insert(const_iterator position, size_type new_size, const value_type& x) 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { deque_base::insert(position, new_size, x); } 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#elif defined(_GLIBCXX_DEQUE) && EIGEN_GNUC_AT_LEAST(4,2) 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // workaround GCC std::deque implementation 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void resize(size_type new_size, const value_type& x) 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (new_size < deque_base::size()) 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque_base::_M_erase_at_end(this->_M_impl._M_start + new_size); 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque_base::insert(deque_base::end(), new_size - deque_base::size(), x); 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#else 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // either GCC 4.1 or non-GCC 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // default implementation which should always work. 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void resize(size_type new_size, const value_type& x) 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath if (new_size < deque_base::size()) 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque_base::erase(deque_base::begin() + new_size, deque_base::end()); 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath else if (new_size > deque_base::size()) 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath deque_base::insert(deque_base::end(), new_size - deque_base::size(), x); 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // check whether specialization is actually required 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_STDDEQUE_H 127