v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
list.h
Go to the documentation of this file.
1// Copyright 2024 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_BASE_TEMPLATE_META_PROGRAMMING_LIST_H_
6#define V8_BASE_TEMPLATE_META_PROGRAMMING_LIST_H_
7
8#include <cstddef>
9#include <limits>
10#include <type_traits>
11
13
14#define TYPENAME1 \
15 template <typename> \
16 typename
17
18namespace v8::base::tmp {
19
20// list is a classical type list.
21template <typename...>
22struct list {};
23
24// list1 is a version of list that holds 1-ary template types.
25template <TYPENAME1...>
26struct list1 {};
27
28namespace detail {
29
30template <typename List>
32template <typename... Ts>
33struct length_impl<list<Ts...>>
34 : std::integral_constant<size_t, sizeof...(Ts)> {};
35template <TYPENAME1... Ts>
36struct length_impl<list1<Ts...>>
37 : std::integral_constant<size_t, sizeof...(Ts)> {};
38
39template <typename List, size_t Index>
41template <typename Head, typename... Tail>
42struct element_impl<list<Head, Tail...>, 0> {
43 using type = Head;
44};
45template <typename Head, typename... Tail, size_t Index>
46struct element_impl<list<Head, Tail...>, Index>
47 : element_impl<list<Tail...>, Index - 1> {};
48
49template <template <typename> typename F, typename List>
50struct map_impl;
51template <template <typename> typename F, typename... Ts>
52struct map_impl<F, list<Ts...>> {
54};
55
56template <size_t I, size_t Otherwise, typename T, typename List>
58template <size_t I, size_t Otherwise, typename T, typename Head,
59 typename... Tail>
60struct index_of_impl<I, Otherwise, T, list<Head, Tail...>>
61 : public index_of_impl<I + 1, Otherwise, T, list<Tail...>> {};
62template <size_t I, size_t Otherwise, typename T, typename... Tail>
63struct index_of_impl<I, Otherwise, T, list<T, Tail...>>
64 : public std::integral_constant<size_t, I> {};
65template <size_t I, size_t Otherwise, typename T>
66struct index_of_impl<I, Otherwise, T, list<>>
67 : public std::integral_constant<size_t, Otherwise> {};
68
69template <size_t I, size_t Otherwise, TYPENAME1 T, typename List1>
71template <size_t I, size_t Otherwise, TYPENAME1 T, TYPENAME1 Head,
72 TYPENAME1... Tail>
73struct index_of1_impl<I, Otherwise, T, list1<Head, Tail...>>
74 : public index_of1_impl<I + 1, Otherwise, T, list1<Tail...>> {};
75template <size_t I, size_t Otherwise, TYPENAME1 T, TYPENAME1... Tail>
76struct index_of1_impl<I, Otherwise, T, list1<T, Tail...>>
77 : public std::integral_constant<size_t, I> {};
78template <size_t I, size_t Otherwise, TYPENAME1 T>
79struct index_of1_impl<I, Otherwise, T, list1<>>
80 : public std::integral_constant<size_t, Otherwise> {};
81
82template <typename List, typename Element>
84template <typename... Ts, typename Element>
85struct contains_impl<list<Ts...>, Element>
86 : std::bool_constant<(equals<Ts, Element>::value || ...)> {};
87
88template <typename List, TYPENAME1 Element>
90template <TYPENAME1... Ts, TYPENAME1 Element>
91struct contains_impl1<list1<Ts...>, Element>
92 : std::bool_constant<(equals1<Ts, Element>::value || ...)> {};
93
94template <typename List, template <typename, typename> typename Cmp>
96template <typename Head, typename... Tail,
97 template <typename, typename> typename Cmp>
98struct all_equal_impl<list<Head, Tail...>, Cmp>
99 : std::bool_constant<(Cmp<Head, Tail>::value && ...)> {};
100
101template <size_t I, typename T, typename Before, typename After>
103template <size_t I, typename T, typename... Before, typename Head,
104 typename... Tail>
105struct insert_at_impl<I, T, list<Before...>, list<Head, Tail...>>
106 : insert_at_impl<I - 1, T, list<Before..., Head>, list<Tail...>> {};
107template <size_t I, typename T, typename... Before>
108struct insert_at_impl<I, T, list<Before...>, list<>> {
109 using type = list<Before..., T>;
110};
111template <typename T, typename... Before, typename Head, typename... Tail>
112struct insert_at_impl<0, T, list<Before...>, list<Head, Tail...>> {
113 using type = list<Before..., T, Head, Tail...>;
114};
115
116template <size_t I, TYPENAME1 T, typename Before, typename After>
118template <size_t I, TYPENAME1 T, TYPENAME1... Before, TYPENAME1 Head,
119 TYPENAME1... Tail>
120struct insert_at1_impl<I, T, list1<Before...>, list1<Head, Tail...>>
121 : insert_at1_impl<I - 1, T, list1<Before..., Head>, list1<Tail...>> {};
122template <size_t I, TYPENAME1 T, TYPENAME1... Before>
123struct insert_at1_impl<I, T, list1<Before...>, list<>> {
124 using type = list1<Before..., T>;
125};
126template <TYPENAME1 T, TYPENAME1... Before, TYPENAME1 Head, TYPENAME1... Tail>
127struct insert_at1_impl<0, T, list1<Before...>, list1<Head, Tail...>> {
128 using type = list1<Before..., T, Head, Tail...>;
129};
130
131template <template <typename, typename> typename F, typename T, typename List>
133template <template <typename, typename> typename F, typename T, typename Head,
134 typename... Tail>
135struct fold_right_impl<F, T, list<Head, Tail...>> {
136 using type =
137 F<Head, typename fold_right_impl<F, T, list<Tail...>>::type>::type;
138};
139template <template <typename, typename> typename F, typename T>
140struct fold_right_impl<F, T, list<>> {
141 using type = T;
142};
143
144template <template <TYPENAME1, typename> typename F, typename T, typename List1>
146template <template <TYPENAME1, typename> typename F, typename T, TYPENAME1 Head,
147 TYPENAME1... Tail>
148struct fold_right1_impl<F, T, list1<Head, Tail...>> {
149 using type =
150 F<Head, typename fold_right1_impl<F, T, list1<Tail...>>::type>::type;
151};
152template <template <TYPENAME1, typename> typename F, typename T>
153struct fold_right1_impl<F, T, list1<>> {
154 using type = T;
155};
156
157} // namespace detail
158
159// length<List>::value is the length of the {List}.
160template <typename List>
161struct length : detail::length_impl<List> {};
162template <typename List>
163constexpr size_t length_v = length<List>::value;
164template <typename List1>
165struct length1 : detail::length_impl<List1> {};
166template <typename List1>
168
169// element<List, Index>::type is the {List}'s element at {Index}.
170template <typename List, size_t Index>
171struct element : detail::element_impl<List, Index> {};
172template <typename List, size_t Index>
174
175// map<F, List>::type is a new list after applying {F} (in the form of
176// F<E>::type) to all elements (E) in {List}.
177template <template <typename> typename F, typename List>
178struct map : detail::map_impl<F, List> {};
179template <template <typename> typename F, typename List>
180using map_t = typename map<F, List>::type;
181
182// index_of<List, T, Otherwise>::value is the first index of {T} in {List} or
183// {Otherwise} if the list doesn't contain {T}.
184template <typename List, typename T,
185 size_t Otherwise = std::numeric_limits<size_t>::max()>
186struct index_of : detail::index_of_impl<0, Otherwise, T, List> {};
187template <typename List, typename T,
188 size_t Otherwise = std::numeric_limits<size_t>::max()>
190template <typename List1, TYPENAME1 T,
191 size_t Otherwise = std::numeric_limits<size_t>::max()>
192struct index_of1 : detail::index_of1_impl<0, Otherwise, T, List1> {};
193template <typename List1, TYPENAME1 T,
194 size_t Otherwise = std::numeric_limits<size_t>::max()>
196
197// contains<List, T>::value is true iff {List} contains {T}.
198template <typename List, typename T>
199struct contains : detail::contains_impl<List, T> {};
200template <typename List, typename T>
202template <typename List1, TYPENAME1 T>
203struct contains1 : detail::contains_impl1<List1, T> {};
204template <typename List1, TYPENAME1 T>
206
207// all_equal<List, Cmp = equals>::value is true iff all values in {List}
208// are equal with respect to {Cmp}.
209template <typename List, template <typename, typename> typename Cmp = equals>
210struct all_equal : detail::all_equal_impl<List, Cmp> {};
211template <typename List, template <typename, typename> typename Cmp = equals>
213
214// insert_at<List, I, T>::value is identical to {List}, except that {T} is
215// inserted at position {I}. If {I} is larger than the length of the list, {T}
216// is simply appended.
217template <typename List, size_t I, typename T>
218struct insert_at : public detail::insert_at_impl<I, T, list<>, List> {};
219template <typename List, size_t I, typename T>
221template <typename List1, size_t I, TYPENAME1 T>
222struct insert_at1 : public detail::insert_at1_impl<I, T, list1<>, List1> {};
223template <typename List1, size_t I, TYPENAME1 T>
225
226// fold_right recursively applies binary function {F} to elements of the {List}
227// and the previous result, starting from the right. The initial value is {T}.
228// Example, for E0, E1, ... En elements of List:
229// fold_right<F, List, T>::type
230// resembles
231// F<E0, F<E1, ... F<En, T>::type ...>::type>::type.
232template <template <typename, typename> typename F, typename List, typename T>
233struct fold_right : public detail::fold_right_impl<F, T, List> {};
234template <template <typename, typename> typename F, typename List, typename T>
236template <template <TYPENAME1, typename> typename F, typename List1, typename T>
237struct fold_right1 : public detail::fold_right1_impl<F, T, List1> {};
238template <template <TYPENAME1, typename> typename F, typename List1, typename T>
240
241} // namespace v8::base::tmp
242
243#undef TYPENAME1
244
245#endif // V8_BASE_TEMPLATE_META_PROGRAMMING_LIST_H_
#define F(name, str)
#define T
typename map< F, List >::type map_t
Definition list.h:180
constexpr size_t length_v
Definition list.h:163
fold_right1< F, List1, T >::type fold_right1_t
Definition list.h:239
constexpr bool all_equal_v
Definition list.h:212
constexpr bool contains1_v
Definition list.h:205
insert_at1< List1, I, T >::type insert_at1_t
Definition list.h:224
constexpr size_t length1_v
Definition list.h:167
constexpr size_t index_of_v
Definition list.h:189
constexpr size_t index_of1_v
Definition list.h:195
typename element< List, Index >::type element_t
Definition list.h:173
insert_at< List, I, T >::type insert_at_t
Definition list.h:220
constexpr bool contains_v
Definition list.h:201
fold_right< F, List, T >::type fold_right_t
Definition list.h:235
#define I(name, number_of_args, result_size)
Definition runtime.cc:36
#define TYPENAME1
Definition common.h:10
F< Head, typename fold_right1_impl< F, T, list1< Tail... > >::type >::type type
Definition list.h:149
F< Head, typename fold_right_impl< F, T, list< Tail... > >::type >::type type
Definition list.h:136
wasm::ValueType type