DPC++ Runtime
Runtime libraries for oneAPI DPC++
type_traits.hpp
Go to the documentation of this file.
1 //==----------------- type_traits.hpp - SYCL type traits -------------------==//
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 
15 
16 #include <array>
17 #include <tuple>
18 #include <type_traits>
19 
21 namespace sycl {
22 template <int Dimensions> class group;
23 namespace ext {
24 namespace oneapi {
25 struct sub_group;
26 } // namespace oneapi
27 } // namespace ext
28 
29 namespace detail {
30 
31 template <typename T> struct is_group : std::false_type {};
32 
33 template <int Dimensions>
34 struct is_group<group<Dimensions>> : std::true_type {};
35 
36 template <typename T> struct is_sub_group : std::false_type {};
37 
38 template <> struct is_sub_group<ext::oneapi::sub_group> : std::true_type {};
39 
40 template <typename T>
42  : std::integral_constant<bool,
43  is_group<T>::value || is_sub_group<T>::value> {};
44 
45 namespace half_impl {
46 class half;
47 }
48 } // namespace detail
50 
51 // Forward declaration
52 template <typename ElementType, access::address_space Space> class multi_ptr;
53 
54 template <class T>
57 
58 namespace detail {
59 // Type for Intel device UUID extension.
60 // For details about this extension, see
61 // sycl/doc/extensions/supported/sycl_ext_intel_device_info.md
62 using uuid_type = std::array<unsigned char, 16>;
63 
64 template <typename T, typename R> struct copy_cv_qualifiers;
65 
66 template <typename T, typename R>
68 
69 template <int V> using int_constant = std::integral_constant<int, V>;
70 
71 // vector_size
72 // scalars are interpreted as a vector of 1 length.
73 template <typename T> struct vector_size_impl : int_constant<1> {};
74 template <typename T, int N>
75 struct vector_size_impl<vec<T, N>> : int_constant<N> {};
76 template <typename T>
77 struct vector_size : vector_size_impl<remove_cv_t<remove_reference_t<T>>> {};
78 
79 // 4.10.2.6 Memory layout and alignment
80 template <typename T, int N>
82  : conditional_t<N == 3, int_constant<sizeof(T) * 4>,
83  int_constant<sizeof(T) * N>> {};
84 
85 template <typename T, int N>
87  : vector_alignment_impl<remove_cv_t<remove_reference_t<T>>, N> {};
88 
89 // vector_element
90 template <typename T> struct vector_element_impl;
91 template <typename T>
93 template <typename T> struct vector_element_impl { using type = T; };
94 template <typename T, int N> struct vector_element_impl<vec<T, N>> {
95  using type = T;
96 };
97 template <typename T> struct vector_element {
99 };
100 template <class T> using vector_element_t = typename vector_element<T>::type;
101 
102 // change_base_type_t
103 template <typename T, typename B> struct change_base_type { using type = B; };
104 
105 template <typename T, int N, typename B> struct change_base_type<vec<T, N>, B> {
106  using type = vec<B, N>;
107 };
108 
109 template <typename T, typename B>
111 
112 // Applies the same the cv-qualifiers from T type to R type
113 template <typename T, typename R> struct copy_cv_qualifiers_impl {
114  using type = R;
115 };
116 
117 template <typename T, typename R> struct copy_cv_qualifiers_impl<const T, R> {
118  using type = const R;
119 };
120 
121 template <typename T, typename R>
122 struct copy_cv_qualifiers_impl<volatile T, R> {
123  using type = volatile R;
124 };
125 
126 template <typename T, typename R>
127 struct copy_cv_qualifiers_impl<const volatile T, R> {
128  using type = const volatile R;
129 };
130 
131 template <typename T, typename R> struct copy_cv_qualifiers {
133 };
134 
135 // make_signed with support SYCL vec class
136 template <typename T, typename Enable = void> struct make_signed_impl;
137 
138 template <typename T>
140 
141 template <typename T>
143  T, enable_if_t<is_contained<T, gtl::scalar_integer_list>::value, T>> {
144  using type = typename std::make_signed<T>::type;
145 };
146 
147 template <typename T>
149  T, enable_if_t<is_contained<T, gtl::vector_integer_list>::value, T>> {
152 };
153 
154 // TODO Delete this specialization after solving the problems in the test
155 // infrastructure.
156 template <typename T>
158  T, enable_if_t<!is_contained<T, gtl::integer_list>::value, T>> {
159  using type = T;
160 };
161 
162 template <typename T> struct make_signed {
165 };
166 
167 template <typename T> using make_signed_t = typename make_signed<T>::type;
168 
169 // make_unsigned with support SYCL vec class
170 template <typename T, typename Enable = void> struct make_unsigned_impl;
171 
172 template <typename T>
174 
175 template <typename T>
177  T, enable_if_t<is_contained<T, gtl::scalar_integer_list>::value, T>> {
178  using type = typename std::make_unsigned<T>::type;
179 };
180 
181 template <typename T>
183  T, enable_if_t<is_contained<T, gtl::vector_integer_list>::value, T>> {
186 };
187 
188 // TODO Delete this specialization after solving the problems in the test
189 // infrastructure.
190 template <typename T>
192  T, enable_if_t<!is_contained<T, gtl::integer_list>::value, T>> {
193  using type = T;
194 };
195 
196 template <typename T> struct make_unsigned {
199 };
200 
201 template <typename T> using make_unsigned_t = typename make_unsigned<T>::type;
202 
203 // Checks that sizeof base type of T equal N and T satisfies S<T>::value
204 template <typename T, int N, template <typename> class S>
207 
208 template <typename> struct is_vec : std::false_type {};
209 template <typename T, std::size_t N>
210 struct is_vec<cl::sycl::vec<T, N>> : std::true_type {};
211 
212 // is_integral
213 template <typename T>
214 struct is_integral : std::is_integral<vector_element_t<T>> {};
215 
216 // is_floating_point
217 template <typename T>
218 struct is_floating_point_impl : std::is_floating_point<T> {};
219 
220 template <> struct is_floating_point_impl<half> : std::true_type {};
221 
222 template <typename T>
224  : is_floating_point_impl<remove_cv_t<vector_element_t<T>>> {};
225 
226 // is_arithmetic
227 template <typename T>
229  : bool_constant<is_integral<T>::value || is_floating_point<T>::value> {};
230 
231 template <typename T>
233  : bool_constant<!is_vec<T>::value && is_arithmetic<T>::value> {};
234 
235 template <typename T>
237  : bool_constant<is_vec<T>::value && is_arithmetic<T>::value> {};
238 
239 // is_bool
240 template <typename T>
242  : bool_constant<std::is_same<remove_cv_t<T>, bool>::value> {};
243 
244 template <typename T>
246  : bool_constant<is_vec<T>::value &&
247  is_scalar_bool<vector_element_t<T>>::value> {};
248 
249 template <typename T>
250 struct is_bool : bool_constant<is_scalar_bool<vector_element_t<T>>::value> {};
251 
252 // is_pointer
253 template <typename T> struct is_pointer_impl : std::false_type {};
254 
255 template <typename T> struct is_pointer_impl<T *> : std::true_type {};
256 
257 template <typename T, access::address_space Space>
258 struct is_pointer_impl<multi_ptr<T, Space>> : std::true_type {};
259 
260 template <typename T> struct is_pointer : is_pointer_impl<remove_cv_t<T>> {};
261 
262 // remove_pointer_t
263 template <typename T> struct remove_pointer_impl { using type = T; };
264 
265 template <typename T> struct remove_pointer_impl<T *> { using type = T; };
266 
267 template <typename T, access::address_space Space>
268 struct remove_pointer_impl<multi_ptr<T, Space>> {
269  using type = T;
270 };
271 
272 template <typename T>
273 struct remove_pointer : remove_pointer_impl<remove_cv_t<T>> {};
274 
275 template <typename T> using remove_pointer_t = typename remove_pointer<T>::type;
276 
277 // is_address_space_compliant
278 template <typename T, typename SpaceList>
279 struct is_address_space_compliant_impl : std::false_type {};
280 
281 template <typename T, typename SpaceList>
282 struct is_address_space_compliant_impl<T *, SpaceList> : std::true_type {};
283 
284 template <typename T, typename SpaceList, access::address_space Space>
285 struct is_address_space_compliant_impl<multi_ptr<T, Space>, SpaceList>
286  : bool_constant<is_one_of_spaces<Space, SpaceList>::value> {};
287 
288 template <typename T, typename SpaceList>
290  : is_address_space_compliant_impl<remove_cv_t<T>, SpaceList> {};
291 
292 // make_type_t
293 template <typename T, typename TL> struct make_type_impl {
295 };
296 
297 template <typename T, int N, typename TL> struct make_type_impl<vec<T, N>, TL> {
300 };
301 
302 template <typename T, typename TL>
304 
305 // make_larger_t
306 template <typename T, typename Enable = void> struct make_larger_impl;
307 template <typename T>
309  T, enable_if_t<is_contained<T, gtl::scalar_floating_list>::value, T>> {
311 };
312 
313 template <typename T>
315  T,
318 };
319 
320 template <typename T>
322  T,
325 };
326 
327 template <typename T, int N> struct make_larger_impl<vec<T, N>, vec<T, N>> {
331  static constexpr bool found = !std::is_same<upper_type, void>::value;
333 };
334 
335 template <typename T> struct make_larger {
337 };
338 
339 template <typename T> using make_larger_t = typename make_larger<T>::type;
340 
341 #if defined(RESTRICT_WRITE_ACCESS_TO_CONSTANT_PTR)
342 template <access::address_space AS, class DataT>
343 using const_if_const_AS =
344  typename std::conditional<AS == access::address_space::constant_space,
345  const DataT, DataT>::type;
346 #else
347 template <access::address_space AS, class DataT>
348 using const_if_const_AS = DataT;
349 #endif
350 
351 template <typename T> struct function_traits {};
352 
353 template <typename Ret, typename... Args> struct function_traits<Ret(Args...)> {
354  using ret_type = Ret;
355  using args_type = std::tuple<Args...>;
356 };
357 
358 } // namespace detail
359 } // namespace sycl
360 } // __SYCL_INLINE_NAMESPACE(cl)
cl::sycl::detail::copy_cv_qualifiers_t
typename copy_cv_qualifiers< T, R >::type copy_cv_qualifiers_t
Definition: type_traits.hpp:67
cl::sycl::detail::make_signed::type
copy_cv_qualifiers_t< T, new_type_wo_cv_qualifiers > type
Definition: type_traits.hpp:164
cl::sycl::detail::is_arithmetic
Definition: type_traits.hpp:228
cl::sycl::detail::make_larger_impl< vec< T, N >, vec< T, N > >::base_type
vector_element_t< vec< T, N > > base_type
Definition: type_traits.hpp:328
cl::sycl::detail::copy_cv_qualifiers::type
typename copy_cv_qualifiers_impl< T, remove_cv_t< R > >::type type
Definition: type_traits.hpp:132
cl::sycl::detail::make_unsigned_impl< T, enable_if_t<!is_contained< T, gtl::integer_list >::value, T > >::type
T type
Definition: type_traits.hpp:193
cl::sycl::detail::make_signed_impl_t
typename make_signed_impl< T, T >::type make_signed_impl_t
Definition: type_traits.hpp:139
cl::sycl::detail::make_signed_impl< T, enable_if_t< is_contained< T, gtl::scalar_integer_list >::value, T > >::type
typename std::make_signed< T >::type type
Definition: type_traits.hpp:144
cl::sycl::detail::vector_size_impl
Definition: type_traits.hpp:73
cl::sycl::detail::make_signed_impl
Definition: type_traits.hpp:136
cl::sycl::detail::vector_element_impl
Definition: type_traits.hpp:90
cl::sycl::detail::vector_element::type
copy_cv_qualifiers_t< T, vector_element_impl_t< remove_cv_t< T > >> type
Definition: type_traits.hpp:98
cl::sycl::detail::make_signed_t
typename make_signed< T >::type make_signed_t
Definition: type_traits.hpp:167
cl::sycl::detail::vector_element_impl::type
T type
Definition: type_traits.hpp:93
cl::sycl::detail::is_scalar_bool
Definition: type_traits.hpp:241
cl::sycl::detail::change_base_type::type
B type
Definition: type_traits.hpp:103
cl::sycl::detail::copy_cv_qualifiers
Definition: type_traits.hpp:64
cl::sycl::group
Encapsulates all functionality required to represent a particular work-group within a parallel execut...
Definition: helpers.hpp:29
cl::sycl::detail::copy_cv_qualifiers_impl
Definition: type_traits.hpp:113
cl::sycl::detail::is_contained
Definition: type_list.hpp:54
cl::sycl::detail::find_twice_as_large_type_t
find_type_t< TL, is_type_size_double_of, T > find_twice_as_large_type_t
Definition: type_list.hpp:134
cl::sycl::detail::remove_pointer_impl
Definition: type_traits.hpp:263
cl::sycl::detail::is_pointer_impl
Definition: type_traits.hpp:253
cl::sycl::detail::make_unsigned_t
typename make_unsigned< T >::type make_unsigned_t
Definition: type_traits.hpp:201
cl::sycl::detail::copy_cv_qualifiers_impl< const volatile T, R >::type
const volatile R type
Definition: type_traits.hpp:128
cl::sycl::detail::uuid_type
std::array< unsigned char, 16 > uuid_type
Definition: type_traits.hpp:62
cl::sycl::detail::remove_pointer_t
typename remove_pointer< T >::type remove_pointer_t
Definition: type_traits.hpp:275
sycl
Definition: invoke_simd.hpp:68
cl::sycl::detail::is_floating_point
Definition: type_traits.hpp:223
cl::sycl::detail::make_signed_impl< T, enable_if_t< is_contained< T, gtl::vector_integer_list >::value, T > >::base_type
make_signed_impl_t< vector_element_t< T > > base_type
Definition: type_traits.hpp:150
bool_constant
cl::sycl::multi_ptr
Provides constructors for address space qualified and non address space qualified pointers to allow i...
Definition: atomic.hpp:32
access.hpp
cl::sycl::detail::make_unsigned_impl
Definition: type_traits.hpp:170
cl::sycl::detail::is_bool
Definition: type_traits.hpp:250
cl::sycl::detail::const_if_const_AS
DataT const_if_const_AS
Definition: type_traits.hpp:348
cl::sycl::detail::gtl::scalar_unsigned_integer_list
type_list< conditional_t< std::is_unsigned< char >::value, type_list< scalar_default_char_list, scalar_unsigned_char_list >, scalar_unsigned_char_list >, scalar_unsigned_short_list, scalar_unsigned_int_list, scalar_unsigned_long_list, scalar_unsigned_longlong_list > scalar_unsigned_integer_list
Definition: generic_type_lists.hpp:453
cl::sycl::detail::make_larger_impl
Definition: type_traits.hpp:306
generic_type_lists.hpp
cl::sycl::detail::make_unsigned_impl< T, enable_if_t< is_contained< T, gtl::scalar_integer_list >::value, T > >::type
typename std::make_unsigned< T >::type type
Definition: type_traits.hpp:178
cl::sycl::detail::copy_cv_qualifiers_impl< const T, R >::type
const R type
Definition: type_traits.hpp:118
cl::sycl::detail::find_same_size_type_t
find_type_t< TL, is_type_size_equal, T > find_same_size_type_t
Definition: type_list.hpp:122
cl::sycl::half
cl::sycl::detail::half_impl::half half
Definition: aliases.hpp:76
stl_type_traits.hpp
cl::sycl::detail::is_vector_arithmetic
Definition: type_traits.hpp:236
cl::sycl::detail::function_traits< Ret(Args...)>::ret_type
Ret ret_type
Definition: type_traits.hpp:354
cl::sycl::detail::make_signed::new_type_wo_cv_qualifiers
make_signed_impl_t< remove_cv_t< T > > new_type_wo_cv_qualifiers
Definition: type_traits.hpp:163
cl::sycl::detail::make_larger_impl< vec< T, N >, vec< T, N > >::type
conditional_t< found, new_type, void > type
Definition: type_traits.hpp:332
cl::sycl::detail::conditional_t
typename std::conditional< B, T, F >::type conditional_t
Definition: stl_type_traits.hpp:27
cl::sycl::detail::make_signed_impl< T, enable_if_t<!is_contained< T, gtl::integer_list >::value, T > >::type
T type
Definition: type_traits.hpp:159
cl::sycl::detail::half_impl::half
Definition: half_type.hpp:329
cl::sycl::detail::make_signed
Definition: type_traits.hpp:162
cl::sycl::detail::make_type_impl
Definition: type_traits.hpp:293
cl::sycl::detail::make_larger_impl< T, enable_if_t< is_contained< T, gtl::scalar_unsigned_integer_list >::value, T > >::type
find_twice_as_large_type_t< gtl::scalar_unsigned_integer_list, T > type
Definition: type_traits.hpp:324
cl::sycl::detail::is_address_space_compliant
Definition: type_traits.hpp:289
cl::sycl::detail::gtl::scalar_signed_integer_list
type_list< conditional_t< std::is_signed< char >::value, type_list< scalar_default_char_list, scalar_signed_char_list >, scalar_signed_char_list >, scalar_signed_short_list, scalar_signed_int_list, scalar_signed_long_list, scalar_signed_longlong_list > scalar_signed_integer_list
Definition: generic_type_lists.hpp:422
cl::sycl::detail::is_pointer
Definition: type_traits.hpp:260
cl::__ESIMD_ENS::lsc_scope::group
@ group
cl::sycl::detail::make_larger_impl< vec< T, N >, vec< T, N > >::upper_type
typename make_larger_impl< base_type, base_type >::type upper_type
Definition: type_traits.hpp:329
cl::sycl::detail::make_larger_impl< T, enable_if_t< is_contained< T, gtl::scalar_floating_list >::value, T > >::type
find_twice_as_large_type_t< gtl::scalar_floating_list, T > type
Definition: type_traits.hpp:310
cl::sycl::detail::gtl::vector_integer_list
type_list< vector_signed_integer_list, vector_unsigned_integer_list > vector_integer_list
Definition: generic_type_lists.hpp:489
cl::sycl::detail::make_signed_impl< T, enable_if_t< is_contained< T, gtl::vector_integer_list >::value, T > >::type
change_base_type_t< T, base_type > type
Definition: type_traits.hpp:151
cl::sycl::detail::function_traits
Definition: type_traits.hpp:351
cl
We provide new interfaces for matrix muliply in this patch:
Definition: access.hpp:13
cl::sycl::detail::gtl::scalar_integer_list
type_list< scalar_signed_integer_list, scalar_unsigned_integer_list > scalar_integer_list
Definition: generic_type_lists.hpp:486
cl::sycl::detail::is_vector_bool
Definition: type_traits.hpp:245
cl::sycl::detail::is_address_space_compliant_impl
Definition: type_traits.hpp:279
cl::sycl::detail::is_scalar_arithmetic
Definition: type_traits.hpp:232
cl::sycl::detail::is_vec
Definition: type_traits.hpp:208
cl::sycl::detail::make_larger::type
typename make_larger_impl< T, T >::type type
Definition: type_traits.hpp:336
cl::sycl::detail::gtl::scalar_floating_list
type_list< scalar_float_list, scalar_double_list, scalar_half_list > scalar_floating_list
Definition: generic_type_lists.hpp:78
cl::sycl::detail::vector_element_impl< vec< T, N > >::type
T type
Definition: type_traits.hpp:95
cl::sycl::detail::is_generic_group
Definition: type_traits.hpp:41
cl::sycl::detail::vector_element_impl_t
typename vector_element_impl< T >::type vector_element_impl_t
Definition: type_traits.hpp:92
cl::sycl::detail::copy_cv_qualifiers_impl::type
R type
Definition: type_traits.hpp:114
cl::sycl::detail::make_unsigned_impl_t
typename make_unsigned_impl< T, T >::type make_unsigned_impl_t
Definition: type_traits.hpp:173
cl::sycl::detail::is_group
Definition: type_traits.hpp:31
cl::sycl::detail::gtl::integer_list
type_list< scalar_integer_list, vector_integer_list, marray_integer_list > integer_list
Definition: generic_type_lists.hpp:495
cl::sycl::ext::oneapi::sub_group
Definition: sub_group.hpp:108
cl::sycl::detail::function_traits< Ret(Args...)>::args_type
std::tuple< Args... > args_type
Definition: type_traits.hpp:355
cl::sycl::detail::change_base_type_t
typename change_base_type< T, B >::type change_base_type_t
Definition: type_traits.hpp:110
cl::sycl::is_group_v
__SYCL_INLINE_CONSTEXPR bool is_group_v
Definition: type_traits.hpp:55
cl::sycl::vec
Provides a cross-patform vector class template that works efficiently on SYCL devices as well as in h...
Definition: aliases.hpp:18
cl::sycl::detail::remove_pointer_impl< remove_cv_t< T > >::type
remove_cv_t< T > type
Definition: type_traits.hpp:263
cl::sycl::detail::make_unsigned
Definition: type_traits.hpp:196
cl::sycl::detail::make_unsigned::type
copy_cv_qualifiers_t< T, new_type_wo_cv_qualifiers > type
Definition: type_traits.hpp:198
cl::sycl::detail::make_larger_t
typename make_larger< T >::type make_larger_t
Definition: type_traits.hpp:339
cl::sycl::detail::make_unsigned::new_type_wo_cv_qualifiers
make_unsigned_impl_t< remove_cv_t< T > > new_type_wo_cv_qualifiers
Definition: type_traits.hpp:197
cl::sycl::detail::remove_pointer_impl< multi_ptr< T, Space > >::type
T type
Definition: type_traits.hpp:269
__SYCL_INLINE_CONSTEXPR
#define __SYCL_INLINE_CONSTEXPR
Definition: defines_elementary.hpp:65
cl::sycl::detail::make_unsigned_impl< T, enable_if_t< is_contained< T, gtl::vector_integer_list >::value, T > >::base_type
make_unsigned_impl_t< vector_element_t< T > > base_type
Definition: type_traits.hpp:184
cl::sycl::detail::make_larger_impl< T, enable_if_t< is_contained< T, gtl::scalar_signed_integer_list >::value, T > >::type
find_twice_as_large_type_t< gtl::scalar_signed_integer_list, T > type
Definition: type_traits.hpp:317
cl::sycl::detail::make_larger
Definition: type_traits.hpp:335
cl::sycl::detail::int_constant
std::integral_constant< int, V > int_constant
Definition: type_traits.hpp:69
cl::sycl::detail::is_sub_group
Definition: type_traits.hpp:36
cl::sycl::detail::vector_alignment
Definition: type_traits.hpp:86
cl::sycl::detail::make_type_impl< vec< T, N >, TL >::scalar_type
typename make_type_impl< T, TL >::type scalar_type
Definition: type_traits.hpp:298
cl::sycl::detail::make_type_impl::type
find_same_size_type_t< TL, T > type
Definition: type_traits.hpp:294
cl::sycl::detail::copy_cv_qualifiers_impl< volatile T, R >::type
volatile R type
Definition: type_traits.hpp:123
cl::sycl::detail::remove_pointer_impl< T * >::type
T type
Definition: type_traits.hpp:265
cl::sycl::detail::vector_element
Definition: type_traits.hpp:97
cl::sycl::detail::is_gen_based_on_type_sizeof
bool_constant< S< T >::value &&(sizeof(vector_element_t< T >)==N)> is_gen_based_on_type_sizeof
Definition: type_traits.hpp:206
cl::sycl::detail::is_integral
Definition: type_traits.hpp:214
cl::sycl::detail::enable_if_t
typename std::enable_if< B, T >::type enable_if_t
Definition: stl_type_traits.hpp:24
cl::sycl::detail::make_unsigned_impl< T, enable_if_t< is_contained< T, gtl::vector_integer_list >::value, T > >::type
change_base_type_t< T, base_type > type
Definition: type_traits.hpp:185
cl::sycl::detail::is_floating_point_impl
Definition: type_traits.hpp:218
cl::sycl::detail::change_base_type
Definition: type_traits.hpp:103
cl::sycl::detail::make_type_t
typename make_type_impl< T, TL >::type make_type_t
Definition: type_traits.hpp:303
cl::sycl::Dimensions
Dimensions
Definition: backend.hpp:138
cl::sycl::detail::vector_element_t
typename vector_element< T >::type vector_element_t
Definition: type_traits.hpp:100
cl::sycl::detail::vector_alignment_impl
Definition: type_traits.hpp:81
cl::sycl::detail::vector_size
Definition: type_traits.hpp:77
cl::sycl::detail::remove_pointer
Definition: type_traits.hpp:273
type_list.hpp
__SYCL_INLINE_NAMESPACE
#define __SYCL_INLINE_NAMESPACE(X)
Definition: defines_elementary.hpp:12