// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2008 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/.

#include "main.h"

template <typename MatrixType>
void verifySizeOf(const MatrixType&) {
  typedef typename MatrixType::Scalar Scalar;
  if (MatrixType::RowsAtCompileTime != Dynamic && MatrixType::ColsAtCompileTime != Dynamic)
    VERIFY_IS_EQUAL(std::ptrdiff_t(sizeof(MatrixType)),
                    std::ptrdiff_t(sizeof(Scalar)) * std::ptrdiff_t(MatrixType::SizeAtCompileTime));
  else
    VERIFY_IS_EQUAL(sizeof(MatrixType), sizeof(Scalar*) + 2 * sizeof(Index));
}

EIGEN_DECLARE_TEST(sizeof) {
  CALL_SUBTEST(verifySizeOf(Matrix<float, 1, 1>()));
  CALL_SUBTEST(verifySizeOf(Array<float, 2, 1>()));
  CALL_SUBTEST(verifySizeOf(Array<float, 3, 1>()));
  CALL_SUBTEST(verifySizeOf(Array<float, 4, 1>()));
  CALL_SUBTEST(verifySizeOf(Array<float, 5, 1>()));
  CALL_SUBTEST(verifySizeOf(Array<float, 6, 1>()));
  CALL_SUBTEST(verifySizeOf(Array<float, 7, 1>()));
  CALL_SUBTEST(verifySizeOf(Array<float, 8, 1>()));
  CALL_SUBTEST(verifySizeOf(Array<float, 9, 1>()));
  CALL_SUBTEST(verifySizeOf(Array<float, 10, 1>()));
  CALL_SUBTEST(verifySizeOf(Array<float, 11, 1>()));
  CALL_SUBTEST(verifySizeOf(Array<float, 12, 1>()));
  CALL_SUBTEST(verifySizeOf(Vector2d()));
  CALL_SUBTEST(verifySizeOf(Vector4f()));
  CALL_SUBTEST(verifySizeOf(Matrix4d()));
  CALL_SUBTEST(verifySizeOf(Matrix<double, 4, 2>()));
  CALL_SUBTEST(verifySizeOf(Matrix<bool, 7, 5>()));
  CALL_SUBTEST(verifySizeOf(MatrixXcf(3, 3)));
  CALL_SUBTEST(verifySizeOf(MatrixXi(8, 12)));
  CALL_SUBTEST(verifySizeOf(MatrixXcd(20, 20)));
  CALL_SUBTEST(verifySizeOf(Matrix<float, 100, 100>()));

  VERIFY(sizeof(std::complex<float>) == 2 * sizeof(float));
  VERIFY(sizeof(std::complex<double>) == 2 * sizeof(double));
}
