// 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 #include #include #include 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 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 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 inline constexpr size_t count(std::initializer_list ilist, T value) { size_t c = 0; for (const auto& v : ilist) { c += (v == value); } return c; } constexpr size_t pack_npos = static_cast(-1); template struct ParameterPack { // Checks if |Type| occurs in the parameter pack. template using HasType = std::bool_constant::value...})>; // Checks if the parameter pack only contains |Type|. template using OnlyHasType = std::bool_constant::value...})>; // Checks if |Type| occurs only once in the parameter pack. template using IsUniqueInPack = std::bool_constant::value...}, true) == 1>; // Returns the zero-based index of |Type| within |Pack...| or |pack_npos| if // it's not within the pack. template static constexpr size_t IndexInPack() { size_t index = 0; for (bool value : {std::is_same::value...}) { if (value) return index; index++; } return pack_npos; } // Helper for extracting the Nth type from a parameter pack. template using NthType = std::tuple_element_t>; // Checks if every type in the parameter pack is the same. using IsAllSameType = std::bool_constant, Ts>::value...})>; }; } // namespace base #endif // BASE_PARAMETER_PACK_H_