xref: /aosp_15_r20/external/eigen/test/ctorleak.cpp (revision bf2c37156dfe67e5dfebd6d394bad8b2ab5804d4)
1*bf2c3715SXin Li #include "main.h"
2*bf2c3715SXin Li 
3*bf2c3715SXin Li #include <exception>  // std::exception
4*bf2c3715SXin Li 
5*bf2c3715SXin Li struct Foo
6*bf2c3715SXin Li {
7*bf2c3715SXin Li   static Index object_count;
8*bf2c3715SXin Li   static Index object_limit;
9*bf2c3715SXin Li   int dummy;
10*bf2c3715SXin Li 
FooFoo11*bf2c3715SXin Li   Foo() : dummy(0)
12*bf2c3715SXin Li   {
13*bf2c3715SXin Li #ifdef EIGEN_EXCEPTIONS
14*bf2c3715SXin Li     // TODO: Is this the correct way to handle this?
15*bf2c3715SXin Li     if (Foo::object_count > Foo::object_limit) { std::cout << "\nThrow!\n"; throw Foo::Fail(); }
16*bf2c3715SXin Li #endif
17*bf2c3715SXin Li 	  std::cout << '+';
18*bf2c3715SXin Li     ++Foo::object_count;
19*bf2c3715SXin Li   }
20*bf2c3715SXin Li 
~FooFoo21*bf2c3715SXin Li   ~Foo()
22*bf2c3715SXin Li   {
23*bf2c3715SXin Li 	  std::cout << '-';
24*bf2c3715SXin Li     --Foo::object_count;
25*bf2c3715SXin Li   }
26*bf2c3715SXin Li 
27*bf2c3715SXin Li   class Fail : public std::exception {};
28*bf2c3715SXin Li };
29*bf2c3715SXin Li 
30*bf2c3715SXin Li Index Foo::object_count = 0;
31*bf2c3715SXin Li Index Foo::object_limit = 0;
32*bf2c3715SXin Li 
33*bf2c3715SXin Li #undef EIGEN_TEST_MAX_SIZE
34*bf2c3715SXin Li #define EIGEN_TEST_MAX_SIZE 3
35*bf2c3715SXin Li 
EIGEN_DECLARE_TEST(ctorleak)36*bf2c3715SXin Li EIGEN_DECLARE_TEST(ctorleak)
37*bf2c3715SXin Li {
38*bf2c3715SXin Li   typedef Matrix<Foo, Dynamic, Dynamic> MatrixX;
39*bf2c3715SXin Li   typedef Matrix<Foo, Dynamic, 1> VectorX;
40*bf2c3715SXin Li 
41*bf2c3715SXin Li   Foo::object_count = 0;
42*bf2c3715SXin Li   for(int i = 0; i < g_repeat; i++) {
43*bf2c3715SXin Li     Index rows = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE), cols = internal::random<Index>(2,EIGEN_TEST_MAX_SIZE);
44*bf2c3715SXin Li     Foo::object_limit = rows*cols;
45*bf2c3715SXin Li     {
46*bf2c3715SXin Li     MatrixX r(rows, cols);
47*bf2c3715SXin Li     Foo::object_limit = r.size()+internal::random<Index>(0, rows*cols - 2);
48*bf2c3715SXin Li     std::cout << "object_limit =" << Foo::object_limit << std::endl;
49*bf2c3715SXin Li #ifdef EIGEN_EXCEPTIONS
50*bf2c3715SXin Li     try
51*bf2c3715SXin Li     {
52*bf2c3715SXin Li #endif
53*bf2c3715SXin Li       if(internal::random<bool>()) {
54*bf2c3715SXin Li         std::cout <<       "\nMatrixX m(" << rows << ", " << cols << ");\n";
55*bf2c3715SXin Li         MatrixX m(rows, cols);
56*bf2c3715SXin Li       }
57*bf2c3715SXin Li       else {
58*bf2c3715SXin Li         std::cout <<       "\nMatrixX m(r);\n";
59*bf2c3715SXin Li         MatrixX m(r);
60*bf2c3715SXin Li       }
61*bf2c3715SXin Li #ifdef EIGEN_EXCEPTIONS
62*bf2c3715SXin Li       VERIFY(false);  // not reached if exceptions are enabled
63*bf2c3715SXin Li     }
64*bf2c3715SXin Li     catch (const Foo::Fail&) { /* ignore */ }
65*bf2c3715SXin Li #endif
66*bf2c3715SXin Li     }
67*bf2c3715SXin Li     VERIFY_IS_EQUAL(Index(0), Foo::object_count);
68*bf2c3715SXin Li 
69*bf2c3715SXin Li     {
70*bf2c3715SXin Li       Foo::object_limit = (rows+1)*(cols+1);
71*bf2c3715SXin Li       MatrixX A(rows, cols);
72*bf2c3715SXin Li       VERIFY_IS_EQUAL(Foo::object_count, rows*cols);
73*bf2c3715SXin Li       VectorX v=A.row(0);
74*bf2c3715SXin Li       VERIFY_IS_EQUAL(Foo::object_count, (rows+1)*cols);
75*bf2c3715SXin Li       v = A.col(0);
76*bf2c3715SXin Li       VERIFY_IS_EQUAL(Foo::object_count, rows*(cols+1));
77*bf2c3715SXin Li     }
78*bf2c3715SXin Li     VERIFY_IS_EQUAL(Index(0), Foo::object_count);
79*bf2c3715SXin Li   }
80*bf2c3715SXin Li   std::cout << "\n";
81*bf2c3715SXin Li }
82