Iros
 
Loading...
Searching...
No Matches
list.h
Go to the documentation of this file.
1#pragma once
2
3#include "di/meta/constexpr.h"
4#include "di/meta/core.h"
5#include "di/meta/function.h"
6#include "di/types/integers.h"
7
8namespace di::meta {
9namespace detail {
10 template<usize index, typename... Types>
11 struct AtHelper {};
12
13 template<typename T, typename... Rest>
14 struct AtHelper<0, T, Rest...> : TypeConstant<T> {};
15
16 template<usize index, typename T, typename... Rest>
17 struct AtHelper<index, T, Rest...> : AtHelper<index - 1, Rest...> {};
18}
19
20namespace detail {
21 template<typename Needle, typename... Types>
22 struct LookupHelper : Constexpr<0ZU> {};
23
24 template<typename Needle, typename T, typename... Rest>
25 struct LookupHelper<Needle, T, Rest...>
26 : Constexpr<concepts::SameAs<T, Needle> ? 0ZU : 1 + LookupHelper<Needle, Rest...>::value> {};
27}
28
29namespace detail {
30 template<typename... Types>
31 struct BackHelper {};
32
33 template<typename T>
34 struct BackHelper<T> : TypeConstant<T> {};
35
36 template<typename Head, typename... Tail>
37 struct BackHelper<Head, Tail...> : BackHelper<Tail...> {};
38}
39
40template<typename Head, typename... Rest>
41struct List<Head, Rest...> {
42 using Front = Head;
43
44 using Back = Type<detail::BackHelper<Rest...>>;
45
46 constexpr static usize size = sizeof...(Rest) + 1;
47
48 template<usize index>
49 using At = Type<detail::AtHelper<index, Head, Rest...>>;
50
51 template<typename T>
52 constexpr static auto Lookup = detail::LookupHelper<T, Head, Rest...>::value;
53
54 template<typename T>
55 constexpr static bool UniqueType =
56 (static_cast<usize>(concepts::SameAs<T, Head>) + ... + static_cast<usize>(concepts::SameAs<T, Rest>)) == 1ZU;
57};
58
59template<typename T>
60struct List<T> {
61 using Front = T;
62 using Back = T;
63
64 constexpr static usize size = 1;
65
66 template<usize index>
68
69 template<typename U>
71
72 template<typename U>
73 constexpr static bool UniqueType = concepts::SameAs<T, U>;
74};
75
76template<>
77struct List<> {
78 constexpr static usize size = 0;
79
80 template<typename U>
81 constexpr static bool UniqueType = false;
82
83 template<usize index>
84 requires(false)
85 using At = void;
86
87 template<usize index>
88 requires(false)
89 using Front = void;
90
91 template<usize index>
92 requires(false)
93 using Back = void;
94
95 template<typename U>
96 constexpr static usize Lookup = 0;
97};
98
99template<concepts::TypeList T>
100using Front = T::Front;
101
102template<concepts::TypeList T>
103using Back = T::Back;
104
105template<concepts::TypeList T>
106constexpr inline usize Size = T::size;
107
108template<concepts::TypeList T, usize index>
109requires(index < Size<T>)
110using At = typename T::template At<index>;
111
112template<typename T, concepts::TypeList List>
113constexpr static inline auto Lookup = List::template Lookup<T>;
114
115template<typename T, typename List>
117
118template<typename List, typename T>
119concept Contains = concepts::TypeList<List> && (Lookup<T, List> < Size<List>);
120
121namespace detail {
122 template<typename T, typename List>
124
125 template<typename T>
126 struct CountHelper<T, List<>> : meta::Constexpr<0ZU> {};
127
128 template<typename T, typename U, typename... Rest>
129 struct CountHelper<T, List<U, Rest...>> {
130 constexpr static auto value = (concepts::SameAs<T, U> ? 1 : 0) + CountHelper<T, List<Rest...>>::value;
131 };
132}
133
134template<concepts::TypeList List, typename T>
135constexpr static auto Count = detail::CountHelper<T, List>::value;
136
137template<typename List, typename T>
138concept ExactlyOnce = concepts::TypeList<List> && Count<List, T> == 1;
139}
Definition core.h:114
Definition core.h:164
Definition list.h:119
Definition list.h:138
Definition list.h:116
Definition const_sentinel.h:8
Definition merge_interfaces.h:6
typename T::template At< index > At
Definition list.h:110
T::Type Type
Definition core.h:26
constexpr usize Size
Definition list.h:106
T::Back Back
Definition list.h:103
T::Front Front
Definition list.h:100
size_t usize
Definition integers.h:33
A wrapper for a constexpr value.
Definition core.h:77
static constexpr auto value
Definition constexpr.h:40
Definition core.h:5
static constexpr usize size
Definition list.h:64
void At
Definition list.h:85
Type< detail::BackHelper< Rest... > > Back
Definition list.h:44
detail::AtHelper< index, T >::Type At
Definition list.h:67
static constexpr auto Lookup
Definition list.h:70
void Back
Definition list.h:93
void Front
Definition list.h:89
Head Front
Definition list.h:42
T Front
Definition list.h:61
Type< detail::AtHelper< index, Head, Rest... > > At
Definition list.h:49
static constexpr usize size
Definition list.h:78
static constexpr usize size
Definition list.h:46
static constexpr usize Lookup
Definition list.h:96
T Back
Definition list.h:62
static constexpr auto Lookup
Definition list.h:52
Definition core.h:18
Definition list.h:11
Definition list.h:31
Definition list.h:123
static constexpr auto value
Definition list.h:130
Definition list.h:22