20 #ifndef __utl_meta_typelist_h__ 21 #define __utl_meta_typelist_h__ 64 template <
typename... Ts>
69 static constexpr
size_t size() noexcept {
73 static constexpr
bool empty() noexcept {
74 return (
sizeof...(Ts) == 0);
78 template <
typename... >
struct cat_ { };
79 template <
typename... L1,
typename... L2>
84 template <
size_t N,
typename ...T>
94 template <
typename ...T>
98 template <
typename ...T>
128 template <
typename List>
139 template <
typename List>
144 template <
typename T1,
typename T2>
154 template <
size_t N,
typename ...Ts>
160 template <
typename N,
typename ...Ts>
169 namespace apply_impl {
171 template <
typename Fn,
typename Seq>
175 template<
typename Fn,
typename ...List>
180 template <
typename Fn,
typename T, T... Is>
196 template <
typename Fn,
typename Seq>
199 template <
typename Fn,
typename Seq>
214 template <
typename ...>
217 template <
typename... voids>
220 template <
typename T>
static constexpr T select(voids..., T*, ...);
222 static constexpr
nil_ select (...);
225 template<
typename List, index_t N>
228 template<
typename... List,
index_t N>
231 using type = decltype(
242 template <
typename List, index_t N>
252 template <
typename List,
typename N>
259 namespace front_impl {
260 template <
typename L>
263 template <
typename Head,
typename... Tail>
271 template <
typename List>
279 namespace back_impl {
280 template <
typename List>
283 template <
typename Head,
typename... Tail>
286 typelist<Head, Tail...>,
sizeof...(Tail)
293 template <
typename List>
305 template <
typename... Lists>
313 template <
typename... L1>
318 template <
typename... L1,
typename... L2>
323 template <
typename... L1,
typename... L2,
typename... Ln>
325 :
cat_ <typelist<L1..., L2...>, Ln...> { };
335 template <
typename... Lists>
344 namespace fold_impl {
346 template<
typename,
typename,
typename>
350 template<
typename Head,
typename... Tail,
364 template<
typename V0,
typename Fn>
382 template <
typename List,
typename V,
typename Fn>
386 template <
typename List,
typename V,
typename Fn>
389 namespace rev_fold_impl {
392 template<
typename,
typename,
typename>
396 template<
typename Head,
typename... Tail,
412 template<
typename Tail,
typename V,
typename Fn>
417 template<
typename V,
typename Fn>
435 template <
typename List,
typename V,
typename Fn>
445 template <
typename List,
typename... Ts>
456 template <
typename List,
typename... Ts>
465 namespace reverse_impl {
466 template <
typename List,
typename V = typelist<>>
476 template <
typename List>
484 namespace pop_front_impl {
485 template <
typename List>
488 template <
typename Head,
typename... Tail>
499 template <
typename List>
507 namespace pop_back_impl {
508 template <
typename List>
523 template <
typename List>
531 namespace transform_impl {
532 template <
typename,
typename =
void>
535 template <
typename... Ts,
typename Fn>
543 template <
typename... Ts0,
typename... Ts1,
typename Fn>
565 template <
typename... Args>
573 namespace transform_lazy_impl {
574 template <
typename,
typename =
void>
578 template <
typename... Ts,
typename Fn>
587 template <
typename... Ts0,
typename... Ts1,
typename Fn>
611 template <
typename... Args>
620 namespace find_if_impl {
621 template <
typename,
typename, index_t>
624 template<
typename Head,
typename... Tail,
typename Fn,
index_t N>
637 template<
typename Fn, index_t N>
654 template<
typename List,
typename Pred>
662 template <
typename List,
typename T>
668 namespace seek_if_impl {
669 template <
typename,
typename, index_t>
672 template<
typename Head,
typename... Tail,
typename Fn,
index_t N>
685 template<
typename Fn, index_t N>
702 template <
typename List,
typename Pred>
710 template <
typename List,
typename T>
716 namespace count_if_impl {
717 template <
typename,
typename,
size_t>
720 template<
typename Head,
typename... Tail,
typename Fn,
size_t N>
736 template<
typename Fn,
size_t N>
752 template <
typename List,
typename Pred>
760 template <
typename List,
typename T>
766 namespace filter_impl {
767 template <
typename,
typename,
typename>
770 template<
typename Head,
typename... Tail,
typename Fn,
typename L>
782 template<
typename Fn,
typename L>
797 template <
typename List,
typename Pred>
805 namespace replace_if_impl {
806 template <
typename,
typename,
typename,
typename>
809 template <
typename Head,
typename... Tail,
typename Fn,
typename T,
typename Ret>
821 template <
typename Fn,
typename T,
typename Ret>
838 template<
typename List,
typename Pred,
typename T>
845 template <
typename List,
typename T,
typename U>
854 template <
typename List,
typename Pred>
865 template <
typename List,
typename Pred>
872 template <
typename List,
typename Pred>
if_c< If::type::value, Args... > if_
Select one type or another depending on a compile-time Boolean type.
void void_t
void_t type alias
Detection idiom based on WG21's N4502 [n4502 1] from Walter E. Brown.
STL's core language concepts.
Template meta-programming SFINAE helpers.
size_t index_t
index_t and size_t mend to be interchangeable
not_c< _Tp::type::value > not_
not
Implementation detail main forward header.