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// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.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#include "main.h"
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/StdVector>
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/Geometry>
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Vector4f)
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Matrix2f)
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Matrix4f)
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Matrix4d)
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Affine3f)
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Affine3d)
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Quaternionf)
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan KamathEIGEN_DEFINE_STL_VECTOR_SPECIALIZATION(Quaterniond)
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType>
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid check_stdvector_matrix(const MatrixType& m)
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typename MatrixType::Index rows = m.rows();
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typename MatrixType::Index cols = m.cols();
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  std::vector<MatrixType> v(10, MatrixType(rows,cols)), w(20, y);
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v[5] = x;
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  w[6] = v[5];
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(w[6], v[5]);
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v = w;
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 0; i < 20; i++)
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY_IS_APPROX(w[i], v[i]);
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.resize(21);
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v[20] = x;
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v[20], x);
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.resize(22,y);
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v[21], y);
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.push_back(x);
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v[22], x);
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(MatrixType));
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // do a lot of push_back such that the vector gets internally resized
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // (with memory reallocation)
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType* ref = &w[0];
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    v.push_back(w[i%w.size()]);
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(unsigned int i=23; i<v.size(); ++i)
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY(v[i]==w[(i-23)%w.size()]);
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename TransformType>
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid check_stdvector_transform(const TransformType&)
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename TransformType::MatrixType MatrixType;
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  TransformType x(MatrixType::Random()), y(MatrixType::Random());
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  std::vector<TransformType> v(10), w(20, y);
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v[5] = x;
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  w[6] = v[5];
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(w[6], v[5]);
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v = w;
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 0; i < 20; i++)
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY_IS_APPROX(w[i], v[i]);
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.resize(21);
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v[20] = x;
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v[20], x);
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.resize(22,y);
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v[21], y);
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.push_back(x);
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v[22], x);
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(TransformType));
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // do a lot of push_back such that the vector gets internally resized
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // (with memory reallocation)
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  TransformType* ref = &w[0];
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    v.push_back(w[i%w.size()]);
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(unsigned int i=23; i<v.size(); ++i)
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY(v[i].matrix()==w[(i-23)%w.size()].matrix());
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename QuaternionType>
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid check_stdvector_quaternion(const QuaternionType&)
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename QuaternionType::Coefficients Coefficients;
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  QuaternionType x(Coefficients::Random()), y(Coefficients::Random());
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  std::vector<QuaternionType> v(10), w(20, y);
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v[5] = x;
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  w[6] = v[5];
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(w[6], v[5]);
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v = w;
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 0; i < 20; i++)
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY_IS_APPROX(w[i], v[i]);
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.resize(21);
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v[20] = x;
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v[20], x);
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.resize(22,y);
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v[21], y);
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.push_back(x);
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v[22], x);
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY((size_t)&(v[22]) == (size_t)&(v[21]) + sizeof(QuaternionType));
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // do a lot of push_back such that the vector gets internally resized
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // (with memory reallocation)
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  QuaternionType* ref = &w[0];
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    v.push_back(w[i%w.size()]);
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(unsigned int i=23; i<v.size(); ++i)
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY(v[i].coeffs()==w[(i-23)%w.size()].coeffs());
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_stdvector_overload()
135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // some non vectorizable fixed sizes
137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_1(check_stdvector_matrix(Vector2f()));
138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_1(check_stdvector_matrix(Matrix3f()));
139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_2(check_stdvector_matrix(Matrix3d()));
140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // some vectorizable fixed sizes
142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_1(check_stdvector_matrix(Matrix2f()));
143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_1(check_stdvector_matrix(Vector4f()));
144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_1(check_stdvector_matrix(Matrix4f()));
145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_2(check_stdvector_matrix(Matrix4d()));
146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // some dynamic sizes
148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_3(check_stdvector_matrix(MatrixXd(1,1)));
149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_3(check_stdvector_matrix(VectorXd(20)));
150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_3(check_stdvector_matrix(RowVectorXf(20)));
151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_3(check_stdvector_matrix(MatrixXcf(10,10)));
152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // some Transform
154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_4(check_stdvector_transform(Affine2f())); // does not need the specialization (2+1)^2 = 9
155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_4(check_stdvector_transform(Affine3f()));
156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_4(check_stdvector_transform(Affine3d()));
157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // some Quaternion
159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_5(check_stdvector_quaternion(Quaternionf()));
160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_5(check_stdvector_quaternion(Quaterniond()));
161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
162