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#include <Eigen/StdList>
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <Eigen/Geometry>
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MatrixType>
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid check_stdlist_matrix(const MatrixType& m)
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename MatrixType::Index Index;
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index rows = m.rows();
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  Index cols = m.cols();
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  std::list<MatrixType,Eigen::aligned_allocator<MatrixType> > v(10, MatrixType(rows,cols)), w(20, y);
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.front() = x;
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  w.front() = w.back();
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(w.front(), w.back());
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v = w;
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typename std::list<MatrixType,Eigen::aligned_allocator<MatrixType> >::iterator vi = v.begin();
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typename std::list<MatrixType,Eigen::aligned_allocator<MatrixType> >::iterator wi = w.begin();
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 0; i < 20; i++)
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY_IS_APPROX(*vi, *wi);
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ++vi;
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ++wi;
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.resize(21);
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.back() = x;
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v.back(), x);
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.resize(22,y);
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v.back(), y);
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.push_back(x);
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v.back(), x);
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename TransformType>
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid check_stdlist_transform(const TransformType&)
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename TransformType::MatrixType MatrixType;
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  TransformType x(MatrixType::Random()), y(MatrixType::Random());
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  std::list<TransformType,Eigen::aligned_allocator<TransformType> > v(10), w(20, y);
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.front() = x;
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  w.front() = w.back();
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(w.front(), w.back());
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v = w;
57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typename std::list<TransformType,Eigen::aligned_allocator<TransformType> >::iterator vi = v.begin();
59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typename std::list<TransformType,Eigen::aligned_allocator<TransformType> >::iterator wi = w.begin();
60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 0; i < 20; i++)
61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY_IS_APPROX(*vi, *wi);
63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ++vi;
64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ++wi;
65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.resize(21);
68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.back() = x;
69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v.back(), x);
70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.resize(22,y);
71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v.back(), y);
72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.push_back(x);
73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v.back(), x);
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename QuaternionType>
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid check_stdlist_quaternion(const QuaternionType&)
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typedef typename QuaternionType::Coefficients Coefficients;
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  QuaternionType x(Coefficients::Random()), y(Coefficients::Random());
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  std::list<QuaternionType,Eigen::aligned_allocator<QuaternionType> > v(10), w(20, y);
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.front() = x;
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  w.front() = w.back();
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(w.front(), w.back());
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v = w;
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typename std::list<QuaternionType,Eigen::aligned_allocator<QuaternionType> >::iterator vi = v.begin();
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  typename std::list<QuaternionType,Eigen::aligned_allocator<QuaternionType> >::iterator wi = w.begin();
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  for(int i = 0; i < 20; i++)
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  {
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    VERIFY_IS_APPROX(*vi, *wi);
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ++vi;
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    ++wi;
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  }
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.resize(21);
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.back() = x;
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v.back(), x);
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.resize(22,y);
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v.back(), y);
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  v.push_back(x);
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  VERIFY_IS_APPROX(v.back(), x);
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathvoid test_stdlist()
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // some non vectorizable fixed sizes
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_1(check_stdlist_matrix(Vector2f()));
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_1(check_stdlist_matrix(Matrix3f()));
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_2(check_stdlist_matrix(Matrix3d()));
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // some vectorizable fixed sizes
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_1(check_stdlist_matrix(Matrix2f()));
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_1(check_stdlist_matrix(Vector4f()));
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_1(check_stdlist_matrix(Matrix4f()));
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_2(check_stdlist_matrix(Matrix4d()));
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // some dynamic sizes
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_3(check_stdlist_matrix(MatrixXd(1,1)));
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_3(check_stdlist_matrix(VectorXd(20)));
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_3(check_stdlist_matrix(RowVectorXf(20)));
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_3(check_stdlist_matrix(MatrixXcf(10,10)));
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // some Transform
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_4(check_stdlist_transform(Affine2f()));
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_4(check_stdlist_transform(Affine3f()));
127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_4(check_stdlist_transform(Affine3d()));
128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  // some Quaternion
130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_5(check_stdlist_quaternion(Quaternionf()));
131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  CALL_SUBTEST_5(check_stdlist_quaternion(Quaterniond()));
132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
133