21 #include <type_traits>
25 inline namespace _V1 {
29 typename PropertyListT>
36 namespace ext::oneapi {
50 template <
typename... PropsT>
52 :
protected sycl::detail::PropertyListBase {
55 template <
class T,
class U>
struct AreSameTemplate : std::is_same<T, U> {};
56 template <
template <
class...>
class T,
class T1,
class T2>
57 struct AreSameTemplate<T<T1>, T<T2>> : std::true_type {};
62 template <
template <
auto...>
class T,
auto... T1,
auto... T2>
63 struct AreSameTemplate<T<T1...>, T<T2...>> : std::true_type {};
68 template <
typename PropT,
typename... PropListT>
struct ContainsProperty;
69 template <
typename PropT>
struct ContainsProperty<PropT> : std::false_type {};
70 template <
typename PropT,
typename Head,
typename... Tail>
71 struct ContainsProperty<PropT, Head, Tail...>
72 : std::conditional_t<AreSameTemplate<PropT, Head>::value, std::true_type,
73 ContainsProperty<PropT, Tail...>> {};
77 template <
typename...>
struct PropertyContainer {
81 template <
typename T,
typename... Other>
82 struct PropertyContainer<T, Other...> {
84 using Rest = PropertyContainer<Other...>;
86 template <
typename T>
struct PropertyContainer<T> {
93 template <
typename ContainerT,
template <
auto...>
typename PropT,
95 struct ContainsPropertyInstance
97 !std::is_same_v<typename ContainerT::Head, void> &&
98 AreSameTemplate<PropT<Args...>,
99 typename ContainerT::Head>::value,
101 ContainsPropertyInstance<typename ContainerT::Rest, PropT,
104 template <
template <
auto...>
typename PropT,
auto... Args>
105 struct ContainsPropertyInstance<void, PropT, Args...> : std::false_type {};
110 template <
typename ContainerT,
typename... OtherProps>
111 struct ContainsSameProperties
112 : std::conditional_t<
113 !sycl::detail::IsCompileTimePropertyInstance<
114 typename ContainerT::Head>::value ||
115 ContainsProperty<typename ContainerT::Head,
116 OtherProps...>::value,
117 ContainsSameProperties<typename ContainerT::Rest, OtherProps...>,
119 template <
typename... OtherProps>
120 struct ContainsSameProperties<void, OtherProps...> : std::true_type {};
126 template <
typename ContainerT,
template <
auto...>
class PropT,
auto... Args>
127 struct GetCompileTimePropertyHelper {
128 using type =
typename std::conditional_t<
129 AreSameTemplate<
typename ContainerT::Head, PropT<Args...>>::value,
130 typename ContainerT::Head,
131 typename GetCompileTimePropertyHelper<
typename ContainerT::Rest, PropT,
134 template <
typename Head,
template <
auto...>
class PropT,
auto... Args>
135 struct GetCompileTimePropertyHelper<PropertyContainer<Head>, PropT, Args...> {
136 using type =
typename std::conditional_t<
137 AreSameTemplate<Head, PropT<Args...>>::value, Head,
void>;
145 template <
typename... Tail>
struct AllProperties : std::true_type {};
146 template <
typename T,
typename... Tail>
147 struct AllProperties<T, Tail...>
148 : std::conditional_t<
149 std::is_base_of_v<sycl::detail::DataLessPropertyBase, T> ||
150 std::is_base_of_v<sycl::detail::PropertyWithDataBase, T> ||
151 sycl::detail::IsCompileTimePropertyInstance<T>::value,
152 AllProperties<Tail...>, std::false_type> {};
154 accessor_property_list(
155 std::bitset<sycl::detail::DataLessPropKind::DataLessPropKindSize>
157 std::vector<std::shared_ptr<sycl::detail::PropertyWithDataBase>>
159 :
sycl::detail::PropertyListBase(DataLessProps, PropsWithData) {}
163 typename =
typename std::enable_if_t<AllProperties<PropsT...>::value>>
164 accessor_property_list(PropsT... Props)
165 :
sycl::detail::PropertyListBase(false) {
166 ctorHelper(Props...);
170 :
sycl::detail::PropertyListBase(Props.MDataLessProps,
171 Props.MPropsWithData) {}
173 template <
typename... OtherProps,
174 typename =
typename std::enable_if_t<
175 ContainsSameProperties<PropertyContainer<PropsT...>,
176 OtherProps...>::value &&
177 ContainsSameProperties<PropertyContainer<OtherProps...>,
179 accessor_property_list(
const accessor_property_list<OtherProps...> &OtherList)
180 :
sycl::detail::PropertyListBase(OtherList.MDataLessProps,
181 OtherList.MPropsWithData) {}
183 template <
typename PropT,
typename =
typename std::enable_if_t<
184 !is_compile_time_property<PropT>::value>>
186 if (!has_property<PropT>())
187 throw sycl::invalid_object_error(
"The property is not found",
188 PI_ERROR_INVALID_VALUE);
190 return get_property_helper<PropT>();
193 template <
class PropT>
194 typename std::enable_if_t<!is_compile_time_property<PropT>::value,
bool>
196 return has_property_helper<PropT>();
199 template <
typename T>
201 typename std::enable_if_t<is_compile_time_property<T>::value> * = 0) {
202 return ContainsPropertyInstance<PropertyContainer<PropsT...>,
203 T::template instance>::value;
206 template <
typename T>
208 typename std::enable_if_t<
209 is_compile_time_property<T>::value &&
210 ContainsPropertyInstance<PropertyContainer<PropsT...>,
211 T::template instance>::value> * = 0) {
212 return typename GetCompileTimePropertyHelper<PropertyContainer<PropsT...>,
213 T::template instance>::type{};
217 return property_list(MDataLessProps, MPropsWithData);
222 typename PropertyListT>
225 template <
typename... OtherProps>
friend class accessor_property_list;
231 template <
typename... OtherPropsT>
232 static constexpr
bool areSameCompileTimeProperties() {
233 return ContainsSameProperties<PropertyContainer<OtherPropsT...>,
Objects of the property_list class are containers for the SYCL properties.
class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor accessor(buffer< DataT, Dimensions, AllocatorT >) -> accessor< DataT, Dimensions, access::mode::read_write, target::device, access::placeholder::true_t >
Buffer accessor.
static constexpr bool has_property()
static constexpr auto get_property()
class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor class __SYCL_EBO __SYCL_SPECIAL_CLASS Dimensions
class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor class __SYCL_EBO __SYCL_SPECIAL_CLASS IsPlaceholder
class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor class __SYCL_EBO __SYCL_SPECIAL_CLASS AccessMode