17#if __cplusplus >= 201703L
32 template <
typename T,
typename Enabler =
void>
35 template <
typename...
Ts>
37 using type = std::tuple<typename std::remove_reference<Ts>::type...>;
40 template <
typename Tuple>
46 template <
typename...
Ts>
51 template <
typename...
Ts,
typename...
Us,
typename...
R>
54 decltype(std::tuple_cat(std::declval<std::tuple<Ts...>>(), std::declval<std::tuple<Us...>>())),
R...>::type;
61 template <
typename Tuple,
template <
typename>
typename Predicate>
68 using type = std::tuple<E>;
78 template <
template <
typename>
typename Pred,
typename...
Es>
80 using type =
decltype(std::tuple_cat(
84 template <
typename Tuple,
template <
typename>
typename Pred>
155 template <
template <
typename>
typename Predicate,
typename...
Ts>
156 struct probe_any : std::bool_constant<(Predicate<Ts>::value || ...)> {};
158 template <
template <
typename>
typename Predicate,
typename...
Ts>
161 template <
template <
typename>
typename Predicate,
typename...
Ts>
169 template <
template <
typename>
typename Predicate,
typename...
Ts>
177 template <
template <
typename>
typename Predicate,
typename...
Ts>
178 struct probe_all : std::bool_constant<(Predicate<Ts>::value && ...)> {};
180 template <
template <
typename>
typename Predicate,
typename...
Ts>
183 template <
template <
typename>
typename Predicate,
typename...
Ts>
191 template <
template <
typename>
typename Predicate,
typename...
Ts>
203 template <
typename T>
206 template <
typename T>
209 template <
typename T>
210 struct is_void : std::bool_constant<is_void_v<T>> {};
212 template <
typename T>
215 template <
typename T>
218 template <
typename...
Ts>
221 template <
typename...
Ts>
224 template <
typename...
Ts>
227 template <
typename...
Ts>
230 template <
typename...
Ts>
233 template <
typename...
Ts>
236 template <
typename...
Ts>
239 template <
typename...
Ts>
242 template <
typename...
Ts>
245 template <
typename...
Ts>
248 template <
typename...
Ts>
251 template <
typename...
Ts>
254 template <
typename...
Ts>
257 template <
typename...
Ts>
260 template <
typename T>
268 template <
typename T>
271 template <
typename T>
273 std::is_lvalue_reference_v<T> &&std::is_const_v<std::remove_reference_t<T>>;
275 template <
typename T>
278 template <
typename T>
280 std::is_lvalue_reference_v<T> && !std::is_const_v<std::remove_reference_t<T>>;
282 template <
typename T>
285 template <
typename...
Ts>
288 template <
typename...
Ts>
291 template <
typename...
Ts>
333 template <
typename Typelist, std::
size_t N,
typename Enabler =
void>
336 template <
typename...
Ts>
341 template <
typename...
Ts>
346 template <
typename T,
typename...
Ts, std::size_t
N>
351 template <
typename T,
typename...
Ts, std::size_t
N>
357 template <
typename Typelist, std::
size_t N>
360 template <
typename ResultTuple,
typename InputTuple, std::
size_t N,
typename Enabler =
void>
363 template <
typename...
Ts,
typename...
Us>
367 template <
typename...
Ts,
typename...
Us>
372 template <
typename...
Ts,
typename U,
typename...
Us, std::size_t
N>
376 template <
typename...
Ts,
typename U,
typename...
Us, std::size_t
N>
381 template <
typename...
Ts, std::size_t
N>
386 template <
typename...
Ts, std::size_t
N>
392 template <
typename Typelist, std::
size_t N,
typename Enabler =
void>
395 template <
typename...
Ts, std::size_t
N>
397 using type =
typename take_first_n<std::tuple<
Ts...>, (
sizeof...(Ts) -
N)>::type;
399 template <
typename...
Ts, std::size_t
N>
404 template <
typename...
Ts, std::size_t
N>
405 struct drop_last_n<
std::
tuple<Ts...>,
N, std::enable_if_t<!(N <= sizeof...(Ts))>> {
406 using type = std::tuple<>;
408 template <
typename...
Ts, std::size_t
N>
409 struct drop_last_n<typelist<
Ts...>,
N,
std::
enable_if_t<!(N <= sizeof...(Ts))>> {
414 template <
typename T,
typename Enabler =
void>
417 template <
typename...
Ts>
419 using type = std::tuple<std::decay_t<Ts>...>;
421 template <
typename...
Ts>
426 template <
typename Tuple>
430 template <
typename T,
template <
typename...>
typename Pred>
436 template <
typename...
FilteredTs,
template <
typename...>
typename Pred>
440 template <
typename...
FilteredTs,
template <
typename...>
typename Pred>
447 : std::conditional_t<Pred<U>::value, filter_impl<typelist<FilteredTs..., U>, Pred, RestOfUs...>,
448 filter_impl<typelist<FilteredTs...>, Pred, RestOfUs...>> {};
451 : std::conditional_t<Pred<U>::value, filter_impl<std::tuple<FilteredTs..., U>, Pred, RestOfUs...>,
452 filter_impl<std::tuple<FilteredTs...>, Pred, RestOfUs...>> {};
454 template <
typename...
Ts,
template <
typename...>
typename Pred>
456 template <
typename...
Ts,
template <
typename...>
typename Pred>
459 template <
typename T,
template <
typename...>
typename Pred>
460 using filter_t =
typename filter<T, Pred>::type;
462 template <
typename T>
465 template <
typename T>
468 template <
typename T,
typename S,
typename U>
472 template <
typename...
Ts,
typename S,
typename...
Ss,
typename U,
typename...
Us>
479 template <
typename...
Ts,
typename...
Ss,
typename U,
typename...
Us>
486 template <
typename...
Ts,
typename...
Us>
492 template <
typename...
Ts,
typename...
Ss>
498 template <
typename...
Ts>
504 template <
typename T,
typename U>
507 template <
typename... T,
typename...
U>
512 template <
typename... T,
typename...
U>
518 template <
typename T,
typename U>
525 template <
typename T>
528 template <
typename...
Ts>
530 using type = std::tuple<void_to_Void_t<Ts>...>;
533 template <
typename tupleT>
536 template <
typename T>
539 template <
typename...
Ts>
541 using type = std::tuple<std::add_lvalue_reference_t<Ts>...>;
544 template <
typename tupleT>
547 template <
typename T>
550 template <
typename...
Ts>
552 using type = std::tuple<std::conditional_t<std::is_const_v<Ts>, std::add_lvalue_reference_t<Ts>,
553 std::add_rvalue_reference_t<std::remove_const_t<Ts>>>...>;
556 template <
typename tupleT>
559 template <
typename T,
typename...
Ts>
564 template <
typename T>
566 static constexpr bool value = !std::is_reference_v<T>;
569 template <
typename... T>
575 template <
typename... T>
578 template <
typename T>
579 struct is_tuple : std::integral_constant<bool, false> {};
581 template <
typename...
Ts>
584 template <
typename T>
585 constexpr bool is_tuple_v = is_tuple<T>::value;
588 struct is_span : std::false_type {};
590 template <
typename T, std::
size_t S>
591 struct is_span<
ttg::span<T, S>> : std::true_type {};
593 template <
typename T>
594 constexpr bool is_span_v = is_span<T>::value;
596 template <
template <
class>
class Pred,
typename TupleT, std::size_t
I, std::size_t...
Is>
599 template <
template <
class>
class Pred,
typename T,
typename...
Ts, std::size_t
I, std::size_t...
Is>
601 using seq = std::conditional_t<Pred<T>::value,
606 template <
template <
class>
class Pred, std::size_t
I, std::size_t...
Is>
608 using seq = std::index_sequence<
Is...>;
611 template <
typename T>
617 template <
typename TupleT>
618 using nonvoid_index_seq =
typename predicate_index_seq_helper<is_none_void_pred, TupleT, 0>::seq;
620 template <
typename T>
621 struct is_void_pred : std::integral_constant<bool, is_void_v<T>> {};
626 template <
typename TupleT>
627 using void_index_seq =
typename predicate_index_seq_helper<is_void_pred, TupleT, 0>::seq;
635 template <
typename T,
typename Enabler =
void>
638 template <
typename...
Ts>
641 template <
typename Tuple>
656 void operator=(
nonesuch const &) =
delete;
668 using value_t = std::false_type;
669 using type = Default;
672 template <
class Default,
template <
class...>
class TT,
class...
Args>
674 using value_t = std::true_type;
675 using type = TT<Args...>;
680 template <
template <
class...>
class TT,
class...
Args>
683 template <
template <
class...>
class TT,
class...
Args>
686 template <
class Default,
template <
class...>
class TT,
class...
Args>
689 template <
template <
class...>
class TT,
class...
Args>
692 template <
class Default,
template <
class...>
class TT,
class...
Args>
695 template <
class Expected,
template <
class...>
class TT,
class...
Args>
698 template <
class Expected,
template <
class...>
class TT,
class...
Args>
701 template <
class To,
template <
class...>
class TT,
class...
Args>
704 template <
class To,
template <
class...>
class TT,
class...
Args>
711 template <
typename T>
717 template <
typename T,
typename Enabler =
void>
719 template <
typename T>
721 T,
ttg::
meta::void_t<decltype(std::declval<std::hash<T>>()(std::declval<const T &>()))>> : std::true_type {};
722 template <
typename T>
730 template <
typename Key,
typename Value,
typename Enabler =
void>
731 struct send_callback;
732 template <
typename Key,
typename Value>
734 using type = std::function<void(
const Key &,
const Value &)>;
736 template <
typename Key,
typename Value>
738 using type = std::function<void(
const Key &)>;
740 template <
typename Key,
typename Value>
742 using type = std::function<void(
const Value &)>;
744 template <
typename Key,
typename Value>
746 using type = std::function<void()>;
748 template <
typename Key,
typename Value>
754 template <
typename Key,
typename Value,
typename Enabler =
void>
755 struct move_callback;
756 template <
typename Key,
typename Value>
758 using type = std::function<void(
const Key &, Value &&)>;
760 template <
typename Key,
typename Value>
762 using type = std::function<void(
const Key &)>;
764 template <
typename Key,
typename Value>
766 using type = std::function<void(Value &&)>;
768 template <
typename Key,
typename Value>
770 using type = std::function<void()>;
772 template <
typename Key,
typename Value>
778 template <
typename Key,
typename Value,
typename Enabler =
void>
779 struct broadcast_callback;
780 template <
typename Key,
typename Value>
782 using type = std::function<void(
const ttg::span<const Key> &,
const Value &)>;
784 template <
typename Key,
typename Value>
786 using type = std::function<void(
const ttg::span<const Key> &)>;
788 template <
typename Key,
typename Value>
790 using type = std::function<void(
const Value &)>;
792 template <
typename Key,
typename Value>
794 using type = std::function<void()>;
796 template <
typename Key,
typename Value>
804 template <
typename Key,
typename Enabler =
void>
805 struct setsize_callback;
806 template <
typename Key>
808 using type = std::function<void(
const Key &, std::size_t)>;
810 template <
typename Key>
812 using type = std::function<void(std::size_t)>;
814 template <
typename Key>
820 template <
typename Key,
typename Enabler =
void>
821 struct finalize_callback;
822 template <
typename Key>
824 using type = std::function<void(
const Key &)>;
826 template <
typename Key>
828 using type = std::function<void()>;
830 template <
typename Key>
836 template <
typename Key,
typename Return,
typename Enabler =
void>
838 template <
typename Key,
typename Return>
840 using type = std::function<Return(
const Key &)>;
842 template <
typename Key,
typename Return>
844 using type = std::function<Return()>;
846 template <
typename Key,
typename Return =
int>
847 using keymap_t =
typename keymap<Key, Return>::type;
855 template <
typename T,
typename Enabler =
void>
857 template <
typename T>
859 using type = std::function<void(std::decay_t<T> &,
const std::decay_t<T> &)>;
861 template <
typename T>
863 using type = std::function<void()>;
866 struct input_reducers {
867 using type = std::tuple<typename input_reducer_type<valueTs>::type...>;
870 struct input_reducers<
std::
tuple<valueTs...>> {
871 using type = std::tuple<typename input_reducer_type<valueTs>::type...>;
879 template <
typename Key,
typename Value,
typename Enabler =
void>
880 struct prepare_send_callback;
881 template <
typename Key,
typename Value>
883 using type = std::function<void(
const ttg::span<const Key> &,
const Value &)>;
885 template <
typename Key,
typename Value>
887 using type = std::function<void(
const ttg::span<const Key> &)>;
889 template <
typename Key,
typename Value>
891 using type = std::function<void(
const Value &)>;
893 template <
typename Key,
typename Value>
895 using type = std::function<void()>;
897 template <
typename Key,
typename Value>
900 template<
typename Key,
typename Enabler =
void>
903 template<
typename Key>
905 using type = std::function<bool(
const Key&)>;
908 template<
typename Key>
910 using type = std::function<bool()>;
913 template<
typename Key>
922 template <
typename T,
typename =
void>
926 template <
typename T>
927 struct is_iterable<T,
std::
void_t<decltype(std::begin(std::declval<T>())), decltype(std::end(std::declval<T>()))>>
930 template <
typename T>
936 template <
typename Callable,
typename Typelist>
940 template <
typename ReturnType,
typename Callable,
typename Typelist>
949 template <
typename Callable,
typename Typelist>
953 template <
class F,
class...
ArgTypes>
A complete version of void.
top-level TTG namespace contains runtime-neutral functionality
meta::typelist< Ts... > typelist