diff options
author | Benoit Jacob <jacob.benoit.1@gmail.com> | 2009-01-09 23:26:45 +0000 |
---|---|---|
committer | Benoit Jacob <jacob.benoit.1@gmail.com> | 2009-01-09 23:26:45 +0000 |
commit | 335d3bcf054cd0d1328cc12fbc72bb8463aef859 (patch) | |
tree | 8936d0870e24cb849efb37999cd72261bfb0a517 /Eigen/StdVector | |
parent | 5052d3659b797926afb4396329fcb6f050f24572 (diff) |
Based on code + help from Alex Stapleton:
*Add Eigen/StdVector header.
Including it #includes<vector> and "Core" and generates a partial
specialization of std::vector<T> for T=Eigen::Matrix<...>
that will work even with vectorizable fixed-size Eigen types
(working around a design issue in the c++ STL)
*Add unit-test
CCMAIL: alex.stapleton@gmail.com
Diffstat (limited to 'Eigen/StdVector')
-rw-r--r-- | Eigen/StdVector | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/Eigen/StdVector b/Eigen/StdVector new file mode 100644 index 000000000..6d5366468 --- /dev/null +++ b/Eigen/StdVector @@ -0,0 +1,75 @@ +// This file is part of Eigen, a lightweight C++ template library +// for linear algebra. Eigen itself is part of the KDE project. +// +// Copyright (C) 2009 Benoit Jacob <jacob.benoit.1@gmail.com> +// Copyright (C) 2009 Alex Stapleton <alex.stapleton@gmail.com> +// +// Eigen is free software; you can redistribute it and/or +// modify it under the terms of the GNU Lesser General Public +// License as published by the Free Software Foundation; either +// version 3 of the License, or (at your option) any later version. +// +// Alternatively, you can redistribute it and/or +// modify it under the terms of the GNU General Public License as +// published by the Free Software Foundation; either version 2 of +// the License, or (at your option) any later version. +// +// Eigen is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License or the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License and a copy of the GNU General Public License along with +// Eigen. If not, see <http://www.gnu.org/licenses/>. + +#ifndef EIGEN_STDVECTOR_MODULE_H +#define EIGEN_STDVECTOR_MODULE_H + +#include "Core" +#include <vector> + +namespace Eigen{ +template<typename aligned_type> class ei_unaligned_type; + +template<typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols> +class ei_unaligned_type<Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > + : public Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> +{ + public: + typedef Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> aligned_base; + ei_unaligned_type() : aligned_base(ei_select_matrix_constructor_doing_absolutely_nothing()) {} + ei_unaligned_type(const aligned_base& other) + { + ei_assign_impl<ei_unaligned_type,aligned_base,NoVectorization>::run(*this, other); + } +}; +} // namespace Eigen + +namespace std { + + template <typename _Scalar, int _Rows, int _Cols, int _Options, int _MaxRows, int _MaxCols, typename _Alloc> + class vector<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols>, _Alloc> + : public vector<Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> >, + Eigen::aligned_allocator<Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > > > + { + public: + typedef Eigen::ei_unaligned_type<Eigen::Matrix<_Scalar,_Rows,_Cols,_Options,_MaxRows,_MaxCols> > value_type; + typedef Eigen::aligned_allocator<value_type> allocator_type; + typedef vector<value_type, allocator_type > unaligned_base; + typedef typename unaligned_base::size_type size_type; + typedef typename unaligned_base::iterator iterator; + + explicit vector(const allocator_type& __a = allocator_type()) : unaligned_base(__a) {} + vector(const vector& c) : unaligned_base(c) {} + vector(size_type num, const value_type& val = value_type()) : unaligned_base(num, val) {} + vector(iterator start, iterator end) : unaligned_base(start, end) {} + vector& operator=(const vector& __x) { + unaligned_base::operator=(__x); + return *this; + } + }; + +} // namespace std + +#endif // EIGEN_STDVECTOR_MODULE_H |