| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 | // Copyright 2019 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_PARAMETER_PACK_H_#define BASE_PARAMETER_PACK_H_#include <stddef.h>#include <initializer_list>#include <tuple>#include <type_traits>#include "base/template_util.h"#include "build/build_config.h"namespace base {// Checks if any of the elements in |ilist| is true.// Similar to std::any_of for the case of constexpr initializer_list.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::all_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;}constexpr size_t pack_npos = -1;template <typename... Ts>struct ParameterPack {  // Checks if |Type| occurs in the parameter pack.  template <typename Type>  using HasType = bool_constant<any_of({std::is_same<Type, Ts>::value...})>;  // Checks if the parameter pack only contains |Type|.  template <typename Type>  using OnlyHasType = bool_constant<all_of({std::is_same<Type, Ts>::value...})>;  // Checks if |Type| occurs only once in the parameter pack.  template <typename Type>  using IsUniqueInPack =      bool_constant<count({std::is_same<Type, Ts>::value...}, true) == 1>;  // Returns the zero-based index of |Type| within |Pack...| or |pack_npos| if  // it's not within the pack.  template <typename Type>  static constexpr size_t IndexInPack() {    size_t index = 0;    for (bool value : {std::is_same<Type, Ts>::value...}) {      if (value)        return index;      index++;    }    return pack_npos;  }  // Helper for extracting the Nth type from a parameter pack.  template <size_t N>  using NthType = std::tuple_element_t<N, std::tuple<Ts...>>;  // Checks if every type in the parameter pack is the same.  using IsAllSameType =      bool_constant<all_of({std::is_same<NthType<0>, Ts>::value...})>;};}  // namespace base#endif  // BASE_PARAMETER_PACK_H_
 |