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