VTK-m  2.2
ArrayHandleCompositeVector.h
Go to the documentation of this file.
1 //============================================================================
2 // Copyright (c) Kitware, Inc.
3 // All rights reserved.
4 // See LICENSE.txt for details.
5 //
6 // This software is distributed WITHOUT ANY WARRANTY; without even
7 // the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
8 // PURPOSE. See the above copyright notice for more information.
9 //============================================================================
10 #ifndef vtk_m_ArrayHandleCompositeVector_h
11 #define vtk_m_ArrayHandleCompositeVector_h
12 
14 #include <vtkm/cont/ArrayHandle.h>
15 
16 #include <vtkm/StaticAssert.h>
17 #include <vtkm/Tuple.h>
18 #include <vtkm/VecTraits.h>
19 
20 #include <vtkmstd/integer_sequence.h>
21 
22 #include <numeric>
23 #include <type_traits>
24 
25 namespace vtkm
26 {
27 namespace internal
28 {
29 
30 namespace compvec
31 {
32 
33 template <typename... PortalList>
34 using AllPortalsAreWritable =
35  vtkm::ListAll<vtkm::List<PortalList...>, vtkm::internal::PortalSupportsSets>;
36 
37 // GetValueType: ---------------------------------------------------------------
38 // Determines the output `ValueType` of the set of `ArrayHandle` objects. For example, if the input
39 // set contains 3 types with `vtkm::Float32` ValueTypes, then the ValueType defined here will be
40 // `vtkm::Vec<Float32, 3>`. This also validates that all members have the same `ValueType`.
41 
42 template <typename ExpectedValueType, typename ArrayType>
43 struct CheckValueType
44 {
45  VTKM_STATIC_ASSERT_MSG((std::is_same<ExpectedValueType, typename ArrayType::ValueType>::value),
46  "ArrayHandleCompositeVector must be built from "
47  "ArrayHandles with the same ValueTypes.");
48 };
49 
50 template <typename ArrayType0, typename... ArrayTypes>
51 struct GetValueType
52 {
53  static constexpr vtkm::IdComponent COUNT =
54  static_cast<vtkm::IdComponent>(sizeof...(ArrayTypes)) + 1;
55  using ComponentType = typename ArrayType0::ValueType;
57  using ValueType = vtkm::Vec<ComponentType, COUNT>;
58 };
59 
60 // Special case for only one component
61 template <typename ArrayType>
62 struct GetValueType<ArrayType>
63 {
64  static constexpr vtkm::IdComponent COUNT = 1;
65  using ComponentType = typename ArrayType::ValueType;
66  using ValueType = typename ArrayType::ValueType;
67 };
68 
69 // SetToPortals: ---------------------------------------------------------------
70 // Given a Vec-like object, and index, and a set of array portals, sets each of
71 // the portals to the respective component of the Vec.
73 template <typename ValueType, vtkm::IdComponent... I, typename... Portals>
74 VTKM_EXEC_CONT void SetToPortalsImpl(vtkm::Id index,
75  const ValueType& value,
76  vtkmstd::integer_sequence<vtkm::IdComponent, I...>,
77  const Portals&... portals)
78 {
79  using Traits = vtkm::VecTraits<ValueType>;
80  (void)std::initializer_list<bool>{ (portals.Set(index, Traits::GetComponent(value, I)),
81  false)... };
82 }
83 
85 template <typename ValueType, typename... Portals>
86 VTKM_EXEC_CONT void SetToPortals(vtkm::Id index, const ValueType& value, const Portals&... portals)
87 {
88  SetToPortalsImpl(
89  index,
90  value,
91  vtkmstd::make_integer_sequence<vtkm::IdComponent, vtkm::IdComponent(sizeof...(Portals))>{},
92  portals...);
93 }
94 
95 } // namespace compvec
96 
97 template <typename... PortalTypes>
98 class VTKM_ALWAYS_EXPORT ArrayPortalCompositeVector
99 {
100  using Writable = compvec::AllPortalsAreWritable<PortalTypes...>;
101  using TupleType = vtkm::Tuple<PortalTypes...>;
102  TupleType Portals;
103 
104 public:
105  using ValueType = typename compvec::GetValueType<PortalTypes...>::ValueType;
106 
108  ArrayPortalCompositeVector() {}
109 
110  VTKM_CONT
111  ArrayPortalCompositeVector(const PortalTypes&... portals)
112  : Portals(portals...)
113  {
114  }
115 
116  VTKM_CONT
117  ArrayPortalCompositeVector(const TupleType& portals)
118  : Portals(portals)
119  {
120  }
121 
123  vtkm::Id GetNumberOfValues() const { return vtkm::Get<0>(this->Portals).GetNumberOfValues(); }
124 
126  ValueType Get(vtkm::Id index) const
127  {
128  auto getFromPortals = [index](const auto&... portals) {
129  return ValueType{ portals.Get(index)... };
130  };
131  return this->Portals.Apply(getFromPortals);
132  }
133 
134  template <typename Writable_ = Writable,
135  typename = typename std::enable_if<Writable_::value>::type>
136  VTKM_EXEC_CONT void Set(vtkm::Id index, const ValueType& value) const
137  {
138  // Note that we are using a lambda function here to implicitly construct a
139  // functor to pass to Apply. Some device compilers will not allow passing a
140  // function or function pointer to Tuple::Apply.
141  auto setToPortal = [index, &value](const auto&... portals) {
142  compvec::SetToPortals(index, value, portals...);
143  };
144  this->Portals.Apply(setToPortal);
145  }
146 };
147 
148 }
149 } // vtkm::internal
150 
151 namespace vtkm
152 {
153 namespace cont
154 {
155 namespace internal
156 {
157 
158 namespace compvec
159 {
160 
161 template <typename ArrayType>
162 struct VerifyArrayHandle
163 {
164  VTKM_STATIC_ASSERT_MSG(vtkm::cont::internal::ArrayHandleCheck<ArrayType>::type::value,
165  "Template parameters for ArrayHandleCompositeVector "
166  "must be a list of ArrayHandle types.");
167 };
168 
169 } // end namespace compvec
170 
171 } // namespace internal
172 
173 template <typename... StorageTags>
175 {
176 };
177 
178 namespace internal
179 {
180 
181 template <typename... ArrayTs>
182 struct CompositeVectorTraits
183 {
184  // Need to check this here, since this traits struct is used in the
185  // ArrayHandleCompositeVector superclass definition before any other
186  // static_asserts could be used.
187  using CheckArrayHandles = vtkm::List<compvec::VerifyArrayHandle<ArrayTs>...>;
188 
189  using ValueType = typename vtkm::internal::compvec::GetValueType<ArrayTs...>::ValueType;
190  using StorageTag = vtkm::cont::StorageTagCompositeVec<typename ArrayTs::StorageTag...>;
191  using Superclass = ArrayHandle<ValueType, StorageTag>;
192 };
193 
194 template <typename T, typename... StorageTags>
195 class Storage<vtkm::Vec<T, static_cast<vtkm::IdComponent>(sizeof...(StorageTags))>,
196  vtkm::cont::StorageTagCompositeVec<StorageTags...>>
197 {
198  using ValueType = vtkm::Vec<T, static_cast<vtkm::IdComponent>(sizeof...(StorageTags))>;
199 
200  struct Info
201  {
202  std::array<std::size_t, sizeof...(StorageTags) + 1> BufferOffset;
203  };
204 
205  template <typename S>
206  using StorageFor = vtkm::cont::internal::Storage<T, S>;
207 
208  using StorageTuple = vtkm::Tuple<StorageFor<StorageTags>...>;
209 
210  VTKM_CONT static std::vector<vtkm::cont::internal::Buffer> GetBuffers(
211  const std::vector<vtkm::cont::internal::Buffer>& buffers,
212  std::size_t subArray)
213  {
214  Info info = buffers[0].GetMetaData<Info>();
215  return std::vector<vtkm::cont::internal::Buffer>(buffers.begin() + info.BufferOffset[subArray],
216  buffers.begin() +
217  info.BufferOffset[subArray + 1]);
218  }
219 
220  template <std::size_t I>
221  VTKM_CONT static std::vector<vtkm::cont::internal::Buffer> Buffers(
222  const std::vector<vtkm::cont::internal::Buffer>& buffers)
223  {
224  return GetBuffers(buffers, I);
225  }
226 
227  using IndexList = vtkmstd::make_index_sequence<sizeof...(StorageTags)>;
228 
229 public:
230  using ReadPortalType =
231  vtkm::internal::ArrayPortalCompositeVector<typename StorageFor<StorageTags>::ReadPortalType...>;
232  using WritePortalType = vtkm::internal::ArrayPortalCompositeVector<
233  typename StorageFor<StorageTags>::WritePortalType...>;
234 
235 private:
236  template <std::size_t... Is>
237  static void ResizeBuffersImpl(vtkmstd::index_sequence<Is...>,
238  vtkm::Id numValues,
239  const std::vector<vtkm::cont::internal::Buffer>& buffers,
240  vtkm::CopyFlag preserve,
241  vtkm::cont::Token& token)
242  {
243  std::vector<std::vector<vtkm::cont::internal::Buffer>> bufferPartitions = { Buffers<Is>(
244  buffers)... };
246  numValues, bufferPartitions[Is], preserve, token),
247  false)... };
248  (void)init_list;
249  }
250 
251  template <std::size_t... Is>
252  static void FillImpl(vtkmstd::index_sequence<Is...>,
253  const std::vector<vtkm::cont::internal::Buffer>& buffers,
254  const ValueType& fillValue,
255  vtkm::Id startIndex,
256  vtkm::Id endIndex,
257  vtkm::cont::Token& token)
258  {
259  auto init_list = { (
261  fillValue[static_cast<vtkm::IdComponent>(Is)],
262  startIndex,
263  endIndex,
264  token),
265  false)... };
266  (void)init_list;
267  }
268 
269  template <std::size_t... Is>
270  static ReadPortalType CreateReadPortalImpl(
271  vtkmstd::index_sequence<Is...>,
272  const std::vector<vtkm::cont::internal::Buffer>& buffers,
274  vtkm::cont::Token& token)
275  {
277  Buffers<Is>(buffers), device, token)...);
278  }
279 
280  template <std::size_t... Is>
281  static WritePortalType CreateWritePortalImpl(
282  vtkmstd::index_sequence<Is...>,
283  const std::vector<vtkm::cont::internal::Buffer>& buffers,
285  vtkm::cont::Token& token)
286  {
288  Buffers<Is>(buffers), device, token)...);
289  }
290 
291 public:
292  VTKM_CONT static vtkm::IdComponent GetNumberOfComponentsFlat(
293  const std::vector<vtkm::cont::internal::Buffer>& buffers)
294  {
295  // Assume that all subcomponents are the same size. Things are not well defined otherwise.
297  GetBuffers(buffers, 0)) *
298  ValueType::NUM_COMPONENTS;
299  }
300 
301  VTKM_CONT static vtkm::Id GetNumberOfValues(
302  const std::vector<vtkm::cont::internal::Buffer>& buffers)
303  {
304  return vtkm::TupleElement<0, StorageTuple>::GetNumberOfValues(Buffers<0>(buffers));
305  }
306 
307  VTKM_CONT static void ResizeBuffers(vtkm::Id numValues,
308  const std::vector<vtkm::cont::internal::Buffer>& buffers,
309  vtkm::CopyFlag preserve,
310  vtkm::cont::Token& token)
311  {
312  ResizeBuffersImpl(IndexList{}, numValues, buffers, preserve, token);
313  }
314 
315  VTKM_CONT static void Fill(const std::vector<vtkm::cont::internal::Buffer>& buffers,
316  const ValueType& fillValue,
317  vtkm::Id startIndex,
318  vtkm::Id endIndex,
319  vtkm::cont::Token& token)
320  {
321  FillImpl(IndexList{}, buffers, fillValue, startIndex, endIndex, token);
322  }
323 
324  VTKM_CONT static ReadPortalType CreateReadPortal(
325  const std::vector<vtkm::cont::internal::Buffer>& buffers,
327  vtkm::cont::Token& token)
328  {
329  return CreateReadPortalImpl(IndexList{}, buffers, device, token);
330  }
331 
332  VTKM_CONT static WritePortalType CreateWritePortal(
333  const std::vector<vtkm::cont::internal::Buffer>& buffers,
335  vtkm::cont::Token& token)
336  {
337  return CreateWritePortalImpl(IndexList{}, buffers, device, token);
338  }
339 
340 public:
341  VTKM_CONT static std::vector<vtkm::cont::internal::Buffer> CreateBuffers(
343  {
344  auto numBuffers = { std::size_t{ 1 }, arrays.GetBuffers().size()... };
345  Info info;
346  std::partial_sum(numBuffers.begin(), numBuffers.end(), info.BufferOffset.begin());
347  return vtkm::cont::internal::CreateBuffers(info, arrays...);
348  }
349 
350  VTKM_CONT static std::vector<vtkm::cont::internal::Buffer> CreateBuffers()
351  {
352  return CreateBuffers(vtkm::cont::ArrayHandle<T, StorageTags>{}...);
353  }
354 
355 private:
356  using ArrayTupleType = vtkm::Tuple<vtkm::cont::ArrayHandle<T, StorageTags>...>;
357 
358  template <std::size_t... Is>
359  VTKM_CONT static ArrayTupleType GetArrayTupleImpl(
360  vtkmstd::index_sequence<Is...>,
361  const std::vector<vtkm::cont::internal::Buffer>& buffers)
362  {
363  return ArrayTupleType(vtkm::cont::ArrayHandle<T, StorageTags>(Buffers<Is>(buffers))...);
364  }
365 
366 public:
367  VTKM_CONT static ArrayTupleType GetArrayTuple(
368  const std::vector<vtkm::cont::internal::Buffer>& buffers)
369  {
370  return GetArrayTupleImpl(IndexList{}, buffers);
371  }
372 };
373 
374 // Special degenerative case when there is only one array being composited
375 template <typename T, typename StorageTag>
376 struct Storage<T, vtkm::cont::StorageTagCompositeVec<StorageTag>> : Storage<T, StorageTag>
377 {
378  VTKM_CONT static std::vector<vtkm::cont::internal::Buffer> CreateBuffers(
380  {
381  return vtkm::cont::internal::CreateBuffers(array);
382  }
383 
385  const std::vector<vtkm::cont::internal::Buffer>& buffers)
386  {
388  }
389 };
390 
391 } // namespace internal
392 
409 template <typename... ArrayTs>
411  : public ArrayHandle<typename internal::CompositeVectorTraits<ArrayTs...>::ValueType,
412  typename internal::CompositeVectorTraits<ArrayTs...>::StorageTag>
413 {
414 public:
418 
420  VTKM_CONT
421  ArrayHandleCompositeVector(const ArrayTs&... arrays)
422  : Superclass(StorageType::CreateBuffers(arrays...))
423  {
424  }
425 
427  VTKM_CONT vtkm::Tuple<ArrayTs...> GetArrayTuple() const
428  {
429  return StorageType::GetArrayTuple(this->GetBuffers());
430  }
431 };
432 
435 template <typename... ArrayTs>
437  const ArrayTs&... arrays)
438 {
439  // Will issue compiler error if any of ArrayTs is not a valid ArrayHandle.
441  (void)checkArrayHandles;
442  return ArrayHandleCompositeVector<ArrayTs...>(arrays...);
443 }
444 
445 //--------------------------------------------------------------------------------
446 // Specialization of ArrayExtractComponent
447 namespace internal
448 {
449 
450 namespace detail
451 {
452 
453 template <typename T>
454 struct ExtractComponentCompositeVecFunctor
455 {
457 
458  ResultArray operator()(vtkm::IdComponent, vtkm::IdComponent, vtkm::CopyFlag) const
459  {
460  throw vtkm::cont::ErrorBadValue("Invalid component index given to ArrayExtractComponent.");
461  }
462 
463  template <typename A0, typename... As>
464  ResultArray operator()(vtkm::IdComponent compositeIndex,
465  vtkm::IdComponent subIndex,
466  vtkm::CopyFlag allowCopy,
467  const A0& array0,
468  const As&... arrays) const
469  {
470  if (compositeIndex == 0)
471  {
472  return vtkm::cont::internal::ArrayExtractComponentImpl<typename A0::StorageTag>{}(
473  array0, subIndex, allowCopy);
474  }
475  else
476  {
477  return (*this)(--compositeIndex, subIndex, allowCopy, arrays...);
478  }
479  }
480 };
481 
482 } // namespace detail
483 
484 // Superclass will inherit the ArrayExtractComponentImplInefficient property if any
485 // of the sub-storage are inefficient (thus making everything inefficient).
486 template <typename... StorageTags>
487 struct ArrayExtractComponentImpl<StorageTagCompositeVec<StorageTags...>>
488  : vtkm::cont::internal::ArrayExtractComponentImplInherit<StorageTags...>
489 {
490  template <typename VecT>
491  auto operator()(
493  vtkm::IdComponent componentIndex,
494  vtkm::CopyFlag allowCopy) const
495  {
496  using T = typename vtkm::VecTraits<VecT>::ComponentType;
498  constexpr vtkm::IdComponent NUM_SUB_COMPONENTS = vtkm::VecFlat<T>::NUM_COMPONENTS;
499 
500  return array.GetArrayTuple().Apply(detail::ExtractComponentCompositeVecFunctor<T>{},
501  componentIndex / NUM_SUB_COMPONENTS,
502  componentIndex % NUM_SUB_COMPONENTS,
503  allowCopy);
504  }
505 };
506 
507 } // namespace internal
508 
509 }
510 } // namespace vtkm::cont
511 
512 //=============================================================================
513 // Specializations of serialization related classes
515 namespace vtkm
516 {
517 namespace cont
518 {
519 
520 template <typename... AHs>
521 struct SerializableTypeString<vtkm::cont::ArrayHandleCompositeVector<AHs...>>
522 {
523  static VTKM_CONT const std::string& Get()
524  {
525  static std::string name =
526  "AH_CompositeVector<" + internal::GetVariadicSerializableTypeString(AHs{}...) + ">";
527  return name;
528  }
529 };
530 
531 template <typename T, typename... STs>
532 struct SerializableTypeString<
533  vtkm::cont::ArrayHandle<vtkm::Vec<T, static_cast<vtkm::IdComponent>(sizeof...(STs))>,
534  vtkm::cont::StorageTagCompositeVec<STs...>>>
535  : SerializableTypeString<
536  vtkm::cont::ArrayHandleCompositeVector<vtkm::cont::ArrayHandle<T, STs>...>>
537 {
538 };
539 }
540 } // vtkm::cont
541 
542 namespace mangled_diy_namespace
543 {
544 
545 template <typename... AHs>
546 struct Serialization<vtkm::cont::ArrayHandleCompositeVector<AHs...>>
547 {
548 private:
549  using Type = typename vtkm::cont::ArrayHandleCompositeVector<AHs...>;
551 
552  struct SaveFunctor
553  {
554  BinaryBuffer& Buffer;
555  SaveFunctor(BinaryBuffer& bb)
556  : Buffer(bb)
557  {
558  }
559 
560  template <typename AH>
561  void operator()(const AH& ah) const
562  {
563  vtkmdiy::save(this->Buffer, ah);
564  }
565  };
566 
567  struct LoadFunctor
568  {
569  BinaryBuffer& Buffer;
570  LoadFunctor(BinaryBuffer& bb)
571  : Buffer(bb)
572  {
573  }
574 
575  template <typename AH>
576  void operator()(AH& ah) const
577  {
578  vtkmdiy::load(this->Buffer, ah);
579  }
580  };
581 
582  static BaseType Create(const AHs&... arrays) { return Type(arrays...); }
583 
584 public:
585  static VTKM_CONT void save(BinaryBuffer& bb, const BaseType& obj)
586  {
587  Type(obj).GetArrayTuple().ForEach(SaveFunctor{ bb });
588  }
589 
590  static VTKM_CONT void load(BinaryBuffer& bb, BaseType& obj)
591  {
592  vtkm::Tuple<AHs...> tuple;
593  tuple.ForEach(LoadFunctor{ bb });
594  obj = tuple.Apply(Create);
595  }
596 };
597 
598 template <typename T, typename... STs>
599 struct Serialization<
600  vtkm::cont::ArrayHandle<vtkm::Vec<T, static_cast<vtkm::IdComponent>(sizeof...(STs))>,
601  vtkm::cont::StorageTagCompositeVec<STs...>>>
602  : Serialization<vtkm::cont::ArrayHandleCompositeVector<vtkm::cont::ArrayHandle<T, STs>...>>
603 {
604 };
605 } // diy
607 
608 #endif //vtk_m_ArrayHandleCompositeVector_h
vtkm::cont::ArrayHandle
Manages an array-worth of data.
Definition: ArrayHandle.h:300
ArrayHandle.h
ArrayExtractComponent.h
vtkm::TupleElement
typename detail::TupleElementImpl< Index, TupleType >::type TupleElement
Becomes the type of the given index for the given vtkm::Tuple.
Definition: Tuple.h:63
vtkm::cont::ArrayHandle::GetBuffers
const std::vector< vtkm::cont::internal::Buffer > & GetBuffers() const
Returns the internal Buffer structures that hold the data.
Definition: ArrayHandle.h:721
vtkm::exec::arg::load
T load(const U &u, vtkm::Id v)
Definition: FetchTagArrayDirectIn.h:36
vtkm
Groups connected points that have the same field value.
Definition: Atomic.h:19
vtkm::cont::make_ArrayHandleCompositeVector
ArrayHandleCompositeVector< ArrayTs... > make_ArrayHandleCompositeVector(const ArrayTs &... arrays)
Create a composite vector array from other arrays.
Definition: ArrayHandleCompositeVector.h:436
vtkm::Get
auto Get(const vtkm::Tuple< Ts... > &tuple)
Retrieve the object from a vtkm::Tuple at the given index.
Definition: Tuple.h:81
VTKM_ARRAY_HANDLE_SUBCLASS
#define VTKM_ARRAY_HANDLE_SUBCLASS(classname, fullclasstype, superclass)
Macro to make default methods in ArrayHandle subclasses.
Definition: ArrayHandle.h:243
vtkm::cont::StorageTagCompositeVec
Definition: ArrayHandleCompositeVector.h:174
vtkm::cont::ArrayHandleCompositeVector::ArrayHandleCompositeVector
ArrayHandleCompositeVector(const ArrayTs &... arrays)
Construct an ArrayHandleCompositeVector from a set of component vectors.
Definition: ArrayHandleCompositeVector.h:421
VTKM_EXEC_CONT
#define VTKM_EXEC_CONT
Definition: ExportMacros.h:52
vtkm::tuple_element_t
typename tuple_element< Index, TupleType >::type tuple_element_t
Compatible with std::tuple_element_t for vtkm::Tuple.
Definition: Tuple.h:76
vtkm::IdComponent
vtkm::Int32 IdComponent
Base type to use to index small lists.
Definition: Types.h:194
vtkm::VecTraits::ComponentType
T ComponentType
Type of the components in the vector.
Definition: VecTraits.h:71
vtkm::cont::ArrayHandleCompositeVector
An ArrayHandle that combines components from other arrays.
Definition: ArrayHandleCompositeVector.h:410
mangled_diy_namespace
Definition: Particle.h:351
vtkm::cont::ArrayHandleCompositeVector::GetArrayTuple
vtkm::Tuple< ArrayTs... > GetArrayTuple() const
Return the arrays of all of the components in a vtkm::Tuple object.
Definition: ArrayHandleCompositeVector.h:427
vtkm::cont::ArrayHandleStride
An ArrayHandle that accesses a basic array with strides and offsets.
Definition: ArrayHandleStride.h:332
vtkm::cont::Token
A token to hold the scope of an ArrayHandle or other object.
Definition: Token.h:35
vtkm::cont::LogLevel::Info
@ Info
Information messages (detected hardware, etc) and temporary debugging output.
vtkm::cont::ArrayHandleCompositeVector::Superclass
typename vtkm::cont::detail::GetTypeInParentheses< void(typename internal::CompositeVectorTraits< ArrayTs... >::Superclass) >::type Superclass
Definition: ArrayHandleCompositeVector.h:417
VTKM_STATIC_ASSERT_MSG
#define VTKM_STATIC_ASSERT_MSG(condition, message)
Definition: StaticAssert.h:18
VTKM_CONT
#define VTKM_CONT
Definition: ExportMacros.h:57
vtkm::Id
vtkm::Int64 Id
Base type to use to index arrays.
Definition: Types.h:227
vtkm::VecFlat
Treat a Vec or Vec-like object as a flat Vec.
Definition: VecFlat.h:224
vtkm::cont::DeviceAdapterId
An object used to specify a device.
Definition: DeviceAdapterTag.h:58
vtkm::Vec
A short fixed-length array.
Definition: Types.h:357
vtkm::cont::ErrorBadValue
This class is thrown when a VTKm function or method encounters an invalid value that inhibits progres...
Definition: ErrorBadValue.h:25
vtkm::Tuple
VTK-m replacement for std::tuple.
Definition: Tuple.h:35
StaticAssert.h
vtkm::List
A template used to hold a list of types.
Definition: List.h:39
vtkm::CopyFlag
CopyFlag
Identifier used to specify whether a function should deep copy data.
Definition: Flags.h:17
vtkm::VecTraits
Traits that can be queried to treat any type as a Vec.
Definition: VecTraits.h:61
VTKM_ALWAYS_EXPORT
#define VTKM_ALWAYS_EXPORT
Definition: ExportMacros.h:89
vtkm::ListAll
vtkm::ListReduce< vtkm::ListTransform< List, Predicate >, vtkm::internal::meta::And, std::true_type > ListAll
Determines whether all the types in the list are "true.".
Definition: List.h:843
vtkm::cont::ArrayHandleCompositeVector::StorageType
typename Superclass::StorageType StorageType
Definition: ArrayHandleCompositeVector.h:417
VTKM_SUPPRESS_EXEC_WARNINGS
#define VTKM_SUPPRESS_EXEC_WARNINGS
Definition: ExportMacros.h:53
Tuple.h
VecTraits.h