// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2017 Gael Guennebaud <gael.guennebaud@inria.fr>
//
// 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/.

#define TEST_ENABLE_TEMPORARY_TRACKING

#include "main.h"

template <typename MatrixType>
struct Wrapper {
  MatrixType m_mat;
  inline Wrapper(const MatrixType& x) : m_mat(x) {}
  inline operator const MatrixType&() const { return m_mat; }
  inline operator MatrixType&() { return m_mat; }
};

enum my_sizes { M = 12, N = 7 };

template <typename MatrixType>
void ctor_init1(const MatrixType& m) {
  // Check logic in PlainObjectBase::_init1
  Index rows = m.rows();
  Index cols = m.cols();

  MatrixType m0 = MatrixType::Random(rows, cols);

  VERIFY_EVALUATION_COUNT(MatrixType m1(m0), 1);
  VERIFY_EVALUATION_COUNT(MatrixType m2(m0 + m0), 1);
  VERIFY_EVALUATION_COUNT(MatrixType m2(m0.block(0, 0, rows, cols)), 1);

  Wrapper<MatrixType> wrapper(m0);
  VERIFY_EVALUATION_COUNT(MatrixType m3(wrapper), 1);
}

EIGEN_DECLARE_TEST(constructor) {
  for (int i = 0; i < g_repeat; i++) {
    CALL_SUBTEST_1(ctor_init1(Matrix<float, 1, 1>()));
    CALL_SUBTEST_1(ctor_init1(Matrix4d()));
    CALL_SUBTEST_1(ctor_init1(
        MatrixXcf(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
    CALL_SUBTEST_1(ctor_init1(
        MatrixXi(internal::random<int>(1, EIGEN_TEST_MAX_SIZE), internal::random<int>(1, EIGEN_TEST_MAX_SIZE))));
  }
  {
    Matrix<Index, 1, 1> a(123);
    VERIFY_IS_EQUAL(a[0], 123);
  }
  {
    Matrix<Index, 1, 1> a(123.0);
    VERIFY_IS_EQUAL(a[0], 123);
  }
  {
    Matrix<float, 1, 1> a(123);
    VERIFY_IS_EQUAL(a[0], 123.f);
  }
  {
    Array<Index, 1, 1> a(123);
    VERIFY_IS_EQUAL(a[0], 123);
  }
  {
    Array<Index, 1, 1> a(123.0);
    VERIFY_IS_EQUAL(a[0], 123);
  }
  {
    Array<float, 1, 1> a(123);
    VERIFY_IS_EQUAL(a[0], 123.f);
  }
  {
    Array<Index, 3, 3> a(123);
    VERIFY_IS_EQUAL(a(4), 123);
  }
  {
    Array<Index, 3, 3> a(123.0);
    VERIFY_IS_EQUAL(a(4), 123);
  }
  {
    Array<float, 3, 3> a(123);
    VERIFY_IS_EQUAL(a(4), 123.f);
  }
  {
    MatrixXi m1(M, N);
    VERIFY_IS_EQUAL(m1.rows(), M);
    VERIFY_IS_EQUAL(m1.cols(), N);
    ArrayXXi a1(M, N);
    VERIFY_IS_EQUAL(a1.rows(), M);
    VERIFY_IS_EQUAL(a1.cols(), N);
    VectorXi v1(M);
    VERIFY_IS_EQUAL(v1.size(), M);
    ArrayXi a2(M);
    VERIFY_IS_EQUAL(a2.size(), M);
  }
}
