51 lines
1.6 KiB
C
51 lines
1.6 KiB
C
|
|
// Copyright 2022 The Chromium Authors
|
||
|
|
// Use of this source code is governed by a BSD-style license that can be
|
||
|
|
// found in the LICENSE file.
|
||
|
|
|
||
|
|
#ifndef BASE_ALLOCATOR_DISPATCHER_TESTING_TOOLS_H_
|
||
|
|
#define BASE_ALLOCATOR_DISPATCHER_TESTING_TOOLS_H_
|
||
|
|
|
||
|
|
#include <array>
|
||
|
|
#include <tuple>
|
||
|
|
#include <utility>
|
||
|
|
|
||
|
|
namespace base::allocator::dispatcher::testing {
|
||
|
|
|
||
|
|
namespace internal {
|
||
|
|
template <size_t Size, typename Type, typename... AppendedTypes>
|
||
|
|
struct DefineTupleFromSingleType {
|
||
|
|
using type = typename DefineTupleFromSingleType<Size - 1,
|
||
|
|
Type,
|
||
|
|
AppendedTypes...,
|
||
|
|
Type>::type;
|
||
|
|
};
|
||
|
|
|
||
|
|
template <typename Type, typename... AppendedTypes>
|
||
|
|
struct DefineTupleFromSingleType<0, Type, AppendedTypes...> {
|
||
|
|
using type = std::tuple<AppendedTypes...>;
|
||
|
|
};
|
||
|
|
|
||
|
|
} // namespace internal
|
||
|
|
|
||
|
|
template <size_t Size, typename Type>
|
||
|
|
struct DefineTupleFromSingleType {
|
||
|
|
using type = typename internal::DefineTupleFromSingleType<Size, Type>::type;
|
||
|
|
};
|
||
|
|
|
||
|
|
template <typename Type, size_t Size, size_t... Indices>
|
||
|
|
typename internal::DefineTupleFromSingleType<Size, Type*>::type
|
||
|
|
CreateTupleOfPointers(std::array<Type, Size>& items,
|
||
|
|
std::index_sequence<Indices...>) {
|
||
|
|
return std::make_tuple((&items[Indices])...);
|
||
|
|
}
|
||
|
|
|
||
|
|
template <typename Type, size_t Size>
|
||
|
|
typename internal::DefineTupleFromSingleType<Size, Type*>::type
|
||
|
|
CreateTupleOfPointers(std::array<Type, Size>& items) {
|
||
|
|
return CreateTupleOfPointers(items, std::make_index_sequence<Size>{});
|
||
|
|
}
|
||
|
|
|
||
|
|
} // namespace base::allocator::dispatcher::testing
|
||
|
|
|
||
|
|
#endif
|