source: pacpussensors/trunk/Vislab/lib3dv-1.2.0/lib3dv/eigen/test/stddeque_overload.cpp

Last change on this file was 136, checked in by ldecherf, 8 years ago

Doc

File size: 4.6 KB
Line 
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@gmail.com>
5// Copyright (C) 2010 Hauke Heibel <hauke.heibel@gmail.com>
6//
7// This Source Code Form is subject to the terms of the Mozilla
8// Public License v. 2.0. If a copy of the MPL was not distributed
9// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
10
11#include "main.h"
12
13#include <Eigen/StdDeque>
14#include <Eigen/Geometry>
15
16EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Vector4f)
17
18EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Matrix2f)
19EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Matrix4f)
20EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Matrix4d)
21
22EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Affine3f)
23EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Affine3d)
24
25EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Quaternionf)
26EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(Quaterniond)
27
28template<typename MatrixType>
29void check_stddeque_matrix(const MatrixType& m)
30{
31 typename MatrixType::Index rows = m.rows();
32 typename MatrixType::Index cols = m.cols();
33 MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);
34 std::deque<MatrixType> v(10, MatrixType(rows,cols)), w(20, y);
35 v[5] = x;
36 w[6] = v[5];
37 VERIFY_IS_APPROX(w[6], v[5]);
38 v = w;
39 for(int i = 0; i < 20; i++)
40 {
41 VERIFY_IS_APPROX(w[i], v[i]);
42 }
43
44 v.resize(21);
45 v[20] = x;
46 VERIFY_IS_APPROX(v[20], x);
47 v.resize(22,y);
48 VERIFY_IS_APPROX(v[21], y);
49 v.push_back(x);
50 VERIFY_IS_APPROX(v[22], x);
51
52 // do a lot of push_back such that the deque gets internally resized
53 // (with memory reallocation)
54 MatrixType* ref = &w[0];
55 for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)
56 v.push_back(w[i%w.size()]);
57 for(unsigned int i=23; i<v.size(); ++i)
58 {
59 VERIFY(v[i]==w[(i-23)%w.size()]);
60 }
61}
62
63template<typename TransformType>
64void check_stddeque_transform(const TransformType&)
65{
66 typedef typename TransformType::MatrixType MatrixType;
67 TransformType x(MatrixType::Random()), y(MatrixType::Random());
68 std::deque<TransformType> v(10), w(20, y);
69 v[5] = x;
70 w[6] = v[5];
71 VERIFY_IS_APPROX(w[6], v[5]);
72 v = w;
73 for(int i = 0; i < 20; i++)
74 {
75 VERIFY_IS_APPROX(w[i], v[i]);
76 }
77
78 v.resize(21);
79 v[20] = x;
80 VERIFY_IS_APPROX(v[20], x);
81 v.resize(22,y);
82 VERIFY_IS_APPROX(v[21], y);
83 v.push_back(x);
84 VERIFY_IS_APPROX(v[22], x);
85
86 // do a lot of push_back such that the deque gets internally resized
87 // (with memory reallocation)
88 TransformType* ref = &w[0];
89 for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)
90 v.push_back(w[i%w.size()]);
91 for(unsigned int i=23; i<v.size(); ++i)
92 {
93 VERIFY(v[i].matrix()==w[(i-23)%w.size()].matrix());
94 }
95}
96
97template<typename QuaternionType>
98void check_stddeque_quaternion(const QuaternionType&)
99{
100 typedef typename QuaternionType::Coefficients Coefficients;
101 QuaternionType x(Coefficients::Random()), y(Coefficients::Random());
102 std::deque<QuaternionType> v(10), w(20, y);
103 v[5] = x;
104 w[6] = v[5];
105 VERIFY_IS_APPROX(w[6], v[5]);
106 v = w;
107 for(int i = 0; i < 20; i++)
108 {
109 VERIFY_IS_APPROX(w[i], v[i]);
110 }
111
112 v.resize(21);
113 v[20] = x;
114 VERIFY_IS_APPROX(v[20], x);
115 v.resize(22,y);
116 VERIFY_IS_APPROX(v[21], y);
117 v.push_back(x);
118 VERIFY_IS_APPROX(v[22], x);
119
120 // do a lot of push_back such that the deque gets internally resized
121 // (with memory reallocation)
122 QuaternionType* ref = &w[0];
123 for(int i=0; i<30 || ((ref==&w[0]) && i<300); ++i)
124 v.push_back(w[i%w.size()]);
125 for(unsigned int i=23; i<v.size(); ++i)
126 {
127 VERIFY(v[i].coeffs()==w[(i-23)%w.size()].coeffs());
128 }
129}
130
131void test_stddeque_overload()
132{
133 // some non vectorizable fixed sizes
134 CALL_SUBTEST_1(check_stddeque_matrix(Vector2f()));
135 CALL_SUBTEST_1(check_stddeque_matrix(Matrix3f()));
136 CALL_SUBTEST_2(check_stddeque_matrix(Matrix3d()));
137
138 // some vectorizable fixed sizes
139 CALL_SUBTEST_1(check_stddeque_matrix(Matrix2f()));
140 CALL_SUBTEST_1(check_stddeque_matrix(Vector4f()));
141 CALL_SUBTEST_1(check_stddeque_matrix(Matrix4f()));
142 CALL_SUBTEST_2(check_stddeque_matrix(Matrix4d()));
143
144 // some dynamic sizes
145 CALL_SUBTEST_3(check_stddeque_matrix(MatrixXd(1,1)));
146 CALL_SUBTEST_3(check_stddeque_matrix(VectorXd(20)));
147 CALL_SUBTEST_3(check_stddeque_matrix(RowVectorXf(20)));
148 CALL_SUBTEST_3(check_stddeque_matrix(MatrixXcf(10,10)));
149
150 // some Transform
151 CALL_SUBTEST_4(check_stddeque_transform(Affine2f())); // does not need the specialization (2+1)^2 = 9
152 CALL_SUBTEST_4(check_stddeque_transform(Affine3f()));
153 CALL_SUBTEST_4(check_stddeque_transform(Affine3d()));
154
155 // some Quaternion
156 CALL_SUBTEST_5(check_stddeque_quaternion(Quaternionf()));
157 CALL_SUBTEST_5(check_stddeque_quaternion(Quaterniond()));
158}
Note: See TracBrowser for help on using the repository browser.