|  | #include "main.h" | 
|  |  | 
|  | #include <exception>  // std::exception | 
|  |  | 
|  | #include <Eigen/src/Core/util/MaxSizeVector.h> | 
|  |  | 
|  | struct Foo { | 
|  | static Index object_count; | 
|  | static Index object_limit; | 
|  | EIGEN_ALIGN_TO_BOUNDARY(128) int dummy; | 
|  |  | 
|  | Foo(int x = 0) : dummy(x) { | 
|  | #ifdef EIGEN_EXCEPTIONS | 
|  | // TODO: Is this the correct way to handle this? | 
|  | if (Foo::object_count > Foo::object_limit) { | 
|  | std::cout << "\nThrow!\n"; | 
|  | throw Foo::Fail(); | 
|  | } | 
|  | #endif | 
|  | std::cout << '+'; | 
|  | ++Foo::object_count; | 
|  | eigen_assert((std::uintptr_t(this) & (127)) == 0); | 
|  | } | 
|  | Foo(const Foo&) { | 
|  | std::cout << 'c'; | 
|  | ++Foo::object_count; | 
|  | eigen_assert((std::uintptr_t(this) & (127)) == 0); | 
|  | } | 
|  |  | 
|  | ~Foo() { | 
|  | std::cout << '~'; | 
|  | --Foo::object_count; | 
|  | } | 
|  |  | 
|  | class Fail : public std::exception {}; | 
|  | }; | 
|  |  | 
|  | Index Foo::object_count = 0; | 
|  | Index Foo::object_limit = 0; | 
|  |  | 
|  | EIGEN_DECLARE_TEST(cxx11_maxsizevector) { | 
|  | typedef MaxSizeVector<Foo> VectorX; | 
|  | Foo::object_count = 0; | 
|  | for (int r = 0; r < g_repeat; r++) { | 
|  | Index rows = internal::random<Index>(3, 30); | 
|  | Foo::object_limit = internal::random<Index>(0, rows - 2); | 
|  | std::cout << "object_limit = " << Foo::object_limit << std::endl; | 
|  | bool exception_raised = false; | 
|  | #ifdef EIGEN_EXCEPTIONS | 
|  | try { | 
|  | #endif | 
|  | std::cout << "\nVectorX m(" << rows << ");\n"; | 
|  | VectorX vect(rows); | 
|  | for (int i = 0; i < rows; ++i) vect.push_back(Foo()); | 
|  | #ifdef EIGEN_EXCEPTIONS | 
|  | VERIFY(false);  // not reached if exceptions are enabled | 
|  | } catch (const Foo::Fail&) { | 
|  | exception_raised = true; | 
|  | } | 
|  | VERIFY(exception_raised); | 
|  | #endif | 
|  | VERIFY_IS_EQUAL(Index(0), Foo::object_count); | 
|  |  | 
|  | { | 
|  | Foo::object_limit = rows + 1; | 
|  | VectorX vect2(rows, Foo()); | 
|  | VERIFY_IS_EQUAL(Foo::object_count, rows); | 
|  | } | 
|  | VERIFY_IS_EQUAL(Index(0), Foo::object_count); | 
|  | std::cout << '\n'; | 
|  | } | 
|  | } |