1 #ifndef SIPLASPLAS_UTILITY_META_H 2 #define SIPLASPLAS_UTILITY_META_H 13 using decay_t =
typename std::decay<T>::type;
15 template<
typename... Bs>
18 template<
typename B,
typename... Bs>
21 static_assert(B::value,
"Assertion failed");
28 using void_t =
typename std::conditional<sizeof(T) >= 0, void, T>
::type;
36 template<
typename Metafunction>
37 using type_t =
typename Metafunction::type;
39 template<
typename MetafunctionClass,
typename... Args>
40 using apply_t = type_t<
typename MetafunctionClass::template apply<Args...>>;
42 template<
typename MetafunctionClass,
typename Seq>
45 template<
typename MetafunctionClass,
46 template<
typename...>
class Seq,
typename... Ts>
49 using type = apply_t<MetafunctionClass, Ts...>;
52 template<
typename MetafunctionClass,
typename Seq>
53 using sequence_apply_t = type_t<sequence_apply<MetafunctionClass, Seq>>;
55 template<std::u
int8_t I>
56 using uint8_t = std::integral_constant<std::uint8_t, I>;
57 template<std::u
int16_t I>
58 using uint16_t = std::integral_constant<std::uint16_t, I>;
59 template<std::u
int32_t I>
60 using uint32_t = std::integral_constant<std::uint32_t, I>;
61 template<std::u
int64_t I>
62 using uint64_t = std::integral_constant<std::uint64_t, I>;
64 template<std::
int8_t I>
65 using int8_t = std::integral_constant<std::int8_t, I>;
66 template<std::
int16_t I>
67 using int16_t = std::integral_constant<std::int16_t, I>;
68 template<std::
int32_t I>
69 using int32_t = std::integral_constant<std::int32_t, I>;
70 template<std::
int64_t I>
71 using int64_t = std::integral_constant<std::int64_t, I>;
73 template<std::
size_t I>
74 using size_t = std::integral_constant<std::size_t, I>;
77 using bool_ = std::integral_constant<bool, B>;
78 using true_ = bool_<true>;
79 using false_ = bool_<false>;
82 using char_ = std::integral_constant<char, C>;
84 template<
typename T,
typename =
void>
91 template<
typename T,
typename = assert<is_
integral<T>>>
92 constexpr decltype(T::value) value()
97 template<
template<
typename...>
class Function>
100 template<
typename... Args>
103 template<typename Instance, bool = is_integral<Instance>::value>
106 using type = Instance;
109 template<
typename Instance>
112 using type = type_t<Instance>;
121 template<
typename Lhs,
typename Rhs>
127 using type = bool_<Lhs::value && Rhs::value>;
131 template<
typename Lhs,
typename Rhs>
132 using and_t = apply_t<and_, Lhs, Rhs>;
136 template<
typename Lhs,
typename Rhs>
142 using type = bool_<Lhs::value || Rhs::value>;
146 template<
typename Lhs,
typename Rhs>
147 using or_t = apply_t<or_, Lhs, Rhs>;
151 template<
typename Lhs,
typename Rhs>
157 using type = std::integral_constant<decltype(Lhs::value + Rhs::value), Lhs::value + Rhs::value>;
163 template<
typename Lhs,
typename Rhs>
169 using type = std::integral_constant<decltype(Lhs::value / Rhs::value), Lhs::value / Rhs::value>;
173 template<
typename Lhs,
typename Rhs>
174 using add_t = apply_t<add_, Lhs, Rhs>;
176 template<
typename Lhs,
typename Rhs>
177 using div_t = apply_t<div_, Lhs, Rhs>;
181 template<
typename Lhs,
typename Rhs>
187 using type = bool_<(Lhs::value > Rhs::value)>;
192 template<
typename Lhs,
typename Rhs>
198 using type = bool_<(Lhs::value >= Rhs::value)>;
203 template<
typename Lhs,
typename Rhs>
209 using type = bool_<(Lhs::value < Rhs::value)>;
214 template<
typename Lhs,
typename Rhs>
220 using type = bool_<(Lhs::value <= Rhs::value)>;
224 template<
typename... Ts>
227 static constexpr std::size_t size =
sizeof...(Ts);
230 template<
typename List>
233 template<
template<
typename...>
class Sequence,
typename... Ts>
234 struct list_size<Sequence<Ts...>> :
public size_t<sizeof...(Ts)>
237 template<
char... Chars>
241 template<
typename Seq>
244 static_assert(
sizeof(Seq) !=
sizeof(Seq),
"Type is not a sequence");
247 template<
template<
typename...>
class Seq,
typename... Ts>
250 template<
typename... Us>
253 using type = Seq<Us...>;
256 template<
template<
typename...>
class Seq2,
typename... Us>
257 struct apply<Seq2<Us...>>
259 using type = Seq<Us...>;
263 template<
typename Seq,
typename... Ts>
264 using apply_functor = apply_t<functor<Seq>, Ts...>;
266 template<
typename Seq,
typename... Ts>
267 using functor_t = apply_functor<Seq, Ts...>;
269 template<
typename Lhs,
typename Rhs>
272 template<
template<
typename...>
class Seq,
273 typename... Lhs,
typename... Rhs>
274 struct cat<Seq<Lhs...>, Seq<Rhs...>>
276 using type = Seq<Lhs..., Rhs...>;
279 template<
typename Lhs,
typename Rhs>
280 using cat_t = type_t<cat<Lhs, Rhs>>;
282 template<std::
size_t I>
283 using index_t = std::integral_constant<std::size_t, I>;
285 template<
typename T, T... Values>
288 template<std::size_t... Is>
293 template<
typename Left, std::
size_t Index,
typename Right>
296 template<
template<
typename...>
class Seq, std::size_t Index,
297 typename... Left,
typename Head,
typename... Tail>
298 struct split<Seq<Left...>, Index, Seq<Head, Tail...>>
300 using next =
split<Seq<Left..., Head>, Index - 1, Seq<Tail...>>;
302 using before =
typename next::before;
303 using left =
typename next::left;
304 using head =
typename next::head;
305 using right =
typename next::right;
306 using after =
typename next::after;
309 template<
template<
typename...>
class Seq,
310 typename... Left,
typename Head,
typename... Tail>
311 struct split<Seq<Left...>, 0, Seq<Head, Tail...>>
313 using before = Seq<Left...>;
314 using left = Seq<Left..., Head>;
316 using right = Seq<Head, Tail...>;
317 using after = Seq<Tail...>;
320 template<
template<
typename...>
class Seq,
324 using before = Seq<>;
325 using left = Seq<Head>;
327 using right = Seq<Head>;
332 template<std::size_t Index,
typename... Ts>
334 template<std::size_t Index,
typename... Ts>
335 using pack_split_left_t =
typename pack_split<Index, Ts...>::left;
336 template<std::size_t Index,
typename... Ts>
337 using pack_get_t =
typename pack_split<Index, Ts...>::head;
338 template<std::size_t Index,
typename... Ts>
339 using pack_split_right_t =
typename pack_split<Index, Ts...>::right;
340 template<std::size_t Index,
typename... Ts>
341 using pack_split_before_t =
typename pack_split<Index, Ts...>::before;
342 template<std::size_t Index,
typename... Ts>
343 using pack_split_after_t =
typename pack_split<Index, Ts...>::after;
344 template<
typename... Ts>
345 using pack_head_t = pack_get_t<0, Ts...>;
346 template<
typename... Ts>
347 using pack_tail_t = pack_split_after_t<0, Ts...>;
349 template<std::
size_t Index,
typename Seq>
351 template<std::size_t Index,
template<
typename...>
class Seq,
typename... Ts>
356 using before =
typename splitter::before;
357 using left =
typename splitter::left;
358 using head =
typename splitter::head;
359 using right =
typename splitter::right;
360 using after =
typename splitter::after;
362 template<std::
size_t Index,
typename Seq>
364 template<std::
size_t Index,
typename Seq>
366 template<std::
size_t Index,
typename Seq>
368 template<std::
size_t Index,
typename Seq>
370 template<std::
size_t Index,
typename Seq>
372 template<
typename Seq>
373 using head_t = get_t<0, Seq>;
374 template<
typename Seq>
375 using tail_t = split_after_t<0, Seq>;
378 template<
typename T,
typename... Ts>
380 template<
typename T,
typename... Ts>
382 template<
typename T, std::size_t Index,
typename... Ts>
383 using pack_insert_t = cat_t<pack_append_t<pack_split_left_t<Index, Ts...>, T>, pack_split_right_t<Index, Ts...>>;
384 template<
typename T, std::size_t Index,
typename... Ts>
385 using pack_remove_t = cat_t<pack_split_before_t<Index, Ts...>, pack_split_after_t<Index, Ts...>>;
387 template<
typename T,
typename Seq>
389 template<
typename T,
template<
typename...>
class Seq,
typename... Ts>
392 using type = Seq<T, Ts...>;
394 template<
typename T,
typename Seq>
396 template<
typename T,
template<
typename...>
class Seq,
typename... Ts>
399 using type = Seq<Ts..., T>;
402 template<
typename T,
typename Seq>
403 using prepend_t = type_t<prepend<T, Seq>>;
404 template<
typename T,
typename Seq>
405 using append_t = type_t<append<Seq, T>>;
406 template<
typename T, std::
size_t Index,
typename Seq>
407 using insert_t = cat_t<append_t<split_left_t<Index, Seq>, T>, split_right_t<Index, Seq>>;
408 template<
typename T, std::
size_t Index,
typename Seq>
409 using remove_t = cat_t<split_before_t<Index, Seq>, split_after_t<Index, Seq>>;
413 template<
typename Result,
typename Lhs,
typename Rhs,
typename Compare>
416 template<
template<
typename...>
class Sequence,
typename... Ts,
typename LhsHead,
typename... LhsTail,
typename RhsHead,
typename... RhsTail,
typename Compare>
417 struct merge<Sequence<Ts...>, Sequence<LhsHead, LhsTail...>, Sequence<RhsHead, RhsTail...>,
Compare>
419 using next_result = std::conditional_t<
420 apply_t<Compare, LhsHead, RhsHead>::value,
421 Sequence<Ts..., LhsHead>,
422 Sequence<Ts..., RhsHead>
424 using next_lhs = std::conditional_t<
425 apply_t<Compare, LhsHead, RhsHead>::value,
426 Sequence<LhsTail...>,
427 Sequence<LhsHead, LhsTail...>
429 using next_rhs = std::conditional_t<
430 apply_t<Compare, LhsHead, RhsHead>::value,
431 Sequence<RhsHead, RhsTail...>,
445 template<
template<
typename...>
class Sequence,
typename... Ts,
typename LhsHead,
typename... LhsTail,
typename Compare>
446 struct merge<Sequence<Ts...>, Sequence<LhsHead, LhsTail...>, Sequence<>,
Compare>
448 using type = Sequence<Ts..., LhsHead, LhsTail...>;
451 template<
template<
typename...>
class Sequence,
typename... Ts,
typename RhsHead,
typename... RhsTail,
typename Compare>
452 struct merge<Sequence<Ts...>, Sequence<>, Sequence<RhsHead, RhsTail...>,
Compare>
454 using type = Sequence<Ts..., RhsHead, RhsTail...>;
457 template<
template<
typename...>
class Sequence,
typename... Ts,
typename Compare>
460 using type = Sequence<Ts...>;
464 template<
typename Lhs,
typename Rhs,
typename Compare = less>
467 template<
typename Lhs,
typename Rhs,
typename Compare = less>
468 using merge_t = type_t<merge<Lhs, Rhs, Compare>>;
474 template<
typename List,
typename Compare>
477 using left = split_left_t< div_t<list_size<List>, int32_t<2>>::value, List>;
478 using right = split_after_t<div_t<list_size<List>, int32_t<2>>::value, List>;
480 using left_sorted = type_t<mergesort<left, Compare>>;
481 using right_sorted = type_t<mergesort<right, Compare>>;
483 using type = merge_t<left_sorted, right_sorted, Compare>;
486 template<
template<
typename...>
class Sequence,
typename Compare>
489 using type = Sequence<>;
492 template<
template<
typename...>
class Sequence,
typename T,
typename Compare>
495 using type = Sequence<T>;
498 template<
template<
typename...>
class Sequence,
typename T,
typename U,
typename Compare>
501 template<typename First, typename Second, bool FirstWins = apply_t<Compare, First, Second>::value>
504 using type = Sequence<First, Second>;
507 template<
typename First,
typename Second>
508 struct apply<First, Second, false>
510 using type = Sequence<Second, First>;
513 using type = type_t<apply<T, U>>;
518 template<
typename List,
typename Compare = less>
521 template<
typename List,
typename Compare = less>
522 using sort_t = type_t<sort<List, Compare>>;
524 template<
typename Key,
typename Value>
531 template<
typename Pair>
532 using key_t =
typename Pair::key;
533 template<
typename Pair>
534 using value_t =
typename Pair::value;
536 template<
typename... Ts>
539 template<
typename... Ts>
544 template<
typename Ts>
547 template<
template<
typename...>
class Seq,
typename T,
typename... Ts>
560 template<
template<
typename...>
class Seq>
571 template<
typename... Ts>
574 template<
typename...>
577 template<
typename... Keys,
typename... Values>
584 template<
typename Key>
585 using at_key = type_t<decltype(lookup((inherit<pairs>*)
nullptr))>;
587 template<
typename Key,
typename Value>
591 template<
typename Map>
592 using keys_t =
typename Map::keys;
593 template<
typename Map>
594 using values_t =
typename Map::values;
595 template<
typename Map>
596 using pairs_t =
typename Map::pairs;
597 template<
typename Map,
typename Key>
598 using at_key =
typename Map::template at_key<Key>;
600 template<
typename Function,
typename... Ts>
606 template<
typename Function,
typename List>
609 template<
typename Function,
template<
typename...>
class Seq,
typename... Ts>
612 using type = Seq<apply_t<Function, Ts>...>;
617 template<
typename Predicate,
typename FilteredSeq,
typename Seq>
620 template<
typename Predicate,
621 template<
typename...>
class Seq,
typename... Filtered,
typename Head,
typename... Tail>
622 struct filter<Predicate, Seq<Filtered...>, Seq<Head, Tail...>>
624 template<
typename _Head = Head,
bool = value<apply_t<Predicate, _Head>>()>
627 using type = Seq<Filtered..., Head>;
630 template<
typename _Head>
631 struct next<_Head, false>
633 using type = Seq<Filtered...>;
636 using type = type_t<filter<Predicate, type_t<next<>>, Seq<Tail...>>>;
639 template<
typename Predicate,
640 template<
typename...>
class Seq,
typename... Filtered>
641 struct filter<Predicate, Seq<Filtered...>, Seq<>>
643 using type = Seq<Filtered...>;
647 template<
typename Function,
typename Seed,
typename Seq>
650 template<
typename Function,
typename Seed,
651 template<
typename...>
class Seq,
typename Head,
typename... Tail>
656 apply_t<Function, Seed, Head>,
662 template<
typename Function,
typename Seed,
663 template<
typename...>
class Seq>
669 template<
typename Function,
typename Seed,
typename Seq>
672 template<
typename Function,
typename Seed,
673 template<
typename...>
class Seq,
typename Head,
typename... Tail>
676 using type = apply_t<
678 type_t<
foldr<Function, Seed, Seq<Tail...>>>
682 template<
typename Function,
typename Seed,
683 template<
typename...>
class Seq>
689 template<
typename Function,
typename... Ts>
691 template<
typename Function,
typename Seq>
692 using fmap_t = type_t<fmap<Function, Seq>>;
694 template<
typename Function,
typename Seed,
typename... Seq>
696 template<
typename Function,
typename Seed,
typename... Seq>
697 using pack_foldl_t = type_t<pack_foldl<Function, Seed, Seq...>>;
698 template<
typename Function,
typename Seed,
typename Seq>
699 using foldl_t = type_t<foldl<Function, Seed, Seq>>;
701 template<
typename Function,
typename Seed,
typename... Seq>
703 template<
typename Function,
typename Seed,
typename... Seq>
704 using pack_foldr_t = type_t<pack_foldr<Function, Seed, Seq...>>;
705 template<
typename Function,
typename Seed,
typename Seq>
706 using foldr_t = type_t<foldr<Function, Seed, Seq>>;
708 template<
typename Predicate,
typename Seq>
710 template<
typename Predicate,
typename Seq>
711 using filter_t = type_t<filter<Predicate, Seq>>;
712 template<
typename Predicate,
typename... Seq>
714 template<
typename Predicate,
typename... Seq>
715 using pack_filter_t = type_t<pack_filter<Predicate, Seq...>>;
717 template<
typename Bs>
719 template<
typename Bs>
720 using any_of_t = foldl_t<or_, false_, Bs>;
721 template<
typename... Bs>
723 template<
typename... Bs>
724 using pack_any_of_t = pack_foldl_t<or_, false_, Bs...>;
726 template<
typename Bs>
728 template<
typename Bs>
729 using any_of_t = foldl_t<or_, false_, Bs>;
730 template<
typename... Bs>
731 using pack_any_of = pack_foldl<or_, false_, Bs...>;
732 template<
typename... Bs>
733 using pack_any_of_t = pack_foldl_t<or_, false_, Bs...>;
735 template<
typename... Seqs>
736 using join =
foldl<defer<cat>, apply_functor<pack_get_t<0, Seqs...>>, apply_functor<pack_get_t<0, Seqs...>, Seqs...>>;
737 template<
typename... Seqs>
738 using join_t = type_t<join<Seqs...>>;
742 template<
template<
typename...>
class Seq, std::size_t N>
745 static constexpr std::size_t n = (N % 2) ? ((N - 1) / 2) : (N / 2);
746 static constexpr std::size_t m = N - n;
753 using type = apply_t<add_, size_t<n>, T>;
758 type_t<make_index_sequence<Seq, n>>,
759 fmap_t<adder, type_t<make_index_sequence<Seq, m>>>
763 template<
template<
typename...>
class Seq>
766 using type = Seq<size_t<0>>;
769 template<
template<
typename...>
class Seq>
776 template<std::size_t N,
template<
typename...>
class Seq =
list>
778 template<
typename... Ts>
779 using make_index_sequence_for = make_index_sequence<
sizeof...(Ts)>;
780 template<
typename Seq>
782 template<
template<
typename...>
class Seq,
typename... Ts>
785 using type = make_index_sequence<
sizeof...(Ts), Seq>;
787 template<
typename Seq>
788 using to_index_sequence_t = type_t<to_index_sequence<Seq>>;
793 #endif // SIPLASPLAS_UTILITY_META_H
Definition: membermatching.cpp:14
Definition: messaging.hpp:8
Definition: test_util.hpp:13
Definition: function.hpp:14