// 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 "main.h"

using Eigen::placeholders::all;
using Eigen::placeholders::last;
using Eigen::placeholders::lastp1;

template <typename T1, typename T2>
bool is_same_symb(const T1& a, const T2& b, Index size) {
  return a.eval(last = size - 1) == b.eval(last = size - 1);
}

template <typename T>
void check_is_symbolic(const T&) {
  STATIC_CHECK((symbolic::is_symbolic<T>::value))
}

template <typename T>
void check_isnot_symbolic(const T&) {
  STATIC_CHECK((!symbolic::is_symbolic<T>::value))
}

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

void check_symbolic_index() {
  check_is_symbolic(last);
  check_is_symbolic(lastp1);
  check_is_symbolic(last + 1);
  check_is_symbolic(last - lastp1);
  check_is_symbolic(2 * last - lastp1 / 2);
  check_isnot_symbolic(fix<3>());

  Index size = 100;

  // First, let's check FixedInt arithmetic:
  VERIFY(is_same_type((fix<5>() - fix<3>()) * fix<9>() / (-fix<3>()), fix<-(5 - 3) * 9 / 3>()));
  VERIFY(is_same_type((fix<5>() - fix<3>()) * fix<9>() / fix<2>(), fix<(5 - 3) * 9 / 2>()));
  VERIFY(is_same_type(fix<9>() / fix<2>(), fix<9 / 2>()));
  VERIFY(is_same_type(fix<9>() % fix<2>(), fix<9 % 2>()));
  VERIFY(is_same_type(fix<9>() & fix<2>(), fix<9 & 2>()));
  VERIFY(is_same_type(fix<9>() | fix<2>(), fix<9 | 2>()));
  VERIFY(is_same_type(fix<9>() / 2, int(9 / 2)));

  VERIFY(is_same_symb(lastp1 - 1, last, size));
  VERIFY(is_same_symb(lastp1 - fix<1>(), last, size));

  VERIFY_IS_EQUAL(((last * 5 - 2) / 3).eval(last = size - 1), ((size - 1) * 5 - 2) / 3);
  VERIFY_IS_EQUAL(((last * fix<5>() - fix<2>()) / fix<3>()).eval(last = size - 1), ((size - 1) * 5 - 2) / 3);
  VERIFY_IS_EQUAL((-last * lastp1).eval(last = size - 1), -(size - 1) * size);
  VERIFY_IS_EQUAL((lastp1 - 3 * last).eval(last = size - 1), size - 3 * (size - 1));
  VERIFY_IS_EQUAL(((lastp1 - 3 * last) / lastp1).eval(last = size - 1), (size - 3 * (size - 1)) / size);

  {
    struct x_tag {};
    static const symbolic::SymbolExpr<x_tag> x;
    struct y_tag {};
    static const symbolic::SymbolExpr<y_tag> y;
    struct z_tag {};
    static const symbolic::SymbolExpr<z_tag> z;

    VERIFY_IS_APPROX(int(((x + 3) / y + z).eval(x = 6, y = 3, z = -13)), (6 + 3) / 3 + (-13));
  }
}

EIGEN_DECLARE_TEST(symbolic_index) { CALL_SUBTEST_1(check_symbolic_index()); }
