20 namespace experimental {
23 template <
typename PropertyT,
typename T,
typename... Ts>
struct property_value;
32 template <
typename T>
struct IsTuple : std::false_type {};
36 template <
typename... Ts>
37 using GetFirstType =
typename std::tuple_element<0, std::tuple<Ts...>>::type;
41 template <
typename T,
typename... Ts>
43 using type = std::tuple<T, Ts...>;
47 template <
typename T,
typename U =
int>
struct HasValue : std::false_type {};
49 struct HasValue<T, decltype((void)T::value, 0)> : std::true_type {};
57 template <
typename PropertyT>
63 static constexpr
bool value =
70 static constexpr
bool value =
76 template <
typename... Ts>
78 template <
typename T,
typename... Ts>
81 AllPropertyValues<std::tuple<Ts...>>,
90 template <
typename T1,
bool ShouldSplit>
struct HeadSplit {};
91 template <
typename T,
typename... Ts>
94 using ttype = std::tuple<Ts...>;
98 using ttype = std::tuple<Ts...>;
114 template <
typename T1,
typename T2>
struct Merge {};
116 using type = std::tuple<LTs...>;
119 using type = std::tuple<RTs...>;
121 template <
typename... LTs,
typename... RTs>
125 static constexpr
bool left_has_min =
139 using type =
typename std::tuple<>;
142 using type =
typename std::tuple<std::pair<std::tuple<T>, std::tuple<>>>;
144 template <
typename L,
typename R,
typename... Rest>
157 template <
typename... LTs,
typename... RTs,
typename... Rest>
159 std::
tuple<std::pair<std::tuple<LTs...>, std::tuple<RTs...>>, Rest...>> {
161 using type = std::tuple<std::pair<merged, std::tuple<>>>;
163 template <
typename... LLTs,
typename... LRTs,
typename... RLTs,
164 typename... RRTs,
typename... Rest>
166 std::
tuple<std::pair<std::tuple<LLTs...>, std::tuple<LRTs...>>,
167 std::pair<std::tuple<RLTs...>, std::tuple<RRTs...>>, Rest...>> {
173 std::pair<lmerged, rmerged>,
181 using type = std::tuple<Ts...>;
183 template <
typename... Ts>
185 using type = std::tuple<Ts...>;
193 template <
typename... Ts>
struct Sorted {
195 "Unrecognized property in property list.");
202 template <
typename... Ts>
205 template <
typename L,
typename R,
typename... Rest>
208 IsSorted<std::tuple<R, Rest...>>,
212 template <typename T> struct SortedAllUnique {};
213 template <typename... Ts>
214 struct SortedAllUnique<std::tuple<Ts...>> : std::true_type {};
215 template <typename T> struct SortedAllUnique<std::tuple<T>> : std::true_type {};
216 template <typename L, typename R, typename... Rest>
217 struct SortedAllUnique<std::tuple<L, R, Rest...>>
218 : sycl::detail::conditional_t<PropertyID<L>::value != PropertyID<R>::value,
219 SortedAllUnique<std::tuple<R, Rest...>>,