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