16#if __cplusplus >= 201703L
31 template <
typename T,
typename Enabler =
void>
34 template <
typename...
Ts>
36 using type = std::tuple<typename std::remove_reference<Ts>::type...>;
39 template <
typename Tuple>
45 template <
typename...
Ts>
50 template <
typename...
Ts,
typename...
Us,
typename...
R>
53 decltype(std::tuple_cat(std::declval<std::tuple<Ts...>>(), std::declval<std::tuple<Us...>>())),
R...>::type;
60 template <
typename Tuple,
template <
typename>
typename Predicate>
67 using type = std::tuple<E>;
77 template <
template <
typename>
typename Pred,
typename...
Es>
79 using type =
decltype(std::tuple_cat(
83 template <
typename Tuple,
template <
typename>
typename Pred>
154 template <
template <
typename>
typename Predicate,
typename...
Ts>
155 struct probe_any : std::bool_constant<(Predicate<Ts>::value || ...)> {};
157 template <
template <
typename>
typename Predicate,
typename...
Ts>
160 template <
template <
typename>
typename Predicate,
typename...
Ts>
168 template <
template <
typename>
typename Predicate,
typename...
Ts>
176 template <
template <
typename>
typename Predicate,
typename...
Ts>
177 struct probe_all : std::bool_constant<(Predicate<Ts>::value && ...)> {};
179 template <
template <
typename>
typename Predicate,
typename...
Ts>
182 template <
template <
typename>
typename Predicate,
typename...
Ts>
190 template <
template <
typename>
typename Predicate,
typename...
Ts>
202 template <
typename T>
205 template <
typename T>
208 template <
typename T>
209 struct is_void : std::bool_constant<is_void_v<T>> {};
211 template <
typename T>
214 template <
typename T>
217 template <
typename...
Ts>
220 template <
typename...
Ts>
223 template <
typename...
Ts>
226 template <
typename...
Ts>
229 template <
typename...
Ts>
232 template <
typename...
Ts>
235 template <
typename...
Ts>
238 template <
typename...
Ts>
241 template <
typename...
Ts>
244 template <
typename...
Ts>
247 template <
typename...
Ts>
250 template <
typename...
Ts>
253 template <
typename...
Ts>
256 template <
typename...
Ts>
259 template <
typename T>
267 template <
typename T>
270 template <
typename T>
272 std::is_lvalue_reference_v<T> &&std::is_const_v<std::remove_reference_t<T>>;
274 template <
typename T>
277 template <
typename T>
279 std::is_lvalue_reference_v<T> && !std::is_const_v<std::remove_reference_t<T>>;
281 template <
typename T>
284 template <
typename...
Ts>
287 template <
typename...
Ts>
290 template <
typename...
Ts>
332 template <
typename Typelist, std::
size_t N,
typename Enabler =
void>
335 template <
typename...
Ts>
340 template <
typename...
Ts>
345 template <
typename T,
typename...
Ts, std::size_t
N>
350 template <
typename T,
typename...
Ts, std::size_t
N>
356 template <
typename Typelist, std::
size_t N>
359 template <
typename ResultTuple,
typename InputTuple, std::
size_t N,
typename Enabler =
void>
362 template <
typename...
Ts,
typename...
Us>
366 template <
typename...
Ts,
typename...
Us>
371 template <
typename...
Ts,
typename U,
typename...
Us, std::size_t
N>
375 template <
typename...
Ts,
typename U,
typename...
Us, std::size_t
N>
380 template <
typename...
Ts, std::size_t
N>
385 template <
typename...
Ts, std::size_t
N>
391 template <
typename Typelist, std::
size_t N,
typename Enabler =
void>
394 template <
typename...
Ts, std::size_t
N>
396 using type =
typename take_first_n<std::tuple<
Ts...>, (
sizeof...(Ts) -
N)>::type;
398 template <
typename...
Ts, std::size_t
N>
403 template <
typename...
Ts, std::size_t
N>
404 struct drop_last_n<
std::
tuple<Ts...>,
N, std::enable_if_t<!(N <= sizeof...(Ts))>> {
405 using type = std::tuple<>;
407 template <
typename...
Ts, std::size_t
N>
408 struct drop_last_n<typelist<
Ts...>,
N,
std::
enable_if_t<!(N <= sizeof...(Ts))>> {
413 template <
typename T,
typename Enabler =
void>
416 template <
typename...
Ts>
418 using type = std::tuple<std::decay_t<Ts>...>;
420 template <
typename...
Ts>
425 template <
typename Tuple>
429 template <
typename T,
template <
typename...>
typename Pred>
435 template <
typename...
FilteredTs,
template <
typename...>
typename Pred>
439 template <
typename...
FilteredTs,
template <
typename...>
typename Pred>
446 : std::conditional_t<Pred<U>::value, filter_impl<typelist<FilteredTs..., U>, Pred, RestOfUs...>,
447 filter_impl<typelist<FilteredTs...>, Pred, RestOfUs...>> {};
450 : std::conditional_t<Pred<U>::value, filter_impl<std::tuple<FilteredTs..., U>, Pred, RestOfUs...>,
451 filter_impl<std::tuple<FilteredTs...>, Pred, RestOfUs...>> {};
453 template <
typename...
Ts,
template <
typename...>
typename Pred>
455 template <
typename...
Ts,
template <
typename...>
typename Pred>
458 template <
typename T,
template <
typename...>
typename Pred>
459 using filter_t =
typename filter<T, Pred>::type;
461 template <
typename T>
464 template <
typename T>
467 template <
typename T,
typename S,
typename U>
471 template <
typename...
Ts,
typename S,
typename...
Ss,
typename U,
typename...
Us>
478 template <
typename...
Ts,
typename...
Ss,
typename U,
typename...
Us>
485 template <
typename...
Ts,
typename...
Us>
491 template <
typename...
Ts,
typename...
Ss>
497 template <
typename...
Ts>
503 template <
typename T,
typename U>
506 template <
typename... T,
typename...
U>
511 template <
typename... T,
typename...
U>
517 template <
typename T,
typename U>
524 template <
typename T>
527 template <
typename...
Ts>
529 using type = std::tuple<void_to_Void_t<Ts>...>;
532 template <
typename tupleT>
535 template <
typename T>
538 template <
typename...
Ts>
540 using type = std::tuple<std::add_lvalue_reference_t<Ts>...>;
543 template <
typename tupleT>
546 template <
typename T>
549 template <
typename...
Ts>
551 using type = std::tuple<std::conditional_t<std::is_const_v<Ts>, std::add_lvalue_reference_t<Ts>,
552 std::add_rvalue_reference_t<std::remove_const_t<Ts>>>...>;
555 template <
typename tupleT>
558 template <
typename T,
typename...
Ts>
563 template <
typename T>
565 static constexpr bool value = !std::is_reference_v<T>;
568 template <
typename... T>
574 template <
typename... T>
577 template <
typename T>
578 struct is_tuple : std::integral_constant<bool, false> {};
580 template <
typename...
Ts>
583 template <
typename T>
584 constexpr bool is_tuple_v = is_tuple<T>::value;
587 struct is_span : std::false_type {};
589 template <
typename T, std::
size_t S>
590 struct is_span<
ttg::span<T, S>> : std::true_type {};
592 template <
typename T>
593 constexpr bool is_span_v = is_span<T>::value;
595 template <
template <
class>
class Pred,
typename TupleT, std::size_t
I, std::size_t...
Is>
598 template <
template <
class>
class Pred,
typename T,
typename...
Ts, std::size_t
I, std::size_t...
Is>
600 using seq = std::conditional_t<Pred<T>::value,
605 template <
template <
class>
class Pred, std::size_t
I, std::size_t...
Is>
607 using seq = std::index_sequence<
Is...>;
610 template <
typename T>
616 template <
typename TupleT>
617 using nonvoid_index_seq =
typename predicate_index_seq_helper<is_none_void_pred, TupleT, 0>::seq;
619 template <
typename T>
620 struct is_void_pred : std::integral_constant<bool, is_void_v<T>> {};
625 template <
typename TupleT>
626 using void_index_seq =
typename predicate_index_seq_helper<is_void_pred, TupleT, 0>::seq;
634 template <
typename T,
typename Enabler =
void>
637 template <
typename...
Ts>
640 template <
typename Tuple>
655 void operator=(
nonesuch const &) =
delete;
667 using value_t = std::false_type;
668 using type = Default;
671 template <
class Default,
template <
class...>
class TT,
class...
Args>
673 using value_t = std::true_type;
674 using type = TT<Args...>;
679 template <
template <
class...>
class TT,
class...
Args>
682 template <
template <
class...>
class TT,
class...
Args>
685 template <
class Default,
template <
class...>
class TT,
class...
Args>
688 template <
template <
class...>
class TT,
class...
Args>
691 template <
class Default,
template <
class...>
class TT,
class...
Args>
694 template <
class Expected,
template <
class...>
class TT,
class...
Args>
697 template <
class Expected,
template <
class...>
class TT,
class...
Args>
700 template <
class To,
template <
class...>
class TT,
class...
Args>
703 template <
class To,
template <
class...>
class TT,
class...
Args>
710 template <
typename T>
716 template <
typename T,
typename Enabler =
void>
718 template <
typename T>
720 T,
ttg::
meta::void_t<decltype(std::declval<std::hash<T>>()(std::declval<const T &>()))>> : std::true_type {};
721 template <
typename T>
729 template <
typename Key,
typename Value,
typename Enabler =
void>
730 struct send_callback;
731 template <
typename Key,
typename Value>
733 using type = std::function<void(
const Key &,
const Value &)>;
735 template <
typename Key,
typename Value>
737 using type = std::function<void(
const Key &)>;
739 template <
typename Key,
typename Value>
741 using type = std::function<void(
const Value &)>;
743 template <
typename Key,
typename Value>
745 using type = std::function<void()>;
747 template <
typename Key,
typename Value>
753 template <
typename Key,
typename Value,
typename Enabler =
void>
754 struct move_callback;
755 template <
typename Key,
typename Value>
757 using type = std::function<void(
const Key &, Value &&)>;
759 template <
typename Key,
typename Value>
761 using type = std::function<void(
const Key &)>;
763 template <
typename Key,
typename Value>
765 using type = std::function<void(Value &&)>;
767 template <
typename Key,
typename Value>
769 using type = std::function<void()>;
771 template <
typename Key,
typename Value>
777 template <
typename Key,
typename Value,
typename Enabler =
void>
778 struct broadcast_callback;
779 template <
typename Key,
typename Value>
781 using type = std::function<void(
const ttg::span<const Key> &,
const Value &)>;
783 template <
typename Key,
typename Value>
785 using type = std::function<void(
const ttg::span<const Key> &)>;
787 template <
typename Key,
typename Value>
789 using type = std::function<void(
const Value &)>;
791 template <
typename Key,
typename Value>
793 using type = std::function<void()>;
795 template <
typename Key,
typename Value>
803 template <
typename Key,
typename Enabler =
void>
804 struct setsize_callback;
805 template <
typename Key>
807 using type = std::function<void(
const Key &, std::size_t)>;
809 template <
typename Key>
811 using type = std::function<void(std::size_t)>;
813 template <
typename Key>
819 template <
typename Key,
typename Enabler =
void>
820 struct finalize_callback;
821 template <
typename Key>
823 using type = std::function<void(
const Key &)>;
825 template <
typename Key>
827 using type = std::function<void()>;
829 template <
typename Key>
835 template <
typename Key,
typename Return,
typename Enabler =
void>
837 template <
typename Key,
typename Return>
839 using type = std::function<Return(
const Key &)>;
841 template <
typename Key,
typename Return>
843 using type = std::function<Return()>;
845 template <
typename Key,
typename Return =
int>
846 using keymap_t =
typename keymap<Key, Return>::type;
854 template <
typename T,
typename Enabler =
void>
856 template <
typename T>
858 using type = std::function<void(std::decay_t<T> &,
const std::decay_t<T> &)>;
860 template <
typename T>
862 using type = std::function<void()>;
865 struct input_reducers {
866 using type = std::tuple<typename input_reducer_type<valueTs>::type...>;
869 struct input_reducers<
std::
tuple<valueTs...>> {
870 using type = std::tuple<typename input_reducer_type<valueTs>::type...>;
878 template <
typename Key,
typename Value,
typename Enabler =
void>
879 struct prepare_send_callback;
880 template <
typename Key,
typename Value>
882 using type = std::function<void(
const ttg::span<const Key> &,
const Value &)>;
884 template <
typename Key,
typename Value>
886 using type = std::function<void(
const ttg::span<const Key> &)>;
888 template <
typename Key,
typename Value>
890 using type = std::function<void(
const Value &)>;
892 template <
typename Key,
typename Value>
894 using type = std::function<void()>;
896 template <
typename Key,
typename Value>
899 template<
typename Key,
typename Enabler =
void>
902 template<
typename Key>
904 using type = std::function<bool(
const Key&)>;
907 template<
typename Key>
909 using type = std::function<bool()>;
912 template<
typename Key>
921 template <
typename T,
typename =
void>
925 template <
typename T>
926 struct is_iterable<T,
std::
void_t<decltype(std::begin(std::declval<T>())), decltype(std::end(std::declval<T>()))>>
929 template <
typename T>
935 template <
typename Callable,
typename Typelist>
939 template <
typename ReturnType,
typename Callable,
typename Typelist>
948 template <
typename Callable,
typename Typelist>
952 template <
class F,
class...
ArgTypes>
A complete version of void.
top-level TTG namespace contains runtime-neutral functionality
meta::typelist< Ts... > typelist