14 #include <type_traits>
18 template <
int dimensions>
class id;
24 template <
int dimensions = 1>
class range :
public detail::array<dimensions> {
25 static_assert(dimensions >= 1 && dimensions <= 3,
26 "range can only be 1, 2, or 3 dimensional.");
27 using base = detail::array<dimensions>;
28 template <
typename N,
typename T>
29 using IntegralType = std::enable_if_t<std::is_integral_v<N>,
T>;
34 template <
int N = dimensions>
35 range(
typename std::enable_if_t<(N == 1),
size_t> dim0) :
base(dim0) {}
39 template <
int N = dimensions>
40 range(
typename std::enable_if_t<(N == 2),
size_t> dim0,
size_t dim1)
45 template <
int N = dimensions>
46 range(
typename std::enable_if_t<(N == 3),
size_t> dim0,
size_t dim1,
48 :
base(dim0, dim1, dim2) {}
52 for (
int i = 0; i < dimensions; ++i) {
65 #define __SYCL_GEN_OPT_BASE(op) \
66 friend range<dimensions> operator op(const range<dimensions> &lhs, \
67 const range<dimensions> &rhs) { \
68 range<dimensions> result(lhs); \
69 for (int i = 0; i < dimensions; ++i) { \
70 result.common_array[i] = lhs.common_array[i] op rhs.common_array[i]; \
75 #ifndef __SYCL_DISABLE_ID_TO_INT_CONV__
77 #define __SYCL_GEN_OPT(op) \
78 __SYCL_GEN_OPT_BASE(op) \
79 template <typename T> \
80 friend IntegralType<T, range<dimensions>> operator op( \
81 const range<dimensions> &lhs, const T &rhs) { \
82 range<dimensions> result(lhs); \
83 for (int i = 0; i < dimensions; ++i) { \
84 result.common_array[i] = lhs.common_array[i] op rhs; \
88 template <typename T> \
89 friend IntegralType<T, range<dimensions>> operator op( \
90 const T &lhs, const range<dimensions> &rhs) { \
91 range<dimensions> result(rhs); \
92 for (int i = 0; i < dimensions; ++i) { \
93 result.common_array[i] = lhs op rhs.common_array[i]; \
98 #define __SYCL_GEN_OPT(op) \
99 __SYCL_GEN_OPT_BASE(op) \
100 friend range<dimensions> operator op(const range<dimensions> &lhs, \
101 const size_t &rhs) { \
102 range<dimensions> result(lhs); \
103 for (int i = 0; i < dimensions; ++i) { \
104 result.common_array[i] = lhs.common_array[i] op rhs; \
108 friend range<dimensions> operator op(const size_t &lhs, \
109 const range<dimensions> &rhs) { \
110 range<dimensions> result(rhs); \
111 for (int i = 0; i < dimensions; ++i) { \
112 result.common_array[i] = lhs op rhs.common_array[i]; \
116 #endif // __SYCL_DISABLE_ID_TO_INT_CONV__
135 #undef __SYCL_GEN_OPT
136 #undef __SYCL_GEN_OPT_BASE
139 #define __SYCL_GEN_OPT(op) \
140 friend range<dimensions> &operator op(range<dimensions> &lhs, \
141 const range<dimensions> &rhs) { \
142 for (int i = 0; i < dimensions; ++i) { \
143 lhs.common_array[i] op rhs[i]; \
147 friend range<dimensions> &operator op(range<dimensions> &lhs, \
148 const size_t &rhs) { \
149 for (int i = 0; i < dimensions; ++i) { \
150 lhs.common_array[i] op rhs; \
166 #undef __SYCL_GEN_OPT
169 #define __SYCL_GEN_OPT(op) \
170 friend range<dimensions> operator op(const range<dimensions> &rhs) { \
171 range<dimensions> result(rhs); \
172 for (int i = 0; i < dimensions; ++i) { \
173 result.common_array[i] = (op rhs.common_array[i]); \
181 #undef __SYCL_GEN_OPT
184 #define __SYCL_GEN_OPT(op) \
185 friend range<dimensions> &operator op(range<dimensions> &rhs) { \
186 for (int i = 0; i < dimensions; ++i) { \
187 op rhs.common_array[i]; \
195 #undef __SYCL_GEN_OPT
198 #define __SYCL_GEN_OPT(op) \
199 friend range<dimensions> operator op(range<dimensions> &lhs, int) { \
200 range<dimensions> old_lhs(lhs); \
201 for (int i = 0; i < dimensions; ++i) { \
202 op lhs.common_array[i]; \
210 #undef __SYCL_GEN_OPT
217 void set_range_dim0(
const size_t dim0) { this->common_array[0] = dim0; }
220 #ifdef __cpp_deduction_guides
221 range(
size_t)->range<1>;
222 range(
size_t,
size_t)->range<2>;
223 range(
size_t,
size_t,
size_t)->range<3>;