@@ -1255,9 +1255,9 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
1255
1255
std::conditional_t <AccessTarget == access::target::device,
1256
1256
global_ptr<value_type, IsDecorated>, value_type *>;
1257
1257
1258
- using iterator = typename detail::accessor_iterator<value_type, Dimensions >;
1258
+ using iterator = typename detail::accessor_iterator<value_type, AdjustedDim >;
1259
1259
using const_iterator =
1260
- typename detail::accessor_iterator<const value_type, Dimensions >;
1260
+ typename detail::accessor_iterator<const value_type, AdjustedDim >;
1261
1261
using reverse_iterator = std::reverse_iterator<iterator>;
1262
1262
using const_reverse_iterator = std::reverse_iterator<const_iterator>;
1263
1263
using difference_type =
@@ -2035,18 +2035,16 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
2035
2035
2036
2036
bool empty () const noexcept { return size () == 0 ; }
2037
2037
2038
- template <int Dims = Dimensions, typename = std::enable_if_t <(Dims > 0 )>>
2038
+ template <int Dims = Dimensions,
2039
+ typename = std::enable_if_t <Dims == Dimensions && (Dims > 0 )>>
2039
2040
range<Dimensions> get_range () const {
2040
- return detail::convertToArrayOfN<Dimensions, 1 >( getAccessRange () );
2041
+ return getRange<Dims>( );
2041
2042
}
2042
2043
2043
- template <int Dims = Dimensions, typename = std::enable_if_t <(Dims > 0 )>>
2044
+ template <int Dims = Dimensions,
2045
+ typename = std::enable_if_t <Dims == Dimensions && (Dims > 0 )>>
2044
2046
id<Dimensions> get_offset () const {
2045
- static_assert (
2046
- !(PropertyListT::template has_property<
2047
- sycl::ext::oneapi::property::no_offset>()),
2048
- " Accessor has no_offset property, get_offset() can not be used" );
2049
- return detail::convertToArrayOfN<Dimensions, 0 >(getOffset ());
2047
+ return getOffset<Dims>();
2050
2048
}
2051
2049
2052
2050
template <int Dims = Dimensions, typename RefT = RefType,
@@ -2197,29 +2195,29 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
2197
2195
iterator begin () const noexcept {
2198
2196
return iterator::getBegin (
2199
2197
get_pointer (),
2200
- detail::convertToArrayOfN<Dimensions , 1 >(getMemoryRange ()), get_range ( ),
2201
- get_offset ());
2198
+ detail::convertToArrayOfN<AdjustedDim , 1 >(getMemoryRange ()),
2199
+ getRange<AdjustedDim>(), getOffset<AdjustedDim> ());
2202
2200
}
2203
2201
2204
2202
iterator end () const noexcept {
2205
2203
return iterator::getEnd (
2206
2204
get_pointer (),
2207
- detail::convertToArrayOfN<Dimensions , 1 >(getMemoryRange ()), get_range ( ),
2208
- get_offset ());
2205
+ detail::convertToArrayOfN<AdjustedDim , 1 >(getMemoryRange ()),
2206
+ getRange<AdjustedDim>(), getOffset<AdjustedDim> ());
2209
2207
}
2210
2208
2211
2209
const_iterator cbegin () const noexcept {
2212
2210
return const_iterator::getBegin (
2213
2211
get_pointer (),
2214
- detail::convertToArrayOfN<Dimensions , 1 >(getMemoryRange ()), get_range ( ),
2215
- get_offset ());
2212
+ detail::convertToArrayOfN<AdjustedDim , 1 >(getMemoryRange ()),
2213
+ getRange<AdjustedDim>(), getOffset<AdjustedDim> ());
2216
2214
}
2217
2215
2218
2216
const_iterator cend () const noexcept {
2219
2217
return const_iterator::getEnd (
2220
2218
get_pointer (),
2221
- detail::convertToArrayOfN<Dimensions , 1 >(getMemoryRange ()), get_range ( ),
2222
- get_offset ());
2219
+ detail::convertToArrayOfN<AdjustedDim , 1 >(getMemoryRange ()),
2220
+ getRange<AdjustedDim>(), getOffset<AdjustedDim> ());
2223
2221
}
2224
2222
2225
2223
reverse_iterator rbegin () const noexcept { return reverse_iterator (end ()); }
@@ -2233,6 +2231,23 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(accessor) accessor :
2233
2231
}
2234
2232
2235
2233
private:
2234
+ template <int Dims, typename = std::enable_if_t <(Dims > 0 )>>
2235
+ range<Dims> getRange () const {
2236
+ if constexpr (Dimensions == 0 )
2237
+ return range<1 >{1 };
2238
+ else
2239
+ return detail::convertToArrayOfN<Dims, 1 >(getAccessRange ());
2240
+ }
2241
+
2242
+ template <int Dims = Dimensions, typename = std::enable_if_t <(Dims > 0 )>>
2243
+ id<Dims> getOffset () const {
2244
+ static_assert (
2245
+ !(PropertyListT::template has_property<
2246
+ sycl::ext::oneapi::property::no_offset>()),
2247
+ " Accessor has no_offset property, get_offset() can not be used" );
2248
+ return detail::convertToArrayOfN<Dims, 0 >(getOffset ());
2249
+ }
2250
+
2236
2251
#ifdef __SYCL_DEVICE_ONLY__
2237
2252
size_t getTotalOffset () const noexcept {
2238
2253
size_t TotalOffset = 0 ;
@@ -2844,9 +2859,17 @@ class __SYCL_EBO __SYCL_SPECIAL_CLASS __SYCL_TYPE(local_accessor) local_accessor
2844
2859
bool empty () const noexcept { return this ->size () == 0 ; }
2845
2860
2846
2861
iterator begin () const noexcept {
2847
- return &this ->operator [](id<Dimensions>());
2862
+ if constexpr (Dimensions == 0 )
2863
+ return local_acc::getQualifiedPtr ();
2864
+ else
2865
+ return &this ->operator [](id<Dimensions>());
2866
+ }
2867
+ iterator end () const noexcept {
2868
+ if constexpr (Dimensions == 0 )
2869
+ return begin () + 1 ;
2870
+ else
2871
+ return begin () + this ->size ();
2848
2872
}
2849
- iterator end () const noexcept { return begin () + this ->size (); }
2850
2873
2851
2874
const_iterator cbegin () const noexcept { return const_iterator (begin ()); }
2852
2875
const_iterator cend () const noexcept { return const_iterator (end ()); }
0 commit comments