// 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/.

#include <valarray>
#include <vector>
#include "main.h"

using Eigen::placeholders::all;
using Eigen::placeholders::last;
using Eigen::placeholders::lastN;
using Eigen::placeholders::lastp1;
#include <array>

typedef std::pair<Index, Index> IndexPair;

int encode(Index i, Index j) { return int(i * 100 + j); }

IndexPair decode(Index ij) { return IndexPair(ij / 100, ij % 100); }

template <typename T>
bool match(const T& xpr, std::string ref, std::string str_xpr = "") {
  EIGEN_UNUSED_VARIABLE(str_xpr);
  std::stringstream str;
  str << xpr;
  if (!(str.str() == ref)) std::cout << str_xpr << "\n" << xpr << "\n\n";
  return str.str() == ref;
}

#define MATCH(X, R) match(X, R, #X)

template <typename T1, typename T2>
std::enable_if_t<internal::is_same<T1, T2>::value, bool> is_same_eq(const T1& a, const T2& b) {
  return (a == b).all();
}

template <typename T1, typename T2>
bool is_same_seq(const T1& a, const T2& b) {
  bool ok = a.first() == b.first() && a.size() == b.size() && Index(a.incrObject()) == Index(b.incrObject());
  ;
  if (!ok) {
    std::cerr << "seqN(" << a.first() << ", " << a.size() << ", " << Index(a.incrObject()) << ") != ";
    std::cerr << "seqN(" << b.first() << ", " << b.size() << ", " << Index(b.incrObject()) << ")\n";
  }
  return ok;
}

template <typename T1, typename T2>
std::enable_if_t<internal::is_same<T1, T2>::value, bool> is_same_seq_type(const T1& a, const T2& b) {
  return is_same_seq(a, b);
}

#define VERIFY_EQ_INT(A, B) VERIFY_IS_APPROX(int(A), int(B))

// C++03 does not allow local or unnamed enums as index
enum DummyEnum { XX = 0, YY = 1 };

void check_indexed_view() {
  Index n = 10;

  ArrayXd a = ArrayXd::LinSpaced(n, 0, n - 1);
  Array<double, 1, Dynamic> b = a.transpose();

  ArrayXXi A = ArrayXXi::NullaryExpr(n, n, std::ref(encode));

  for (Index i = 0; i < n; ++i)
    for (Index j = 0; j < n; ++j) VERIFY(decode(A(i, j)) == IndexPair(i, j));

  Array4i eii(4);
  eii << 3, 1, 6, 5;
  std::valarray<int> vali(4);
  Map<ArrayXi>(&vali[0], 4) = eii;
  std::vector<int> veci(4);
  Map<ArrayXi>(veci.data(), 4) = eii;

  VERIFY(MATCH(A(3, seq(9, 3, -1)), "309  308  307  306  305  304  303"));

  VERIFY(MATCH(A(seqN(2, 5), seq(9, 3, -1)),
               "209  208  207  206  205  204  203\n"
               "309  308  307  306  305  304  303\n"
               "409  408  407  406  405  404  403\n"
               "509  508  507  506  505  504  503\n"
               "609  608  607  606  605  604  603"));

  VERIFY(MATCH(A(seqN(2, 5), 5),
               "205\n"
               "305\n"
               "405\n"
               "505\n"
               "605"));

  VERIFY(MATCH(A(seqN(last, 5, -1), seq(2, last)),
               "902  903  904  905  906  907  908  909\n"
               "802  803  804  805  806  807  808  809\n"
               "702  703  704  705  706  707  708  709\n"
               "602  603  604  605  606  607  608  609\n"
               "502  503  504  505  506  507  508  509"));

  VERIFY(MATCH(A(eii, veci),
               "303  301  306  305\n"
               "103  101  106  105\n"
               "603  601  606  605\n"
               "503  501  506  505"));

  VERIFY(MATCH(A(eii, all),
               "300  301  302  303  304  305  306  307  308  309\n"
               "100  101  102  103  104  105  106  107  108  109\n"
               "600  601  602  603  604  605  606  607  608  609\n"
               "500  501  502  503  504  505  506  507  508  509"));

  // take row number 3, and repeat it 5 times
  VERIFY(MATCH(A(seqN(3, 5, 0), all),
               "300  301  302  303  304  305  306  307  308  309\n"
               "300  301  302  303  304  305  306  307  308  309\n"
               "300  301  302  303  304  305  306  307  308  309\n"
               "300  301  302  303  304  305  306  307  308  309\n"
               "300  301  302  303  304  305  306  307  308  309"));

  VERIFY(MATCH(a(seqN(3, 3), 0), "3\n4\n5"));
  VERIFY(MATCH(a(seq(3, 5)), "3\n4\n5"));
  VERIFY(MATCH(a(seqN(3, 3, 1)), "3\n4\n5"));
  VERIFY(MATCH(a(seqN(5, 3, -1)), "5\n4\n3"));

  VERIFY(MATCH(b(0, seqN(3, 3)), "3  4  5"));
  VERIFY(MATCH(b(seq(3, 5)), "3  4  5"));
  VERIFY(MATCH(b(seqN(3, 3, 1)), "3  4  5"));
  VERIFY(MATCH(b(seqN(5, 3, -1)), "5  4  3"));

  VERIFY(MATCH(b(all), "0  1  2  3  4  5  6  7  8  9"));
  VERIFY(MATCH(b(eii), "3  1  6  5"));

  Array44i B;
  B.setRandom();
  VERIFY((A(seqN(2, 5), 5)).ColsAtCompileTime == 1);
  VERIFY((A(seqN(2, 5), 5)).RowsAtCompileTime == Dynamic);
  VERIFY_EQ_INT((A(seqN(2, 5), 5)).InnerStrideAtCompileTime, A.InnerStrideAtCompileTime);
  VERIFY_EQ_INT((A(seqN(2, 5), 5)).OuterStrideAtCompileTime, A.col(5).OuterStrideAtCompileTime);

  VERIFY_EQ_INT((A(5, seqN(2, 5))).InnerStrideAtCompileTime, A.row(5).InnerStrideAtCompileTime);
  VERIFY_EQ_INT((A(5, seqN(2, 5))).OuterStrideAtCompileTime, A.row(5).OuterStrideAtCompileTime);
  VERIFY_EQ_INT((B(1, seqN(1, 2))).InnerStrideAtCompileTime, B.row(1).InnerStrideAtCompileTime);
  VERIFY_EQ_INT((B(1, seqN(1, 2))).OuterStrideAtCompileTime, B.row(1).OuterStrideAtCompileTime);

  VERIFY_EQ_INT((A(seqN(2, 5), seq(1, 3))).InnerStrideAtCompileTime, A.InnerStrideAtCompileTime);
  VERIFY_EQ_INT((A(seqN(2, 5), seq(1, 3))).OuterStrideAtCompileTime, A.OuterStrideAtCompileTime);
  VERIFY_EQ_INT((B(seqN(1, 2), seq(1, 3))).InnerStrideAtCompileTime, B.InnerStrideAtCompileTime);
  VERIFY_EQ_INT((B(seqN(1, 2), seq(1, 3))).OuterStrideAtCompileTime, B.OuterStrideAtCompileTime);
  VERIFY_EQ_INT((A(seqN(2, 5, 2), seq(1, 3, 2))).InnerStrideAtCompileTime, Dynamic);
  VERIFY_EQ_INT((A(seqN(2, 5, 2), seq(1, 3, 2))).OuterStrideAtCompileTime, Dynamic);
  VERIFY_EQ_INT((A(seqN(2, 5, fix<2>), seq(1, 3, fix<3>))).InnerStrideAtCompileTime, 2);
  VERIFY_EQ_INT((A(seqN(2, 5, fix<2>), seq(1, 3, fix<3>))).OuterStrideAtCompileTime, Dynamic);
  VERIFY_EQ_INT((B(seqN(1, 2, fix<2>), seq(1, 3, fix<3>))).InnerStrideAtCompileTime, 2);
  VERIFY_EQ_INT((B(seqN(1, 2, fix<2>), seq(1, 3, fix<3>))).OuterStrideAtCompileTime, 3 * 4);

  VERIFY_EQ_INT((A(seqN(2, fix<5>), seqN(1, fix<3>))).RowsAtCompileTime, 5);
  VERIFY_EQ_INT((A(seqN(2, fix<5>), seqN(1, fix<3>))).ColsAtCompileTime, 3);
  VERIFY_EQ_INT((A(seqN(2, fix<5>(5)), seqN(1, fix<3>(3)))).RowsAtCompileTime, 5);
  VERIFY_EQ_INT((A(seqN(2, fix<5>(5)), seqN(1, fix<3>(3)))).ColsAtCompileTime, 3);
  VERIFY_EQ_INT((A(seqN(2, fix<Dynamic>(5)), seqN(1, fix<Dynamic>(3)))).RowsAtCompileTime, Dynamic);
  VERIFY_EQ_INT((A(seqN(2, fix<Dynamic>(5)), seqN(1, fix<Dynamic>(3)))).ColsAtCompileTime, Dynamic);
  VERIFY_EQ_INT((A(seqN(2, fix<Dynamic>(5)), seqN(1, fix<Dynamic>(3)))).rows(), 5);
  VERIFY_EQ_INT((A(seqN(2, fix<Dynamic>(5)), seqN(1, fix<Dynamic>(3)))).cols(), 3);

  VERIFY(is_same_seq_type(seqN(2, 5, fix<-1>), seqN(2, 5, fix<-1>(-1))));
  VERIFY(is_same_seq_type(seqN(2, 5), seqN(2, 5, fix<1>(1))));
  VERIFY(is_same_seq_type(seqN(2, 5, 3), seqN(2, 5, fix<DynamicIndex>(3))));
  VERIFY(is_same_seq_type(seq(2, 7, fix<3>), seqN(2, 2, fix<3>)));
  VERIFY(is_same_seq_type(seqN(2, fix<Dynamic>(5), 3), seqN(2, 5, fix<DynamicIndex>(3))));
  VERIFY(is_same_seq_type(seqN(2, fix<5>(5), fix<-2>), seqN(2, fix<5>, fix<-2>())));

  VERIFY(is_same_seq_type(seq(2, fix<5>), seqN(2, 4)));
  VERIFY(is_same_seq_type(seq(fix<2>, fix<5>), seqN(fix<2>, fix<4>)));
  VERIFY(is_same_seq(seqN(2, std::integral_constant<int, 5>(), std::integral_constant<int, -2>()),
                     seqN(2, fix<5>, fix<-2>())));
  VERIFY(is_same_seq(
      seq(std::integral_constant<int, 1>(), std::integral_constant<int, 5>(), std::integral_constant<int, 2>()),
      seq(fix<1>, fix<5>, fix<2>())));
  VERIFY(is_same_seq_type(seqN(2, std::integral_constant<int, 5>(), std::integral_constant<int, -2>()),
                          seqN(2, fix<5>, fix<-2>())));
  VERIFY(is_same_seq_type(
      seq(std::integral_constant<int, 1>(), std::integral_constant<int, 5>(), std::integral_constant<int, 2>()),
      seq(fix<1>, fix<5>, fix<2>())));

  VERIFY(is_same_seq_type(seqN(2, std::integral_constant<int, 5>()), seqN(2, fix<5>)));
  VERIFY(
      is_same_seq_type(seq(std::integral_constant<int, 1>(), std::integral_constant<int, 5>()), seq(fix<1>, fix<5>)));

  VERIFY((A(seqN(2, fix<5>), 5)).RowsAtCompileTime == 5);
  VERIFY((A(4, all)).ColsAtCompileTime == Dynamic);
  VERIFY((A(4, all)).RowsAtCompileTime == 1);
  VERIFY((B(1, all)).ColsAtCompileTime == 4);
  VERIFY((B(1, all)).RowsAtCompileTime == 1);
  VERIFY((B(all, 1)).ColsAtCompileTime == 1);
  VERIFY((B(all, 1)).RowsAtCompileTime == 4);

  VERIFY(int((A(all, eii)).ColsAtCompileTime) == int(eii.SizeAtCompileTime));
  VERIFY_EQ_INT((A(eii, eii)).Flags & DirectAccessBit, (unsigned int)(0));
  VERIFY_EQ_INT((A(eii, eii)).InnerStrideAtCompileTime, 0);
  VERIFY_EQ_INT((A(eii, eii)).OuterStrideAtCompileTime, 0);

  VERIFY_IS_APPROX(A(seq(n - 1, 2, -2), seqN(n - 1 - 6, 3, -1)), A(seq(last, 2, fix<-2>), seqN(last - 6, 3, fix<-1>)));

  VERIFY_IS_APPROX(A(seq(n - 1, 2, -2), seqN(n - 1 - 6, 4)), A(seq(last, 2, -2), seqN(last - 6, 4)));
  VERIFY_IS_APPROX(A(seq(n - 1 - 6, n - 1 - 2), seqN(n - 1 - 6, 4)),
                   A(seq(last - 6, last - 2), seqN(6 + last - 6 - 6, 4)));
  VERIFY_IS_APPROX(A(seq((n - 1) / 2, (n) / 2 + 3), seqN(2, 4)),
                   A(seq(last / 2, (last + 1) / 2 + 3), seqN(last + 2 - last, 4)));
  VERIFY_IS_APPROX(A(seq(n - 2, 2, -2), seqN(n - 8, 4)), A(seq(lastp1 - 2, 2, -2), seqN(lastp1 - 8, 4)));

  // Check all combinations of seq:
  VERIFY_IS_APPROX(A(seq(1, n - 1 - 2, 2), seq(1, n - 1 - 2, 2)), A(seq(1, last - 2, 2), seq(1, last - 2, fix<2>)));
  VERIFY_IS_APPROX(A(seq(n - 1 - 5, n - 1 - 2, 2), seq(n - 1 - 5, n - 1 - 2, 2)),
                   A(seq(last - 5, last - 2, 2), seq(last - 5, last - 2, fix<2>)));
  VERIFY_IS_APPROX(A(seq(n - 1 - 5, 7, 2), seq(n - 1 - 5, 7, 2)), A(seq(last - 5, 7, 2), seq(last - 5, 7, fix<2>)));
  VERIFY_IS_APPROX(A(seq(1, n - 1 - 2), seq(n - 1 - 5, 7)), A(seq(1, last - 2), seq(last - 5, 7)));
  VERIFY_IS_APPROX(A(seq(n - 1 - 5, n - 1 - 2), seq(n - 1 - 5, n - 1 - 2)),
                   A(seq(last - 5, last - 2), seq(last - 5, last - 2)));

  VERIFY_IS_APPROX(A.col(A.cols() - 1), A(all, last));
  VERIFY_IS_APPROX(A(A.rows() - 2, A.cols() / 2), A(last - 1, lastp1 / 2));
  VERIFY_IS_APPROX(a(a.size() - 2), a(last - 1));
  VERIFY_IS_APPROX(a(a.size() / 2), a((last + 1) / 2));

  // Check fall-back to Block
  {
    VERIFY(is_same_eq(A.col(0), A(all, 0)));
    VERIFY(is_same_eq(A.row(0), A(0, all)));
    VERIFY(is_same_eq(A.block(0, 0, 2, 2), A(seqN(0, 2), seq(0, 1))));
    VERIFY(is_same_eq(A.middleRows(2, 4), A(seqN(2, 4), all)));
    VERIFY(is_same_eq(A.middleCols(2, 4), A(all, seqN(2, 4))));

    VERIFY(is_same_eq(A.col(A.cols() - 1), A(all, last)));

    const ArrayXXi& cA(A);
    VERIFY(is_same_eq(cA.col(0), cA(all, 0)));
    VERIFY(is_same_eq(cA.row(0), cA(0, all)));
    VERIFY(is_same_eq(cA.block(0, 0, 2, 2), cA(seqN(0, 2), seq(0, 1))));
    VERIFY(is_same_eq(cA.middleRows(2, 4), cA(seqN(2, 4), all)));
    VERIFY(is_same_eq(cA.middleCols(2, 4), cA(all, seqN(2, 4))));

    VERIFY(is_same_eq(a.head(4), a(seq(0, 3))));
    VERIFY(is_same_eq(a.tail(4), a(seqN(last - 3, 4))));
    VERIFY(is_same_eq(a.tail(4), a(seq(lastp1 - 4, last))));
    VERIFY(is_same_eq(a.segment<4>(3), a(seqN(3, fix<4>))));
  }

  ArrayXXi A1 = A, A2 = ArrayXXi::Random(4, 4);
  ArrayXi range25(4);
  range25 << 3, 2, 4, 5;
  A1(seqN(3, 4), seq(2, 5)) = A2;
  VERIFY_IS_APPROX(A1.block(3, 2, 4, 4), A2);
  A1 = A;
  A2.setOnes();
  A1(seq(6, 3, -1), range25) = A2;
  VERIFY_IS_APPROX(A1.block(3, 2, 4, 4), A2);

  // check reverse
  {
    VERIFY(is_same_seq_type(seq(3, 7).reverse(), seqN(7, 5, fix<-1>)));
    VERIFY(is_same_seq_type(seq(7, 3, fix<-2>).reverse(), seqN(3, 3, fix<2>)));
    VERIFY_IS_APPROX(a(seqN(2, last / 2).reverse()), a(seqN(2 + (last / 2 - 1) * 1, last / 2, fix<-1>)));
    VERIFY_IS_APPROX(a(seqN(last / 2, fix<4>).reverse()), a(seqN(last / 2, fix<4>)).reverse());
    VERIFY_IS_APPROX(A(seq(last - 5, last - 1, 2).reverse(), seqN(last - 3, 3, fix<-2>).reverse()),
                     A(seq(last - 5, last - 1, 2), seqN(last - 3, 3, fix<-2>)).reverse());
  }

  // check lastN
  VERIFY_IS_APPROX(a(lastN(3)), a.tail(3));
  VERIFY(MATCH(a(lastN(3)), "7\n8\n9"));
  VERIFY_IS_APPROX(a(lastN(fix<3>())), a.tail<3>());
  VERIFY(MATCH(a(lastN(3, 2)), "5\n7\n9"));
  VERIFY(MATCH(a(lastN(3, fix<2>())), "5\n7\n9"));
  VERIFY(a(lastN(fix<3>())).SizeAtCompileTime == 3);

  VERIFY((A(all, std::array<int, 4>{{1, 3, 2, 4}})).ColsAtCompileTime == 4);

  VERIFY_IS_APPROX((A(std::array<int, 3>{{1, 3, 5}}, std::array<int, 4>{{9, 6, 3, 0}})),
                   A(seqN(1, 3, 2), seqN(9, 4, -3)));
  VERIFY_IS_EQUAL(A(std::array<int, 3>{1, 3, 5}, std::array<int, 4>{3, 1, 6, 5}).RowsAtCompileTime, 3);
  VERIFY_IS_EQUAL(A(std::array<int, 3>{1, 3, 5}, std::array<int, 4>{3, 1, 6, 5}).ColsAtCompileTime, 4);

  VERIFY_IS_EQUAL(a(std::array<int, 3>{1, 3, 5}).SizeAtCompileTime, 3);
  VERIFY_IS_EQUAL(b(std::array<int, 3>{1, 3, 5}).SizeAtCompileTime, 3);

  // check different index types (C-style array, STL container, Eigen type)
  {
    Index size = 10;
    ArrayXd r = ArrayXd::Random(size);
    ArrayXi idx = ArrayXi::EqualSpaced(size, 0, 1);
    std::shuffle(idx.begin(), idx.end(), std::random_device());

    int c_array[3] = {idx[0], idx[1], idx[2]};
    std::vector<int> std_vector{idx[0], idx[1], idx[2]};
    Matrix<int, 3, 1> eigen_matrix{idx[0], idx[1], idx[2]};

    // non-const access
    VERIFY_IS_CWISE_EQUAL(r({idx[0], idx[1], idx[2]}), r(c_array));
    VERIFY_IS_CWISE_EQUAL(r({idx[0], idx[1], idx[2]}), r(std_vector));
    VERIFY_IS_CWISE_EQUAL(r({idx[0], idx[1], idx[2]}), r(eigen_matrix));
    VERIFY_IS_CWISE_EQUAL(r(std_vector), r(c_array));
    VERIFY_IS_CWISE_EQUAL(r(std_vector), r(eigen_matrix));
    VERIFY_IS_CWISE_EQUAL(r(eigen_matrix), r(c_array));

    const ArrayXd& r_ref = r;
    // const access
    VERIFY_IS_CWISE_EQUAL(r_ref({idx[0], idx[1], idx[2]}), r_ref(c_array));
    VERIFY_IS_CWISE_EQUAL(r_ref({idx[0], idx[1], idx[2]}), r_ref(std_vector));
    VERIFY_IS_CWISE_EQUAL(r_ref({idx[0], idx[1], idx[2]}), r_ref(eigen_matrix));
    VERIFY_IS_CWISE_EQUAL(r_ref(std_vector), r_ref(c_array));
    VERIFY_IS_CWISE_EQUAL(r_ref(std_vector), r_ref(eigen_matrix));
    VERIFY_IS_CWISE_EQUAL(r_ref(eigen_matrix), r_ref(c_array));
  }

  {
    Index rows = 8;
    Index cols = 11;
    ArrayXXd R = ArrayXXd::Random(rows, cols);
    ArrayXi r_idx = ArrayXi::EqualSpaced(rows, 0, 1);
    ArrayXi c_idx = ArrayXi::EqualSpaced(cols, 0, 1);
    std::shuffle(r_idx.begin(), r_idx.end(), std::random_device());
    std::shuffle(c_idx.begin(), c_idx.end(), std::random_device());

    int c_array_rows[3] = {r_idx[0], r_idx[1], r_idx[2]};
    int c_array_cols[4] = {c_idx[0], c_idx[1], c_idx[2], c_idx[3]};
    std::vector<int> std_vector_rows{r_idx[0], r_idx[1], r_idx[2]};
    std::vector<int> std_vector_cols{c_idx[0], c_idx[1], c_idx[2], c_idx[3]};
    Matrix<int, 3, 1> eigen_matrix_rows{r_idx[0], r_idx[1], r_idx[2]};
    Matrix<int, 4, 1> eigen_matrix_cols{c_idx[0], c_idx[1], c_idx[2], c_idx[3]};

    // non-const access
    VERIFY_IS_CWISE_EQUAL(R({r_idx[0], r_idx[1], r_idx[2]}, {c_idx[0], c_idx[1], c_idx[2], c_idx[3]}),
                          R(c_array_rows, c_array_cols));
    VERIFY_IS_CWISE_EQUAL(R({r_idx[0], r_idx[1], r_idx[2]}, {c_idx[0], c_idx[1], c_idx[2], c_idx[3]}),
                          R(std_vector_rows, std_vector_cols));
    VERIFY_IS_CWISE_EQUAL(R({r_idx[0], r_idx[1], r_idx[2]}, {c_idx[0], c_idx[1], c_idx[2], c_idx[3]}),
                          R(eigen_matrix_rows, eigen_matrix_cols));
    VERIFY_IS_CWISE_EQUAL(R(std_vector_rows, std_vector_cols), R(c_array_rows, c_array_cols));
    VERIFY_IS_CWISE_EQUAL(R(std_vector_rows, std_vector_cols), R(eigen_matrix_rows, eigen_matrix_cols));
    VERIFY_IS_CWISE_EQUAL(R(eigen_matrix_rows, eigen_matrix_cols), R(c_array_rows, c_array_cols));

    const ArrayXXd& R_ref = R;
    // const access
    VERIFY_IS_CWISE_EQUAL(R_ref({r_idx[0], r_idx[1], r_idx[2]}, {c_idx[0], c_idx[1], c_idx[2], c_idx[3]}),
                          R_ref(c_array_rows, c_array_cols));
    VERIFY_IS_CWISE_EQUAL(R_ref({r_idx[0], r_idx[1], r_idx[2]}, {c_idx[0], c_idx[1], c_idx[2], c_idx[3]}),
                          R_ref(std_vector_rows, std_vector_cols));
    VERIFY_IS_CWISE_EQUAL(R_ref({r_idx[0], r_idx[1], r_idx[2]}, {c_idx[0], c_idx[1], c_idx[2], c_idx[3]}),
                          R_ref(eigen_matrix_rows, eigen_matrix_cols));
    VERIFY_IS_CWISE_EQUAL(R_ref(std_vector_rows, std_vector_cols), R_ref(c_array_rows, c_array_cols));
    VERIFY_IS_CWISE_EQUAL(R_ref(std_vector_rows, std_vector_cols), R_ref(eigen_matrix_rows, eigen_matrix_cols));
    VERIFY_IS_CWISE_EQUAL(R_ref(eigen_matrix_rows, eigen_matrix_cols), R_ref(c_array_rows, c_array_cols));
  }

  // check mat(i,j) with weird types for i and j
  {
    VERIFY_IS_APPROX(A(B.RowsAtCompileTime - 1, 1), A(3, 1));
    VERIFY_IS_APPROX(A(B.RowsAtCompileTime, 1), A(4, 1));
    VERIFY_IS_APPROX(A(B.RowsAtCompileTime - 1, B.ColsAtCompileTime - 1), A(3, 3));
    VERIFY_IS_APPROX(A(B.RowsAtCompileTime, B.ColsAtCompileTime), A(4, 4));
    const Index I_ = 3, J_ = 4;
    VERIFY_IS_APPROX(A(I_, J_), A(3, 4));
  }

  // check extended block API
  {
    VERIFY(is_same_eq(A.block<3, 4>(1, 1), A.block(1, 1, fix<3>, fix<4>)));
    VERIFY(is_same_eq(A.block<3, 4>(1, 1, 3, 4), A.block(1, 1, fix<3>(), fix<4>(4))));
    VERIFY(is_same_eq(A.block<3, Dynamic>(1, 1, 3, 4), A.block(1, 1, fix<3>, 4)));
    VERIFY(is_same_eq(A.block<Dynamic, 4>(1, 1, 3, 4), A.block(1, 1, fix<Dynamic>(3), fix<4>)));
    VERIFY(is_same_eq(A.block(1, 1, 3, 4), A.block(1, 1, fix<Dynamic>(3), fix<Dynamic>(4))));

    VERIFY(is_same_eq(A.topLeftCorner<3, 4>(), A.topLeftCorner(fix<3>, fix<4>)));
    VERIFY(is_same_eq(A.bottomLeftCorner<3, 4>(), A.bottomLeftCorner(fix<3>, fix<4>)));
    VERIFY(is_same_eq(A.bottomRightCorner<3, 4>(), A.bottomRightCorner(fix<3>, fix<4>)));
    VERIFY(is_same_eq(A.topRightCorner<3, 4>(), A.topRightCorner(fix<3>, fix<4>)));

    VERIFY(is_same_eq(A.leftCols<3>(), A.leftCols(fix<3>)));
    VERIFY(is_same_eq(A.rightCols<3>(), A.rightCols(fix<3>)));
    VERIFY(is_same_eq(A.middleCols<3>(1), A.middleCols(1, fix<3>)));

    VERIFY(is_same_eq(A.topRows<3>(), A.topRows(fix<3>)));
    VERIFY(is_same_eq(A.bottomRows<3>(), A.bottomRows(fix<3>)));
    VERIFY(is_same_eq(A.middleRows<3>(1), A.middleRows(1, fix<3>)));

    VERIFY(is_same_eq(a.segment<3>(1), a.segment(1, fix<3>)));
    VERIFY(is_same_eq(a.head<3>(), a.head(fix<3>)));
    VERIFY(is_same_eq(a.tail<3>(), a.tail(fix<3>)));

    const ArrayXXi& cA(A);
    VERIFY(is_same_eq(cA.block<Dynamic, 4>(1, 1, 3, 4), cA.block(1, 1, fix<Dynamic>(3), fix<4>)));

    VERIFY(is_same_eq(cA.topLeftCorner<3, 4>(), cA.topLeftCorner(fix<3>, fix<4>)));
    VERIFY(is_same_eq(cA.bottomLeftCorner<3, 4>(), cA.bottomLeftCorner(fix<3>, fix<4>)));
    VERIFY(is_same_eq(cA.bottomRightCorner<3, 4>(), cA.bottomRightCorner(fix<3>, fix<4>)));
    VERIFY(is_same_eq(cA.topRightCorner<3, 4>(), cA.topRightCorner(fix<3>, fix<4>)));

    VERIFY(is_same_eq(cA.leftCols<3>(), cA.leftCols(fix<3>)));
    VERIFY(is_same_eq(cA.rightCols<3>(), cA.rightCols(fix<3>)));
    VERIFY(is_same_eq(cA.middleCols<3>(1), cA.middleCols(1, fix<3>)));

    VERIFY(is_same_eq(cA.topRows<3>(), cA.topRows(fix<3>)));
    VERIFY(is_same_eq(cA.bottomRows<3>(), cA.bottomRows(fix<3>)));
    VERIFY(is_same_eq(cA.middleRows<3>(1), cA.middleRows(1, fix<3>)));
  }

  // Check compilation of enums as index type:
  a(XX) = 1;
  A(XX, YY) = 1;
  // Anonymous enums only work with C++11
  enum { X = 0, Y = 1 };
  a(X) = 1;
  A(X, Y) = 1;
  A(XX, Y) = 1;
  A(X, YY) = 1;
  // check symbolic indices
  a(last) = 1.0;
  A(last, last) = 1;
  // check weird non-const, non-lvalue scenarios
  {
    // in these scenarios, the objects are not declared 'const', and the compiler will atttempt to use the non-const
    // overloads without intervention

    // non-const map to a const object
    Map<const ArrayXd> a_map(a.data(), a.size());
    Map<const ArrayXXi> A_map(A.data(), A.rows(), A.cols());

    VERIFY_IS_EQUAL(a_map(last), a.coeff(a.size() - 1));
    VERIFY_IS_EQUAL(A_map(last, last), A.coeff(A.rows() - 1, A.cols() - 1));

    // non-const expressions that have no modifiable data
    using Op = internal::scalar_constant_op<double>;
    using VectorXpr = CwiseNullaryOp<Op, VectorXd>;
    using MatrixXpr = CwiseNullaryOp<Op, MatrixXd>;
    double constant_val = internal::random<double>();
    Op op(constant_val);
    VectorXpr vectorXpr(10, 1, op);
    MatrixXpr matrixXpr(8, 11, op);

    VERIFY_IS_EQUAL(vectorXpr.coeff(vectorXpr.size() - 1), vectorXpr(last));
    VERIFY_IS_EQUAL(matrixXpr.coeff(matrixXpr.rows() - 1, matrixXpr.cols() - 1), matrixXpr(last, last));
  }

  // Check compilation of varying integer types as index types:
  Index i = n / 2;
  short i_short(i);
  std::size_t i_sizet(i);
  VERIFY_IS_EQUAL(a(i), a.coeff(i_short));
  VERIFY_IS_EQUAL(a(i), a.coeff(i_sizet));

  VERIFY_IS_EQUAL(A(i, i), A.coeff(i_short, i_short));
  VERIFY_IS_EQUAL(A(i, i), A.coeff(i_short, i));
  VERIFY_IS_EQUAL(A(i, i), A.coeff(i, i_short));
  VERIFY_IS_EQUAL(A(i, i), A.coeff(i, i_sizet));
  VERIFY_IS_EQUAL(A(i, i), A.coeff(i_sizet, i));
  VERIFY_IS_EQUAL(A(i, i), A.coeff(i_sizet, i_short));
  VERIFY_IS_EQUAL(A(i, i), A.coeff(5, i_sizet));

  // Regression test for Max{Rows,Cols}AtCompileTime
  {
    Matrix3i A3 = Matrix3i::Random();
    ArrayXi ind(5);
    ind << 1, 1, 1, 1, 1;
    VERIFY_IS_EQUAL(A3(ind, ind).eval(), MatrixXi::Constant(5, 5, A3(1, 1)));
  }

  // Regression for bug 1736
  {
    VERIFY_IS_APPROX(A(all, eii).col(0).eval(), A.col(eii(0)));
    A(all, eii).col(0) = A.col(eii(0));
  }

  // bug 1815: IndexedView should allow linear access
  {
    VERIFY(MATCH(b(eii)(0), "3"));
    VERIFY(MATCH(a(eii)(0), "3"));
    VERIFY(MATCH(A(1, eii)(0), "103"));
    VERIFY(MATCH(A(eii, 1)(0), "301"));
    VERIFY(MATCH(A(1, all)(1), "101"));
    VERIFY(MATCH(A(all, 1)(1), "101"));
  }

  // bug #2375: indexing over matrices of dim >128 should compile on gcc
  {
    Matrix<double, 513, 3> large_mat = Matrix<double, 513, 3>::Random();
    std::array<int, 2> test_indices = {0, 1};
    Matrix<double, 513, 2> thin_slice = large_mat(all, test_indices);
    for (int col = 0; col < int(test_indices.size()); ++col)
      for (int row = 0; row < large_mat.rows(); ++row) VERIFY_IS_EQUAL(thin_slice(row, col), large_mat(row, col));
  }

  // Bug IndexView with a single static row should be RowMajor:
  {
    // A(1, seq(0,2,1)).cwiseAbs().colwise().replicate(2).eval();
    STATIC_CHECK(((internal::evaluator<decltype(A(1, seq(0, 2, 1)))>::Flags & RowMajorBit) == RowMajorBit));
  }
}

EIGEN_DECLARE_TEST(indexed_view) {
  //   for(int i = 0; i < g_repeat; i++) {
  CALL_SUBTEST_1(check_indexed_view());
  //   }

  // static checks of some internals:
  STATIC_CHECK((internal::is_valid_index_type<int>::value));
  STATIC_CHECK((internal::is_valid_index_type<unsigned int>::value));
  STATIC_CHECK((internal::is_valid_index_type<short>::value));
  STATIC_CHECK((internal::is_valid_index_type<std::ptrdiff_t>::value));
  STATIC_CHECK((internal::is_valid_index_type<std::size_t>::value));
  STATIC_CHECK((!internal::valid_indexed_view_overload<int, int>::value));
  STATIC_CHECK((!internal::valid_indexed_view_overload<int, std::ptrdiff_t>::value));
  STATIC_CHECK((!internal::valid_indexed_view_overload<std::ptrdiff_t, int>::value));
  STATIC_CHECK((!internal::valid_indexed_view_overload<std::size_t, int>::value));
}
