Skip to content

Commit d70980c

Browse files
author
Alexander Batashev
committed
Attempt to improve code readability
1 parent 0091796 commit d70980c

File tree

3 files changed

+49
-29
lines changed

3 files changed

+49
-29
lines changed

sycl/include/CL/sycl/ONEAPI/accessor_property_list.hpp

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,14 @@
1717

1818
__SYCL_INLINE_NAMESPACE(cl) {
1919
namespace sycl {
20+
// Forward declaration
21+
template <typename, int, access::mode, access::target, access::placeholder,
22+
typename PropertyListT>
23+
class accessor;
2024
namespace detail {
2125
// This helper template must be specialized for nested instance template
2226
// of each compile-time-constant property.
23-
template <typename T> struct IsCxPropertyInstance : std::false_type {};
27+
template <typename T> struct IsCompileTimePropertyInstance : std::false_type {};
2428
} // namespace detail
2529
namespace ONEAPI {
2630

@@ -44,6 +48,9 @@ class accessor_property_list : protected sycl::detail::PropertyListBase {
4448
template <template <class...> class T, class T1, class T2>
4549
struct AreSameTemplate<T<T1>, T<T2>> : std::true_type {};
4650
#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.
4754
template <template <auto...> class T, auto... T1, auto... T2>
4855
struct AreSameTemplate<T<T1...>, T<T2...>> : std::true_type {};
4956
#endif
@@ -54,13 +61,13 @@ class accessor_property_list : protected sycl::detail::PropertyListBase {
5461
template <typename PropT> struct ContainsProperty<PropT> : std::false_type {};
5562
template <typename PropT, typename Head, typename... Tail>
5663
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 {};
6168

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.
6471
template <typename...> struct PropertyContainer {
6572
using Head = void;
6673
using Rest = void;
@@ -85,7 +92,7 @@ class accessor_property_list : protected sycl::detail::PropertyListBase {
8592
!std::is_same_v<typename ContainerT::Head, void> &&
8693
(AreSameTemplate<PropT<Args...>,
8794
typename ContainerT::Head>::value ||
88-
!sycl::detail::IsCxPropertyInstance<
95+
!sycl::detail::IsCompileTimePropertyInstance<
8996
typename ContainerT::Head>::value),
9097
std::true_type,
9198
ContainsPropertyInstance<typename ContainerT::Rest, PropT,
@@ -108,30 +115,36 @@ class accessor_property_list : protected sycl::detail::PropertyListBase {
108115

109116
#if __cplusplus >= 201703L
110117
// 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.
112121
template <typename ContainerT, template <auto...> class PropT, auto... Args>
113-
struct GetCxPropertyHelper {
122+
struct GetCompileTimePropertyHelper {
114123
using type = typename std::conditional_t<
115124
AreSameTemplate<typename ContainerT::Head, PropT<Args...>>::value,
116125
typename ContainerT::Head,
117-
typename GetCxPropertyHelper<typename ContainerT::Rest, PropT,
118-
Args...>::type>;
126+
typename GetCompileTimePropertyHelper<typename ContainerT::Rest, PropT,
127+
Args...>::type>;
119128
};
120129
template <typename Head, template <auto...> class PropT, auto... Args>
121-
struct GetCxPropertyHelper<PropertyContainer<Head>, PropT, Args...> {
130+
struct GetCompileTimePropertyHelper<PropertyContainer<Head>, PropT, Args...> {
122131
using type = typename std::conditional_t<
123132
AreSameTemplate<Head, PropT<Args...>>::value, Head, void>;
124133
};
125134
#endif
126135

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.
128141
template <typename... Tail> struct AllProperties : std::true_type {};
129142
template <typename T, typename... Tail>
130143
struct AllProperties<T, Tail...>
131144
: std::conditional<
132145
std::is_base_of<sycl::detail::DataLessPropertyBase, T>::value ||
133146
std::is_base_of<sycl::detail::PropertyWithDataBase, T>::value ||
134-
sycl::detail::IsCxPropertyInstance<T>::value,
147+
sycl::detail::IsCompileTimePropertyInstance<T>::value,
135148
AllProperties<Tail...>, std::false_type>::type {};
136149

137150
accessor_property_list(
@@ -192,21 +205,27 @@ class accessor_property_list : protected sycl::detail::PropertyListBase {
192205
typename = typename std::enable_if_t<
193206
is_compile_time_property<T>::value && has_property<T>()>>
194207
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{};
197210
}
198211
#endif
199212

200-
template <typename... OtherPropsT>
201-
static constexpr bool areSameCxProperties() {
202-
return ContainsSameProperties<PropertyContainer<OtherPropsT...>,
203-
PropsT...>::value;
204-
}
205-
206213
private:
214+
template <typename, int, access::mode, access::target, access::placeholder,
215+
typename PropertyListT>
216+
friend class sycl::accessor;
217+
207218
template <typename... OtherProps> friend class accessor_property_list;
208219

209220
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+
}
210229
};
211230
} // namespace ONEAPI
212231
} // namespace sycl

sycl/include/CL/sycl/accessor.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1488,8 +1488,9 @@ class accessor :
14881488
{
14891489
static_assert(detail::IsCxPropertyList<PropertyListT>::value,
14901490
"Conversion is only available for accessor_property_list");
1491-
static_assert(PropertyListT::template areSameCxProperties<NewPropsT...>(),
1492-
"Compile-time-constant properties must be the same");
1491+
static_assert(
1492+
PropertyListT::template areSameCompileTimeProperties<NewPropsT...>(),
1493+
"Compile-time-constant properties must be the same");
14931494
}
14941495

14951496
constexpr bool is_placeholder() const { return IsPlaceH; }

sycl/include/CL/sycl/properties/accessor_properties.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -103,13 +103,13 @@ struct is_compile_time_property<INTEL::property::buffer_location>
103103
} // namespace ONEAPI
104104
namespace detail {
105105
template <int I>
106-
struct IsCxPropertyInstance<INTEL::property::buffer_location::instance<I>>
107-
: std::true_type {};
106+
struct IsCompileTimePropertyInstance<
107+
INTEL::property::buffer_location::instance<I>> : std::true_type {};
108108
template <>
109-
struct IsCxPropertyInstance<ONEAPI::property::no_alias::instance<>>
109+
struct IsCompileTimePropertyInstance<ONEAPI::property::no_alias::instance<>>
110110
: std::true_type {};
111111
template <>
112-
struct IsCxPropertyInstance<ONEAPI::property::no_offset::instance<>>
112+
struct IsCompileTimePropertyInstance<ONEAPI::property::no_offset::instance<>>
113113
: std::true_type {};
114114
} // namespace detail
115115
} // namespace sycl

0 commit comments

Comments
 (0)