12#include "detray/definitions/detail/qualifiers.hpp"
13#include "detray/utils/tuple.hpp"
14#include "detray/utils/type_traits.hpp"
22namespace detray::detail {
31template <std::size_t I,
typename... value_types>
32DETRAY_HOST_DEVICE
constexpr decltype(
auto) get(
33 const ::detray::dtuple<value_types...>& tuple)
noexcept {
34 return ::detray::get<I>(tuple);
37template <std::size_t I,
typename... value_types>
38DETRAY_HOST_DEVICE
constexpr decltype(
auto) get(
40 return ::detray::get<I>(tuple);
43template <
typename query_t,
typename... value_types>
44DETRAY_HOST_DEVICE
constexpr decltype(
auto) get(
45 const ::detray::dtuple<value_types...>& tuple)
noexcept {
46 return ::detray::get<get_type_pos_v<query_t, value_types...>>(tuple);
49template <
typename query_t,
typename... value_types>
50DETRAY_HOST_DEVICE
constexpr decltype(
auto) get(
52 return ::detray::get<get_type_pos_v<query_t, value_types...>>(tuple);
61template <std::
size_t N,
class T>
65template <std::size_t N,
typename... value_types>
67 : std::tuple_element<N, std::tuple<value_types...>> {};
71template <std::size_t N,
typename... value_types>
74 using type = std::decay_t<decltype(::detray::get<N>(
78template <std::
size_t N,
class T>
91template <
typename... value_types>
93 : std::tuple_size<std::tuple<value_types...>> {};
97template <
typename... value_types>
100 static constexpr std::size_t
value =
sizeof...(value_types);
126using unwrap_decay_t =
typename unwrap_refwrapper<std::decay_t<T>>::type;
129template <
template <
typename...>
class tuple_t,
class... value_types>
130 requires std::is_same_v<tuple_t<value_types...>, std::tuple<value_types...>>
131DETRAY_HOST
constexpr std::tuple<unwrap_decay_t<value_types>...>
make_tuple(
132 value_types&&... args) {
133 return std::make_tuple(std::forward<value_types>(args)...);
137template <
template <
typename...>
class tuple_t,
class... value_types>
138 requires std::is_same_v<tuple_t<value_types...>,
141make_tuple(value_types&&... args) {
143 std::forward<value_types>(args)...};
151template <
typename T,
typename tuple_t>
158template <
typename T,
typename U,
typename... Ts>
161template <
typename T,
typename... Ts>
162struct has_type<T, std::
tuple<T, Ts...>> : std::true_type {};
168template <
typename T,
typename U,
typename... Ts>
170 :
has_type<T, detray::dtuple<Ts...>> {};
172template <
typename T,
typename... Ts>
175template <
typename T,
class tuple_t>
181template <
typename... tuple_ts>
184template <
typename... Args>
186 using type = std::tuple<Args...>;
189template <
typename... Args1,
typename... Args2,
typename... tuple_ts>
190struct tuple_cat_type<std::
tuple<Args1...>, std::tuple<Args2...>, tuple_ts...> {
191 using type =
typename tuple_cat_type<std::tuple<Args1..., Args2...>,
196template <
typename... Args>
203template <
typename... Args1,
typename... Args2,
typename... tuple_ts>
211template <
typename... tuple_ts>
217template <std::size_t I,
typename... tuple_ts>
221template <std::
size_t I>
223 using type = std::tuple<>;
227template <std::size_t I,
typename Arg1,
typename... Args>
228struct unique_types<I, std::
tuple<Arg1, Args...>> {
229 using type = std::conditional_t<
230 has_type_v<Arg1, std::tuple<Args...>>,
231 typename unique_types<I - 1u, std::tuple<Args...>>::type,
232 typename unique_types<I - 1u, std::tuple<Args..., Arg1>>::type>;
236template <
typename Arg1,
typename... Args>
237struct unique_types<0u, std::tuple<Arg1, Args...>> {
238 using type = std::tuple<Arg1, Args...>;
242template <std::
size_t I>
249template <std::size_t I,
typename Arg1,
typename... Args>
252 using type = std::conditional_t<
259template <
typename Arg1,
typename... Args>
265template <
typename tuple_t>
272template <
typename T1,
typename T2>
277 :
public std::true_type {};
280template <
typename... Args1,
typename... Args2>
289 template <
typename o_tuple_t,
typename T,
typename... U>
291 if constexpr (detray::detail::has_type_v<T, o_tuple_t>) {
292 if constexpr (
sizeof...(U) == 0u) {
295 return compare<o_tuple_t, U...>();
304 ((detray::detail::tuple_size_v<T1> == detray::detail::tuple_size_v<T2>) &&
308template <
typename T1,
typename T2>
316template <
template <
typename...>
class trait,
typename tuple_t>
319template <
template <
typename...>
class trait,
typename... Args>
321 static constexpr bool value = (trait<Args>::value || ...);
324template <
template <
typename...>
class trait,
typename... Args>
327 static constexpr bool value = (trait<Args>::value || ...);
330template <
template <
typename...>
class trait,
typename tuple_t>
334template <
template <
typename...>
class trait,
typename tuple_t>
337template <
template <
typename...>
class trait,
typename... Args>
339 static constexpr bool value = (trait<Args>::value && ...);
342template <
template <
typename...>
class trait,
typename... Args>
345 static constexpr bool value = (trait<Args>::value && ...);
348template <
template <
typename...>
class trait,
typename tuple_t>
Detray include(s).
Definition array_operators.hpp:18
constexpr detray::tuple< std::decay_t< Ts >... > make_tuple(Ts &&...vs)
Construct a tuple by decaying and forwarding its arguments.
Definition tuple.hpp:219
detray::tuple< types... > dtuple
Tuple type used by detray storage and dispatch.
Definition containers.hpp:46
Check if the tuple contains a type.
Definition tuple_helpers.hpp:152
detray::dtuple< Args2... > T2
Second tuple type being compared.
Definition tuple_helpers.hpp:285
static consteval bool compare()
Check whether every type in the pack occurs in the other tuple.
Definition tuple_helpers.hpp:290
static constexpr bool value
Whether both tuples contain the same types, regardless of order.
Definition tuple_helpers.hpp:303
detray::dtuple< Args1... > T1
First tuple type being compared.
Definition tuple_helpers.hpp:283
Check for equality of tuple types modulo permutation.
Definition tuple_helpers.hpp:273
static constexpr bool value
Whether every element type satisfies trait.
Definition tuple_helpers.hpp:345
Definition tuple_helpers.hpp:335
static constexpr bool value
Whether at least one element type satisfies trait.
Definition tuple_helpers.hpp:327
Check trait on ever element of the tuple.
Definition tuple_helpers.hpp:317
typename tuple_cat_type< detray::dtuple< Args1..., Args2... >, tuple_ts... >::type type
Tuple type containing the concatenated element types.
Definition tuple_helpers.hpp:207
detray::dtuple< Args... > type
Tuple type produced by concatenation.
Definition tuple_helpers.hpp:199
Concatenate tuple types.
Definition tuple_helpers.hpp:182
std::decay_t< decltype(::detray::get< N >( std::declval< detray::dtuple< value_types... > >()))> type
Decayed type of the selected element.
Definition tuple_helpers.hpp:74
tuple_element for std::tuple
Definition tuple_helpers.hpp:62
static constexpr std::size_t value
Number of element types in the tuple.
Definition tuple_helpers.hpp:100
tuple_size for std::tuple
Definition tuple_helpers.hpp:88
detray::dtuple< Arg1, Args... > type
Tuple type at the end of duplicate removal.
Definition tuple_helpers.hpp:262
std::conditional_t< has_type_v< Arg1, detray::dtuple< Args... > >, typename unique_types< I - 1u, detray::dtuple< Args... > >::type, typename unique_types< I - 1u, detray::dtuple< Args..., Arg1 > >::type > type
Tuple type with repeated element types removed.
Definition tuple_helpers.hpp:252
detray::dtuple<> type
Empty tuple type.
Definition tuple_helpers.hpp:245
Remove duplicate types from tuple.
Definition tuple_helpers.hpp:218
make_tuple for std::tuple users have to specify tuple_t for detail::make_tuple
Definition tuple_helpers.hpp:114
T type
Decayed type when the argument is not a reference wrapper.
Definition tuple_helpers.hpp:116
Default tuple type.
Definition tuple.hpp:26