18 #ifndef viskores_cont_ArrayHandleRuntimeVec_h
19 #define viskores_cont_ArrayHandleRuntimeVec_h
46 template <
typename T, viskores::IdComponent N>
47 struct UnrollVecImpl<
viskores::Vec<T, N>>
49 using subtype =
typename UnrollVecImpl<T>::type;
60 using UnrollVec =
typename detail::UnrollVecImpl<T>::type;
62 template <
typename ComponentsPortalType>
63 class VISKORES_ALWAYS_EXPORT ArrayPortalRuntimeVec
66 using ComponentType =
typename std::remove_const<typename ComponentsPortalType::ValueType>::type;
69 ArrayPortalRuntimeVec() =
default;
73 : ComponentsPortal(componentsPortal)
74 , NumberOfComponents(numComponents)
81 template <
typename OtherComponentsPortalType>
83 const ArrayPortalRuntimeVec<OtherComponentsPortalType>& src)
84 : ComponentsPortal(src.GetComponentsPortal())
85 , NumberOfComponents(src.GetNumberOfComponents())
91 return this->ComponentsPortal.GetNumberOfValues() / this->NumberOfComponents;
97 this->ComponentsPortal, this->NumberOfComponents, index * this->NumberOfComponents);
102 if ((&value.GetPortal() == &this->ComponentsPortal) &&
103 (value.GetOffset() == (index * this->NumberOfComponents)))
111 this->
Get(index) = value;
117 return this->ComponentsPortal;
122 return this->NumberOfComponents;
126 ComponentsPortalType ComponentsPortal;
145 struct RuntimeVecMetaData
150 template <
typename ComponentsPortal>
153 using ComponentType =
typename ComponentsPortal::ValueType;
154 using ComponentsStorage =
155 viskores::cont::internal::Storage<ComponentType, viskores::cont::StorageTagBasic>;
159 "ArrayHandleRuntimeVec only supports scalars grouped into a single Vec. Nested Vecs can "
160 "still be used with ArrayHandleRuntimeVec. The values are treated as flattened (like "
166 (std::is_same<ComponentsPortal, typename ComponentsStorage::WritePortalType>::value),
167 "Used invalid ComponentsPortal type with expected ComponentsStorageTag.");
169 using Info = RuntimeVecMetaData;
171 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> ComponentsBuffers(
172 const std::vector<viskores::cont::internal::Buffer>& buffers)
174 return std::vector<viskores::cont::internal::Buffer>(buffers.begin() + 1, buffers.end());
178 using ReadPortalType =
179 viskores::internal::ArrayPortalRuntimeVec<typename ComponentsStorage::ReadPortalType>;
180 using WritePortalType =
181 viskores::internal::ArrayPortalRuntimeVec<typename ComponentsStorage::WritePortalType>;
184 const std::vector<viskores::cont::internal::Buffer>& buffers)
186 return buffers[0].GetMetaData<Info>().NumberOfComponents;
190 const std::vector<viskores::cont::internal::Buffer>& buffers)
194 ComponentsStorage::GetNumberOfComponentsFlat(ComponentsBuffers(buffers));
195 return numComponents * numSubComponents;
199 const std::vector<viskores::cont::internal::Buffer>& buffers)
201 return ComponentsStorage::GetNumberOfValues(ComponentsBuffers(buffers)) /
202 GetNumberOfComponents(buffers);
207 const std::vector<viskores::cont::internal::Buffer>& buffers,
211 ComponentsStorage::ResizeBuffers(
212 numValues * GetNumberOfComponents(buffers), ComponentsBuffers(buffers), preserve, token);
215 VISKORES_CONT static void Fill(
const std::vector<viskores::cont::internal::Buffer>&,
225 const std::vector<viskores::cont::internal::Buffer>& buffers,
229 return ReadPortalType(
230 ComponentsStorage::CreateReadPortal(ComponentsBuffers(buffers), device, token),
231 GetNumberOfComponents(buffers));
235 const std::vector<viskores::cont::internal::Buffer>& buffers,
239 return WritePortalType(
240 ComponentsStorage::CreateWritePortal(ComponentsBuffers(buffers), device, token),
241 GetNumberOfComponents(buffers));
244 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> CreateBuffers(
246 const ComponentsArray& componentsArray = ComponentsArray{})
249 (componentsArray.GetNumberOfValues() % numComponents) != 0,
250 "Array given to ArrayHandleRuntimeVec has size ("
251 << componentsArray.GetNumberOfValues()
252 <<
") that is not divisible by the number of components selected ("
253 << numComponents <<
").");
255 info.NumberOfComponents = numComponents;
256 return viskores::cont::internal::CreateBuffers(info, componentsArray);
260 const std::vector<viskores::cont::internal::Buffer>& buffers)
262 return ComponentsArray(ComponentsBuffers(buffers));
266 const std::vector<viskores::cont::internal::Buffer>& buffers,
269 if (GetNumberOfComponents(buffers) != 1)
272 "Attempted to pull a scalar array from an ArrayHandleRuntime that does not hold scalars.");
274 dest = GetComponentsArray(buffers);
277 template <viskores::IdComponent N>
279 const std::vector<viskores::cont::internal::Buffer>& buffers,
283 if (GetNumberOfComponents(buffers) != N)
286 "Attempted to pull an array of Vecs of the wrong size from an ArrayHandleRuntime.");
290 ComponentsBuffers(buffers));
293 template <
typename T, viskores::IdComponent NInner, viskores::IdComponent NOuter>
295 const std::vector<viskores::cont::internal::Buffer>& buffers,
301 AsArrayHandleBasic(buffers, squashedArray);
337 template <
typename ComponentType>
340 viskores::VecFromPortal<typename ArrayHandleBasic<ComponentType>::WritePortalType>,
341 viskores::cont::StorageTagRuntimeVec>
366 :
Superclass(StorageType::CreateBuffers(numComponents, componentsArray))
373 return StorageType::GetNumberOfComponents(this->
GetBuffers());
382 return StorageType::GetComponentsArray(this->
GetBuffers());
391 template <
typename ValueType>
394 StorageType::AsArrayHandleBasic(this->
GetBuffers(), array);
398 template <
typename ArrayType>
415 template <
typename T>
421 using UnrolledVec = viskores::internal::UnrollVec<T>;
422 using ComponentType =
typename UnrolledVec::ComponentType;
427 componentsArray.GetBuffers());
430 numComponents * UnrolledVec::NUM_COMPONENTS, flatComponents);
435 template <
typename T>
444 template <
typename T>
459 template <
typename T>
464 viskores::cont::internal::BufferInfo::Deleter deleter = internal::SimpleArrayDeleter<T>,
465 viskores::cont::internal::BufferInfo::Reallocater reallocater =
466 internal::SimpleArrayReallocater<T>)
475 template <
typename T,
typename Allocator>
477 const std::vector<T, Allocator>& array,
485 template <
typename T,
typename Allocator>
487 std::vector<T, Allocator>&& array)
492 template <
typename T,
typename Allocator>
494 std::vector<T, Allocator>&& array,
506 template <
typename T>
511 using ComponentType =
typename T::ComponentType;
516 ArrayExtractComponentImpl<viskores::cont::StorageTagBasic>{}(
517 array.GetComponentsArray(), componentIndex % NUM_SUB_COMPONENTS, allowCopy);
544 template <
typename T>
545 struct SerializableTypeString<
viskores::cont::ArrayHandleRuntimeVec<T>>
554 template <
typename VecType>
555 struct SerializableTypeString<
556 viskores::cont::ArrayHandle<VecType, viskores::cont::StorageTagRuntimeVec>>
557 : SerializableTypeString<viskores::cont::ArrayHandleRuntimeVec<typename VecType::ComponentType>>
567 template <
typename T>
568 struct Serialization<
viskores::cont::ArrayHandleRuntimeVec<T>>
575 static VISKORES_CONT void save(BinaryBuffer& bb,
const BaseType& obj)
577 viskoresdiy::save(bb, Type(obj).GetNumberOfComponents());
578 viskoresdiy::save(bb, Type(obj).GetComponentsArray());
593 template <
typename VecType>
594 struct Serialization<
viskores::cont::ArrayHandle<VecType, viskores::cont::StorageTagRuntimeVec>>
595 : Serialization<viskores::cont::ArrayHandleRuntimeVec<typename VecType::ComponentType>>
602 #endif //viskores_cont_ArrayHandleRuntimeVec_h