11#ifndef O2_FRAMEWORK_PACK_H_
12#define O2_FRAMEWORK_PACK_H_
27template <
typename...
Ts>
33template <std::
size_t I,
typename T>
36#if __has_builtin(__type_pack_element)
37template <std::size_t I,
typename...
Ts>
39 using type = __type_pack_element<I,
Ts...>;
43template <std::size_t I,
typename Head,
typename... Tail>
49template <
typename Head,
typename... Tail>
55template <std::
size_t I,
typename T>
61template <
typename Head,
typename... Tail>
64 return pack<Tail...>{};
77template <
typename... Args1,
typename... Args2>
80 return pack<Args1..., Args2...>{};
83template <
typename P1,
typename P2,
typename... Ps>
89template <
typename... Ps>
92template <
typename... Args1,
typename... Args2>
98template <
typename P1,
typename P2>
102template <
template <
typename...>
typename Condition,
typename... Ts>
105template <
typename...
Ts>
108 return ((std::is_void_v<Ts> ? 0 : 1) + ...);
111template <
typename Result>
131template <
typename... Rs, void_pack_element V,
typename...
Ts>
138template <
typename... Rs, nonvoid_pack_element T1, nonvoid_pack_element T2,
typename...
Ts>
145template <
typename... Rs, nonvoid_pack_element T1, nonvoid_pack_element T2, nonvoid_pack_element T3, nonvoid_pack_element T4,
typename...
Ts>
152template <
typename... Rs, nonvoid_pack_element T1, nonvoid_pack_element T2, nonvoid_pack_element T3, nonvoid_pack_element T4,
153 nonvoid_pack_element T5, nonvoid_pack_element T6, nonvoid_pack_element T7, nonvoid_pack_element T8,
typename...
Ts>
162template <
template <
typename...>
typename Condition,
typename Result,
typename... Cs>
168template <
template <
typename...>
typename Condition,
typename Result,
typename T,
typename... Cs,
typename...
Ts>
178template <
template <
typename...>
typename Condition,
typename... Types>
180template <
template <
typename...>
typename Condition,
typename CondPack,
typename Pack>
184template <
template <
typename>
typename Condition,
typename Result>
190template <
template <
typename>
typename Condition,
typename Result,
typename T,
typename...
Ts>
203 puts(__PRETTY_FUNCTION__);
206template <
template <
typename>
typename Condition,
typename... Types>
209template <
typename T,
typename... Us>
212 return (std::same_as<T, Us> || ...);
215template <
typename T,
typename P>
218template <
template <
typename,
typename>
typename Condition,
typename T,
typename... Us>
224template <
template <
typename,
typename>
typename Condition,
typename T,
typename P>
227template <
typename T,
typename...
Ts>
230 constexpr size_t size =
sizeof...(Ts);
231 constexpr bool found[
size] = {std::same_as<T, Ts>...};
232 for (
size_t i = 0;
i <
size; ++
i) {
240template <
template <
typename,
typename>
typename Condition,
typename T,
typename...
Ts>
243 constexpr size_t size =
sizeof...(Ts);
245 for (
size_t i = 0;
i <
size; ++
i) {
254template <
typename S1,
typename S2>
256 template <std::size_t... Indices>
261 has_type<pack_element_t<Indices, S1>>(S2{}),
267template <
typename S1,
typename S2>
270template <
typename... A1,
typename... A2>
276template <
typename P1,
typename P2,
typename... Ps>
282template <
typename... Ps>
286template <
typename S1,
typename S2>
288 template <std::size_t... Indices>
293 !has_type<pack_element_t<Indices, S1>>(S2{}),
299template <
typename... Args1,
typename... Args2>
306template <
typename P1>
312template <
typename P1,
typename P2,
typename... Ps>
318template <
typename... Ps>
321template <
typename PT>
327template <
typename PT,
typename T,
typename...
Ts>
336template <
typename... Ts>
339 return std::tuple<
Ts...>{};
345template <
typename T, std::size_t... Is>
348 return pack<
decltype((Is, T{}))...>{};
351template <
typename T, std::
size_t N>
constexpr int p1()
constexpr to accelerate the coordinates changing
GLint GLint GLsizei GLint GLenum GLenum type
Defining PrimaryVertex explicitly as messageable.
typename intersect_pack< S1, S2 >::type intersected_pack_t
decltype(unique_pack(P{}, pack<>{})) unique_pack_t
constexpr bool has_type_conditional_v
constexpr auto pack_tail(pack< Head, Tail... >)
decltype(interleave_pack(P1{}, P2{})) interleaved_pack_t
decltype(sequence_to_pack< T >(std::make_index_sequence< N >())) repeated_type_pack_t
std::decay_t< decltype(select_pack< Condition >(pack<>{}, Pack{}, CondPack{}))> selected_pack_multicondition
std::decay_t< decltype(prune_voids_pack(pack<>{}, with_condition_pack< Condition, Types... >{}))> selected_pack
consteval size_t has_type_at_conditional_v(pack< Ts... >)
bool consteval has_type(framework::pack< Us... >)
auto sequence_to_pack(std::integer_sequence< std::size_t, Is... >)
decltype(intersected_pack(Ps{}...)) full_intersected_pack_t
constexpr auto intersected_pack(pack< A1... >, pack< A2... >)
constexpr auto filter_pack(Result result, pack<>)
Select only the items of a pack which match Condition.
@ Condition
Eventually a message whose content is retrieved from CCDB.
decltype(concatenate_pack(Ps{}...)) concatenated_pack_t
constexpr auto interleave_pack(pack< Args1... >, pack< Args2... >)
constexpr bool has_type_v
typename pack_element< I, T >::type pack_element_t
std::decay_t< decltype(filter_pack< Condition >(pack<>{}, pack< Types... >{}))> filtered_pack
consteval size_t has_type_at_v(pack< Ts... >)
constexpr std::tuple< Ts... > pack_to_tuple(pack< Ts... >)
constexpr auto concatenate_pack(pack< Args1... >, pack< Args2... >)
constexpr auto unique_pack(pack<>, PT p2)
constexpr std::size_t pack_size(pack< Ts... > const &)
template function to determine number of types in a pack
decltype(concatenate_pack_unique(Ps{}...)) concatenated_pack_unique_t
consteval auto prune_voids_pack(Result result, pack<>)
constexpr auto concatenate_pack_unique(pack< Args1... >, pack< Args2... >)
typename pack_element< 0, T >::type pack_head_t
consteval auto count_non_void_pack(pack< Ts... > const &)
decltype(pack_to_tuple(P{})) pack_to_tuple_t
bool consteval has_type_conditional(framework::pack< Us... >)
consteval auto select_pack(Result result, pack<>, pack< Cs... >)
static constexpr auto make_intersection(std::index_sequence< Indices... >)
decltype(make_intersection(std::make_index_sequence< pack_size(S1{})>{})) type
static constexpr auto make_subtraction(std::index_sequence< Indices... >)
decltype(make_subtraction(std::make_index_sequence< pack_size(S1{})>{})) type