// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef BASE_TASK_TASK_TRAITS_DETAILS_H_
#define BASE_TASK_TASK_TRAITS_DETAILS_H_

#include <initializer_list>
#include <tuple>
#include <type_traits>
#include <utility>

#include "nb/cpp14oncpp11.h"

namespace base {
namespace trait_helpers {

// Checks if any of the elements in |ilist| is true.
// Similar to std::any_of for the case of constexpr initializer_list.
#if __cplusplus >= 201402L
inline constexpr bool any_of(std::initializer_list<bool> ilist) {
  for (auto c : ilist) {
    if (c)
      return true;
  }
  return false;
}

// Checks if all of the elements in |ilist| are true.
// Similar to std::any_of for the case of constexpr initializer_list.
inline constexpr bool all_of(std::initializer_list<bool> ilist) {
  for (auto c : ilist) {
    if (!c)
      return false;
  }
  return true;
}

// Counts the elements in |ilist| that are equal to |value|.
// Similar to std::count for the case of constexpr initializer_list.
template <class T>
inline constexpr size_t count(std::initializer_list<T> ilist, T value) {
  size_t c = 0;
  for (const auto& v : ilist) {
    c += (v == value);
  }
  return c;
}
#endif

// CallFirstTag is an argument tag that helps to avoid ambiguous overloaded
// functions. When the following call is made:
//    func(CallFirstTag(), arg...);
// the compiler will give precedence to an overload candidate that directly
// takes CallFirstTag. Another overload that takes CallSecondTag will be
// considered iff the preferred overload candidates were all invalids and
// therefore discarded.
struct CallSecondTag {};
struct CallFirstTag : CallSecondTag {};

// A trait filter class |TraitFilterType| implements the protocol to get a value
// of type |ArgType| from an argument list and convert it to a value of type
// |TraitType|. If the argument list contains an argument of type |ArgType|, the
// filter class will be instantiated with that argument. If the argument list
// contains no argument of type |ArgType|, the filter class will be instantiated
// using the default constructor if available; a compile error is issued
// otherwise. The filter class must have the conversion operator TraitType()
// which returns a value of type TraitType.

// |InvalidTrait| is used to return from GetTraitFromArg when the argument is
// not compatible with the desired trait.
struct InvalidTrait {};

// Returns an object of type |TraitFilterType| constructed from |arg| if
// compatible, or |InvalidTrait| otherwise.
template <class TraitFilterType,
          class ArgType,
          class CheckArgumentIsCompatible = std::enable_if_t<
              std::is_constructible<TraitFilterType, ArgType>::value>>
constexpr TraitFilterType GetTraitFromArg(CallFirstTag, ArgType arg) {
  return TraitFilterType(arg);
}

template <class TraitFilterType, class ArgType>
constexpr InvalidTrait GetTraitFromArg(CallSecondTag, ArgType /*arg*/) {
  return InvalidTrait();
}

// Returns an object of type |TraitFilterType| constructed from a compatible
// argument in |args...|, or default constructed if none of the arguments are
// compatible. This is the implementation of GetTraitFromArgList() with a
// disambiguation tag.
#if __cplusplus < 201402L
template <class TraitFilterType,
          class ArgTypes1,
          class ArgTypes2,
          class ArgTypes3,
          class ArgTypes4,
          class TestCompatibleArgument = std::enable_if_t<
              std::is_constructible<TraitFilterType, ArgTypes1>::value ||
              std::is_constructible<TraitFilterType, ArgTypes2>::value ||
              std::is_constructible<TraitFilterType, ArgTypes3>::value ||
              std::is_constructible<TraitFilterType, ArgTypes4>::value>>
TraitFilterType GetTraitFromArgListImpl(CallFirstTag,
                                        ArgTypes1 arg1,
                                        ArgTypes2 arg2,
                                        ArgTypes3 arg3,
                                        ArgTypes4 arg4) {
  return std::get<TraitFilterType>(
      std::make_tuple(GetTraitFromArg<TraitFilterType>(CallFirstTag(), arg1),
                      GetTraitFromArg<TraitFilterType>(CallFirstTag(), arg2),
                      GetTraitFromArg<TraitFilterType>(CallFirstTag(), arg3),
                      GetTraitFromArg<TraitFilterType>(CallFirstTag(), arg4)));
}

template <class TraitFilterType,
          class ArgTypes1,
          class ArgTypes2,
          class ArgTypes3,
          class TestCompatibleArgument = std::enable_if_t<
              std::is_constructible<TraitFilterType, ArgTypes1>::value ||
              std::is_constructible<TraitFilterType, ArgTypes2>::value ||
              std::is_constructible<TraitFilterType, ArgTypes3>::value>>
TraitFilterType GetTraitFromArgListImpl(CallFirstTag,
                                        ArgTypes1 arg1,
                                        ArgTypes2 arg2,
                                        ArgTypes3 arg3) {
  return std::get<TraitFilterType>(
      std::make_tuple(GetTraitFromArg<TraitFilterType>(CallFirstTag(), arg1),
                      GetTraitFromArg<TraitFilterType>(CallFirstTag(), arg2),
                      GetTraitFromArg<TraitFilterType>(CallFirstTag(), arg3)));
}

template <class TraitFilterType,
          class ArgTypes1,
          class ArgTypes2,
          class TestCompatibleArgument = std::enable_if_t<
              std::is_constructible<TraitFilterType, ArgTypes1>::value ||
              std::is_constructible<TraitFilterType, ArgTypes2>::value>>
TraitFilterType GetTraitFromArgListImpl(CallFirstTag,
                                        ArgTypes1 arg1,
                                        ArgTypes2 arg2) {
  return std::get<TraitFilterType>(
      std::make_tuple(GetTraitFromArg<TraitFilterType>(CallFirstTag(), arg1),
                      GetTraitFromArg<TraitFilterType>(CallFirstTag(), arg2)));
}

template <class TraitFilterType,
          class ArgTypes1,
          class TestCompatibleArgument = std::enable_if_t<
              std::is_constructible<TraitFilterType, ArgTypes1>::value>>
constexpr TraitFilterType GetTraitFromArgListImpl(CallFirstTag,
                                                  ArgTypes1 arg1) {
  return TraitFilterType(arg1);
}
#else
template <class TraitFilterType,
          class... ArgTypes,
          class TestCompatibleArgument = std::enable_if_t<any_of(
              {std::is_constructible<TraitFilterType, ArgTypes>::value...})>>
constexpr TraitFilterType GetTraitFromArgListImpl(CallFirstTag,
                                                  ArgTypes... args) {
  return std::get<TraitFilterType>(std::make_tuple(
      GetTraitFromArg<TraitFilterType>(CallFirstTag(), args)...));
}
#endif

template <class TraitFilterType, class... ArgTypes>
constexpr TraitFilterType GetTraitFromArgListImpl(CallSecondTag,
                                                  ArgTypes... /*args*/) {
  static_assert(std::is_constructible<TraitFilterType>::value,
                "TaskTraits contains a Trait that must be explicity "
                "initialized in its constructor.");
  return TraitFilterType();
}

// Constructs an object of type |TraitFilterType| from a compatible argument in
// |args...|, or using the default constructor, and returns its associated trait
// value using conversion to |TraitFilterType::ValueType|. If there are more
// than one compatible argument in |args|, generates a compile-time error.
template <class TraitFilterType, class... ArgTypes>
CONSTEXPR typename TraitFilterType::ValueType GetTraitFromArgList(
    ArgTypes... args) {
#if __cplusplus >= 201402L
  static_assert(
      count({std::is_constructible<TraitFilterType, ArgTypes>::value...},
            true) <= 1,
      "Multiple arguments of the same type were provided to the "
      "constructor of TaskTraits.");
#endif
  return GetTraitFromArgListImpl<TraitFilterType>(CallFirstTag(), args...);
}

// Returns true if this trait is explicitly defined in an argument list, i.e.
// there is an argument compatible with this trait in |args...|.
#if __cplusplus < 201402L
template <class TraitFilterType>
constexpr bool TraitIsDefined() {
  return false;
}

template <class TraitFilterType, class ArgType1>
constexpr bool TraitIsDefined(ArgType1 arg1) {
  return std::is_constructible<TraitFilterType, ArgType1>::value;
}

template <class TraitFilterType, class ArgType1, class ArgType2>
constexpr bool TraitIsDefined(ArgType1 arg1, ArgType2 /*arg2*/) {
  return std::is_constructible<TraitFilterType, ArgType1>::value ||
         std::is_constructible<TraitFilterType, ArgType2>::value;
}

template <class TraitFilterType, class ArgType1, class ArgType2, class ArgType3>
constexpr bool TraitIsDefined(ArgType1 /*arg1*/,
                              ArgType2 /*arg2*/,
                              ArgType3 /*arg3*/) {
  return std::is_constructible<TraitFilterType, ArgType1>::value ||
         std::is_constructible<TraitFilterType, ArgType2>::value ||
         std::is_constructible<TraitFilterType, ArgType3>::value;
}

template <class TraitFilterType,
          class ArgType1,
          class ArgType2,
          class ArgType3,
          class ArgType4>
constexpr bool TraitIsDefined(ArgType1 /*arg1*/,
                              ArgType2 /*arg2*/,
                              ArgType3 /*arg3*/,
                              ArgType4 /*arg4*/) {
  return std::is_constructible<TraitFilterType, ArgType1>::value ||
         std::is_constructible<TraitFilterType, ArgType2>::value ||
         std::is_constructible<TraitFilterType, ArgType3>::value ||
         std::is_constructible<TraitFilterType, ArgType4>::value;
}
#else
template <class TraitFilterType, class... ArgTypes>
constexpr bool TraitIsDefined(ArgTypes... args) {
  return any_of({std::is_constructible<TraitFilterType, ArgTypes>::value...});
}
#endif

// Helper class to implemnent a |TraitFilterType|.
template <typename T>
struct BasicTraitFilter {
  using ValueType = T;

  constexpr operator ValueType() const { return value; }

  ValueType value = {};
};

template <typename ArgType>
struct BooleanTraitFilter : public BasicTraitFilter<bool> {
  CONSTEXPR BooleanTraitFilter() { this->value = false; }
  CONSTEXPR BooleanTraitFilter(ArgType) { this->value = true; }
};

template <typename ArgType, ArgType DefaultValue>
struct EnumTraitFilter : public BasicTraitFilter<ArgType> {
  CONSTEXPR EnumTraitFilter() { this->value = DefaultValue; }
  CONSTEXPR EnumTraitFilter(ArgType arg) { this->value = arg; }
};

// Tests whether multiple given argtument types are all valid traits according
// to the provided ValidTraits. To use, define a ValidTraits
template <typename ArgType>
struct RequiredEnumTraitFilter : public BasicTraitFilter<ArgType> {
  CONSTEXPR RequiredEnumTraitFilter(ArgType arg) { this->value = arg; }
};

#ifdef STARBOARD
// Allows instantiation of multiple types in one statement. Used to prevent
// instantiation of the constructor of TaskTraits with inappropriate argument
// types.
template <class...>
struct InitTypes {};
#endif

#if __cplusplus >= 201402L
// Tests whether a given trait type is valid or invalid by testing whether it is
// convertible to the provided ValidTraits type. To use, define a ValidTraits
// type like this:
//
// struct ValidTraits {
//   ValidTraits(MyTrait);
//   ...
// };
template <class ValidTraits, class... ArgTypes>
struct AreValidTraits
    : std::integral_constant<
          bool,
          all_of({std::is_convertible<ArgTypes, ValidTraits>::value...})> {};
#endif

}  // namespace trait_helpers
}  // namespace base

#endif  // BASE_TASK_TASK_TRAITS_DETAILS_H_
