18 #ifndef viskores_cont_ArrayHandleGroupVec_h
19 #define viskores_cont_ArrayHandleGroupVec_h
31 template <
typename PortalType, viskores::IdComponent N_COMPONENTS>
32 class VISKORES_ALWAYS_EXPORT ArrayPortalGroupVec
34 using Writable = viskores::internal::PortalSupportsSets<PortalType>;
38 using ComponentsPortalType = PortalType;
40 using ComponentType =
typename std::remove_const<typename ComponentsPortalType::ValueType>::type;
52 ArrayPortalGroupVec(
const ComponentsPortalType& componentsPortal)
53 : ComponentsPortal(componentsPortal)
61 template <
typename OtherComponentsPortalType>
63 const ArrayPortalGroupVec<OtherComponentsPortalType, NUM_COMPONENTS>& src)
64 : ComponentsPortal(src.GetPortal())
72 return this->ComponentsPortal.GetNumberOfValues() / NUM_COMPONENTS;
84 result[componentIndex] = this->ComponentsPortal.Get(componentsIndex);
91 template <
typename Writable_ = Writable,
92 typename =
typename std::enable_if<Writable_::value>::type>
99 this->ComponentsPortal.Set(componentsIndex, value[componentIndex]);
106 const ComponentsPortalType& GetPortal()
const {
return this->ComponentsPortal; }
109 ComponentsPortalType ComponentsPortal;
119 template <
typename ComponentsStorageTag, viskores::IdComponent NUM_COMPONENTS>
127 template <
typename ComponentType,
129 typename ComponentsStorageTag>
130 class Storage<
viskores::
Vec<ComponentType, NUM_COMPONENTS>,
133 using ComponentsStorage = viskores::cont::internal::Storage<ComponentType, ComponentsStorageTag>;
137 using ReadPortalType =
138 viskores::internal::ArrayPortalGroupVec<
typename ComponentsStorage::ReadPortalType,
140 using WritePortalType =
141 viskores::internal::ArrayPortalGroupVec<
typename ComponentsStorage::WritePortalType,
144 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> CreateBuffers()
146 return ComponentsStorage::CreateBuffers();
151 const std::vector<viskores::cont::internal::Buffer>& buffers,
155 ComponentsStorage::ResizeBuffers(NUM_COMPONENTS * numValues, buffers, preserve, token);
159 const std::vector<viskores::cont::internal::Buffer>& buffers)
161 return ComponentsStorage::GetNumberOfComponentsFlat(buffers) * NUM_COMPONENTS;
165 const std::vector<viskores::cont::internal::Buffer>& buffers)
167 viskores::Id componentsSize = ComponentsStorage::GetNumberOfValues(buffers);
168 return componentsSize / NUM_COMPONENTS;
171 VISKORES_CONT static void Fill(
const std::vector<viskores::cont::internal::Buffer>&,
181 const std::vector<viskores::cont::internal::Buffer>& buffers,
185 if ((ComponentsStorage::GetNumberOfValues(buffers) % NUM_COMPONENTS) != 0)
188 "ArrayHandleGroupVec's components array does not divide evenly into Vecs.");
190 return ReadPortalType(ComponentsStorage::CreateReadPortal(buffers, device, token));
194 const std::vector<viskores::cont::internal::Buffer>& buffers,
198 if ((ComponentsStorage::GetNumberOfValues(buffers) % NUM_COMPONENTS) != 0)
201 "ArrayHandleGroupVec's components array does not divide evenly into Vecs.");
203 return WritePortalType(ComponentsStorage::CreateWritePortal(buffers, device, token));
226 template <
typename ComponentsArrayHandleType, viskores::IdComponent NUM_COMPONENTS>
229 viskores::Vec<typename ComponentsArrayHandleType::ValueType, NUM_COMPONENTS>,
230 viskores::cont::StorageTagGroupVec<typename ComponentsArrayHandleType::StorageTag,
256 return ComponentsArrayHandleType(this->
GetBuffers());
265 template <viskores::IdComponent NUM_COMPONENTS,
typename ArrayHandleType>
279 template <
typename ComponentsStorageTag, viskores::IdComponent NUM_COMPONENTS>
280 struct ArrayExtractComponentImpl<
282 : viskores::cont::internal::ArrayExtractComponentImpl<ComponentsStorageTag>
284 template <
typename T>
297 ArrayExtractComponentImpl<ComponentsStorageTag>{}(
298 srcArray.GetComponentsArray(), componentIndex % NUM_SUB_COMPONENTS, allowCopy);
324 template <
typename AH, viskores::IdComponent NUM_COMPS>
325 struct SerializableTypeString<
viskores::cont::ArrayHandleGroupVec<AH, NUM_COMPS>>
329 static std::string name =
335 template <
typename T, viskores::IdComponent NUM_COMPS,
typename ST>
336 struct SerializableTypeString<
337 viskores::cont::ArrayHandle<viskores::Vec<T, NUM_COMPS>,
338 viskores::cont::StorageTagGroupVec<ST, NUM_COMPS>>>
339 : SerializableTypeString<
340 viskores::cont::ArrayHandleGroupVec<viskores::cont::ArrayHandle<T, ST>, NUM_COMPS>>
349 template <
typename AH, viskores::IdComponent NUM_COMPS>
350 struct Serialization<
viskores::cont::ArrayHandleGroupVec<AH, NUM_COMPS>>
357 static VISKORES_CONT void save(BinaryBuffer& bb,
const BaseType& obj)
359 viskoresdiy::save(bb, Type(obj).GetComponentsArray());
367 obj = viskores::cont::make_ArrayHandleGroupVec<NUM_COMPS>(array);
371 template <
typename T, viskores::IdComponent NUM_COMPS,
typename ST>
372 struct Serialization<
viskores::cont::ArrayHandle<viskores::Vec<T, NUM_COMPS>,
373 viskores::cont::StorageTagGroupVec<ST, NUM_COMPS>>>
375 viskores::cont::ArrayHandleGroupVec<viskores::cont::ArrayHandle<T, ST>, NUM_COMPS>>
382 #endif //viskores_cont_ArrayHandleGroupVec_h