// This file is part of Eigen, a lightweight C++ template library
// for linear algebra.
//
// Copyright (C) 2010 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/.
// SPDX-License-Identifier: MPL-2.0

#include "main.h"
#include "random_for_arithmetic.h"

template <int Alignment, typename VectorType>
void map_class_vector(const VectorType& m) {
  typedef typename VectorType::Scalar Scalar;

  Index size = m.size();

  VectorType v = VectorType::Random(size);

  Index arraysize = 3 * size;

  Scalar* a_array = internal::aligned_new<Scalar>(arraysize + 1);
  Scalar* array = a_array;
  if (Alignment != Aligned)
    array = (Scalar*)(std::intptr_t(a_array) + (internal::packet_traits<Scalar>::AlignedOnScalar
                                                    ? sizeof(Scalar)
                                                    : sizeof(typename NumTraits<Scalar>::Real)));

  {
    Map<VectorType, Alignment, InnerStride<3> > map(array, size);
    map = v;
    for (int i = 0; i < size; ++i) {
      VERIFY_IS_EQUAL(array[3 * i], v[i]);
      VERIFY_IS_EQUAL(map[i], v[i]);
    }
  }

  {
    Map<VectorType, Unaligned, InnerStride<Dynamic> > map(array, size, InnerStride<Dynamic>(2));
    map = v;
    for (int i = 0; i < size; ++i) {
      VERIFY_IS_EQUAL(array[2 * i], v[i]);
      VERIFY_IS_EQUAL(map[i], v[i]);
    }
  }

  internal::aligned_delete(a_array, arraysize + 1);
}

template <int Alignment, typename MatrixType>
void map_class_matrix(const MatrixType& _m) {
  typedef typename MatrixType::Scalar Scalar;

  Index rows = _m.rows(), cols = _m.cols();

  MatrixType m = random_for_arithmetic<MatrixType>(rows, cols);
  Scalar s1 = random_scalar_for_arithmetic<Scalar>();

  Index arraysize = 4 * (rows + 4) * (cols + 4);

  Scalar* a_array1 = internal::aligned_new<Scalar>(arraysize + 1);
  Scalar* array1 = a_array1;
  if (Alignment != Aligned)
    array1 = (Scalar*)(std::intptr_t(a_array1) + (internal::packet_traits<Scalar>::AlignedOnScalar
                                                      ? sizeof(Scalar)
                                                      : sizeof(typename NumTraits<Scalar>::Real)));

  Scalar a_array2[256];
  Scalar* array2 = a_array2;
  if (Alignment != Aligned) {
    array2 = (Scalar*)(std::intptr_t(a_array2) + (internal::packet_traits<Scalar>::AlignedOnScalar
                                                      ? sizeof(Scalar)
                                                      : sizeof(typename NumTraits<Scalar>::Real)));
  } else {
    // In case there is no alignment, default to pointing to the start.
    constexpr int alignment = (std::max<int>)(EIGEN_MAX_ALIGN_BYTES, 1);
    array2 = (Scalar*)(((std::uintptr_t(a_array2) + alignment - 1) / alignment) * alignment);
  }
  Index maxsize2 = a_array2 - array2 + 256;

  // test no inner stride and some dynamic outer stride
  for (int k = 0; k < 2; ++k) {
    if (k == 1 && (m.innerSize() + 1) * m.outerSize() > maxsize2) break;
    Scalar* array = (k == 0 ? array1 : array2);

    Map<MatrixType, Alignment, OuterStride<Dynamic> > map(array, rows, cols, OuterStride<Dynamic>(m.innerSize() + 1));
    map = m;
    VERIFY(map.outerStride() == map.innerSize() + 1);
    for (int i = 0; i < m.outerSize(); ++i)
      for (int j = 0; j < m.innerSize(); ++j) {
        VERIFY_IS_EQUAL(array[map.outerStride() * i + j], m.coeffByOuterInner(i, j));
        VERIFY_IS_EQUAL(map.coeffByOuterInner(i, j), m.coeffByOuterInner(i, j));
      }
    VERIFY_IS_APPROX(s1 * map, s1 * m);
    map *= s1;
    VERIFY_IS_APPROX(map, s1 * m);
    map.setZero();
    VERIFY_IS_CWISE_EQUAL(map, MatrixType::Zero(rows, cols));
  }

  // test no inner stride and an outer stride of +4. This is quite important as for fixed-size matrices,
  // this allows to hit the special case where it's vectorizable.
  for (int k = 0; k < 2; ++k) {
    if (k == 1 && (m.innerSize() + 4) * m.outerSize() > maxsize2) break;
    Scalar* array = (k == 0 ? array1 : array2);

    enum {
      InnerSize = MatrixType::InnerSizeAtCompileTime,
      OuterStrideAtCompileTime = InnerSize == Dynamic ? Dynamic : InnerSize + 4
    };
    Map<MatrixType, Alignment, OuterStride<OuterStrideAtCompileTime> > map(
        array, rows, cols, OuterStride<OuterStrideAtCompileTime>(m.innerSize() + 4));
    map = m;
    VERIFY(map.outerStride() == map.innerSize() + 4);
    for (int i = 0; i < m.outerSize(); ++i)
      for (int j = 0; j < m.innerSize(); ++j) {
        VERIFY_IS_EQUAL(array[map.outerStride() * i + j], m.coeffByOuterInner(i, j));
        VERIFY_IS_EQUAL(map.coeffByOuterInner(i, j), m.coeffByOuterInner(i, j));
      }
    VERIFY_IS_APPROX(s1 * map, s1 * m);
    map *= s1;
    VERIFY_IS_APPROX(map, s1 * m);
    map.setZero();
    VERIFY_IS_CWISE_EQUAL(map, MatrixType::Zero(rows, cols));
  }

  // test both inner stride and outer stride
  for (int k = 0; k < 2; ++k) {
    if (k == 1 && (2 * m.innerSize() + 1) * (m.outerSize() * 2) > maxsize2) break;
    Scalar* array = (k == 0 ? array1 : array2);

    Map<MatrixType, Alignment, Stride<Dynamic, Dynamic> > map(array, rows, cols,
                                                              Stride<Dynamic, Dynamic>(2 * m.innerSize() + 1, 2));
    map = m;
    VERIFY(map.outerStride() == 2 * map.innerSize() + 1);
    VERIFY(map.innerStride() == 2);
    for (int i = 0; i < m.outerSize(); ++i)
      for (int j = 0; j < m.innerSize(); ++j) {
        VERIFY_IS_EQUAL(array[map.outerStride() * i + map.innerStride() * j], m.coeffByOuterInner(i, j));
        VERIFY_IS_EQUAL(map.coeffByOuterInner(i, j), m.coeffByOuterInner(i, j));
      }
    VERIFY_IS_APPROX(s1 * map, s1 * m);
    map *= s1;
    VERIFY_IS_APPROX(map, s1 * m);
    map.setZero();
    VERIFY_IS_CWISE_EQUAL(map, MatrixType::Zero(rows, cols));
  }

  // test inner stride and no outer stride
  for (int k = 0; k < 2; ++k) {
    if (k == 1 && (m.innerSize() * 2) * m.outerSize() > maxsize2) break;
    Scalar* array = (k == 0 ? array1 : array2);

    Map<MatrixType, Alignment, InnerStride<Dynamic> > map(array, rows, cols, InnerStride<Dynamic>(2));
    map = m;
    VERIFY(map.outerStride() == map.innerSize() * 2);
    for (int i = 0; i < m.outerSize(); ++i)
      for (int j = 0; j < m.innerSize(); ++j) {
        VERIFY_IS_EQUAL(array[map.innerSize() * i * 2 + j * 2], m.coeffByOuterInner(i, j));
        VERIFY_IS_EQUAL(map.coeffByOuterInner(i, j), m.coeffByOuterInner(i, j));
      }
    VERIFY_IS_APPROX(s1 * map, s1 * m);
    map *= s1;
    VERIFY_IS_APPROX(map, s1 * m);
    map.setZero();
    VERIFY_IS_CWISE_EQUAL(map, MatrixType::Zero(rows, cols));
  }

  // test negative strides
  {
    Matrix<Scalar, Dynamic, 1>::Map(a_array1, arraysize + 1).setRandom();
    Index outerstride = m.innerSize() + 4;
    Scalar* array = array1;

    {
      Map<MatrixType, Alignment, OuterStride<> > map1(array, rows, cols, OuterStride<>(outerstride));
      Map<MatrixType, Unaligned, OuterStride<> > map2(array + (m.outerSize() - 1) * outerstride, rows, cols,
                                                      OuterStride<>(-outerstride));
      if (MatrixType::IsRowMajor)
        VERIFY_IS_APPROX(map1.colwise().reverse(), map2);
      else
        VERIFY_IS_APPROX(map1.rowwise().reverse(), map2);
    }

    {
      Map<MatrixType, Alignment, OuterStride<> > map1(array, rows, cols, OuterStride<>(outerstride));
      Map<MatrixType, Unaligned, Stride<Dynamic, Dynamic> > map2(
          array + (m.outerSize() - 1) * outerstride + m.innerSize() - 1, rows, cols,
          Stride<Dynamic, Dynamic>(-outerstride, -1));
      VERIFY_IS_APPROX(map1.reverse(), map2);
    }

    {
      Map<MatrixType, Alignment, OuterStride<> > map1(array, rows, cols, OuterStride<>(outerstride));
      Map<MatrixType, Unaligned, Stride<Dynamic, -1> > map2(
          array + (m.outerSize() - 1) * outerstride + m.innerSize() - 1, rows, cols,
          Stride<Dynamic, -1>(-outerstride, -1));
      VERIFY_IS_APPROX(map1.reverse(), map2);
    }
  }

  internal::aligned_delete(a_array1, arraysize + 1);
}

// Additional tests for inner-stride but no outer-stride
template <int>
void bug1453() {
  const int data[] = {0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13, 14, 15,
                      16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31};
  typedef Matrix<int, Dynamic, Dynamic, RowMajor> RowMatrixXi;
  typedef Matrix<int, 2, 3, ColMajor> ColMatrix23i;
  typedef Matrix<int, 3, 2, ColMajor> ColMatrix32i;
  typedef Matrix<int, 2, 3, RowMajor> RowMatrix23i;
  typedef Matrix<int, 3, 2, RowMajor> RowMatrix32i;

  VERIFY_IS_APPROX(MatrixXi::Map(data, 2, 3, InnerStride<2>()), MatrixXi::Map(data, 2, 3, Stride<4, 2>()));
  VERIFY_IS_APPROX(MatrixXi::Map(data, 2, 3, InnerStride<>(2)), MatrixXi::Map(data, 2, 3, Stride<4, 2>()));
  VERIFY_IS_APPROX(MatrixXi::Map(data, 3, 2, InnerStride<2>()), MatrixXi::Map(data, 3, 2, Stride<6, 2>()));
  VERIFY_IS_APPROX(MatrixXi::Map(data, 3, 2, InnerStride<>(2)), MatrixXi::Map(data, 3, 2, Stride<6, 2>()));

  VERIFY_IS_APPROX(RowMatrixXi::Map(data, 2, 3, InnerStride<2>()), RowMatrixXi::Map(data, 2, 3, Stride<6, 2>()));
  VERIFY_IS_APPROX(RowMatrixXi::Map(data, 2, 3, InnerStride<>(2)), RowMatrixXi::Map(data, 2, 3, Stride<6, 2>()));
  VERIFY_IS_APPROX(RowMatrixXi::Map(data, 3, 2, InnerStride<2>()), RowMatrixXi::Map(data, 3, 2, Stride<4, 2>()));
  VERIFY_IS_APPROX(RowMatrixXi::Map(data, 3, 2, InnerStride<>(2)), RowMatrixXi::Map(data, 3, 2, Stride<4, 2>()));

  VERIFY_IS_APPROX(ColMatrix23i::Map(data, InnerStride<2>()), MatrixXi::Map(data, 2, 3, Stride<4, 2>()));
  VERIFY_IS_APPROX(ColMatrix23i::Map(data, InnerStride<>(2)), MatrixXi::Map(data, 2, 3, Stride<4, 2>()));
  VERIFY_IS_APPROX(ColMatrix32i::Map(data, InnerStride<2>()), MatrixXi::Map(data, 3, 2, Stride<6, 2>()));
  VERIFY_IS_APPROX(ColMatrix32i::Map(data, InnerStride<>(2)), MatrixXi::Map(data, 3, 2, Stride<6, 2>()));

  VERIFY_IS_APPROX(RowMatrix23i::Map(data, InnerStride<2>()), RowMatrixXi::Map(data, 2, 3, Stride<6, 2>()));
  VERIFY_IS_APPROX(RowMatrix23i::Map(data, InnerStride<>(2)), RowMatrixXi::Map(data, 2, 3, Stride<6, 2>()));
  VERIFY_IS_APPROX(RowMatrix32i::Map(data, InnerStride<2>()), RowMatrixXi::Map(data, 3, 2, Stride<4, 2>()));
  VERIFY_IS_APPROX(RowMatrix32i::Map(data, InnerStride<>(2)), RowMatrixXi::Map(data, 3, 2, Stride<4, 2>()));
}

EIGEN_DECLARE_TEST(mapstride) {
  for (int i = 0; i < g_repeat; i++) {
    int maxn = 3;
    CALL_SUBTEST_1(map_class_vector<Aligned>(Matrix<float, 1, 1>()));
    CALL_SUBTEST_1(map_class_vector<Unaligned>(Matrix<float, 1, 1>()));
    CALL_SUBTEST_2(map_class_vector<Aligned>(Vector4d()));
    CALL_SUBTEST_2(map_class_vector<Unaligned>(Vector4d()));
    CALL_SUBTEST_3(map_class_vector<Aligned>(RowVector4f()));
    CALL_SUBTEST_3(map_class_vector<Unaligned>(RowVector4f()));
    CALL_SUBTEST_4(map_class_vector<Aligned>(VectorXcf(internal::random<int>(1, maxn))));
    CALL_SUBTEST_4(map_class_vector<Unaligned>(VectorXcf(internal::random<int>(1, maxn))));
    CALL_SUBTEST_5(map_class_vector<Aligned>(VectorXi(internal::random<int>(1, maxn))));
    CALL_SUBTEST_5(map_class_vector<Unaligned>(VectorXi(internal::random<int>(1, maxn))));

    CALL_SUBTEST_1(map_class_matrix<Aligned>(Matrix<float, 1, 1>()));
    CALL_SUBTEST_1(map_class_matrix<Unaligned>(Matrix<float, 1, 1>()));
    CALL_SUBTEST_2(map_class_matrix<Aligned>(Matrix4d()));
    CALL_SUBTEST_2(map_class_matrix<Unaligned>(Matrix4d()));
    CALL_SUBTEST_3(map_class_matrix<Aligned>(Matrix<float, 3, 5>()));
    CALL_SUBTEST_3(map_class_matrix<Unaligned>(Matrix<float, 3, 5>()));
    CALL_SUBTEST_3(map_class_matrix<Aligned>(Matrix<float, 4, 8>()));
    CALL_SUBTEST_3(map_class_matrix<Unaligned>(Matrix<float, 4, 8>()));
    CALL_SUBTEST_4(
        map_class_matrix<Aligned>(MatrixXcf(internal::random<int>(1, maxn), internal::random<int>(1, maxn))));
    CALL_SUBTEST_4(
        map_class_matrix<Unaligned>(MatrixXcf(internal::random<int>(1, maxn), internal::random<int>(1, maxn))));
    CALL_SUBTEST_5(map_class_matrix<Aligned>(MatrixXi(internal::random<int>(1, maxn), internal::random<int>(1, maxn))));
    CALL_SUBTEST_5(
        map_class_matrix<Unaligned>(MatrixXi(internal::random<int>(1, maxn), internal::random<int>(1, maxn))));
    CALL_SUBTEST_6(
        map_class_matrix<Aligned>(MatrixXcd(internal::random<int>(1, maxn), internal::random<int>(1, maxn))));
    CALL_SUBTEST_6(
        map_class_matrix<Unaligned>(MatrixXcd(internal::random<int>(1, maxn), internal::random<int>(1, maxn))));

    CALL_SUBTEST_5(bug1453<0>());

    TEST_SET_BUT_UNUSED_VARIABLE(maxn);
  }
}
