1 // Copyright 2022 The Chromium Authors 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef BASE_ALLOCATOR_DISPATCHER_TESTING_TOOLS_H_ 6 #define BASE_ALLOCATOR_DISPATCHER_TESTING_TOOLS_H_ 7 8 #include <array> 9 #include <tuple> 10 #include <utility> 11 12 namespace base::allocator::dispatcher::testing { 13 14 namespace internal { 15 template <size_t Size, typename Type, typename... AppendedTypes> 16 struct DefineTupleFromSingleType { 17 using type = typename DefineTupleFromSingleType<Size - 1, 18 Type, 19 AppendedTypes..., 20 Type>::type; 21 }; 22 23 template <typename Type, typename... AppendedTypes> 24 struct DefineTupleFromSingleType<0, Type, AppendedTypes...> { 25 using type = std::tuple<AppendedTypes...>; 26 }; 27 28 } // namespace internal 29 30 template <size_t Size, typename Type> 31 struct DefineTupleFromSingleType { 32 using type = typename internal::DefineTupleFromSingleType<Size, Type>::type; 33 }; 34 35 template <typename Type, size_t Size, size_t... Indices> 36 typename internal::DefineTupleFromSingleType<Size, Type*>::type 37 CreateTupleOfPointers(std::array<Type, Size>& items, 38 std::index_sequence<Indices...>) { 39 return std::make_tuple((&items[Indices])...); 40 } 41 42 template <typename Type, size_t Size> 43 typename internal::DefineTupleFromSingleType<Size, Type*>::type 44 CreateTupleOfPointers(std::array<Type, Size>& items) { 45 return CreateTupleOfPointers(items, std::make_index_sequence<Size>{}); 46 } 47 48 } // namespace base::allocator::dispatcher::testing 49 50 #endif // BASE_ALLOCATOR_DISPATCHER_TESTING_TOOLS_H_ 51