// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2011 Benoit Jacob <jacob.benoit.1@gmail.com>
//
// This Source Code Form is subject to the terms of the Mozilla
// Public License v. 2.0. If a copy of the MPL was not distributed
// with this file, You can obtain one at http://mozilla.org/MPL/2.0/.

#include "main.h"

#define VERIFY_THROWS_BADALLOC(a) {                           \
    bool threw = false;                                       \
    try {                                                     \
      a;                                                      \
    }                                                         \
    catch (std::bad_alloc&) { threw = true; }                 \
    VERIFY(threw && "should have thrown bad_alloc: " #a);     \
  }

template<typename MatrixType>
void triggerMatrixBadAlloc(Index rows, Index cols)
{
  VERIFY_THROWS_BADALLOC( MatrixType m(rows, cols) );
  VERIFY_THROWS_BADALLOC( MatrixType m; m.resize(rows, cols) );
  VERIFY_THROWS_BADALLOC( MatrixType m; m.conservativeResize(rows, cols) );
}

template<typename VectorType>
void triggerVectorBadAlloc(Index size)
{
  VERIFY_THROWS_BADALLOC( VectorType v(size) );
  VERIFY_THROWS_BADALLOC( VectorType v; v.resize(size) );
  VERIFY_THROWS_BADALLOC( VectorType v; v.conservativeResize(size) );
}

EIGEN_DECLARE_TEST(sizeoverflow)
{
  // there are 2 levels of overflow checking. first in PlainObjectBase.h we check for overflow in rows*cols computations.
  // this is tested in tests of the form times_itself_gives_0 * times_itself_gives_0
  // Then in Memory.h we check for overflow in size * sizeof(T) computations.
  // this is tested in tests of the form times_4_gives_0 * sizeof(float)
  
  size_t times_itself_gives_0 = size_t(1) << (8 * sizeof(Index) / 2);
  VERIFY(times_itself_gives_0 * times_itself_gives_0 == 0);

  size_t times_4_gives_0 = size_t(1) << (8 * sizeof(Index) - 2);
  VERIFY(times_4_gives_0 * 4 == 0);

  size_t times_8_gives_0 = size_t(1) << (8 * sizeof(Index) - 3);
  VERIFY(times_8_gives_0 * 8 == 0);

  triggerMatrixBadAlloc<MatrixXf>(times_itself_gives_0, times_itself_gives_0);
  triggerMatrixBadAlloc<MatrixXf>(times_itself_gives_0 / 4, times_itself_gives_0);
  triggerMatrixBadAlloc<MatrixXf>(times_4_gives_0, 1);

  triggerMatrixBadAlloc<MatrixXd>(times_itself_gives_0, times_itself_gives_0);
  triggerMatrixBadAlloc<MatrixXd>(times_itself_gives_0 / 8, times_itself_gives_0);
  triggerMatrixBadAlloc<MatrixXd>(times_8_gives_0, 1);
  
  triggerVectorBadAlloc<VectorXf>(times_4_gives_0);
  
  triggerVectorBadAlloc<VectorXd>(times_8_gives_0);
}
