Home | History | Annotate | Download | only in eigen2
      1 // This file is part of Eigen, a lightweight C++ template library
      2 // for linear algebra.
      3 //
      4 // Copyright (C) 2008 Benoit Jacob <jacob.benoit.1 (at) gmail.com>
      5 //
      6 // This Source Code Form is subject to the terms of the Mozilla
      7 // Public License v. 2.0. If a copy of the MPL was not distributed
      8 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
      9 
     10 #define EIGEN_USE_NEW_STDVECTOR
     11 #include "main.h"
     12 #include <Eigen/StdVector>
     13 #include <Eigen/Geometry>
     14 
     15 template<typename MatrixType>
     16 void check_stdvector_matrix(const MatrixType& m)
     17 {
     18   int rows = m.rows();
     19   int cols = m.cols();
     20   MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);
     21   std::vector<MatrixType,Eigen::aligned_allocator<MatrixType> > v(10, MatrixType(rows,cols)), w(20, y);
     22   v[5] = x;
     23   w[6] = v[5];
     24   VERIFY_IS_APPROX(w[6], v[5]);
     25   v = w;
     26   for(int i = 0; i < 20; i++)
     27   {
     28     VERIFY_IS_APPROX(w[i], v[i]);
     29   }
     30 
     31   v.resize(21);
     32   v[20] = x;
     33   VERIFY_IS_APPROX(v[20], x);
     34   v.resize(22,y);
     35   VERIFY_IS_APPROX(v[21], y);
     36   v.push_back(x);
     37   VERIFY_IS_APPROX(v[22], x);
     38   VERIFY((std::size_t)&(v[22]) == (std::size_t)&(v[21]) + sizeof(MatrixType));
     39 
     40   // do a lot of push_back such that the vector gets internally resized
     41   // (with memory reallocation)
     42   MatrixType* ref = &w[0];
     43   for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)
     44     v.push_back(w[i%w.size()]);
     45   for(unsigned int i=23; i<v.size(); ++i)
     46   {
     47     VERIFY(v[i]==w[(i-23)%w.size()]);
     48   }
     49 }
     50 
     51 template<typename TransformType>
     52 void check_stdvector_transform(const TransformType&)
     53 {
     54   typedef typename TransformType::MatrixType MatrixType;
     55   TransformType x(MatrixType::Random()), y(MatrixType::Random());
     56   std::vector<TransformType,Eigen::aligned_allocator<TransformType> > v(10), w(20, y);
     57   v[5] = x;
     58   w[6] = v[5];
     59   VERIFY_IS_APPROX(w[6], v[5]);
     60   v = w;
     61   for(int i = 0; i < 20; i++)
     62   {
     63     VERIFY_IS_APPROX(w[i], v[i]);
     64   }
     65 
     66   v.resize(21);
     67   v[20] = x;
     68   VERIFY_IS_APPROX(v[20], x);
     69   v.resize(22,y);
     70   VERIFY_IS_APPROX(v[21], y);
     71   v.push_back(x);
     72   VERIFY_IS_APPROX(v[22], x);
     73   VERIFY((std::size_t)&(v[22]) == (std::size_t)&(v[21]) + sizeof(TransformType));
     74 
     75   // do a lot of push_back such that the vector gets internally resized
     76   // (with memory reallocation)
     77   TransformType* ref = &w[0];
     78   for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)
     79     v.push_back(w[i%w.size()]);
     80   for(unsigned int i=23; i<v.size(); ++i)
     81   {
     82     VERIFY(v[i].matrix()==w[(i-23)%w.size()].matrix());
     83   }
     84 }
     85 
     86 template<typename QuaternionType>
     87 void check_stdvector_quaternion(const QuaternionType&)
     88 {
     89   typedef typename QuaternionType::Coefficients Coefficients;
     90   QuaternionType x(Coefficients::Random()), y(Coefficients::Random());
     91   std::vector<QuaternionType,Eigen::aligned_allocator<QuaternionType> > v(10), w(20, y);
     92   v[5] = x;
     93   w[6] = v[5];
     94   VERIFY_IS_APPROX(w[6], v[5]);
     95   v = w;
     96   for(int i = 0; i < 20; i++)
     97   {
     98     VERIFY_IS_APPROX(w[i], v[i]);
     99   }
    100 
    101   v.resize(21);
    102   v[20] = x;
    103   VERIFY_IS_APPROX(v[20], x);
    104   v.resize(22,y);
    105   VERIFY_IS_APPROX(v[21], y);
    106   v.push_back(x);
    107   VERIFY_IS_APPROX(v[22], x);
    108   VERIFY((std::size_t)&(v[22]) == (std::size_t)&(v[21]) + sizeof(QuaternionType));
    109 
    110   // do a lot of push_back such that the vector gets internally resized
    111   // (with memory reallocation)
    112   QuaternionType* ref = &w[0];
    113   for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)
    114     v.push_back(w[i%w.size()]);
    115   for(unsigned int i=23; i<v.size(); ++i)
    116   {
    117     VERIFY(v[i].coeffs()==w[(i-23)%w.size()].coeffs());
    118   }
    119 }
    120 
    121 void test_eigen2_newstdvector()
    122 {
    123   // some non vectorizable fixed sizes
    124   CALL_SUBTEST_1(check_stdvector_matrix(Vector2f()));
    125   CALL_SUBTEST_1(check_stdvector_matrix(Matrix3f()));
    126   CALL_SUBTEST_1(check_stdvector_matrix(Matrix3d()));
    127 
    128   // some vectorizable fixed sizes
    129   CALL_SUBTEST_2(check_stdvector_matrix(Matrix2f()));
    130   CALL_SUBTEST_2(check_stdvector_matrix(Vector4f()));
    131   CALL_SUBTEST_2(check_stdvector_matrix(Matrix4f()));
    132   CALL_SUBTEST_2(check_stdvector_matrix(Matrix4d()));
    133 
    134   // some dynamic sizes
    135   CALL_SUBTEST_3(check_stdvector_matrix(MatrixXd(1,1)));
    136   CALL_SUBTEST_3(check_stdvector_matrix(VectorXd(20)));
    137   CALL_SUBTEST_3(check_stdvector_matrix(RowVectorXf(20)));
    138   CALL_SUBTEST_3(check_stdvector_matrix(MatrixXcf(10,10)));
    139 
    140   // some Transform
    141   CALL_SUBTEST_4(check_stdvector_transform(Transform2f()));
    142   CALL_SUBTEST_4(check_stdvector_transform(Transform3f()));
    143   CALL_SUBTEST_4(check_stdvector_transform(Transform3d()));
    144   //CALL_SUBTEST(check_stdvector_transform(Transform4d()));
    145 
    146   // some Quaternion
    147   CALL_SUBTEST_5(check_stdvector_quaternion(Quaternionf()));
    148   CALL_SUBTEST_5(check_stdvector_quaternion(Quaterniond()));
    149 }
    150