48struct get_data_tuple_type
50 static_assert(!std::is_fundamental<T>::value,
51 "get_data_tuple_type called for fundamental type");
52 using get_type =
decltype(std::declval<T>().get());
54 static constexpr bool is_void_v = std::is_void<get_type>::value;
56 using type =
conditional_t<(is_void_v), type_list<>, type_list<T>>;
57 using value_type =
conditional_t<(is_void_v), type_list<>, type_list<get_type>>;
59 type_list<std::tuple<std::string, get_type>>>;
63struct get_data_tuple_type<
std::tuple<>>
65 using type = type_list<>;
66 using value_type = type_list<>;
67 using label_type = type_list<>;
73 using type = type_list<>;
74 using value_type = type_list<>;
75 using label_type = type_list<>;
80template <
typename... Types>
83 using type = convert_t<type_concat_t<typename get_data_tuple_type<Types>::type...>,
86 convert_t<type_concat_t<typename get_data_tuple_type<Types>::value_type...>,
89 convert_t<type_concat_t<typename get_data_tuple_type<Types>::label_type...>,
93template <
typename... Types>
94struct get_data_tuple<
type_list<Types...>> :
public get_data_tuple<Types...>
97template <
typename... Types>
98struct get_data_tuple<
std::tuple<Types...>> :
public get_data_tuple<Types...>
102struct get_data_tuple<
std::tuple<>>
104 using type = std::tuple<>;
105 using value_type = std::tuple<>;
106 using label_type = std::tuple<>;
112 using type = std::tuple<>;
113 using value_type = std::tuple<>;
114 using label_type = std::tuple<>;
123template <
template <
typename>
class TraitT,
typename T>
124struct get_trait_type_tuple
126 using trait_type =
typename TraitT<T>::type;
128 using type =
conditional_t<(is_null_v), type_list<>, type_list<trait_type>>;
131template <
template <
typename>
class TraitT,
typename T>
132using get_trait_type_tuple_t =
typename get_trait_type_tuple<TraitT, T>::type;
136template <
template <
typename>
class TraitT,
typename... Types>
140 type_concat_t<typename get_trait_type_tuple<TraitT, Types>::trait_type...>,
143 convert_t<type_concat_t<get_trait_type_tuple_t<TraitT, Types>...>, std::tuple<>>;
146template <
template <
typename>
class TraitT,
typename... Types>
147struct get_trait_type<TraitT,
type_list<Types...>> : get_trait_type<TraitT, Types...>
150template <
template <
typename>
class TraitT,
typename... T>
156template <
typename... Tp>
159 static constexpr bool value =
false;
162template <
typename T,
template <
typename...>
class Tuple,
typename... Tail>
165 static constexpr bool value =
171template <
typename In,
typename Out>
172struct remove_duplicates;
174template <
typename Out>
175struct remove_duplicates<
type_list<>, Out>
180template <
typename In,
typename... InTail,
typename... Out>
184 !is_one_of<std::remove_pointer_t<In>,
185 type_list<std::remove_pointer_t<Out>...>>::value,
192template <
typename In,
typename Out>
195template <
template <
typename...>
class InTuple,
typename... In,
196 template <
typename...>
class OutTuple,
typename... Out>
197struct unique<InTuple<In...>, OutTuple<Out...>>
199 using tuple_type =
convert_t<InTuple<In...>, OutTuple<>>;
200 using dupl_type =
typename remove_duplicates<tuple_type, OutTuple<>>::type;
201 using type = convert_t<dupl_type, InTuple<>>;
206template <
template <
typename>
class PrioT,
typename BegT,
typename Tp,
typename EndT>
211template <
template <
typename>
class PrioT,
typename Tuple,
typename BegT = type_list<>,
212 typename EndT = type_list<>>
213using sort =
typename sortT<PrioT, Tuple, BegT, EndT>::type;
218template <
template <
typename>
class PrioT,
typename In,
typename... InT>
222 typename sortT<PrioT,
type_list<InT...>, type_list<>, type_list<In>>::type;
228template <
template <
typename>
class PrioT,
typename In,
typename... InT>
232 typename sortT<PrioT,
type_list<InT...>, type_list<>, type_list<In>>::type;
238template <
template <
typename>
class PrioT,
typename... BegTT,
typename... EndTT>
241 using type =
type_list<BegTT..., EndTT...>;
247template <
template <
typename>
class PrioT,
typename In,
typename... InT,
251 using type =
typename sortT<PrioT,
type_list<In, InT...>, type_list<>,
258template <
template <
typename>
class PrioT,
typename In,
typename Tp,
typename... InT>
261 static constexpr bool value = (PrioT<In>::value < PrioT<Tp>::value);
265 typename sortT<PrioT, type_list<InT...>, type_list<>, type_list<In, Tp>>::type,
266 typename sortT<PrioT, type_list<InT...>, type_list<>, type_list<Tp, In>>::type>;
272template <
template <
typename>
class PrioT,
typename In,
typename At,
typename Bt,
273 typename... BegTT,
typename... InT>
276 static constexpr bool iavalue = (PrioT<In>::value < PrioT<At>::value);
277 static constexpr bool ibvalue = (PrioT<In>::value < PrioT<Bt>::value);
278 static constexpr bool abvalue = (PrioT<At>::value <= PrioT<Bt>::value);
283 PrioT, type_list<InT...>,
sort<PrioT, type_list<BegTT..., In>>,
284 conditional_t<(abvalue), type_list<At, Bt>, type_list<Bt, At>>>::type,
287 conditional_t<(ibvalue), type_list<In, Bt>, type_list<Bt, In>>>::type>;
293template <
template <
typename>
class PrioT,
typename In,
typename Tp,
typename... InT,
294 typename... BegTT,
typename... EndTT>
297 static constexpr bool value = (PrioT<In>::value < PrioT<Tp>::value);
301 typename sortT<PrioT, type_list<InT...>, type_list<>,
302 type_list<BegTT..., In, Tp, EndTT...>>::type,
303 typename sortT<PrioT, type_list<In, InT...>,
304 type_list<BegTT..., Tp>, type_list<EndTT...>>::type>;
309template <
typename Tp,
typename OpT>
310struct negative_priority;
312template <
typename Tp,
typename OpT>
313struct positive_priority;
315template <
typename Tp,
template <
typename>
class OpT>
316struct negative_priority<Tp, OpT<Tp>>
318 static constexpr bool value = (OpT<Tp>::value < 0);
321template <
typename Tp,
template <
typename>
class OpT>
322struct positive_priority<Tp, OpT<Tp>>
324 static constexpr bool value = (OpT<Tp>::value > 0);
327template <
typename Tp>
331template <
typename Tp>
335template <
typename Tp>
339template <
typename Tp>
347template <
typename Tp,
typename... Types>
350template <
typename Tp,
template <
typename...>
class Tuple,
typename... Types>
354 using type =
conditional_t<value, Tuple<Types...>, Tuple<Types..., Tp>>;
359template <
typename Tp,
typename... Types>
362template <
typename Tp,
template <
typename...>
class Tuple,
typename... Types>
368 convert_t<type_concat_t<std::conditional_t<std::is_same<Tp, Types>::value,
369 type_list<>, type_list<Types>>...>,
376template <
typename LhsT,
typename RhsT>
379template <
typename... LhsT,
typename... RhsT>
383 type_list<>, type_list<LhsT>>...>;
395 return (std::is_pointer<T>::value) ?
sizeof(std::remove_pointer_t<T>) : 0;
400template <
typename Tp,
typename... Types>
404template <
typename Tp,
typename... Types>
408template <
typename Tp,
typename Types>
412template <
typename Tp,
typename Types>
416template <
typename Types>
422template <
typename T,
typename TupleT = type_list<>>
425template <
typename LhsT,
typename RhsT>
435template <
typename... Types>
451template <
typename TypeList>
455template <
typename TypeList>
459template <
typename TypeList>
463template <
template <
typename>
class TraitT,
typename TypeList>
472template <
template <
typename>
class PrioT,
typename Tuple,
typename BegT =
type_list<>,
480template <
typename... Types>
484template <
typename... Types>
488template <
typename Tp>
491template <
typename Tp>
494template <
typename Tp>
497template <
typename Tp>
typename impl::remove_type< Tp, Types >::type remove_type_t
remove any instances of a type from a tuple/bundler
typename get_true_types< concepts::is_external_function_wrapper, Types... >::type external_function_wrappers_t
convert_t< typename ::tim::mpl::impl::sortT< PrioT, convert_t< Tuple, type_list<> >, convert_t< BegT, type_list<> >, convert_t< EndT, type_list<> > >::type, std::tuple<> > sort
impl::positive_start_priority< Tp > positive_start_priority
typename impl::append_type< Tp, Types >::type append_type_t
append type to a tuple/bundler
typename impl::is_one_of_integral< Types > is_one_of_integral
check if type is in expansion
typename impl::unique< T, type_list<> >::type remove_duplicates_t
typename impl::template get_data_tuple< TypeList >::type get_data_type_t
get the tuple of types
impl::negative_start_priority< Tp > negative_start_priority
typename get_true_types< Predicate, Sequence... >::type get_true_types_t
typename get_false_types< Predicate, Sequence... >::type get_false_types_t
typename get_true_types< concepts::is_runtime_configurable, Types... >::type runtime_configurable_t
impl::get_trait_type_t< TraitT, convert_t< TypeList, type_list<> > > get_trait_type_t
get the tuple of types
impl::remove_type< Tp, Types... > remove_type
remove any instances of a type from a tuple/bundler
get_false_types_t< trait::is_gotcha, std::tuple< Types... > > filter_gotchas
filter out any types that are not available
get_true_types_t< concepts::is_empty, T > filter_empty_t
get_false_types_t< trait::is_gotcha, T > filter_gotchas_t
impl::positive_stop_priority< Tp > positive_stop_priority
convert_t< typename impl::unique< T, type_list<> >::type, TupleT > unique_t
typename impl::template get_data_tuple< TypeList >::label_type get_data_label_t
get the tuple of pair of descriptor and value
typename impl::template get_data_tuple< TypeList >::value_type get_data_value_t
get the tuple of values
impl::append_type< Tp, Types... > append_type
append type to a tuple/bundler
typename impl::subtract< LhsT, RhsT >::type subtract_t
impl::negative_stop_priority< Tp > negative_stop_priority
generic alias for extracting all types with a specified trait enabled
typename impl::type_concat< Ts... >::type type_concat_t
typename impl::is_one_of< Tp, Types > is_one_of
check if type is in expansion
typename std::conditional< B, Lhs, Rhs >::type conditional_t
typename impl::convert< T, U >::type convert_t
lightweight tuple-alternative for meta-programming logic
concept that specifies that a component type wraps external functions
static constexpr bool value
concept that specifies that a type is used to modify behavior at runtime. For example,...
constexpr size_t operator()()
trait that designates the type is a gotcha