11 #if (!defined(_HAS_STD_BYTE) || _HAS_STD_BYTE != 0)
20 #include <system_error>
21 #include <type_traits>
25 inline namespace _V1 {
26 namespace ext::oneapi::experimental {
38 template <
typename Sorter,
typename Group,
typename Val,
typename =
void>
42 typename std::is_same<Val, decltype(std::declval<Sorter>()(
43 std::declval<G>(), std::declval<Val>()))>;
45 template <
typename G = Group>
46 static decltype(std::integral_constant<
bool,
48 sycl::is_group_v<G>>{})
51 template <
typename = Group>
static std::false_type
test(...);
54 template <
typename Sorter,
typename Group,
58 std::void_t<typename has_difference_type<Ptr>::type>> {
59 template <
typename G = Group>
60 static decltype(std::declval<Sorter>()(std::declval<G>(), std::declval<Ptr>(),
62 sycl::detail::is_generic_group<G>{})
65 template <
typename = Group>
static std::false_type
test(...);
68 template <
typename Sorter,
typename Group,
typename ValOrPtr>
69 struct is_sorter : decltype(is_sorter_impl<Sorter, Group, ValOrPtr>::test(0)) {
74 template <
typename Group,
typename T,
typename Sorter>
75 std::enable_if_t<detail::is_sorter<Sorter, Group, T>::value, T>
77 #ifdef __SYCL_DEVICE_ONLY__
78 return sorter(
group, value);
85 "Group algorithms are not supported on host device.");
89 template <
typename Group,
typename T,
typename Compare,
size_t Extent>
90 std::enable_if_t<!detail::is_sorter<Compare, Group, T>::value, T>
92 T value, Compare comp) {
98 template <
typename Group,
typename T,
size_t Extent>
99 std::enable_if_t<sycl::is_group_v<std::decay_t<Group>>, T>
107 template <
typename Group,
typename Iter,
typename Sorter>
108 std::enable_if_t<detail::is_sorter<Sorter, Group, Iter>::value,
void>
110 #ifdef __SYCL_DEVICE_ONLY__
111 sorter(
group, first, last);
119 "Group algorithms are not supported on host device.");
123 template <
typename Group,
typename Iter,
typename Compare,
size_t Extent>
124 std::enable_if_t<!detail::is_sorter<Compare, Group, Iter>::value,
void>
126 Iter last, Compare comp) {
131 template <
typename Group,
typename Iter,
size_t Extent>
132 std::enable_if_t<sycl::is_group_v<std::decay_t<Group>>,
void>
sycl::span< std::byte, Extent > get_memory() const
std::enable_if_t< detail::is_sorter< Sorter, Group, T >::value, T > sort_over_group(Group group, T value, Sorter sorter)
std::enable_if_t< detail::is_sorter< Sorter, Group, Iter >::value, void > joint_sort(Group group, Iter first, Iter last, Sorter sorter)
const std::error_category & sycl_category() noexcept
static decltype(std::declval< Sorter >()(std::declval< G >(), std::declval< Ptr >(), std::declval< Ptr >()), sycl::detail::is_generic_group< G >{}) test(int)
static std::false_type test(...)
static decltype(std::integral_constant< bool, is_expected_return_type< G >::value &&sycl::is_group_v< G >>{}) test(int)
static std::false_type test(...)
typename std::is_same< Val, decltype(std::declval< Sorter >()(std::declval< G >(), std::declval< Val >()))> is_expected_return_type