mirror of
https://gitlab.com/libeigen/eigen.git
synced 2024-12-21 07:19:46 +08:00
78 lines
1.8 KiB
C++
78 lines
1.8 KiB
C++
|
#include "main.h"
|
||
|
|
||
|
#include <exception> // std::exception
|
||
|
|
||
|
#include <unsupported/Eigen/CXX11/Tensor>
|
||
|
|
||
|
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((internal::UIntPtr(this) & (127)) == 0);
|
||
|
}
|
||
|
Foo(const Foo&)
|
||
|
{
|
||
|
std::cout << 'c';
|
||
|
++Foo::object_count;
|
||
|
eigen_assert((internal::UIntPtr(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';
|
||
|
}
|
||
|
}
|