// Ceres Solver - A fast non-linear least squares minimizer
// Copyright 2022 Google Inc. All rights reserved.
// http://ceres-solver.org/
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// * Redistributions of source code must retain the above copyright notice,
//   this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above copyright notice,
//   this list of conditions and the following disclaimer in the documentation
//   and/or other materials provided with the distribution.
// * Neither the name of Google Inc. nor the names of its contributors may be
//   used to endorse or promote products derived from this software without
//   specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
//
// Author: jodebo_beck@gmx.de (Johannes Beck)
//         sergiu.deitsch@gmail.com (Sergiu Deitsch)

#include "ceres/internal/integer_sequence_algorithm.h"

#include <type_traits>
#include <utility>

#include "ceres/internal/jet_traits.h"

namespace ceres {
namespace internal {

// Unit tests for exclusive scan of integer sequence.
static_assert(std::is_same<ExclusiveScan<std::integer_sequence<int>>,
                           std::integer_sequence<int>>::value,
              "Unit test of calculating the exclusive scan of an integer "
              "sequence failed.");
static_assert(std::is_same<ExclusiveScan<std::integer_sequence<int, 2>>,
                           std::integer_sequence<int, 0>>::value,
              "Unit test of calculating the exclusive scan of an integer "
              "sequence failed.");
static_assert(std::is_same<ExclusiveScan<std::integer_sequence<int, 2, 1>>,
                           std::integer_sequence<int, 0, 2>>::value,
              "Unit test of calculating the exclusive scan of an integer "
              "sequence failed.");
static_assert(std::is_same<ExclusiveScan<std::integer_sequence<int, 2, 1, 10>>,
                           std::integer_sequence<int, 0, 2, 3>>::value,
              "Unit test of calculating the exclusive scan of an integer "
              "sequence failed.");

using Ranks001 = Ranks_t<Jet<double, 0>, double, Jet<double, 1>>;
using Ranks1 = Ranks_t<Jet<double, 1>>;
using Ranks110 = Ranks_t<Jet<double, 1>, Jet<double, 1>, double>;
using Ranks023 = Ranks_t<double, Jet<double, 2>, Jet<double, 3>>;
using EmptyRanks = Ranks_t<>;

// Remove zero from the ranks integer sequence
using NonZeroRanks001 = RemoveValue_t<Ranks001, 0>;
using NonZeroRanks1 = RemoveValue_t<Ranks1, 0>;
using NonZeroRanks110 = RemoveValue_t<Ranks110, 0>;
using NonZeroRanks023 = RemoveValue_t<Ranks023, 0>;

static_assert(std::is_same<RemoveValue_t<EmptyRanks, 0>,
                           std::integer_sequence<int>>::value,
              "filtered sequence does not match an empty one");
static_assert(std::is_same<RemoveValue_t<std::integer_sequence<int, 2, 2>, 2>,
                           std::integer_sequence<int>>::value,
              "filtered sequence does not match an empty one");
static_assert(
    std::is_same<RemoveValue_t<std::integer_sequence<int, 0, 0, 2>, 2>,
                 std::integer_sequence<int, 0, 0>>::value,
    "filtered sequence does not match the expected one");
static_assert(
    std::is_same<RemoveValue_t<std::make_integer_sequence<int, 6>, 7>,
                 std::make_integer_sequence<int, 6>>::value,
    "sequence not containing the element to remove must not be transformed");
static_assert(
    std::is_same<NonZeroRanks001, std::integer_sequence<int, 1>>::value,
    "sequences do not match");
static_assert(std::is_same<NonZeroRanks1, std::integer_sequence<int, 1>>::value,
              "sequences do not match");
static_assert(
    std::is_same<NonZeroRanks110, std::integer_sequence<int, 1, 1>>::value,
    "sequences do not match");
static_assert(
    std::is_same<NonZeroRanks023, std::integer_sequence<int, 2, 3>>::value,
    "sequences do not match");
static_assert(std::is_same<RemoveValue_t<std::integer_sequence<long>, -1>,
                           std::integer_sequence<long>>::value,
              "sequences do not match");
static_assert(
    std::is_same<RemoveValue_t<std::integer_sequence<short, -2, -3, -1>, -1>,
                 std::integer_sequence<short, -2, -3>>::value,
    "sequences do not match");

using J = Jet<double, 2>;
template <typename T>
using J0 = Jet<T, 0>;
using J0d = J0<double>;

// Ensure all types match
static_assert(AreAllSame_v<int, int>, "types must be the same");
static_assert(AreAllSame_v<long, long, long>, "types must be the same");
static_assert(AreAllSame_v<J0d, J0d, J0d>, "types must be the same");
static_assert(!AreAllSame_v<double, int>, "types must not be the same");
static_assert(!AreAllSame_v<int, short, char>, "types must not be the same");

// Ensure all values in the integer sequence match
static_assert(AreAllEqual_v<int, 1, 1>,
              "integer sequence must contain same values");
static_assert(AreAllEqual_v<long, 2>,
              "integer sequence must contain one value");
static_assert(!AreAllEqual_v<short, 3, 4>,
              "integer sequence must not contain the same values");
static_assert(!AreAllEqual_v<unsigned, 3, 4, 3>,
              "integer sequence must not contain the same values");
static_assert(!AreAllEqual_v<int, 4, 4, 3>,
              "integer sequence must not contain the same values");

static_assert(IsEmptyOrAreAllEqual_v<std::integer_sequence<short>>,
              "expected empty sequence is not");
static_assert(IsEmptyOrAreAllEqual_v<std::integer_sequence<unsigned, 7, 7, 7>>,
              "expected all equal sequence is not");
static_assert(IsEmptyOrAreAllEqual_v<std::integer_sequence<int, 1>>,
              "expected all equal sequence is not");
static_assert(
    IsEmptyOrAreAllEqual_v<std::integer_sequence<long, 111, 111, 111, 111>>,
    "expected all equal sequence is not");

}  // namespace internal
}  // namespace ceres
