| #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'; |
| } |
| } |