5 #ifndef LODESTAR_TEMPLATETOOLS_HPP
6 #define LODESTAR_TEMPLATETOOLS_HPP
8 #include "TemplateTraits.hpp"
16 template <
class,
class>
18 template <
class... TFirst,
class... TSecond>
19 struct concatenate<::std::tuple<TFirst...>, ::std::tuple<TSecond...>> {
20 using type = ::std::tuple<TFirst..., TSecond...>;
26 template <
typename TType,
template <
typename ...>
class TWrapper>
27 struct wrap<TType, TWrapper, true> {
31 template <
typename TType,
template <
typename ...>
class TWrapper>
32 struct wrap<TType, TWrapper, false> {
33 using type = TWrapper<TType>;
37 template<
typename,
typename>
40 template<
typename T,
typename... Ts,
template<
typename...>
class TT>
43 using type = TT<Ts..., T>;
46 template<
typename T,
unsigned int N,
template<
typename...>
class TT>
52 typename repeat<T, N-1, TT>::type
56 template<
typename T,
template<
typename...>
class TT>
63 template <
typename T,
int ... Is>
64 constexpr
static std::array<T,
sizeof...(Is)>
68 return {{(
static_cast<void>(Is), value)...}};
71 template <
int N,
typename T>
72 constexpr
static std::array<T, N>
73 create_array(
const T& value)
81 template<std::size_t I = 0,
typename FuncT,
typename... Tp>
82 static typename std::enable_if<I ==
sizeof...(Tp),
void>::type
83 forEach(std::tuple<Tp...> &, FuncT)
86 template<std::size_t I = 0,
typename FuncT,
typename... Tp>
87 static typename std::enable_if<I <
sizeof...(Tp),
void>::type
88 forEach(std::tuple<Tp...>& t, FuncT f)
91 forEach<I + 1, FuncT, Tp...>(t, f);
94 template<std::size_t I = 0,
typename FuncT,
typename... Tp>
95 static typename std::enable_if<I ==
sizeof...(Tp),
void>::type
96 forEachPointer(std::tuple<Tp...> &, FuncT)
99 template<std::size_t I = 0,
typename FuncT,
typename... Tp>
100 static typename std::enable_if<I <
sizeof...(Tp),
void>::type
101 forEachPointer(std::tuple<Tp...>& t, FuncT f)
104 forEachPointer<I + 1, FuncT, Tp...>(t, f);
109 template<
int...>
struct index_tuple{};
111 template<
int I,
typename IndexTuple,
typename... Types>
112 struct make_indices_impl;
114 template<
int I,
int... Indexes,
typename T,
typename ... Types>
115 struct make_indices_impl<I, index_tuple<Indexes...>, T, Types...>
117 typedef typename make_indices_impl<I + 1, index_tuple<Indexes..., I>, Types...>::type type;
120 template<
int I,
int... Indexes>
121 struct make_indices_impl<I, index_tuple<Indexes...> >
123 typedef index_tuple<Indexes...> type;
126 template<
typename ... Types>
127 struct make_indices : make_indices_impl<0, index_tuple<>, Types...>
133 template<
class Ret,
class... Args,
template <
typename...>
class Wrapper,
int... Indexes >
134 static Ret applyWrapped_helper(std::function<Ret(Args...)> &pf, index_tuple< Indexes... >, std::tuple<Wrapper<Args>...>&& tup)
136 return pf( std::forward<Args>( std::get<Indexes>(tup).
object)... );
139 template<
class Ret,
class ... Args,
template <
typename...>
class Wrapper>
140 static Ret applyWrapped(std::function<Ret(Args...)> &pf,
const std::tuple<Wrapper<Args>...>& tup)
142 return applyWrapped_helper(pf,
typename make_indices<Args...>::type(), std::tuple<Wrapper<Args>...>(tup));
145 template<
class Ret,
class ... Args,
template <
typename...>
class Wrapper>
146 static Ret applyWrapped(std::function<Ret(Args...)> &pf, std::tuple<Wrapper<Args>...>&& tup)
148 return applyWrapped_helper(pf,
typename make_indices<Args...>::type(), std::forward<std::tuple<Wrapper<Args>...>>(tup));
155 #endif //LODESTAR_TEMPLATETOOLS_HPP