18 #ifndef viskores_cont_ArrayHandleGroupVecVariable_h
19 #define viskores_cont_ArrayHandleGroupVecVariable_h
34 template <
typename ComponentsPortalType,
typename OffsetsPortalType>
35 class VISKORES_ALWAYS_EXPORT ArrayPortalGroupVecVariable
38 using ComponentType =
typename std::remove_const<typename ComponentsPortalType::ValueType>::type;
43 ArrayPortalGroupVecVariable()
51 ArrayPortalGroupVecVariable(
const ComponentsPortalType& componentsPortal,
52 const OffsetsPortalType& offsetsPortal)
53 : ComponentsPortal(componentsPortal)
54 , OffsetsPortal(offsetsPortal)
62 template <
typename OtherComponentsPortalType,
typename OtherOffsetsPortalType>
64 const ArrayPortalGroupVecVariable<OtherComponentsPortalType, OtherOffsetsPortalType>& src)
65 : ComponentsPortal(src.GetComponentsPortal())
66 , OffsetsPortal(src.GetOffsetsPortal())
72 viskores::Id GetNumberOfValues()
const {
return this->OffsetsPortal.GetNumberOfValues() - 1; }
78 viskores::Id offsetIndex = this->OffsetsPortal.Get(index);
79 viskores::Id nextOffsetIndex = this->OffsetsPortal.Get(index + 1);
81 return ValueType(this->ComponentsPortal,
88 void Set(
viskores::Id index,
const ValueType& value)
const
90 if ((&value.GetPortal() == &this->ComponentsPortal) &&
91 (value.GetOffset() == this->OffsetsPortal.Get(index)))
99 this->
Get(index) = value;
105 const ComponentsPortalType& GetComponentsPortal()
const {
return this->ComponentsPortal; }
109 const OffsetsPortalType& GetOffsetsPortal()
const {
return this->OffsetsPortal; }
112 ComponentsPortalType ComponentsPortal;
113 OffsetsPortalType OffsetsPortal;
124 template <
typename ComponentsStorageTag,
typename OffsetsStorageTag>
132 template <
typename ComponentsPortal,
typename ComponentsStorageTag,
typename OffsetsStorageTag>
136 using ComponentType =
typename ComponentsPortal::ValueType;
137 using ComponentsStorage = viskores::cont::internal::Storage<ComponentType, ComponentsStorageTag>;
138 using OffsetsStorage = viskores::cont::internal::Storage<viskores::Id, OffsetsStorageTag>;
144 (std::is_same<ComponentsPortal, typename ComponentsStorage::WritePortalType>::value),
145 "Used invalid ComponentsPortal type with expected ComponentsStorageTag.");
149 std::size_t OffsetsBuffersOffset;
152 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> ComponentsBuffers(
153 const std::vector<viskores::cont::internal::Buffer>& buffers)
155 Info info = buffers[0].GetMetaData<Info>();
156 return std::vector<viskores::cont::internal::Buffer>(
157 buffers.begin() + 1, buffers.begin() + info.OffsetsBuffersOffset);
160 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> OffsetsBuffers(
161 const std::vector<viskores::cont::internal::Buffer> buffers)
163 Info info = buffers[0].GetMetaData<Info>();
164 return std::vector<viskores::cont::internal::Buffer>(
165 buffers.begin() + info.OffsetsBuffersOffset, buffers.end());
171 using ReadPortalType =
172 viskores::internal::ArrayPortalGroupVecVariable<
typename ComponentsStorage::ReadPortalType,
173 typename OffsetsStorage::ReadPortalType>;
174 using WritePortalType =
175 viskores::internal::ArrayPortalGroupVecVariable<
typename ComponentsStorage::WritePortalType,
176 typename OffsetsStorage::ReadPortalType>;
179 const std::vector<viskores::cont::internal::Buffer>&)
186 const std::vector<viskores::cont::internal::Buffer>& buffers)
188 return OffsetsStorage::GetNumberOfValues(OffsetsBuffers(buffers)) - 1;
191 VISKORES_CONT static void Fill(
const std::vector<viskores::cont::internal::Buffer>&,
201 const std::vector<viskores::cont::internal::Buffer>& buffers,
205 return ReadPortalType(
206 ComponentsStorage::CreateReadPortal(ComponentsBuffers(buffers), device, token),
207 OffsetsStorage::CreateReadPortal(OffsetsBuffers(buffers), device, token));
211 const std::vector<viskores::cont::internal::Buffer>& buffers,
215 return WritePortalType(
216 ComponentsStorage::CreateWritePortal(ComponentsBuffers(buffers), device, token),
217 OffsetsStorage::CreateReadPortal(OffsetsBuffers(buffers), device, token));
220 VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> CreateBuffers(
221 const ComponentsArray& componentsArray = ComponentsArray{},
222 const OffsetsArray& offsetsArray = OffsetsArray{})
225 info.OffsetsBuffersOffset = 1 + componentsArray.GetBuffers().size();
226 return viskores::cont::internal::CreateBuffers(info, componentsArray, offsetsArray);
230 const std::vector<viskores::cont::internal::Buffer>& buffers)
232 return ComponentsArray(ComponentsBuffers(buffers));
236 const std::vector<viskores::cont::internal::Buffer>& buffers)
238 return OffsetsArray(OffsetsBuffers(buffers));
278 template <
typename ComponentsArrayHandleType,
typename OffsetsArrayHandleType>
281 viskores::VecFromPortal<typename ComponentsArrayHandleType::WritePortalType>,
282 viskores::cont::StorageTagGroupVecVariable<typename ComponentsArrayHandleType::StorageTag,
283 typename OffsetsArrayHandleType::StorageTag>>
289 (std::is_same<viskores::Id, typename OffsetsArrayHandleType::ValueType>::value),
290 "ArrayHandleGroupVecVariable's offsets array must contain viskores::Id values.");
299 typename OffsetsArrayHandleType::StorageTag>>));
306 const OffsetsArrayHandleType& offsetsArray)
314 return StorageType::GetComponentsArray(this->
GetBuffers());
320 return StorageType::GetOffsetsArray(this->
GetBuffers());
329 template <
typename ComponentsArrayHandleType,
typename OffsetsArrayHandleType>
333 const OffsetsArrayHandleType& offsetsArray)
336 OffsetsArrayHandleType>(componentsArray,
350 template <
typename SAH,
typename OAH>
351 struct SerializableTypeString<
viskores::cont::ArrayHandleGroupVecVariable<SAH, OAH>>
361 template <
typename SP,
typename SST,
typename OST>
362 struct SerializableTypeString<
363 viskores::cont::ArrayHandle<viskores::VecFromPortal<SP>,
364 viskores::cont::StorageTagGroupVecVariable<SST, OST>>>
365 : SerializableTypeString<viskores::cont::ArrayHandleGroupVecVariable<
366 viskores::cont::ArrayHandle<typename SP::ValueType, SST>,
367 viskores::cont::ArrayHandle<viskores::Id, OST>>>
376 template <
typename SAH,
typename OAH>
377 struct Serialization<
viskores::cont::ArrayHandleGroupVecVariable<SAH, OAH>>
384 static VISKORES_CONT void save(BinaryBuffer& bb,
const BaseType& obj)
386 viskoresdiy::save(bb, Type(obj).GetComponentsArray());
387 viskoresdiy::save(bb, Type(obj).GetOffsetsArray());
402 template <
typename SP,
typename SST,
typename OST>
403 struct Serialization<
404 viskores::cont::ArrayHandle<viskores::VecFromPortal<SP>,
405 viskores::cont::StorageTagGroupVecVariable<SST, OST>>>
406 : Serialization<viskores::cont::ArrayHandleGroupVecVariable<
407 viskores::cont::ArrayHandle<typename SP::ValueType, SST>,
408 viskores::cont::ArrayHandle<viskores::Id, OST>>>
414 #endif //viskores_cont_ArrayHandleGroupVecVariable_h