Viskores  1.0
ArrayHandleGroupVecVariable.h
Go to the documentation of this file.
1 //============================================================================
2 // The contents of this file are covered by the Viskores license. See
3 // LICENSE.txt for details.
4 //
5 // By contributing to this file, all contributors agree to the Developer
6 // Certificate of Origin Version 1.1 (DCO 1.1) as stated in DCO.txt.
7 //============================================================================
8 
9 //============================================================================
10 // Copyright (c) Kitware, Inc.
11 // All rights reserved.
12 // See LICENSE.txt for details.
13 //
14 // This software is distributed WITHOUT ANY WARRANTY; without even
15 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 // PURPOSE. See the above copyright notice for more information.
17 //============================================================================
18 #ifndef viskores_cont_ArrayHandleGroupVecVariable_h
19 #define viskores_cont_ArrayHandleGroupVecVariable_h
20 
25 
26 #include <viskores/Assert.h>
27 #include <viskores/VecFromPortal.h>
28 
29 namespace viskores
30 {
31 namespace internal
32 {
33 
34 template <typename ComponentsPortalType, typename OffsetsPortalType>
35 class VISKORES_ALWAYS_EXPORT ArrayPortalGroupVecVariable
36 {
37 public:
38  using ComponentType = typename std::remove_const<typename ComponentsPortalType::ValueType>::type;
40 
43  ArrayPortalGroupVecVariable()
44  : ComponentsPortal()
45  , OffsetsPortal()
46  {
47  }
48 
51  ArrayPortalGroupVecVariable(const ComponentsPortalType& componentsPortal,
52  const OffsetsPortalType& offsetsPortal)
53  : ComponentsPortal(componentsPortal)
54  , OffsetsPortal(offsetsPortal)
55  {
56  }
57 
62  template <typename OtherComponentsPortalType, typename OtherOffsetsPortalType>
63  VISKORES_EXEC_CONT ArrayPortalGroupVecVariable(
64  const ArrayPortalGroupVecVariable<OtherComponentsPortalType, OtherOffsetsPortalType>& src)
65  : ComponentsPortal(src.GetComponentsPortal())
66  , OffsetsPortal(src.GetOffsetsPortal())
67  {
68  }
69 
72  viskores::Id GetNumberOfValues() const { return this->OffsetsPortal.GetNumberOfValues() - 1; }
73 
76  ValueType Get(viskores::Id index) const
77  {
78  viskores::Id offsetIndex = this->OffsetsPortal.Get(index);
79  viskores::Id nextOffsetIndex = this->OffsetsPortal.Get(index + 1);
80 
81  return ValueType(this->ComponentsPortal,
82  static_cast<viskores::IdComponent>(nextOffsetIndex - offsetIndex),
83  offsetIndex);
84  }
85 
88  void Set(viskores::Id index, const ValueType& value) const
89  {
90  if ((&value.GetPortal() == &this->ComponentsPortal) &&
91  (value.GetOffset() == this->OffsetsPortal.Get(index)))
92  {
93  // The ValueType (VecFromPortal) operates on demand. Thus, if you set
94  // something in the value, it has already been passed to the array.
95  }
96  else
97  {
98  // The value comes from somewhere else. Copy data in.
99  this->Get(index) = value;
100  }
101  }
102 
105  const ComponentsPortalType& GetComponentsPortal() const { return this->ComponentsPortal; }
106 
109  const OffsetsPortalType& GetOffsetsPortal() const { return this->OffsetsPortal; }
110 
111 private:
112  ComponentsPortalType ComponentsPortal;
113  OffsetsPortalType OffsetsPortal;
114 };
115 
116 }
117 } // namespace viskores::internal
118 
119 namespace viskores
120 {
121 namespace cont
122 {
123 
124 template <typename ComponentsStorageTag, typename OffsetsStorageTag>
125 struct VISKORES_ALWAYS_EXPORT StorageTagGroupVecVariable
126 {
127 };
128 
129 namespace internal
130 {
131 
132 template <typename ComponentsPortal, typename ComponentsStorageTag, typename OffsetsStorageTag>
133 class Storage<viskores::VecFromPortal<ComponentsPortal>,
134  viskores::cont::StorageTagGroupVecVariable<ComponentsStorageTag, OffsetsStorageTag>>
135 {
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>;
139 
142 
144  (std::is_same<ComponentsPortal, typename ComponentsStorage::WritePortalType>::value),
145  "Used invalid ComponentsPortal type with expected ComponentsStorageTag.");
146 
147  struct Info
148  {
149  std::size_t OffsetsBuffersOffset;
150  };
151 
152  VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> ComponentsBuffers(
153  const std::vector<viskores::cont::internal::Buffer>& buffers)
154  {
155  Info info = buffers[0].GetMetaData<Info>();
156  return std::vector<viskores::cont::internal::Buffer>(
157  buffers.begin() + 1, buffers.begin() + info.OffsetsBuffersOffset);
158  }
159 
160  VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> OffsetsBuffers(
161  const std::vector<viskores::cont::internal::Buffer> buffers)
162  {
163  Info info = buffers[0].GetMetaData<Info>();
164  return std::vector<viskores::cont::internal::Buffer>(
165  buffers.begin() + info.OffsetsBuffersOffset, buffers.end());
166  }
167 
168 public:
170 
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>;
177 
178  VISKORES_CONT static viskores::IdComponent GetNumberOfComponentsFlat(
179  const std::vector<viskores::cont::internal::Buffer>&)
180  {
181  // Number of components can be variable.
182  return 0;
183  }
184 
185  VISKORES_CONT static viskores::Id GetNumberOfValues(
186  const std::vector<viskores::cont::internal::Buffer>& buffers)
187  {
188  return OffsetsStorage::GetNumberOfValues(OffsetsBuffers(buffers)) - 1;
189  }
190 
191  VISKORES_CONT static void Fill(const std::vector<viskores::cont::internal::Buffer>&,
193  viskores::Id,
194  viskores::Id,
196  {
197  throw viskores::cont::ErrorBadType("Fill not supported for ArrayHandleGroupVecVariable.");
198  }
199 
200  VISKORES_CONT static ReadPortalType CreateReadPortal(
201  const std::vector<viskores::cont::internal::Buffer>& buffers,
203  viskores::cont::Token& token)
204  {
205  return ReadPortalType(
206  ComponentsStorage::CreateReadPortal(ComponentsBuffers(buffers), device, token),
207  OffsetsStorage::CreateReadPortal(OffsetsBuffers(buffers), device, token));
208  }
209 
210  VISKORES_CONT static WritePortalType CreateWritePortal(
211  const std::vector<viskores::cont::internal::Buffer>& buffers,
213  viskores::cont::Token& token)
214  {
215  return WritePortalType(
216  ComponentsStorage::CreateWritePortal(ComponentsBuffers(buffers), device, token),
217  OffsetsStorage::CreateReadPortal(OffsetsBuffers(buffers), device, token));
218  }
219 
220  VISKORES_CONT static std::vector<viskores::cont::internal::Buffer> CreateBuffers(
221  const ComponentsArray& componentsArray = ComponentsArray{},
222  const OffsetsArray& offsetsArray = OffsetsArray{})
223  {
224  Info info;
225  info.OffsetsBuffersOffset = 1 + componentsArray.GetBuffers().size();
226  return viskores::cont::internal::CreateBuffers(info, componentsArray, offsetsArray);
227  }
228 
229  VISKORES_CONT static ComponentsArray GetComponentsArray(
230  const std::vector<viskores::cont::internal::Buffer>& buffers)
231  {
232  return ComponentsArray(ComponentsBuffers(buffers));
233  }
234 
235  VISKORES_CONT static OffsetsArray GetOffsetsArray(
236  const std::vector<viskores::cont::internal::Buffer>& buffers)
237  {
238  return OffsetsArray(OffsetsBuffers(buffers));
239  }
240 };
241 
242 } // namespace internal
243 
278 template <typename ComponentsArrayHandleType, typename OffsetsArrayHandleType>
281  viskores::VecFromPortal<typename ComponentsArrayHandleType::WritePortalType>,
282  viskores::cont::StorageTagGroupVecVariable<typename ComponentsArrayHandleType::StorageTag,
283  typename OffsetsArrayHandleType::StorageTag>>
284 {
285  VISKORES_IS_ARRAY_HANDLE(ComponentsArrayHandleType);
286  VISKORES_IS_ARRAY_HANDLE(OffsetsArrayHandleType);
287 
289  (std::is_same<viskores::Id, typename OffsetsArrayHandleType::ValueType>::value),
290  "ArrayHandleGroupVecVariable's offsets array must contain viskores::Id values.");
291 
292 public:
298  viskores::cont::StorageTagGroupVecVariable<typename ComponentsArrayHandleType::StorageTag,
299  typename OffsetsArrayHandleType::StorageTag>>));
300 
301  using ComponentType = typename ComponentsArrayHandleType::ValueType;
302 
305  ArrayHandleGroupVecVariable(const ComponentsArrayHandleType& componentsArray,
306  const OffsetsArrayHandleType& offsetsArray)
307  : Superclass(StorageType::CreateBuffers(componentsArray, offsetsArray))
308  {
309  }
310 
312  VISKORES_CONT ComponentsArrayHandleType GetComponentsArray() const
313  {
314  return StorageType::GetComponentsArray(this->GetBuffers());
315  }
316 
318  VISKORES_CONT OffsetsArrayHandleType GetOffsetsArray() const
319  {
320  return StorageType::GetOffsetsArray(this->GetBuffers());
321  }
322 };
323 
329 template <typename ComponentsArrayHandleType, typename OffsetsArrayHandleType>
332  make_ArrayHandleGroupVecVariable(const ComponentsArrayHandleType& componentsArray,
333  const OffsetsArrayHandleType& offsetsArray)
334 {
335  return viskores::cont::ArrayHandleGroupVecVariable<ComponentsArrayHandleType,
336  OffsetsArrayHandleType>(componentsArray,
337  offsetsArray);
338 }
339 }
340 } // namespace viskores::cont
341 
342 //=============================================================================
343 // Specializations of serialization related classes
345 namespace viskores
346 {
347 namespace cont
348 {
349 
350 template <typename SAH, typename OAH>
351 struct SerializableTypeString<viskores::cont::ArrayHandleGroupVecVariable<SAH, OAH>>
352 {
353  static VISKORES_CONT const std::string& Get()
354  {
355  static std::string name = "AH_GroupVecVariable<" + SerializableTypeString<SAH>::Get() + "," +
357  return name;
358  }
359 };
360 
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>>>
368 {
369 };
370 }
371 } // viskores::cont
372 
373 namespace mangled_diy_namespace
374 {
375 
376 template <typename SAH, typename OAH>
377 struct Serialization<viskores::cont::ArrayHandleGroupVecVariable<SAH, OAH>>
378 {
379 private:
382 
383 public:
384  static VISKORES_CONT void save(BinaryBuffer& bb, const BaseType& obj)
385  {
386  viskoresdiy::save(bb, Type(obj).GetComponentsArray());
387  viskoresdiy::save(bb, Type(obj).GetOffsetsArray());
388  }
389 
390  static VISKORES_CONT void load(BinaryBuffer& bb, BaseType& obj)
391  {
392  SAH src;
393  OAH off;
394 
395  viskoresdiy::load(bb, src);
396  viskoresdiy::load(bb, off);
397 
399  }
400 };
401 
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>>>
409 {
410 };
411 } // diy
413 
414 #endif //viskores_cont_ArrayHandleGroupVecVariable_h
viskores::exec::arg::load
T load(const U &u, viskores::Id v)
Definition: FetchTagArrayDirectIn.h:44
viskores::cont::ArrayHandle< viskores::VecFromPortal< ArrayHandle< viskores::Id > ::WritePortalType >, viskores::cont::StorageTagGroupVecVariable< ArrayHandle< viskores::Id > ::StorageTag, ArrayHandle< viskores::Id > ::StorageTag > >::StorageType
viskores::cont::internal::Storage< ValueType, StorageTag > StorageType
Definition: ArrayHandle.h:322
ArrayHandle.h
ArrayHandleCast.h
viskores::cont::ArrayHandleGroupVecVariable::GetOffsetsArray
OffsetsArrayHandleType GetOffsetsArray() const
Return the offsets array defining the locations and sizes of each value.
Definition: ArrayHandleGroupVecVariable.h:318
viskores::VecFromPortal
A short variable-length array from a window in an ArrayPortal.
Definition: VecFromPortal.h:37
viskores::cont::ErrorBadType
This class is thrown when Viskores encounters data of a type that is incompatible with the current op...
Definition: ErrorBadType.h:33
VISKORES_IS_ARRAY_HANDLE
#define VISKORES_IS_ARRAY_HANDLE(T)
Checks that the given type is a viskores::cont::ArrayHandle.
Definition: ArrayHandle.h:145
viskores::cont::ArrayHandleGroupVecVariable< ArrayHandle< viskores::Id >, ArrayHandle< viskores::Id > >::Superclass
typename viskores::cont::detail::GetTypeInParentheses< void(viskores::cont::ArrayHandle< viskores::VecFromPortal< typename ArrayHandle< viskores::Id > ::WritePortalType >, viskores::cont::StorageTagGroupVecVariable< typename ArrayHandle< viskores::Id > ::StorageTag, typename ArrayHandle< viskores::Id > ::StorageTag > >) >::type Superclass
Definition: ArrayHandleGroupVecVariable.h:299
VISKORES_SUPPRESS_EXEC_WARNINGS
#define VISKORES_SUPPRESS_EXEC_WARNINGS
Definition: ExportMacros.h:61
viskores::cont::ArrayHandle
Manages an array-worth of data.
Definition: ArrayHandle.h:313
Assert.h
viskores::cont::LogLevel::Info
@ Info
Information messages (detected hardware, etc) and temporary debugging output.
viskores::IdComponent
viskores::Int32 IdComponent
Base type to use to index small lists.
Definition: Types.h:202
VISKORES_EXEC_CONT
#define VISKORES_EXEC_CONT
Definition: ExportMacros.h:60
viskores::cont::ArrayHandleGroupVecVariable< ArrayHandle< viskores::Id >, ArrayHandle< viskores::Id > >::ComponentType
typename ArrayHandle< viskores::Id > ::ValueType ComponentType
Definition: ArrayHandleGroupVecVariable.h:301
mangled_diy_namespace
Definition: Particle.h:373
viskores::Id
viskores::Int64 Id
Base type to use to index arrays.
Definition: Types.h:235
VISKORES_CONT
#define VISKORES_CONT
Definition: ExportMacros.h:65
ArrayPortal.h
viskores
Groups connected points that have the same field value.
Definition: Atomic.h:27
VecFromPortal.h
VISKORES_STORAGE_NO_RESIZE
#define VISKORES_STORAGE_NO_RESIZE
Definition: Storage.h:194
viskores::cont::StorageTagGroupVecVariable
Definition: ArrayHandleGroupVecVariable.h:125
VISKORES_STATIC_ASSERT_MSG
#define VISKORES_STATIC_ASSERT_MSG(condition, message)
Definition: StaticAssert.h:26
viskores::cont::DeviceAdapterId
An object used to specify a device.
Definition: DeviceAdapterTag.h:66
VISKORES_ARRAY_HANDLE_SUBCLASS
#define VISKORES_ARRAY_HANDLE_SUBCLASS(classname, fullclasstype, superclass)
Macro to make default methods in ArrayHandle subclasses.
Definition: ArrayHandle.h:256
ErrorBadValue.h
viskores::cont::make_ArrayHandleGroupVecVariable
viskores::cont::ArrayHandleGroupVecVariable< ComponentsArrayHandleType, OffsetsArrayHandleType > make_ArrayHandleGroupVecVariable(const ComponentsArrayHandleType &componentsArray, const OffsetsArrayHandleType &offsetsArray)
make_ArrayHandleGroupVecVariable is convenience function to generate an ArrayHandleGroupVecVariable.
Definition: ArrayHandleGroupVecVariable.h:332
viskores::Get
auto Get(const viskores::Tuple< Ts... > &tuple)
Retrieve the object from a viskores::Tuple at the given index.
Definition: Tuple.h:89
viskores::cont::ArrayHandleGroupVecVariable::GetComponentsArray
ComponentsArrayHandleType GetComponentsArray() const
Return the components array providing the data for the grouped vec array.
Definition: ArrayHandleGroupVecVariable.h:312
viskores::cont::ArrayHandleGroupVecVariable::ArrayHandleGroupVecVariable
ArrayHandleGroupVecVariable(const ComponentsArrayHandleType &componentsArray, const OffsetsArrayHandleType &offsetsArray)
Construct an ArrayHandleGroupVecVariable
Definition: ArrayHandleGroupVecVariable.h:305
viskores::cont::ArrayHandleGroupVecVariable
Fancy array handle that groups values into vectors of different sizes.
Definition: ArrayHandleGroupVecVariable.h:279
viskores::cont::Token
A token to hold the scope of an ArrayHandle or other object.
Definition: Token.h:43
viskores::cont::ArrayHandle< viskores::VecFromPortal< ComponentsArrayHandleType::WritePortalType >, viskores::cont::StorageTagGroupVecVariable< ComponentsArrayHandleType::StorageTag, OffsetsArrayHandleType::StorageTag > >::GetBuffers
const std::vector< viskores::cont::internal::Buffer > & GetBuffers() const
Returns the internal Buffer structures that hold the data.
Definition: ArrayHandle.h:738