88
99#pragma once
1010
11+ #include < sycl/detail/impl_utils.hpp>
1112#include < sycl/detail/kernel_name_str_t.hpp>
13+ #include < sycl/detail/type_traits.hpp>
1214
1315#include < ur_api.h>
1416
17+ #include < algorithm>
18+ #include < iterator>
1519#include < memory>
20+ #include < queue>
1621#include < tuple>
1722#include < variant>
1823#include < vector>
@@ -30,13 +35,26 @@ const RTDeviceBinaryImage *
3035retrieveKernelBinary (queue_impl &Queue, KernelNameStrRefT KernelName,
3136 CGExecKernel *CGKernel = nullptr );
3237
33- template <typename DereferenceImpl, typename ... Iterators>
38+ template <typename DereferenceImpl, typename SyclTy, typename ... Iterators>
3439class variadic_iterator {
3540 using storage_iter = std::variant<Iterators...>;
3641
3742 storage_iter It;
3843
3944public:
45+ using iterator_category = std::forward_iterator_tag;
46+ using difference_type = std::ptrdiff_t ;
47+ using reference = decltype (DereferenceImpl::dereference(
48+ *std::declval<nth_type_t <0 , Iterators...>>()));
49+ using value_type = std::remove_reference_t <reference>;
50+ using sycl_type = SyclTy;
51+ using pointer = value_type *;
52+ static_assert (std::is_same_v<reference, value_type &>);
53+
54+ variadic_iterator (const variadic_iterator &) = default;
55+ variadic_iterator (variadic_iterator &&) = default;
56+ variadic_iterator (variadic_iterator &) = default;
57+
4058 template <typename IterTy>
4159 variadic_iterator (IterTy &&It) : It(std::forward<IterTy>(It)) {}
4260
@@ -52,6 +70,9 @@ class variadic_iterator {
5270 bool operator !=(const variadic_iterator &Other) const {
5371 return It != Other.It ;
5472 }
73+ bool operator ==(const variadic_iterator &Other) const {
74+ return It == Other.It ;
75+ }
5576
5677 decltype (auto ) operator *() {
5778 return std::visit (
@@ -64,6 +85,16 @@ class variadic_iterator {
6485
6586// Non-owning!
6687template <typename iterator> class iterator_range {
88+ using value_type = typename iterator::value_type;
89+ using sycl_type = typename iterator::sycl_type;
90+
91+ template <typename Container, typename = void >
92+ struct has_reserve : public std ::false_type {};
93+ template <typename Container>
94+ struct has_reserve <
95+ Container, std::void_t <decltype (std::declval<Container>().reserve(1 ))>>
96+ : public std::true_type {};
97+
6798public:
6899 iterator_range (const iterator_range &Other) = default ;
69100
@@ -81,6 +112,40 @@ template <typename iterator> class iterator_range {
81112 bool empty () const { return Size == 0 ; }
82113 decltype (auto ) front() const { return *begin (); }
83114
115+ template <typename Container>
116+ std::enable_if_t <
117+ check_type_in_v<Container, std::vector<sycl_type>,
118+ std::queue<value_type *>, std::vector<value_type *>,
119+ std::vector<std::shared_ptr<value_type>>>,
120+ Container>
121+ to () const {
122+ std::conditional_t <std::is_same_v<Container, std::queue<value_type *>>,
123+ typename std::queue<value_type *>::container_type,
124+ Container>
125+ Result;
126+ if constexpr (has_reserve<decltype (Result)>::value)
127+ Result.reserve (size ());
128+ std::transform (
129+ begin (), end (), std::back_inserter (Result), [](value_type &E) {
130+ if constexpr (std::is_same_v<Container, std::vector<sycl_type>>)
131+ return createSyclObjFromImpl<sycl_type>(E);
132+ else if constexpr (std::is_same_v<
133+ Container,
134+ std::vector<std::shared_ptr<value_type>>>)
135+ return E.shared_from_this ();
136+ else
137+ return &E;
138+ });
139+ if constexpr (std::is_same_v<Container, decltype (Result)>)
140+ return Result;
141+ else
142+ return Container{std::move (Result)};
143+ }
144+
145+ protected:
146+ template <typename Container>
147+ static constexpr bool has_reserve_v = has_reserve<Container>::value;
148+
84149private:
85150 iterator Begin;
86151 iterator End;
0 commit comments