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

#include <array>
#include <Eigen/src/Core/util/Meta.h>

template <typename From, typename To>
bool check_is_convertible(const From&, const To&) {
  return internal::is_convertible<From, To>::value;
}

struct FooReturnType {
  typedef int ReturnType;
};

struct MyInterface {
  virtual void func() = 0;
  virtual ~MyInterface() {}
};
struct MyImpl : public MyInterface {
  void func() {}
};

EIGEN_DECLARE_TEST(meta) {
  VERIFY((internal::is_same<float, float>::value));
  VERIFY((!internal::is_same<float, double>::value));
  VERIFY((!internal::is_same<float, float&>::value));
  VERIFY((!internal::is_same<float, const float&>::value));

  VERIFY((internal::is_same<float, internal::remove_all_t<const float&>>::value));
  VERIFY((internal::is_same<float, internal::remove_all_t<const float*>>::value));
  VERIFY((internal::is_same<float, internal::remove_all_t<const float*&>>::value));
  VERIFY((internal::is_same<float, internal::remove_all_t<float**>>::value));
  VERIFY((internal::is_same<float, internal::remove_all_t<float**&>>::value));
  VERIFY((internal::is_same<float, internal::remove_all_t<float* const*&>>::value));
  VERIFY((internal::is_same<float, internal::remove_all_t<float* const>>::value));

  // test add_const_on_value_type
  VERIFY((internal::is_same<internal::add_const_on_value_type_t<float&>, float const&>::value));
  VERIFY((internal::is_same<internal::add_const_on_value_type_t<float*>, float const*>::value));

  VERIFY((internal::is_same<internal::add_const_on_value_type_t<float>, const float>::value));
  VERIFY((internal::is_same<internal::add_const_on_value_type_t<const float>, const float>::value));

  VERIFY((internal::is_same<internal::add_const_on_value_type_t<const float* const>, const float* const>::value));
  VERIFY((internal::is_same<internal::add_const_on_value_type_t<float* const>, const float* const>::value));

  // is_convertible
  STATIC_CHECK((internal::is_convertible<float, double>::value));
  STATIC_CHECK((internal::is_convertible<int, double>::value));
  STATIC_CHECK((internal::is_convertible<int, short>::value));
  STATIC_CHECK((internal::is_convertible<short, int>::value));
  STATIC_CHECK((internal::is_convertible<double, int>::value));
  STATIC_CHECK((internal::is_convertible<double, std::complex<double>>::value));
  STATIC_CHECK((!internal::is_convertible<std::complex<double>, double>::value));
  STATIC_CHECK((internal::is_convertible<Array33f, Matrix3f>::value));
  STATIC_CHECK((internal::is_convertible<Matrix3f&, Matrix3f>::value));
  STATIC_CHECK((internal::is_convertible<Matrix3f&, Matrix3f&>::value));
  STATIC_CHECK((internal::is_convertible<Matrix3f&, const Matrix3f&>::value));
  STATIC_CHECK((internal::is_convertible<const Matrix3f&, Matrix3f>::value));
  STATIC_CHECK((internal::is_convertible<const Matrix3f&, const Matrix3f&>::value));
  STATIC_CHECK((!internal::is_convertible<const Matrix3f&, Matrix3f&>::value));
  STATIC_CHECK((!internal::is_convertible<const Matrix3f, Matrix3f&>::value));
  STATIC_CHECK(!(internal::is_convertible<Matrix3f, Matrix3f&>::value));

  STATIC_CHECK(!(internal::is_convertible<int, int&>::value));
  STATIC_CHECK((internal::is_convertible<const int, const int&>::value));

  // STATIC_CHECK((!internal::is_convertible<Matrix3f,Matrix3d>::value )); //does not even compile because the
  // conversion is prevented by a static assertion
  STATIC_CHECK((!internal::is_convertible<Array33f, int>::value));
  STATIC_CHECK((!internal::is_convertible<MatrixXf, float>::value));
  {
    float f = 0.0f;
    MatrixXf A, B;
    VectorXf a, b;
    VERIFY((check_is_convertible(a.dot(b), f)));
    VERIFY((check_is_convertible(a.transpose() * b, f)));
    VERIFY((!check_is_convertible(A * B, f)));
    VERIFY((check_is_convertible(A * B, A)));
  }

#if (EIGEN_COMP_GNUC_STRICT && EIGEN_COMP_GNUC <= 990) || (EIGEN_COMP_CLANG_STRICT && EIGEN_COMP_CLANG <= 990) || \
    (EIGEN_COMP_MSVC && EIGEN_COMP_MSVC <= 1914)
  // See http://eigen.tuxfamily.org/bz/show_bug.cgi?id=1752,
  // a fix in the c++ standard breaks our is_convertible implementation
  // for abstract classes.
  // So the following tests are expected to fail with recent compilers.

  STATIC_CHECK((!internal::is_convertible<MyInterface, MyImpl>::value));
  STATIC_CHECK((!internal::is_convertible<MyImpl, MyInterface>::value));
  STATIC_CHECK((internal::is_convertible<MyImpl, const MyInterface&>::value));

#endif

  {
    int i = 0;
    VERIFY((check_is_convertible(fix<3>(), i)));
    VERIFY((!check_is_convertible(i, fix<DynamicIndex>())));
  }

  VERIFY((internal::has_ReturnType<FooReturnType>::value));
  VERIFY((internal::has_ReturnType<ScalarBinaryOpTraits<int, int>>::value));
  VERIFY((!internal::has_ReturnType<MatrixXf>::value));
  VERIFY((!internal::has_ReturnType<int>::value));

  VERIFY(internal::meta_sqrt<1>::ret == 1);
#define VERIFY_META_SQRT(X) VERIFY(internal::meta_sqrt<X>::ret == int(std::sqrt(double(X))))
  VERIFY_META_SQRT(2);
  VERIFY_META_SQRT(3);
  VERIFY_META_SQRT(4);
  VERIFY_META_SQRT(5);
  VERIFY_META_SQRT(6);
  VERIFY_META_SQRT(8);
  VERIFY_META_SQRT(9);
  VERIFY_META_SQRT(15);
  VERIFY_META_SQRT(16);
  VERIFY_META_SQRT(17);
  VERIFY_META_SQRT(255);
  VERIFY_META_SQRT(256);
  VERIFY_META_SQRT(257);
  VERIFY_META_SQRT(1023);
  VERIFY_META_SQRT(1024);
  VERIFY_META_SQRT(1025);
}

using Eigen::internal::apply_op_from_left;
using Eigen::internal::apply_op_from_right;
using Eigen::internal::arg_prod;
using Eigen::internal::arg_sum;
using Eigen::internal::array_apply;
using Eigen::internal::array_apply_and_reduce;
using Eigen::internal::array_prod;
using Eigen::internal::array_reduce;
using Eigen::internal::array_reverse;
using Eigen::internal::array_sum;
using Eigen::internal::array_zip;
using Eigen::internal::array_zip_and_reduce;
using Eigen::internal::concat;
using Eigen::internal::contained_in_list;
using Eigen::internal::contained_in_list_gf;
using Eigen::internal::gen_numeric_list;
using Eigen::internal::gen_numeric_list_repeated;
using Eigen::internal::gen_numeric_list_reversed;
using Eigen::internal::gen_numeric_list_swapped_pair;
// Eigen::internal::get is intentionally left fully-qualified below: test/main.h
// does `using namespace Eigen;`, and Eigen/src/Core/StructuredBindings.h defines
// free functions `Eigen::get` that would otherwise clash with this metafunction.
using Eigen::internal::id_numeric;
using Eigen::internal::id_type;
using Eigen::internal::instantiate_by_c_array;
using Eigen::internal::is_same;
using Eigen::internal::is_same_gf;
using Eigen::internal::mconcat;
using Eigen::internal::numeric_list;
using Eigen::internal::product_op;
using Eigen::internal::repeat;
using Eigen::internal::skip;
using Eigen::internal::slice;
using Eigen::internal::sum_op;
using Eigen::internal::take;
using Eigen::internal::type_list;

struct dummy_a {};
struct dummy_b {};
struct dummy_c {};
struct dummy_d {};
struct dummy_e {};

// dummy operation for testing apply
template <typename A, typename B>
struct dummy_op;
template <>
struct dummy_op<dummy_a, dummy_b> {
  typedef dummy_c type;
};
template <>
struct dummy_op<dummy_b, dummy_a> {
  typedef dummy_d type;
};
template <>
struct dummy_op<dummy_b, dummy_c> {
  typedef dummy_a type;
};
template <>
struct dummy_op<dummy_c, dummy_b> {
  typedef dummy_d type;
};
template <>
struct dummy_op<dummy_c, dummy_a> {
  typedef dummy_b type;
};
template <>
struct dummy_op<dummy_a, dummy_c> {
  typedef dummy_d type;
};
template <>
struct dummy_op<dummy_a, dummy_a> {
  typedef dummy_e type;
};
template <>
struct dummy_op<dummy_b, dummy_b> {
  typedef dummy_e type;
};
template <>
struct dummy_op<dummy_c, dummy_c> {
  typedef dummy_e type;
};

template <typename A, typename B>
struct dummy_test {
  constexpr static bool value = false;
  constexpr static int global_flags = 0;
};
template <>
struct dummy_test<dummy_a, dummy_a> {
  constexpr static bool value = true;
  constexpr static int global_flags = 1;
};
template <>
struct dummy_test<dummy_b, dummy_b> {
  constexpr static bool value = true;
  constexpr static int global_flags = 2;
};
template <>
struct dummy_test<dummy_c, dummy_c> {
  constexpr static bool value = true;
  constexpr static int global_flags = 4;
};

struct times2_op {
  template <typename A>
  static A run(A v) {
    return v * 2;
  }
};

struct dummy_inst {
  int c;

  dummy_inst() : c(0) {}
  explicit dummy_inst(int) : c(1) {}
  dummy_inst(int, int) : c(2) {}
  dummy_inst(int, int, int) : c(3) {}
  dummy_inst(int, int, int, int) : c(4) {}
  dummy_inst(int, int, int, int, int) : c(5) {}
};

static void test_gen_numeric_list() {
  VERIFY((is_same<typename gen_numeric_list<int, 0>::type, numeric_list<int>>::value));
  VERIFY((is_same<typename gen_numeric_list<int, 1>::type, numeric_list<int, 0>>::value));
  VERIFY((is_same<typename gen_numeric_list<int, 2>::type, numeric_list<int, 0, 1>>::value));
  VERIFY((is_same<typename gen_numeric_list<int, 5>::type, numeric_list<int, 0, 1, 2, 3, 4>>::value));
  VERIFY((is_same<typename gen_numeric_list<int, 10>::type, numeric_list<int, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9>>::value));

  VERIFY((is_same<typename gen_numeric_list<int, 0, 42>::type, numeric_list<int>>::value));
  VERIFY((is_same<typename gen_numeric_list<int, 1, 42>::type, numeric_list<int, 42>>::value));
  VERIFY((is_same<typename gen_numeric_list<int, 2, 42>::type, numeric_list<int, 42, 43>>::value));
  VERIFY((is_same<typename gen_numeric_list<int, 5, 42>::type, numeric_list<int, 42, 43, 44, 45, 46>>::value));
  VERIFY((is_same<typename gen_numeric_list<int, 10, 42>::type,
                  numeric_list<int, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51>>::value));

  VERIFY((is_same<typename gen_numeric_list_reversed<int, 0>::type, numeric_list<int>>::value));
  VERIFY((is_same<typename gen_numeric_list_reversed<int, 1>::type, numeric_list<int, 0>>::value));
  VERIFY((is_same<typename gen_numeric_list_reversed<int, 2>::type, numeric_list<int, 1, 0>>::value));
  VERIFY((is_same<typename gen_numeric_list_reversed<int, 5>::type, numeric_list<int, 4, 3, 2, 1, 0>>::value));
  VERIFY((is_same<typename gen_numeric_list_reversed<int, 10>::type,
                  numeric_list<int, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0>>::value));

  VERIFY((is_same<typename gen_numeric_list_reversed<int, 0, 42>::type, numeric_list<int>>::value));
  VERIFY((is_same<typename gen_numeric_list_reversed<int, 1, 42>::type, numeric_list<int, 42>>::value));
  VERIFY((is_same<typename gen_numeric_list_reversed<int, 2, 42>::type, numeric_list<int, 43, 42>>::value));
  VERIFY((is_same<typename gen_numeric_list_reversed<int, 5, 42>::type, numeric_list<int, 46, 45, 44, 43, 42>>::value));
  VERIFY((is_same<typename gen_numeric_list_reversed<int, 10, 42>::type,
                  numeric_list<int, 51, 50, 49, 48, 47, 46, 45, 44, 43, 42>>::value));

  VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 0, 2, 3>::type, numeric_list<int>>::value));
  VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 1, 2, 3>::type, numeric_list<int, 0>>::value));
  VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 2, 2, 3>::type, numeric_list<int, 0, 1>>::value));
  VERIFY(
      (is_same<typename gen_numeric_list_swapped_pair<int, 5, 2, 3>::type, numeric_list<int, 0, 1, 3, 2, 4>>::value));
  VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 10, 2, 3>::type,
                  numeric_list<int, 0, 1, 3, 2, 4, 5, 6, 7, 8, 9>>::value));

  VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 0, 44, 45, 42>::type, numeric_list<int>>::value));
  VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 1, 44, 45, 42>::type, numeric_list<int, 42>>::value));
  VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 2, 44, 45, 42>::type, numeric_list<int, 42, 43>>::value));
  VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 5, 44, 45, 42>::type,
                  numeric_list<int, 42, 43, 45, 44, 46>>::value));
  VERIFY((is_same<typename gen_numeric_list_swapped_pair<int, 10, 44, 45, 42>::type,
                  numeric_list<int, 42, 43, 45, 44, 46, 47, 48, 49, 50, 51>>::value));

  VERIFY((is_same<typename gen_numeric_list_repeated<int, 0, 0>::type, numeric_list<int>>::value));
  VERIFY((is_same<typename gen_numeric_list_repeated<int, 1, 0>::type, numeric_list<int, 0>>::value));
  VERIFY((is_same<typename gen_numeric_list_repeated<int, 2, 0>::type, numeric_list<int, 0, 0>>::value));
  VERIFY((is_same<typename gen_numeric_list_repeated<int, 5, 0>::type, numeric_list<int, 0, 0, 0, 0, 0>>::value));
  VERIFY((is_same<typename gen_numeric_list_repeated<int, 10, 0>::type,
                  numeric_list<int, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0>>::value));
}

static void test_concat() {
  VERIFY(
      (is_same<typename concat<type_list<dummy_a, dummy_a>, type_list<>>::type, type_list<dummy_a, dummy_a>>::value));
  VERIFY(
      (is_same<typename concat<type_list<>, type_list<dummy_a, dummy_a>>::type, type_list<dummy_a, dummy_a>>::value));
  VERIFY((is_same<typename concat<type_list<dummy_a, dummy_a>, type_list<dummy_a, dummy_a>>::type,
                  type_list<dummy_a, dummy_a, dummy_a, dummy_a>>::value));
  VERIFY((is_same<typename concat<type_list<dummy_a, dummy_a>, type_list<dummy_b, dummy_c>>::type,
                  type_list<dummy_a, dummy_a, dummy_b, dummy_c>>::value));
  VERIFY((is_same<typename concat<type_list<dummy_a>, type_list<dummy_b, dummy_c>>::type,
                  type_list<dummy_a, dummy_b, dummy_c>>::value));

  VERIFY((is_same<typename concat<numeric_list<int, 0, 0>, numeric_list<int>>::type, numeric_list<int, 0, 0>>::value));
  VERIFY((is_same<typename concat<numeric_list<int>, numeric_list<int, 0, 0>>::type, numeric_list<int, 0, 0>>::value));
  VERIFY((is_same<typename concat<numeric_list<int, 0, 0>, numeric_list<int, 0, 0>>::type,
                  numeric_list<int, 0, 0, 0, 0>>::value));
  VERIFY((is_same<typename concat<numeric_list<int, 0, 0>, numeric_list<int, 1, 2>>::type,
                  numeric_list<int, 0, 0, 1, 2>>::value));
  VERIFY((is_same<typename concat<numeric_list<int, 0>, numeric_list<int, 1, 2>>::type,
                  numeric_list<int, 0, 1, 2>>::value));

  VERIFY((is_same<typename mconcat<type_list<dummy_a>>::type, type_list<dummy_a>>::value));
  VERIFY((is_same<typename mconcat<type_list<dummy_a>, type_list<dummy_b>>::type, type_list<dummy_a, dummy_b>>::value));
  VERIFY((is_same<typename mconcat<type_list<dummy_a>, type_list<dummy_b>, type_list<dummy_c>>::type,
                  type_list<dummy_a, dummy_b, dummy_c>>::value));
  VERIFY((is_same<typename mconcat<type_list<dummy_a>, type_list<dummy_b, dummy_c>>::type,
                  type_list<dummy_a, dummy_b, dummy_c>>::value));
  VERIFY((is_same<typename mconcat<type_list<dummy_a, dummy_b>, type_list<dummy_c>>::type,
                  type_list<dummy_a, dummy_b, dummy_c>>::value));

  VERIFY((is_same<typename mconcat<numeric_list<int, 0>>::type, numeric_list<int, 0>>::value));
  VERIFY((is_same<typename mconcat<numeric_list<int, 0>, numeric_list<int, 1>>::type, numeric_list<int, 0, 1>>::value));
  VERIFY((is_same<typename mconcat<numeric_list<int, 0>, numeric_list<int, 1>, numeric_list<int, 2>>::type,
                  numeric_list<int, 0, 1, 2>>::value));
  VERIFY((is_same<typename mconcat<numeric_list<int, 0>, numeric_list<int, 1, 2>>::type,
                  numeric_list<int, 0, 1, 2>>::value));
  VERIFY((is_same<typename mconcat<numeric_list<int, 0, 1>, numeric_list<int, 2>>::type,
                  numeric_list<int, 0, 1, 2>>::value));
}

static void test_slice() {
  typedef type_list<dummy_a, dummy_a, dummy_b, dummy_b, dummy_c, dummy_c> tl;
  typedef numeric_list<int, 0, 1, 2, 3, 4, 5> il;

  VERIFY((is_same<typename take<0, tl>::type, type_list<>>::value));
  VERIFY((is_same<typename take<1, tl>::type, type_list<dummy_a>>::value));
  VERIFY((is_same<typename take<2, tl>::type, type_list<dummy_a, dummy_a>>::value));
  VERIFY((is_same<typename take<3, tl>::type, type_list<dummy_a, dummy_a, dummy_b>>::value));
  VERIFY((is_same<typename take<4, tl>::type, type_list<dummy_a, dummy_a, dummy_b, dummy_b>>::value));
  VERIFY((is_same<typename take<5, tl>::type, type_list<dummy_a, dummy_a, dummy_b, dummy_b, dummy_c>>::value));
  VERIFY((is_same<typename take<6, tl>::type, type_list<dummy_a, dummy_a, dummy_b, dummy_b, dummy_c, dummy_c>>::value));

  VERIFY((is_same<typename take<0, il>::type, numeric_list<int>>::value));
  VERIFY((is_same<typename take<1, il>::type, numeric_list<int, 0>>::value));
  VERIFY((is_same<typename take<2, il>::type, numeric_list<int, 0, 1>>::value));
  VERIFY((is_same<typename take<3, il>::type, numeric_list<int, 0, 1, 2>>::value));
  VERIFY((is_same<typename take<4, il>::type, numeric_list<int, 0, 1, 2, 3>>::value));
  VERIFY((is_same<typename take<5, il>::type, numeric_list<int, 0, 1, 2, 3, 4>>::value));
  VERIFY((is_same<typename take<6, il>::type, numeric_list<int, 0, 1, 2, 3, 4, 5>>::value));

  VERIFY((is_same<typename skip<0, tl>::type, type_list<dummy_a, dummy_a, dummy_b, dummy_b, dummy_c, dummy_c>>::value));
  VERIFY((is_same<typename skip<1, tl>::type, type_list<dummy_a, dummy_b, dummy_b, dummy_c, dummy_c>>::value));
  VERIFY((is_same<typename skip<2, tl>::type, type_list<dummy_b, dummy_b, dummy_c, dummy_c>>::value));
  VERIFY((is_same<typename skip<3, tl>::type, type_list<dummy_b, dummy_c, dummy_c>>::value));
  VERIFY((is_same<typename skip<4, tl>::type, type_list<dummy_c, dummy_c>>::value));
  VERIFY((is_same<typename skip<5, tl>::type, type_list<dummy_c>>::value));
  VERIFY((is_same<typename skip<6, tl>::type, type_list<>>::value));

  VERIFY((is_same<typename skip<0, il>::type, numeric_list<int, 0, 1, 2, 3, 4, 5>>::value));
  VERIFY((is_same<typename skip<1, il>::type, numeric_list<int, 1, 2, 3, 4, 5>>::value));
  VERIFY((is_same<typename skip<2, il>::type, numeric_list<int, 2, 3, 4, 5>>::value));
  VERIFY((is_same<typename skip<3, il>::type, numeric_list<int, 3, 4, 5>>::value));
  VERIFY((is_same<typename skip<4, il>::type, numeric_list<int, 4, 5>>::value));
  VERIFY((is_same<typename skip<5, il>::type, numeric_list<int, 5>>::value));
  VERIFY((is_same<typename skip<6, il>::type, numeric_list<int>>::value));

  VERIFY((is_same<typename slice<0, 3, tl>::type, typename take<3, tl>::type>::value));
  VERIFY((is_same<typename slice<0, 3, il>::type, typename take<3, il>::type>::value));
  VERIFY((is_same<typename slice<1, 3, tl>::type, type_list<dummy_a, dummy_b, dummy_b>>::value));
  VERIFY((is_same<typename slice<1, 3, il>::type, numeric_list<int, 1, 2, 3>>::value));
}

static void test_get() {
  typedef type_list<dummy_a, dummy_a, dummy_b, dummy_b, dummy_c, dummy_c> tl;
  typedef numeric_list<int, 4, 8, 15, 16, 23, 42> il;

  VERIFY((is_same<typename Eigen::internal::get<0, tl>::type, dummy_a>::value));
  VERIFY((is_same<typename Eigen::internal::get<1, tl>::type, dummy_a>::value));
  VERIFY((is_same<typename Eigen::internal::get<2, tl>::type, dummy_b>::value));
  VERIFY((is_same<typename Eigen::internal::get<3, tl>::type, dummy_b>::value));
  VERIFY((is_same<typename Eigen::internal::get<4, tl>::type, dummy_c>::value));
  VERIFY((is_same<typename Eigen::internal::get<5, tl>::type, dummy_c>::value));

  VERIFY_IS_EQUAL(((int)Eigen::internal::get<0, il>::value), 4);
  VERIFY_IS_EQUAL(((int)Eigen::internal::get<1, il>::value), 8);
  VERIFY_IS_EQUAL(((int)Eigen::internal::get<2, il>::value), 15);
  VERIFY_IS_EQUAL(((int)Eigen::internal::get<3, il>::value), 16);
  VERIFY_IS_EQUAL(((int)Eigen::internal::get<4, il>::value), 23);
  VERIFY_IS_EQUAL(((int)Eigen::internal::get<5, il>::value), 42);
}

static void test_id_helper(dummy_a a, dummy_a b, dummy_a c) {
  (void)a;
  (void)b;
  (void)c;
}

template <int... ii>
static void test_id_numeric() {
  test_id_helper(typename id_numeric<int, ii, dummy_a>::type()...);
}

template <typename... tt>
static void test_id_type() {
  test_id_helper(typename id_type<tt, dummy_a>::type()...);
}

static void test_id() {
  // don't call VERIFY here, just assume it works if it compiles
  // (otherwise it will complain that it can't find the function)
  test_id_numeric<1, 4, 6>();
  test_id_type<dummy_a, dummy_b, dummy_c>();
}

static void test_is_same_gf() {
  VERIFY((!is_same_gf<dummy_a, dummy_b>::value));
  VERIFY((!!is_same_gf<dummy_a, dummy_a>::value));
  VERIFY_IS_EQUAL((!!is_same_gf<dummy_a, dummy_b>::global_flags), false);
  VERIFY_IS_EQUAL((!!is_same_gf<dummy_a, dummy_a>::global_flags), false);
}

static void test_apply_op() {
  typedef type_list<dummy_a, dummy_b, dummy_c> tl;
  VERIFY((!!is_same<typename apply_op_from_left<dummy_op, dummy_a, tl>::type,
                    type_list<dummy_e, dummy_c, dummy_d>>::value));
  VERIFY((!!is_same<typename apply_op_from_right<dummy_op, dummy_a, tl>::type,
                    type_list<dummy_e, dummy_d, dummy_b>>::value));
}

static void test_contained_in_list() {
  typedef type_list<dummy_a, dummy_b, dummy_c> tl;

  VERIFY((!!contained_in_list<is_same, dummy_a, tl>::value));
  VERIFY((!!contained_in_list<is_same, dummy_b, tl>::value));
  VERIFY((!!contained_in_list<is_same, dummy_c, tl>::value));
  VERIFY((!contained_in_list<is_same, dummy_d, tl>::value));
  VERIFY((!contained_in_list<is_same, dummy_e, tl>::value));

  VERIFY((!!contained_in_list_gf<dummy_test, dummy_a, tl>::value));
  VERIFY((!!contained_in_list_gf<dummy_test, dummy_b, tl>::value));
  VERIFY((!!contained_in_list_gf<dummy_test, dummy_c, tl>::value));
  VERIFY((!contained_in_list_gf<dummy_test, dummy_d, tl>::value));
  VERIFY((!contained_in_list_gf<dummy_test, dummy_e, tl>::value));

  VERIFY_IS_EQUAL(((int)contained_in_list_gf<dummy_test, dummy_a, tl>::global_flags), 1);
  VERIFY_IS_EQUAL(((int)contained_in_list_gf<dummy_test, dummy_b, tl>::global_flags), 2);
  VERIFY_IS_EQUAL(((int)contained_in_list_gf<dummy_test, dummy_c, tl>::global_flags), 4);
  VERIFY_IS_EQUAL(((int)contained_in_list_gf<dummy_test, dummy_d, tl>::global_flags), 0);
  VERIFY_IS_EQUAL(((int)contained_in_list_gf<dummy_test, dummy_e, tl>::global_flags), 0);
}

static void test_arg_reductions() {
  VERIFY_IS_EQUAL(arg_sum(1, 2, 3, 4), 10);
  VERIFY_IS_EQUAL(arg_prod(1, 2, 3, 4), 24);
  VERIFY_IS_APPROX(arg_sum(0.5, 2, 5), 7.5);
  VERIFY_IS_APPROX(arg_prod(0.5, 2, 5), 5.0);
}

static void test_array_reverse_and_reduce() {
  array<int, 6> a{{4, 8, 15, 16, 23, 42}};
  array<int, 6> b{{42, 23, 16, 15, 8, 4}};

  // there is no operator<< for std::array, so VERIFY_IS_EQUAL will
  // not compile
  VERIFY((array_reverse(a) == b));
  VERIFY((array_reverse(b) == a));
  VERIFY_IS_EQUAL((array_sum(a)), 108);
  VERIFY_IS_EQUAL((array_sum(b)), 108);
  VERIFY_IS_EQUAL((array_prod(a)), 7418880);
  VERIFY_IS_EQUAL((array_prod(b)), 7418880);
}

static void test_array_zip_and_apply() {
  array<int, 6> a{{4, 8, 15, 16, 23, 42}};
  array<int, 6> b{{0, 1, 2, 3, 4, 5}};
  array<int, 6> c{{4, 9, 17, 19, 27, 47}};
  array<int, 6> d{{0, 8, 30, 48, 92, 210}};
  array<int, 6> e{{0, 2, 4, 6, 8, 10}};

  VERIFY((array_zip<sum_op>(a, b) == c));
  VERIFY((array_zip<product_op>(a, b) == d));
  VERIFY((array_apply<times2_op>(b) == e));
  VERIFY_IS_EQUAL((array_apply_and_reduce<sum_op, times2_op>(a)), 216);
  VERIFY_IS_EQUAL((array_apply_and_reduce<sum_op, times2_op>(b)), 30);
  VERIFY_IS_EQUAL((array_zip_and_reduce<product_op, sum_op>(a, b)), 14755932);
  VERIFY_IS_EQUAL((array_zip_and_reduce<sum_op, product_op>(a, b)), 388);
}

static void test_array_misc() {
  array<int, 3> a3{{1, 1, 1}};
  array<int, 6> a6{{2, 2, 2, 2, 2, 2}};
  VERIFY((repeat<3, int>(1) == a3));
  VERIFY((repeat<6, int>(2) == a6));

  int data[5] = {0, 1, 2, 3, 4};
  VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 0>(data).c), 0);
  VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 1>(data).c), 1);
  VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 2>(data).c), 2);
  VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 3>(data).c), 3);
  VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 4>(data).c), 4);
  VERIFY_IS_EQUAL((instantiate_by_c_array<dummy_inst, int, 5>(data).c), 5);
}

EIGEN_DECLARE_TEST(cxx11_meta) {
  CALL_SUBTEST(test_gen_numeric_list());
  CALL_SUBTEST(test_concat());
  CALL_SUBTEST(test_slice());
  CALL_SUBTEST(test_get());
  CALL_SUBTEST(test_id());
  CALL_SUBTEST(test_is_same_gf());
  CALL_SUBTEST(test_apply_op());
  CALL_SUBTEST(test_contained_in_list());
  CALL_SUBTEST(test_arg_reductions());
  CALL_SUBTEST(test_array_reverse_and_reduce());
  CALL_SUBTEST(test_array_zip_and_apply());
  CALL_SUBTEST(test_array_misc());
}
