stddeque_overload.cpp
Go to the documentation of this file.
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 
17 
21 
24 
27 
28 template<typename MatrixType>
30 {
31  Index rows = m.rows();
32  Index cols = m.cols();
33  MatrixType x = MatrixType::Random(rows,cols), y = MatrixType::Random(rows,cols);
34  std::deque<MatrixType> v(10, MatrixType::Zero(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 
63 template<typename TransformType>
64 void check_stddeque_transform(const TransformType&)
65 {
66  typedef typename TransformType::MatrixType MatrixType;
67  TransformType x(MatrixType::Random()), y(MatrixType::Random()), ti=TransformType::Identity();
68  std::deque<TransformType> v(10,ti), 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,ti);
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 
97 template<typename QuaternionType>
98 void check_stddeque_quaternion(const QuaternionType&)
99 {
100  typedef typename QuaternionType::Coefficients Coefficients;
101  QuaternionType x(Coefficients::Random()), y(Coefficients::Random()), qi=QuaternionType::Identity();
102  std::deque<QuaternionType> v(10,qi), 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,qi);
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 
131 EIGEN_DECLARE_TEST(stddeque_overload)
132 {
133  // some non vectorizable fixed sizes
137 
138  // some vectorizable fixed sizes
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
154 
155  // some Quaternion
158 }
Matrix3f m
#define CALL_SUBTEST_4(FUNC)
Transform< float, 3, Affine > Affine3f
Definition: Transform.h:706
Scalar * y
void check_stddeque_transform(const TransformType &)
#define CALL_SUBTEST_3(FUNC)
void check_stddeque_matrix(const MatrixType &m)
#define EIGEN_DEFINE_STL_DEQUE_SPECIALIZATION(...)
Definition: StdDeque.h:21
MatrixXf MatrixType
void check_stddeque_quaternion(const QuaternionType &)
#define VERIFY_IS_APPROX(a, b)
#define CALL_SUBTEST_1(FUNC)
Transform< double, 3, Affine > Affine3d
Definition: Transform.h:710
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:74
Array< int, Dynamic, 1 > v
Reference counting helper.
Definition: object.h:67
RowVector3d w
Transform< float, 2, Affine > Affine2f
Definition: Transform.h:704
#define CALL_SUBTEST_5(FUNC)
#define VERIFY(a)
Definition: main.h:380
The quaternion class used to represent 3D orientations and rotations.
#define CALL_SUBTEST_2(FUNC)
Map< Matrix< T, Dynamic, Dynamic, ColMajor >, 0, OuterStride<> > matrix(T *data, int rows, int cols, int stride)
set noclip points set clip one set noclip two set bar set border lt lw set xdata set ydata set zdata set x2data set y2data set boxwidth set dummy x
EIGEN_DECLARE_TEST(stddeque_overload)
Represents an homogeneous transformation in a N dimensional space.


gtsam
Author(s):
autogenerated on Tue Jul 4 2023 02:36:20