40#ifndef LIB_META_TUPLE_HELPER_H
41#define LIB_META_TUPLE_HELPER_H
71 template<
typename...TYPES>
76 template<
typename...TYPES>
81 using std::remove_cv_t;
82 using std::is_reference_v;
83 using std::remove_reference_t;
90 { std::tuple_size<TUP>::value } -> std::convertible_to<size_t>;
95 template<
class TUP, std::
size_t idx>
98 typename std::tuple_element_t<idx, TUP>;
99 {
get<idx>(
tup) } -> std::convertible_to<std::tuple_element_t<idx, TUP>&>;
103 template<
class TUP, std::
size_t idx>
106 typename std::tuple_element_t<idx, TUP>;
107 {
tup.template
get<idx>() } -> std::convertible_to<std::tuple_element_t<idx, TUP>&>;
110 template<
class TUP, std::
size_t idx>
136 template<std::
size_t idx,
class TUP>
141 using Tup = std::remove_reference_t<TUP>;
142 static_assert (0 < std::tuple_size_v<Tup>);
145 if constexpr (std::is_reference_v<TUP>)
149 using Elm = std::tuple_element_t<idx, TUP>;
167 template<
typename FUN,
typename TUP,
size_t...Idx>
168 constexpr decltype(
auto)
169 __unpack_and_apply (
FUN&&
f, TUP&&
tup, std::index_sequence<Idx...>)
171 return std::invoke (std::forward<FUN> (
f)
178 template<
template<
typename...>
class META,
class FUN,
class TUP>
181 using Tupl = std::decay_t<TUP>;
186 template<
template<
typename...>
class META,
class FUN,
class TUP>
189 using Tupl = std::decay_t<TUP>;
195 template<
class FUN,
class TUP>
208 constexpr decltype(
auto)
211 using Indices = std::make_index_sequence<std::tuple_size_v<std::remove_reference_t<TUP>>>;
213 return __unpack_and_apply (std::forward<FUN> (
f)
214 ,std::forward<TUP> (
tup)
230 forEach (TUP&& tuple,
FUN fun)
234 (fun (std::forward<ELMS>(
elms)), ...);
236 ,std::forward<TUP> (tuple));
255 mapEach (TUP&& tuple,
FUN fun)
259 using Tuple = std::tuple<decltype(fun (std::forward<ELMS>(
elms))) ...>;
260 return Tuple (fun (std::forward<ELMS>(
elms)) ...);
262 ,std::forward<TUP> (tuple));
271 template<tuple_like TUP>
276 template<
size_t...idx>
282 static constexpr size_t SIZ = std::tuple_size_v<TUP>;
284 using Idx = std::make_index_sequence<SIZ>;
288 template<
template<
class>
class META>
291 template<
template<
typename...>
class O>
294 template<
template<
class>
class PRED>
297 template<
template<
class>
class PRED>
307 template<
typename SEQ>
312 template<
typename...TYPES>
318 template<
class H,
typename TAIL>
341 template<
typename TYPES>
342 using Tuple = BuildTupleType<TYPES>::Type;
345 using std::tuple_size;
346 using std::tuple_element;
351 template<
typename...TYPES>
357 template<
typename...TYPES>
392 template<
typename TYPES
401 template<
size_t idx,
class SRC>
408 >{std::forward<SRC> (init)};
412 template<
class SRC,
size_t...idx>
434 template<
class SRC,
class TAR>
438 template<
class SRC,
class TAR,
size_t i>
451 template<
typename TYPES,
class SRC>
484 <
template<
class,
class,
class, u
int>
class _X_
509 <
template<
class,
class,
class, u
int>
class _X_
539 dump (std::string
const& prefix =
"(")
const
541 return BASE::dump (prefix +
util::toString(std::get<idx>(*
this))+
",");
545 template<
class TUP, u
int n>
554 dump (std::string
const& prefix =
"(")
const
556 if (1 < prefix.length())
558 return prefix.substr (0, prefix.length()-1) +
")";
573 template<
typename...TYPES>
575 dump (std::tuple<TYPES...>
const& tuple)
578 using Displayer = BuildAccessor::Product ;
580 return static_cast<Displayer
const&
> (tuple)
592 template<
typename...TYPES>
596 invoke (std::tuple<TYPES...>
const& tuple)
noexcept
598 return "«"+typeStr(tuple)
601 catch(...) {
return FAILURE_INDICATOR; }
Implementation namespace for support and library code.
std::string toString(TY const &val) noexcept
get some string representation of any object, reliably.
static std::string invoke(std::tuple< TYPES... > const &tuple) noexcept
failsafe invocation of custom string conversion.
Metaprogramming: simple helpers for working with lists-of-types.
A template metaprogramming technique for manipulating collections of types.
Some basic facilities for manipulating type sequences.
Metaprogramming with type sequences based on variadic template parameters.