41#if defined __clang__ && __clang_major__ < 12
46template <
size_t... Is,
size_t... Js>
47constexpr auto operator+(index_sequence<Is...>, index_sequence<Js...>)
49 return index_sequence<Is..., Js...>();
65template <
typename... TYPES>
struct list;
68template <
typename TYPE>
70 auto addr =
reinterpret_cast<std::uintptr_t
>(ptr);
71 return !(addr %
alignof(TYPE));
78template <
typename TYPE>
82 operator std::type_index()
const {
91template <
typename TYPE>
95template <auto VALUE,
typename TYPE = decltype(VALUE)>
96using value =
typename std::integral_constant<TYPE, VALUE>::type;
101 return typeid(T).
name();
110 std::is_base_of_v<AD,T>
111 || std::is_base_of_v<SimdBase,T>
112 || std::is_base_of_v<ExprBase,T>
113 || std::is_arithmetic_v<T>
116 || std::is_pointer_v<T>
120template <
typename T,
typename U =
void>
124template <
typename WANTED,
typename... TYPES>
126 return (std::is_same_v<WANTED, TYPES> || ... ||
false);
130template <
typename... TYPES>
132 return ((field ==
typeid(TYPES)) || ... ||
false);
142 typename HEAD = void,
146 using type = std::conditional_t<
147 std::is_base_of<BASE, HEAD>::value,
153template <
typename BASE,
typename HEAD>
155 using type = std::conditional_t<
156 std::is_base_of<BASE, HEAD>::value,
168 typename HEAD = void,
172 using type = std::conditional_t<
173 std::is_base_of<BASE, HEAD>::value,
179template <
typename BASE,
typename HEAD>
181 using type = std::conditional_t<
182 std::is_base_of<BASE, HEAD>::value,
188template <
typename BASE,
typename... TYPES>
192template <
template<
typename>
typename COND,
typename... TYPES>
195template <
template<
typename>
typename COND,
typename HEAD,
typename... TAIL>
197 static constexpr unsigned value = std::conditional_t<
199 std::integral_constant<unsigned, 0>,
204template <
template<
typename>
typename COND>
206 static constexpr unsigned value = 0;
210template <
typename... TYPES>
212 template <
typename T>
213 using type = std::integral_constant<bool, (std::is_same_v<TYPES,T> || ...)>;
217template <
typename... TYPES>
219 template <
typename T>
220 using type = std::integral_constant<bool, (!std::is_same_v<TYPES,T> && ...)>;
224template <
template <
typename>
class COND,
typename HEAD=void,
typename... TAIL>
226 using type = std::conditional_t<
227 COND<HEAD>::value && !std::is_void_v<HEAD>,
228 typename filter<COND, TAIL...>::type::template push<HEAD>,
234template <
template <
typename>
class COND,
typename TYPE>
236 using type = std::conditional_t<
237 COND<TYPE>::value && !std::is_void<TYPE>::value,
244template <
template <
typename>
class COND,
typename... TYPES>
249template <
typename HEAD=void,
typename... TAIL>
251 using type = std::conditional_t<!std::is_void_v<HEAD>,
252 typename reverse<TAIL...>::type::template append<HEAD>,
258template <
typename TYPE>
260 using type = std::conditional_t<
261 !std::is_void<TYPE>::value,
268template <
typename... TYPES>
275template <
typename... TYPES>
277 static constexpr unsigned size =
sizeof...(TYPES);
280 template <
unsigned INDEX>
281 using get =
typename std::tuple_element<INDEX, std::tuple<id<TYPES>...>>::type::type;
287 template <
template<
typename...>
class COLLECTION>
290 template <
template<
typename>
class F>
293 template <
typename F>
296 template <
typename TYPE>
299 template <
typename... UYPES>
303 template <
typename... UYPES>
309 template <
typename BASE>
316 template <
typename BASE,
typename FALLBACK>
318 std::is_void_v<first_with_base<BASE>>,
324 template <
typename TYPE>
330 template <
typename F>
335 template <
typename TYPE>
343template <
typename LIST_A,
typename LIST_B>
344using merge =
typename LIST_A::template decompose_into<LIST_B::template include>;
347template <
typename TYPES,
typename F, std::size_t... INDICES>
351 (f(
id<
typename TYPES::template get<INDICES>>(), INDICES), ...);
353 (f(
id<
typename TYPES::template get<INDICES>>()), ...);
358template <
typename TUPLE,
typename F, std::size_t...INDICES>
361 if constexpr (std::is_invocable_v<F, decltype(std::get<0>(tuple)), std::integral_constant<std::size_t,0>>) {
362 (f(std::get<INDICES>(tuple), std::integral_constant<std::size_t,INDICES>{}), ...);
363 }
else if constexpr (std::is_invocable_v<F, decltype(std::get<0>(tuple)),
unsigned>) {
364 (f(std::get<INDICES>(tuple), INDICES), ...);
366 (f(std::get<INDICES>(tuple)), ...);
372template <
typename TUPLE,
typename F>
375 tuple_for_each_index(tuple, std::forward<F>(f), std::make_index_sequence<std::tuple_size<TUPLE>::value> {});
379template <
typename T,
unsigned D,
typename U, std::size_t... INDICES>
380std::array<T,D>
make_array(U&& u, std::index_sequence<INDICES...>)
382 return std::array<T,D> {(INDICES, u)...};
386template <
typename T,
unsigned D,
typename U>
393template <
typename T,
unsigned D,
typename F, std::size_t... INDICES>
396 return std::array<T,D> {f(INDICES)...};
400template <
typename T,
unsigned D,
typename F>
407template <
auto... VALUE,
typename COND>
410 return (cond(i++, VALUE) || ...);
413#if !defined __clang__ || __clang_major__ >= 12
416template <std::size_t... Is, std::size_t... Js>
417constexpr auto operator+(std::index_sequence<Is...>, std::index_sequence<Js...>)
419 return std::index_sequence<Is..., Js...>();
425template <std::size_t... Is>
428 return std::array<std::size_t,
sizeof...(Is)>{Is...};
432template <
typename PREDICATE, std::size_t... Is>
435 std::conditional_t<predicate(Is),
436 std::index_sequence<Is>,
437 std::index_sequence<>>()
439 + std::index_sequence<>()
444template <
typename TYPES,
typename PREDICATE, std::size_t... Is>
447 std::conditional_t<predicate(
id<
typename TYPES::template get<Is>>()),
448 std::index_sequence<Is>,
449 std::index_sequence<>>()
451 + std::index_sequence<>()
456template <
typename TYPES,
template<
typename>
class COND, std::size_t... Is>
459 std::conditional_t<COND<
typename TYPES::template get<Is>>
::value,
460 std::index_sequence<Is>,
461 std::index_sequence<>>()
463 + std::index_sequence<>()
468template <
typename TYPES,
template<
typename>
class COND>
473template <
typename MAP, std::size_t... Is>
475 return std::index_sequence<
map(Is)...>();
478template <std::size_t N, std::size_t I, std::size_t... Is>
480 if constexpr (N > 0) {
481 return std::index_sequence<I>() +
take_n_sequence<N-1>(std::index_sequence<Is...>());
483 return std::index_sequence<>();
485 __builtin_unreachable();
488template <std::size_t N, std::size_t I, std::size_t... Is>
490 if constexpr (N > 0) {
493 return std::index_sequence<I,Is...>();
495 __builtin_unreachable();
498template <std::
size_t N>
502 }, std::make_index_sequence<N>());
505template <std::
size_t I, std::
size_t O>
509 }, std::make_index_sequence<(O-I)>());
512template <std::size_t... Is>
514 return ((Is == 0) && ... &&
true);
518template <
typename F, std::size_t... INDICES>
524template <
unsigned N,
typename F>
526 return call_n_times<F>(std::forward<F&&>(f), std::make_index_sequence<N>{});
533template <
typename TYPES,
typename Fa,
typename Fb, std::size_t Ia, std::size_t Iaa, std::size_t... Is>
535 if constexpr (seq.size()>2) {
536 fa(
id<
typename TYPES::template get<Ia>>());
540 fa(
id<
typename TYPES::template get<Ia>>());
542 fa(
id<
typename TYPES::template get<Iaa>>());
549template <
typename TYPES,
typename Fa,
typename Fb, std::size_t I, std::size_t... Is>
551 fb(std::make_index_sequence<I>());
552 if constexpr (seq.size()>1) {
555 fa(
id<
typename TYPES::template get<I>>());
562template <
typename TYPES,
typename Fa,
typename Fb, std::size_t... Is>
564 if constexpr (seq.size()>0) {
567 fb(std::make_index_sequence<TYPES::size>());
573 typename HEAD = void,
578 if constexpr (!
sizeof...(TAIL)) {
579 if constexpr (std::is_same<HEAD,void>::value) {
582 if constexpr(std::is_same<BASE,void>::value){
585 using HEAD_EVAL =
typename BASE::template derivedField<HEAD>;
590 if constexpr(std::is_same<BASE,void>::value){
593 using HEAD_EVAL =
typename BASE::template derivedField<HEAD>;
597 __builtin_unreachable();
603 return !std::is_same_v<type, void>;
Top level namespace for all of OpenLB.
Expr operator+(Expr lhs, Expr rhs)