@@ -286,7 +286,9 @@ class __accessor_iterator {
286
286
}
287
287
288
288
__accessor_iterator (const _AccessorT *_AccessorPtr,
289
- const range<3 > &_AccessRange)
289
+ const range<_Dimensions> &_MemoryRange,
290
+ const range<_Dimensions> &_AccessRange,
291
+ const id<_Dimensions> &_Offset)
290
292
: _MAccessorPtr(_AccessorPtr) {
291
293
constexpr int _XIndex = _Dimensions - 1 ;
292
294
constexpr int _YIndex = _Dimensions - 2 ;
@@ -295,52 +297,58 @@ class __accessor_iterator {
295
297
(void )_ZIndex;
296
298
297
299
if constexpr (_Dimensions > 1 )
298
- _MRowSize = _MAccessorPtr-> get_range () [_XIndex];
300
+ _MRowSize = _AccessRange [_XIndex];
299
301
if constexpr (_Dimensions > 2 )
300
- _MSliceSize = _MAccessorPtr-> get_range () [_YIndex] * _MRowSize;
302
+ _MSliceSize = _AccessRange [_YIndex] * _MRowSize;
301
303
302
- if (id<_Dimensions>{} != _MAccessorPtr-> get_offset () )
304
+ if (id<_Dimensions>{} != _Offset )
303
305
_MAccessorIsRanged = true ;
304
306
else {
305
307
for (size_t _I = 0 ; _I < _Dimensions; ++_I)
306
- if (_MAccessorPtr-> get_range () [_I] != _AccessRange [_I])
308
+ if (_AccessRange [_I] != _MemoryRange [_I])
307
309
_MAccessorIsRanged = true ;
308
310
}
309
311
310
312
if (_MAccessorIsRanged) {
311
313
if constexpr (_Dimensions > 2 ) {
312
- _MStaticOffset += _AccessRange[_XIndex] * _AccessRange[_YIndex] *
313
- _MAccessorPtr-> get_offset () [_ZIndex];
314
+ _MStaticOffset +=
315
+ _MemoryRange[_XIndex] * _MemoryRange[_YIndex] * _Offset [_ZIndex];
314
316
_MPerSliceOffset =
315
- _AccessRange [_XIndex] * _AccessRange [_YIndex] - _MSliceSize;
317
+ _MemoryRange [_XIndex] * _MemoryRange [_YIndex] - _MSliceSize;
316
318
}
317
319
if constexpr (_Dimensions > 1 ) {
318
320
// Elements in fully inaccessible rows
319
- _MStaticOffset +=
320
- _AccessRange[_XIndex] * _MAccessorPtr->get_offset ()[_YIndex];
321
- // Elements from the first accessible row
322
- _MStaticOffset += _MAccessorPtr->get_offset ()[_XIndex];
323
- _MPerRowOffset = _AccessRange[_XIndex] - _MRowSize;
321
+ _MStaticOffset += _MemoryRange[_XIndex] * _Offset[_YIndex];
322
+ _MPerRowOffset = _MemoryRange[_XIndex] - _MRowSize;
324
323
}
325
- }
326
324
327
- // To further optimize 1D case, offset is already included into _Begin
328
- if constexpr (_Dimensions == 1 )
329
- _MBegin = _MAccessorPtr->get_offset ()[_XIndex];
325
+ // Elements from the first accessible row
326
+ if constexpr (_Dimensions == 1 )
327
+ // To further optimize 1D case, offset is already included into _Begin
328
+ _MBegin = _Offset[_XIndex];
329
+ else
330
+ _MStaticOffset += _Offset[_XIndex];
331
+ }
330
332
331
- _MEnd = _MBegin + _MAccessorPtr-> size ();
333
+ _MEnd = _MBegin + _AccessRange. size ();
332
334
}
333
335
334
336
static __accessor_iterator __get_begin (const _AccessorT *_AccessorPtr,
335
- const range<3 > &_AccessRange) {
336
- auto _It = __accessor_iterator (_AccessorPtr, _AccessRange);
337
+ const range<_Dimensions> &_MemoryRange,
338
+ const range<_Dimensions> &_AccessRange,
339
+ const id<_Dimensions> &_Offset) {
340
+ auto _It =
341
+ __accessor_iterator (_AccessorPtr, _MemoryRange, _AccessRange, _Offset);
337
342
_It._MLinearId = _It._MBegin ;
338
343
return _It;
339
344
}
340
345
341
346
static __accessor_iterator __get_end (const _AccessorT *_AccessorPtr,
342
- const range<3 > &_AccessRange) {
343
- auto _It = __accessor_iterator (_AccessorPtr, _AccessRange);
347
+ const range<_Dimensions> &_MemoryRange,
348
+ const range<_Dimensions> &_AccessRange,
349
+ const id<_Dimensions> &_Offset) {
350
+ auto _It =
351
+ __accessor_iterator (_AccessorPtr, _MemoryRange, _AccessRange, _Offset);
344
352
_It._MLinearId = _It._MEnd ;
345
353
return _It;
346
354
}
0 commit comments