18 #ifndef viskores_cont_ArrayHandleView_h
19 #define viskores_cont_ArrayHandleView_h
38 ViewIndices() =
default;
42 , NumberOfValues(numValues)
47 template <
typename TargetPortalType>
50 using Writable = viskores::internal::PortalSupportsSets<TargetPortalType>;
53 using ValueType =
typename TargetPortalType::ValueType;
59 ArrayPortalView(
const TargetPortalType& targetPortal, ViewIndices indices)
60 : TargetPortal(targetPortal)
65 template <
typename OtherPortalType>
66 VISKORES_EXEC_CONT ArrayPortalView(
const ArrayPortalView<OtherPortalType>& otherPortal)
67 : TargetPortal(otherPortal.GetTargetPortal())
68 , Indices(otherPortal.GetStartIndex(), otherPortal.GetNumberOfValues())
73 viskores::Id GetNumberOfValues()
const {
return this->Indices.NumberOfValues; }
78 return this->TargetPortal.Get(index + this->GetStartIndex());
81 template <
typename Writable_ = Writable,
82 typename =
typename std::enable_if<Writable_::value>::type>
85 this->TargetPortal.Set(index + this->GetStartIndex(), value);
89 const TargetPortalType& GetTargetPortal()
const {
return this->TargetPortal; }
91 viskores::Id GetStartIndex()
const {
return this->Indices.StartIndex; }
94 TargetPortalType TargetPortal;
103 template <
typename StorageTag>
111 template <
typename T,
typename ST>
115 using SourceStorage = Storage<T, ST>;
117 static std::vector<viskores::cont::internal::Buffer> SourceBuffers(
118 const std::vector<viskores::cont::internal::Buffer>& buffers)
120 return std::vector<viskores::cont::internal::Buffer>(buffers.begin() + 1, buffers.end());
126 using ReadPortalType =
127 viskores::internal::ArrayPortalView<typename ArrayHandleType::ReadPortalType>;
128 using WritePortalType =
129 viskores::internal::ArrayPortalView<typename ArrayHandleType::WritePortalType>;
132 const std::vector<viskores::cont::internal::Buffer>& buffers)
134 return SourceStorage::GetNumberOfComponentsFlat(SourceBuffers(buffers));
138 const std::vector<viskores::cont::internal::Buffer>& buffers)
140 return buffers[0].GetMetaData<viskores::internal::ViewIndices>().NumberOfValues;
144 const std::vector<viskores::cont::internal::Buffer>& buffers,
148 viskores::internal::ViewIndices indices =
149 buffers[0].GetMetaData<viskores::internal::ViewIndices>();
150 return ReadPortalType(SourceStorage::CreateReadPortal(SourceBuffers(buffers), device, token),
154 VISKORES_CONT static void Fill(
const std::vector<viskores::cont::internal::Buffer>& buffers,
160 viskores::internal::ViewIndices indices =
161 buffers[0].GetMetaData<viskores::internal::ViewIndices>();
162 viskores::Id adjustedStartIndex = startIndex + indices.StartIndex;
163 viskores::Id adjustedEndIndex = (endIndex < indices.NumberOfValues)
164 ? endIndex + indices.StartIndex
165 : indices.NumberOfValues + indices.StartIndex;
167 SourceBuffers(buffers), fillValue, adjustedStartIndex, adjustedEndIndex, token);
171 const std::vector<viskores::cont::internal::Buffer>& buffers,
175 viskores::internal::ViewIndices indices =
176 buffers[0].GetMetaData<viskores::internal::ViewIndices>();
177 return WritePortalType(SourceStorage::CreateWritePortal(SourceBuffers(buffers), device, token),
181 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> CreateBuffers(
184 const ArrayHandleType& array = ArrayHandleType{})
186 return viskores::cont::internal::CreateBuffers(
187 viskores::internal::ViewIndices(startIndex, numValues), array);
191 const std::vector<viskores::cont::internal::Buffer>& buffers)
193 return ArrayHandleType(SourceBuffers(buffers));
197 const std::vector<viskores::cont::internal::Buffer>& buffers)
199 return buffers[0].GetMetaData<viskores::internal::ViewIndices>().StartIndex;
211 template <
typename ArrayHandleType>
214 StorageTagView<typename ArrayHandleType::StorageTag>>
252 template <
typename ArrayHandleType>
267 template <
typename StorageTag>
268 struct ArrayExtractComponentImpl<StorageTagView<StorageTag>>
269 : viskores::cont::internal::ArrayExtractComponentImpl<StorageTag>
271 template <
typename T>
272 using StrideArrayType =
275 template <
typename T>
276 StrideArrayType<T> operator()(
282 StrideArrayType<T> subArray =
283 ArrayExtractComponentImpl<StorageTag>{}(srcArray.GetSourceArray(), componentIndex, allowCopy);
285 return StrideArrayType<T>(subArray.GetBasicArray(),
286 srcArray.GetNumberOfValues(),
287 subArray.GetStride(),
288 subArray.GetOffset() +
289 (subArray.GetStride() * srcArray.GetStartIndex()),
290 subArray.GetModulo(),
291 subArray.GetDivisor());
300 #endif //viskores_cont_ArrayHandleView_h