DPC++ Runtime
Runtime libraries for oneAPI DPC++
type_list.hpp
Go to the documentation of this file.
1 //==----------- type_list.hpp - SYCL list of types utils -------------------==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #pragma once
10 
11 #include <sycl/access/access.hpp> // for address_space
12 
13 #include <type_traits> // for bool_constant, conditional_t, fals...
14 
15 #include <sycl/detail/boost/mp11/algorithm.hpp>
16 #include <sycl/detail/boost/mp11/set.hpp>
17 
18 namespace sycl {
19 inline namespace _V1 {
20 namespace detail {
21 
22 template <class... T> using type_list = boost::mp11::mp_list<T...>;
23 
25 
26 template <typename T>
27 using is_empty_type_list = std::is_same<T, empty_type_list>;
28 
29 // is_contained
30 template <typename T, typename TypeList>
31 using is_contained =
32  boost::mp11::mp_set_contains<TypeList, std::remove_cv_t<T>>;
33 template <typename T, typename TypeList>
35 
36 // type list append
37 template <class... L> using tl_append = boost::mp11::mp_append<L...>;
38 
39 // value_list
40 template <typename T, T... Values> struct value_list;
41 
42 template <typename T, T Head, T... Tail> struct value_list<T, Head, Tail...> {
43  static constexpr T head = Head;
44  using tail = value_list<T, Tail...>;
45 };
46 
47 template <typename T> struct value_list<T> {};
48 
49 template <typename T> using tail_t = typename T::tail;
50 
51 // is_contained_value
52 template <typename T, T Value, typename ValueList>
54  : std::conditional_t<Value == ValueList::head, std::true_type,
55  is_contained_value<T, Value, tail_t<ValueList>>> {};
56 
57 template <typename T, T Value>
58 struct is_contained_value<T, Value, value_list<T>> : std::false_type {};
59 
60 // address_space_list
61 template <access::address_space... Values>
63 
64 template <access::address_space AddressSpace, typename ValueList>
67 
68 // size type predicates
69 template <typename T1, typename T2>
70 struct is_type_size_equal : std::bool_constant<(sizeof(T1) == sizeof(T2))> {};
71 
72 template <typename T1, typename T2>
74  : std::bool_constant<(sizeof(T1) == (sizeof(T2) * 2))> {};
75 
76 // find required type
77 template <typename TypeList, template <typename, typename> class Comp,
78  typename T>
79 struct find_type {
80  template <class T2> using C = Comp<T2, T>; // bind back
81  using l = boost::mp11::mp_copy_if<TypeList, C>;
82  using type = boost::mp11::mp_eval_if<is_empty_type_list<l>, void,
83  boost::mp11::mp_front, l>;
84 };
85 
86 template <typename TypeList, template <typename, typename> class Comp,
87  typename T>
89 
90 template <typename TypeList, typename T>
92 
93 template <typename TypeList, typename T>
96 
97 } // namespace detail
98 } // namespace _V1
99 } // namespace sycl
typename find_type< TypeList, Comp, T >::type find_type_t
Definition: type_list.hpp:88
boost::mp11::mp_append< L... > tl_append
Definition: type_list.hpp:37
boost::mp11::mp_set_contains< TypeList, std::remove_cv_t< T > > is_contained
Definition: type_list.hpp:32
boost::mp11::mp_list< T... > type_list
Definition: type_list.hpp:22
typename T::tail tail_t
Definition: type_list.hpp:49
std::is_same< T, empty_type_list > is_empty_type_list
Definition: type_list.hpp:27
type_list<> empty_type_list
Definition: type_list.hpp:24
constexpr bool is_contained_v
Definition: type_list.hpp:34
find_type_t< TypeList, is_type_size_equal, T > find_same_size_type_t
Definition: type_list.hpp:91
find_type_t< TypeList, is_type_size_double_of, T > find_twice_as_large_type_t
Definition: type_list.hpp:95
Definition: access.hpp:18
boost::mp11::mp_eval_if< is_empty_type_list< l >, void, boost::mp11::mp_front, l > type
Definition: type_list.hpp:83
boost::mp11::mp_copy_if< TypeList, C > l
Definition: type_list.hpp:81