xref: /aosp_15_r20/external/cronet/base/allocator/dispatcher/testing/tools.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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