11 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
15 #include <type_traits>
21 namespace ext::oneapi::experimental {
33 template <
typename Sorter,
typename Group,
typename Val,
typename =
void>
37 typename std::is_same<Val, decltype(std::declval<Sorter>()(
38 std::declval<G>(), std::declval<Val>()))>;
40 template <
typename G = Group>
41 static decltype(std::integral_constant<
bool,
43 sycl::is_group_v<G>>{})
46 template <
typename = Group>
static std::false_type test(...);
49 template <
typename Sorter,
typename Group,
55 template <
typename G = Group>
56 static decltype(std::declval<Sorter>()(std::declval<G>(), std::declval<Ptr>(),
58 sycl::detail::is_generic_group<G>{})
61 template <
typename = Group>
static std::false_type test(...);
64 template <
typename Sorter,
typename Group,
typename ValOrPtr>
65 struct is_sorter : decltype(is_sorter_impl<Sorter, Group, ValOrPtr>::test(0)) {
70 template <
typename Group,
typename T,
typename Sorter>
71 typename std::enable_if<detail::is_sorter<Sorter, Group, T>::value, T>::type
73 #ifdef __SYCL_DEVICE_ONLY__
74 return sorter(
group, value);
79 throw sycl::exception(
81 "Group algorithms are not supported on host device.");
85 template <
typename Group,
typename T,
typename Compare,
size_t Extent>
86 typename std::enable_if<!detail::is_sorter<Compare, Group, T>::value,
T>::type
88 T value, Compare comp) {
94 template <
typename Group,
typename T,
size_t Extent>
95 typename std::enable_if<sycl::is_group_v<std::decay_t<Group>>,
T>::type
103 template <
typename Group,
typename Iter,
typename Sorter>
104 typename std::enable_if<detail::is_sorter<Sorter, Group, Iter>::value,
107 #ifdef __SYCL_DEVICE_ONLY__
108 sorter(
group, first, last);
114 throw sycl::exception(
116 "Group algorithms are not supported on host device.");
120 template <
typename Group,
typename Iter,
typename Compare,
size_t Extent>
121 typename std::enable_if<!detail::is_sorter<Compare, Group, Iter>::value,
124 Iter last, Compare comp) {
129 template <
typename Group,
typename Iter,
size_t Extent>
130 typename std::enable_if<sycl::is_group_v<std::decay_t<Group>>,
void>::type