4#ifndef _Stroika_Foundation_Common_TemplateUtilities_h_
5#define _Stroika_Foundation_Common_TemplateUtilities_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
12#include "Stroika/Foundation/Common/Common.h"
33 template <
typename T,
typename... ARGS>
45 template <
template <
typename...>
class Cont,
typename... Ts>
47 using type = Cont<Ts...>;
53 template <
template <
typename...>
class Cont,
typename... Ts>
81 template <
typename CLASS_TYPE,
typename RETURN_TYPE,
typename... ARGS>
82 struct FunctionTraits<RETURN_TYPE (CLASS_TYPE::*) (ARGS...) const> {
86 using type =
typename tuple_element<i, tuple<ARGS...>>::type;
90 using type =
typename conditional_t<(i <
sizeof...(ARGS)), tuple_element<i, tuple<ARGS...>>, Private_::void_type>::type;
97 static inline constexpr size_t kArity =
sizeof...(ARGS);
103 using result_type = RETURN_TYPE;
110 using args_tuple = tuple<ARGS...>;
123 using arg_t =
typename arg_<I>::type;
131 using ArgOrVoid_t =
typename ArgOrVoid_<I>::type;
140 using is_transparent = void;
142 template <
typename T>
143 constexpr T&& operator() (T&& t)
const noexcept
145 return std::forward<T> (t);
150 template <
typename T>
151 using BaseDifferenceType_ =
decltype (T{} - T{});
163 template <
typename T>
177 template <
typename T>
210 template <
typename T,
typename Seq>
212 template <
typename T,
size_t... Is>
213 struct expander<T, index_sequence<Is...>> {
214 template <
typename E,
size_t>
216 using type = tuple<elem<T, Is>...>;
218 template <
size_t N,
class Type>
220 using type =
typename expander<Type, make_index_sequence<N>>::type;
227 template <
size_t N,
class Type>
237#include "TemplateUtilities.inl"
typename LazyType< Cont, Ts... >::type LazyType_t
typename conditional_t< is_integral_v< T >, LazyType< make_unsigned_t, T >, conditional< true, T, T > >::type UnsignedOfIf
typename Private_::my_tuple< N, Type >::type RepeatedTuple_t
same_as<RepeatedTuple_t<3,int>,tuple<int,int,int>>
typename conditional_t< is_enum_v< T >, LazyType< underlying_type_t, T >, LazyType< Private_::BaseDifferenceType_, T > >::type DifferenceType
T & Immortalize(ARGS... args)
Extract the number of arguments, return type, and each individual argument type from a lambda or simp...
function object whose action is to map its argument, back to the same value it started with (identity...