73 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #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';
 | |
|   }
 | |
| }
 | 
