17
17
18
18
__SYCL_INLINE_NAMESPACE (cl) {
19
19
namespace sycl {
20
+ // Forward declaration
21
+ template <typename , int , access::mode, access::target, access::placeholder,
22
+ typename PropertyListT>
23
+ class accessor ;
20
24
namespace detail {
21
25
// This helper template must be specialized for nested instance template
22
26
// of each compile-time-constant property.
23
- template <typename T> struct IsCxPropertyInstance : std::false_type {};
27
+ template <typename T> struct IsCompileTimePropertyInstance : std::false_type {};
24
28
} // namespace detail
25
29
namespace ONEAPI {
26
30
@@ -44,6 +48,9 @@ class accessor_property_list : protected sycl::detail::PropertyListBase {
44
48
template <template <class ...> class T , class T1 , class T2 >
45
49
struct AreSameTemplate <T<T1>, T<T2>> : std::true_type {};
46
50
#if __cplusplus >= 201703L
51
+ // Declaring non-type template parameters with auto is a C++17 feature. Since
52
+ // the extension is written against SYCL 2020, which implies use of C++17,
53
+ // there's no need to provide alternative implementations for older standards.
47
54
template <template <auto ...> class T , auto ... T1, auto ... T2>
48
55
struct AreSameTemplate <T<T1...>, T<T2...>> : std::true_type {};
49
56
#endif
@@ -54,13 +61,13 @@ class accessor_property_list : protected sycl::detail::PropertyListBase {
54
61
template <typename PropT> struct ContainsProperty <PropT> : std::false_type {};
55
62
template <typename PropT, typename Head, typename ... Tail>
56
63
struct ContainsProperty <PropT, Head, Tail...>
57
- : std::conditional<AreSameTemplate<PropT, Head>::value ||
58
- !sycl::detail::IsCxPropertyInstance <PropT>::value,
59
- std::true_type ,
60
- ContainsProperty<PropT, Tail...>>::type {};
64
+ : std::conditional<
65
+ AreSameTemplate <PropT, Head >::value ||
66
+ !sycl::detail::IsCompileTimePropertyInstance<PropT>::value ,
67
+ std::true_type, ContainsProperty<PropT, Tail...>>::type {};
61
68
62
- // The following structures help to check if two property lists contain the
63
- // same compile-time-constant properties .
69
+ // PropertyContainer is a helper structure, that holds list of properties.
70
+ // It is used to avoid multiple parameter packs in templates .
64
71
template <typename ...> struct PropertyContainer {
65
72
using Head = void ;
66
73
using Rest = void ;
@@ -85,7 +92,7 @@ class accessor_property_list : protected sycl::detail::PropertyListBase {
85
92
!std::is_same_v<typename ContainerT::Head, void > &&
86
93
(AreSameTemplate<PropT<Args...>,
87
94
typename ContainerT::Head>::value ||
88
- !sycl::detail::IsCxPropertyInstance <
95
+ !sycl::detail::IsCompileTimePropertyInstance <
89
96
typename ContainerT::Head>::value),
90
97
std::true_type,
91
98
ContainsPropertyInstance<typename ContainerT::Rest, PropT,
@@ -108,30 +115,36 @@ class accessor_property_list : protected sycl::detail::PropertyListBase {
108
115
109
116
#if __cplusplus >= 201703L
110
117
// This template helps to extract exact property instance type based on
111
- // template template argument.
118
+ // template template argument. If there's an instance of target property in
119
+ // ContainerT, find instance template and use it as type. Otherwise, just
120
+ // use void as return type.
112
121
template <typename ContainerT, template <auto ...> class PropT , auto ... Args>
113
- struct GetCxPropertyHelper {
122
+ struct GetCompileTimePropertyHelper {
114
123
using type = typename std::conditional_t <
115
124
AreSameTemplate<typename ContainerT::Head, PropT<Args...>>::value,
116
125
typename ContainerT::Head,
117
- typename GetCxPropertyHelper <typename ContainerT::Rest, PropT,
118
- Args...>::type>;
126
+ typename GetCompileTimePropertyHelper <typename ContainerT::Rest, PropT,
127
+ Args...>::type>;
119
128
};
120
129
template <typename Head, template <auto ...> class PropT , auto ... Args>
121
- struct GetCxPropertyHelper <PropertyContainer<Head>, PropT, Args...> {
130
+ struct GetCompileTimePropertyHelper <PropertyContainer<Head>, PropT, Args...> {
122
131
using type = typename std::conditional_t <
123
132
AreSameTemplate<Head, PropT<Args...>>::value, Head, void >;
124
133
};
125
134
#endif
126
135
127
- // The structs validate that all objects passed are SYCL properties
136
+ // The structs validate that all objects passed are SYCL properties.
137
+ // Properties are either run time SYCL 1.2.1 properties, and thus derive from
138
+ // either DataLessPropertyBase or from PropertyWithDataBase, or
139
+ // compile-time-constant properties, and thus specialize
140
+ // IsCompileTimePropertyInstance template.
128
141
template <typename ... Tail> struct AllProperties : std::true_type {};
129
142
template <typename T, typename ... Tail>
130
143
struct AllProperties <T, Tail...>
131
144
: std::conditional<
132
145
std::is_base_of<sycl::detail::DataLessPropertyBase, T>::value ||
133
146
std::is_base_of<sycl::detail::PropertyWithDataBase, T>::value ||
134
- sycl::detail::IsCxPropertyInstance <T>::value,
147
+ sycl::detail::IsCompileTimePropertyInstance <T>::value,
135
148
AllProperties<Tail...>, std::false_type>::type {};
136
149
137
150
accessor_property_list (
@@ -192,21 +205,27 @@ class accessor_property_list : protected sycl::detail::PropertyListBase {
192
205
typename = typename std::enable_if_t <
193
206
is_compile_time_property<T>::value && has_property<T>()>>
194
207
static constexpr auto get_property () {
195
- return typename GetCxPropertyHelper <PropertyContainer<PropsT...>,
196
- T::template instance>::type{};
208
+ return typename GetCompileTimePropertyHelper <PropertyContainer<PropsT...>,
209
+ T::template instance>::type{};
197
210
}
198
211
#endif
199
212
200
- template <typename ... OtherPropsT>
201
- static constexpr bool areSameCxProperties () {
202
- return ContainsSameProperties<PropertyContainer<OtherPropsT...>,
203
- PropsT...>::value;
204
- }
205
-
206
213
private:
214
+ template <typename , int , access::mode, access::target, access::placeholder,
215
+ typename PropertyListT>
216
+ friend class sycl ::accessor;
217
+
207
218
template <typename ... OtherProps> friend class accessor_property_list ;
208
219
209
220
friend class sycl ::property_list;
221
+
222
+ // Helper method, used by accessor to restrict conversions to compatible
223
+ // property lists.
224
+ template <typename ... OtherPropsT>
225
+ static constexpr bool areSameCompileTimeProperties () {
226
+ return ContainsSameProperties<PropertyContainer<OtherPropsT...>,
227
+ PropsT...>::value;
228
+ }
210
229
};
211
230
} // namespace ONEAPI
212
231
} // namespace sycl
0 commit comments