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