18 #ifndef viskores_cont_ArrayHandleStride_h
19 #define viskores_cont_ArrayHandleStride_h
32 struct ArrayStrideInfo
40 ArrayStrideInfo() =
default;
47 : NumberOfValues(numValues)
58 if (this->Divisor > 1)
60 arrayIndex = arrayIndex / this->Divisor;
64 arrayIndex = arrayIndex % this->Modulo;
66 arrayIndex = (arrayIndex * this->Stride) + this->Offset;
72 class ArrayPortalStrideRead
74 const T* Array =
nullptr;
78 ArrayPortalStrideRead() =
default;
79 ArrayPortalStrideRead(ArrayPortalStrideRead&&) =
default;
80 ArrayPortalStrideRead(
const ArrayPortalStrideRead&) =
default;
81 ArrayPortalStrideRead& operator=(ArrayPortalStrideRead&&) =
default;
82 ArrayPortalStrideRead& operator=(
const ArrayPortalStrideRead&) =
default;
84 ArrayPortalStrideRead(
const T* array,
const ArrayStrideInfo& info)
99 return detail::ArrayPortalBasicReadGet(this->Array + this->Info.ArrayIndex(index));
106 template <
typename T>
107 class ArrayPortalStrideWrite
110 ArrayStrideInfo
Info;
113 ArrayPortalStrideWrite() =
default;
114 ArrayPortalStrideWrite(ArrayPortalStrideWrite&&) =
default;
115 ArrayPortalStrideWrite(
const ArrayPortalStrideWrite&) =
default;
116 ArrayPortalStrideWrite& operator=(ArrayPortalStrideWrite&&) =
default;
117 ArrayPortalStrideWrite& operator=(
const ArrayPortalStrideWrite&) =
default;
119 ArrayPortalStrideWrite(T* array,
const ArrayStrideInfo& info)
134 return detail::ArrayPortalBasicWriteGet(this->Array + this->Info.ArrayIndex(index));
142 detail::ArrayPortalBasicWriteSet(this->Array + this->Info.ArrayIndex(index), value);
164 template <
typename T>
167 using StrideInfo = viskores::internal::ArrayStrideInfo;
170 using ReadPortalType = viskores::internal::ArrayPortalStrideRead<T>;
171 using WritePortalType = viskores::internal::ArrayPortalStrideWrite<T>;
174 const std::vector<viskores::cont::internal::Buffer>& buffers)
176 return buffers[0].GetMetaData<StrideInfo>();
180 const std::vector<viskores::cont::internal::Buffer>&)
186 const std::vector<viskores::cont::internal::Buffer>& buffers)
188 return GetInfo(buffers).NumberOfValues;
193 const std::vector<viskores::cont::internal::Buffer>& buffers,
197 StrideInfo& info = GetInfo(buffers);
199 if (info.NumberOfValues == numValues)
208 viskores::Id resultLength = ((length - 1) / info.Divisor) + 1;
209 if ((info.Modulo > 0) && (info.Modulo < resultLength))
211 resultLength = info.Modulo;
215 viskores::Id lastStridedIndex = lengthDivMod(numValues);
221 originalStride = info.Stride;
222 originalOffset = info.Offset;
229 originalStride = -info.Stride;
231 viskores::Id originalSize = lengthDivMod(info.NumberOfValues);
235 originalOffset = originalSize - info.Offset - 1;
242 if (originalOffset >= originalStride)
251 "Cannot resize stride array with offset greater than stride (start of stride unknown).");
257 viskores::Id lastIndex = lastStridedIndex * originalStride;
259 buffers[1].SetNumberOfBytes(
260 viskores::internal::NumberOfValuesToNumberOfBytes<T>(lastIndex), preserve, token);
261 info.NumberOfValues = numValues;
268 info.Offset = lastIndex - originalOffset - 1;
272 VISKORES_CONT static void Fill(
const std::vector<viskores::cont::internal::Buffer>& buffers,
279 const std::vector<viskores::cont::internal::Buffer>& buffers,
283 return ReadPortalType(
reinterpret_cast<const T*
>(buffers[1].ReadPointerDevice(device, token)),
288 const std::vector<viskores::cont::internal::Buffer>& buffers,
292 return WritePortalType(
reinterpret_cast<T*
>(buffers[1].WritePointerDevice(device, token)),
296 static std::vector<viskores::cont::internal::Buffer> CreateBuffers(
297 const viskores::cont::internal::Buffer& sourceBuffer = viskores::cont::internal::Buffer{},
298 viskores::internal::ArrayStrideInfo&& info = viskores::internal::ArrayStrideInfo{})
300 return viskores::cont::internal::CreateBuffers(info, sourceBuffer);
304 const std::vector<viskores::cont::internal::Buffer>& buffers)
342 template <
typename T>
357 viskores::internal::ArrayStrideInfo(0, stride, offset, modulo, divisor)))
369 array.GetBuffers()[0],
370 viskores::internal::ArrayStrideInfo(numValues, stride, offset, modulo, divisor)))
382 viskores::internal::ArrayStrideInfo(numValues, stride, offset, modulo, divisor)))
426 return StorageType::GetBasicArray(this->GetBuffers());
432 template <
typename T>
441 return { array, numValues, stride, offset, modulo, divisor };
454 template <
typename T>
455 VISKORES_CONT inline void Storage<T, viskores::cont::StorageTagStride>::Fill(
456 const std::vector<viskores::cont::internal::Buffer>& buffers,
462 const StrideInfo& info = GetInfo(buffers);
464 if ((info.Stride == 1) && (info.Modulo == 0) && (info.Divisor <= 1))
467 basicArray.
Fill(fillValue, startIndex + info.Offset, endIndex + info.Offset, token);
482 info.ArrayIndex(startIndex),
490 viskores::cont::internal::ArrayCopyUnknown(constantArray, outputView);
506 template <
typename T>
507 struct SerializableTypeString<
viskores::cont::ArrayHandleStride<T>>
516 template <
typename T>
517 struct SerializableTypeString<
viskores::cont::ArrayHandle<T, viskores::cont::StorageTagStride>>
518 : SerializableTypeString<viskores::cont::ArrayHandleStride<T>>
528 template <
typename T>
529 struct Serialization<
viskores::cont::ArrayHandleStride<T>>
535 static VISKORES_CONT void save(BinaryBuffer& bb,
const BaseType& obj_)
553 viskores::cont::internal::Buffer buffer;
571 #ifndef viskores_cont_ArrayHandleStride_cxx
581 extern template class VISKORES_CONT_TEMPLATE_EXPORT Storage<char, StorageTagStride>;
582 extern template class VISKORES_CONT_TEMPLATE_EXPORT Storage<viskores::Int8, StorageTagStride>;
583 extern template class VISKORES_CONT_TEMPLATE_EXPORT Storage<viskores::UInt8, StorageTagStride>;
584 extern template class VISKORES_CONT_TEMPLATE_EXPORT Storage<viskores::Int16, StorageTagStride>;
585 extern template class VISKORES_CONT_TEMPLATE_EXPORT Storage<viskores::UInt16, StorageTagStride>;
586 extern template class VISKORES_CONT_TEMPLATE_EXPORT Storage<viskores::Int32, StorageTagStride>;
587 extern template class VISKORES_CONT_TEMPLATE_EXPORT Storage<viskores::UInt32, StorageTagStride>;
588 extern template class VISKORES_CONT_TEMPLATE_EXPORT Storage<viskores::Int64, StorageTagStride>;
589 extern template class VISKORES_CONT_TEMPLATE_EXPORT Storage<viskores::UInt64, StorageTagStride>;
590 extern template class VISKORES_CONT_TEMPLATE_EXPORT Storage<viskores::Float32, StorageTagStride>;
591 extern template class VISKORES_CONT_TEMPLATE_EXPORT Storage<viskores::Float64, StorageTagStride>;
595 extern template class VISKORES_CONT_TEMPLATE_EXPORT ArrayHandle<char, StorageTagStride>;
596 extern template class VISKORES_CONT_TEMPLATE_EXPORT ArrayHandle<viskores::Int8, StorageTagStride>;
597 extern template class VISKORES_CONT_TEMPLATE_EXPORT ArrayHandle<viskores::UInt8, StorageTagStride>;
598 extern template class VISKORES_CONT_TEMPLATE_EXPORT ArrayHandle<viskores::Int16, StorageTagStride>;
599 extern template class VISKORES_CONT_TEMPLATE_EXPORT ArrayHandle<viskores::UInt16, StorageTagStride>;
600 extern template class VISKORES_CONT_TEMPLATE_EXPORT ArrayHandle<viskores::Int32, StorageTagStride>;
601 extern template class VISKORES_CONT_TEMPLATE_EXPORT ArrayHandle<viskores::UInt32, StorageTagStride>;
602 extern template class VISKORES_CONT_TEMPLATE_EXPORT ArrayHandle<viskores::Int64, StorageTagStride>;
603 extern template class VISKORES_CONT_TEMPLATE_EXPORT ArrayHandle<viskores::UInt64, StorageTagStride>;
604 extern template class VISKORES_CONT_TEMPLATE_EXPORT
605 ArrayHandle<viskores::Float32, StorageTagStride>;
606 extern template class VISKORES_CONT_TEMPLATE_EXPORT
607 ArrayHandle<viskores::Float64, StorageTagStride>;
612 #endif //viskores_cont_ArrayHandleStride_cxx
615 #endif //viskores_cont_ArrayHandleStride_h