5#ifndef V8_BASE_TEMPLATE_UTILS_H_
6#define V8_BASE_TEMPLATE_UTILS_H_
22template <
typename Function, std::size_t... Indexes>
24 std::index_sequence<Indexes...>)
25 -> std::array<
decltype(f(0)),
sizeof...(Indexes)> {
26 return {{f(Indexes)...}};
37template <std::
size_t Size,
class Function>
53 using Ts::operator()...;
63template <
typename T,
bool remove_array_extend = true>
65 using noref_t =
typename std::remove_reference<T>::type;
66 using decay_t =
typename std::conditional<
67 std::is_array<noref_t>::value && !remove_array_extend,
noref_t,
68 typename std::decay<noref_t>::type>
::type;
69 using type =
typename std::conditional<std::is_scalar<decay_t>::value ||
70 std::is_array<decay_t>::value,
74template <
typename T,
typename TStream = std::ostream>
78template <
class Tuple,
class T>
80 std::declval<Tuple>(), std::declval<std::tuple<T>>()));
83template <
class T,
class Tuple>
85 std::declval<std::tuple<T>>(), std::declval<Tuple>()));
89template <
size_t N,
typename Tuple>
91 N <= std::tuple_size_v<std::decay_t<Tuple>>;
93template <
size_t N,
typename T,
size_t... Ints>
95 return std::tuple{std::get<N + Ints>(tpl)...};
98template <
typename Tuple,
typename Function,
size_t... Index>
100 std::index_sequence<Index...>) {
101 (function(std::get<Index>(tpl)), ...);
104template <
typename Tuple,
typename Function,
size_t... Index>
107 std::index_sequence<Index...>) {
108 (function(std::get<Index>(tpl), std::integral_constant<size_t, Index>()),
112template <
typename Tuple,
typename Function,
size_t... Index>
114 std::index_sequence<Index...>) {
115 return std::make_tuple(
116 function(std::get<Index>(std::forward<Tuple>(tpl)))...);
119template <
typename TupleV,
typename TupleU,
typename Function,
size_t... Index>
122 std::index_sequence<Index...>) {
123 return std::make_tuple(
124 function(std::get<Index>(tplv), std::get<Index>(tplu))...);
127template <
size_t I,
typename T,
typename Tuple,
typename Function>
129 if constexpr (
I == 0) {
130 return function(std::forward<T>(initial), std::get<0>(tpl));
133 std::forward<Tuple>(tpl), function),
141template <
size_t N,
typename Tuple>
143 constexpr size_t total_size = std::tuple_size_v<std::decay_t<Tuple>>;
144 static_assert(N <= total_size);
146 std::make_index_sequence<N>());
150template <
size_t N,
typename Tuple>
157 constexpr size_t total_size = std::tuple_size_v<std::decay_t<Tuple>>;
158 static_assert(N <= total_size);
160 std::forward<Tuple>(tpl), std::make_index_sequence<total_size - N>());
164template <
typename Tuple,
typename Function>
167 std::forward<Tuple>(tpl), function,
168 std::make_index_sequence<std::tuple_size_v<std::decay_t<Tuple>>>());
174template <
typename Tuple,
typename Function>
177 std::forward<Tuple>(tpl), function,
178 std::make_index_sequence<std::tuple_size_v<std::decay_t<Tuple>>>());
183template <
typename Tuple,
typename Function>
186 std::forward<Tuple>(tpl), function,
187 std::make_index_sequence<std::tuple_size_v<std::decay_t<Tuple>>>());
192template <
typename TupleV,
typename TupleU,
typename Function>
194 constexpr size_t S = std::tuple_size_v<std::decay_t<TupleV>>;
195 static_assert(S == std::tuple_size_v<std::decay_t<TupleU>>);
197 std::forward<TupleU>(tplu), function,
198 std::make_index_sequence<S>());
203template <
typename T,
typename Tuple,
typename Function>
206 std::forward<T>(initial), std::forward<Tuple>(tpl), function);
211template <
size_t N,
typename... Ts>
212using nth_type_t = __type_pack_element<N, Ts...>;
217template <
size_t N,
typename... Ts>
220template <
typename T,
typename... Ts>
225template <
size_t N,
typename T,
typename... Ts>
229template <
size_t N,
typename... T>
236template <
typename SearchT,
typename... Ts>
239template <
typename SearchT,
typename... Ts>
241template <
typename SearchT,
typename... Ts>
246template <
typename SearchT>
250template <
typename SearchT,
typename... Ts>
252 :
public std::integral_constant<size_t, 0> {
258template <
typename SearchT,
typename T,
typename... Ts>
260 :
public std::integral_constant<size_t,
261 1 + index_of_type<SearchT, Ts...>::value> {
constexpr auto tuple_fold_impl(T &&initial, Tuple &&tpl, Function &&function)
constexpr auto tuple_map2_impl(TupleV &&tplv, TupleU &&tplu, const Function &function, std::index_sequence< Index... >)
constexpr auto tuple_map_impl(Tuple &&tpl, const Function &function, std::index_sequence< Index... >)
constexpr auto make_array_helper(Function f, std::index_sequence< Indexes... >) -> std::array< decltype(f(0)), sizeof...(Indexes)>
constexpr auto tuple_for_each_impl(const Tuple &tpl, Function &&function, std::index_sequence< Index... >)
constexpr auto tuple_for_each_with_index_impl(const Tuple &tpl, Function &&function, std::index_sequence< Index... >)
constexpr bool NIsNotGreaterThanTupleSize
constexpr auto tuple_slice_impl(const T &tpl, std::index_sequence< Ints... >)
constexpr size_t index_of_type_v
constexpr auto make_array(Function f)
constexpr auto tuple_head(Tuple &&tpl)
constexpr auto tuple_fold(T &&initial, Tuple &&tpl, Function &&function)
decltype(std::tuple_cat( std::declval< Tuple >(), std::declval< std::tuple< T > >())) append_tuple_type
decltype(std::tuple_cat( std::declval< std::tuple< T > >(), std::declval< Tuple >())) prepend_tuple_type
constexpr auto tuple_map(Tuple &&tpl, Function &&function)
constexpr auto tuple_map2(TupleV &&tplv, TupleU &&tplu, Function &&function)
constexpr void tuple_for_each_with_index(Tuple &&tpl, Function &&function)
constexpr bool has_type_v
typename detail::nth_type< N, T... >::type nth_type_t
constexpr auto tuple_drop(Tuple &&tpl)
overloaded(Ts...) -> overloaded< Ts... >
constexpr void tuple_for_each(Tuple &&tpl, Function &&function)
#define I(name, number_of_args, result_size)
typename std::remove_reference< T >::type noref_t
typename std::conditional< std::is_scalar< decay_t >::value|| std::is_array< decay_t >::value, decay_t, const decay_t & >::type type
typename std::conditional< std::is_array< noref_t >::value &&!remove_array_extend, noref_t, typename std::decay< noref_t >::type >::type decay_t
std::unique_ptr< ValueMirror > value