19 #ifndef viskores_cont_ArrayHandleReverse_h
20 #define viskores_cont_ArrayHandleReverse_h
35 template <
typename PortalType>
36 class VISKORES_ALWAYS_EXPORT ArrayPortalReverse
38 using Writable = viskores::internal::PortalSupportsSets<PortalType>;
41 using ValueType =
typename PortalType::ValueType;
50 ArrayPortalReverse(
const PortalType& p)
55 template <
typename OtherPortal>
57 : portal(src.GetPortal())
62 viskores::Id GetNumberOfValues()
const {
return this->portal.GetNumberOfValues(); }
67 return this->portal.Get(portal.GetNumberOfValues() - index - 1);
70 template <
typename Writable_ = Writable,
71 typename =
typename std::enable_if<Writable_::value>::type>
74 this->portal.Set(portal.GetNumberOfValues() - index - 1, value);
82 template <
typename StorageTag>
90 template <
typename T,
typename ST>
93 using SourceStorage = Storage<T, ST>;
97 using ReadPortalType = ArrayPortalReverse<typename ArrayHandleType::ReadPortalType>;
98 using WritePortalType = ArrayPortalReverse<typename ArrayHandleType::WritePortalType>;
100 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> CreateBuffers()
102 return SourceStorage::CreateBuffers();
107 const std::vector<viskores::cont::internal::Buffer>& buffers,
111 SourceStorage::ResizeBuffers(numValues, buffers, preserve, token);
115 const std::vector<viskores::cont::internal::Buffer>& buffers)
117 return SourceStorage::GetNumberOfComponentsFlat(buffers);
121 const std::vector<viskores::cont::internal::Buffer>& buffers)
123 return SourceStorage::GetNumberOfValues(buffers);
126 VISKORES_CONT static void Fill(
const std::vector<viskores::cont::internal::Buffer>& buffers,
133 SourceStorage::Fill(buffers, fillValue, numValues - endIndex, numValues - startIndex, token);
137 const std::vector<viskores::cont::internal::Buffer>& buffers,
141 return ReadPortalType(SourceStorage::CreateReadPortal(buffers, device, token));
145 const std::vector<viskores::cont::internal::Buffer>& buffers,
149 return WritePortalType(SourceStorage::CreateWritePortal(buffers, device, token));
161 template <
typename ArrayHandleType>
164 StorageTagReverse<typename ArrayHandleType::StorageTag>>
189 template <
typename HandleType>
200 template <
typename StorageTag>
202 : viskores::cont::internal::ArrayExtractComponentImpl<StorageTag>
204 template <
typename T>
205 using StrideArrayType =
208 template <
typename T>
209 StrideArrayType<T> operator()(
215 StrideArrayType<T> subArray =
216 ArrayExtractComponentImpl<StorageTag>{}(srcArray.GetSourceArray(), componentIndex, allowCopy);
218 return StrideArrayType<T>(subArray.GetBasicArray(),
219 srcArray.GetNumberOfValues(),
220 -subArray.GetStride(),
221 subArray.GetOffset() +
222 (subArray.GetStride() * (subArray.GetNumberOfValues() - 1)),
223 subArray.GetModulo(),
224 subArray.GetDivisor());
241 template <
typename AH>
242 struct SerializableTypeString<
viskores::cont::ArrayHandleReverse<AH>>
251 template <
typename T,
typename ST>
252 struct SerializableTypeString<
viskores::cont::ArrayHandle<T, viskores::cont::StorageTagReverse<ST>>>
253 : SerializableTypeString<viskores::cont::ArrayHandleReverse<viskores::cont::ArrayHandle<T, ST>>>
262 template <
typename AH>
263 struct Serialization<
viskores::cont::ArrayHandleReverse<AH>>
270 static VISKORES_CONT void save(BinaryBuffer& bb,
const Type& obj)
272 viskoresdiy::save(bb, obj.GetSourceArray());
283 template <
typename T,
typename ST>
284 struct Serialization<
viskores::cont::ArrayHandle<T, viskores::cont::StorageTagReverse<ST>>>
285 : Serialization<viskores::cont::ArrayHandleReverse<viskores::cont::ArrayHandle<T, ST>>>
292 #endif // viskores_cont_ArrayHandleReverse_h