VTK-m  2.1
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 
406 template <typename... ArrayTs>
408  : public ArrayHandle<typename internal::CompositeVectorTraits<ArrayTs...>::ValueType,
409  typename internal::CompositeVectorTraits<ArrayTs...>::StorageTag>
410 {
411 public:
415 
416  VTKM_CONT
417  ArrayHandleCompositeVector(const ArrayTs&... arrays)
418  : Superclass(StorageType::CreateBuffers(arrays...))
419  {
420  }
421 
422  VTKM_CONT vtkm::Tuple<ArrayTs...> GetArrayTuple() const
423  {
424  return StorageType::GetArrayTuple(this->GetBuffers());
425  }
426 };
427 
430 template <typename... ArrayTs>
432  const ArrayTs&... arrays)
433 {
434  // Will issue compiler error if any of ArrayTs is not a valid ArrayHandle.
436  (void)checkArrayHandles;
437  return ArrayHandleCompositeVector<ArrayTs...>(arrays...);
438 }
439 
440 //--------------------------------------------------------------------------------
441 // Specialization of ArrayExtractComponent
442 namespace internal
443 {
444 
445 namespace detail
446 {
447 
448 template <typename T>
449 struct ExtractComponentCompositeVecFunctor
450 {
452 
453  ResultArray operator()(vtkm::IdComponent, vtkm::IdComponent, vtkm::CopyFlag) const
454  {
455  throw vtkm::cont::ErrorBadValue("Invalid component index given to ArrayExtractComponent.");
456  }
457 
458  template <typename A0, typename... As>
459  ResultArray operator()(vtkm::IdComponent compositeIndex,
460  vtkm::IdComponent subIndex,
461  vtkm::CopyFlag allowCopy,
462  const A0& array0,
463  const As&... arrays) const
464  {
465  if (compositeIndex == 0)
466  {
467  return vtkm::cont::internal::ArrayExtractComponentImpl<typename A0::StorageTag>{}(
468  array0, subIndex, allowCopy);
469  }
470  else
471  {
472  return (*this)(--compositeIndex, subIndex, allowCopy, arrays...);
473  }
474  }
475 };
476 
477 } // namespace detail
478 
479 // Superclass will inherit the ArrayExtractComponentImplInefficient property if any
480 // of the sub-storage are inefficient (thus making everything inefficient).
481 template <typename... StorageTags>
482 struct ArrayExtractComponentImpl<StorageTagCompositeVec<StorageTags...>>
483  : vtkm::cont::internal::ArrayExtractComponentImplInherit<StorageTags...>
484 {
485  template <typename VecT>
486  auto operator()(
488  vtkm::IdComponent componentIndex,
489  vtkm::CopyFlag allowCopy) const
490  {
491  using T = typename vtkm::VecTraits<VecT>::ComponentType;
493  constexpr vtkm::IdComponent NUM_SUB_COMPONENTS = vtkm::VecFlat<T>::NUM_COMPONENTS;
494 
495  return array.GetArrayTuple().Apply(detail::ExtractComponentCompositeVecFunctor<T>{},
496  componentIndex / NUM_SUB_COMPONENTS,
497  componentIndex % NUM_SUB_COMPONENTS,
498  allowCopy);
499  }
500 };
501 
502 } // namespace internal
503 
504 }
505 } // namespace vtkm::cont
506 
507 //=============================================================================
508 // Specializations of serialization related classes
510 namespace vtkm
511 {
512 namespace cont
513 {
514 
515 template <typename... AHs>
516 struct SerializableTypeString<vtkm::cont::ArrayHandleCompositeVector<AHs...>>
517 {
518  static VTKM_CONT const std::string& Get()
519  {
520  static std::string name =
521  "AH_CompositeVector<" + internal::GetVariadicSerializableTypeString(AHs{}...) + ">";
522  return name;
523  }
524 };
525 
526 template <typename T, typename... STs>
527 struct SerializableTypeString<
528  vtkm::cont::ArrayHandle<vtkm::Vec<T, static_cast<vtkm::IdComponent>(sizeof...(STs))>,
529  vtkm::cont::StorageTagCompositeVec<STs...>>>
530  : SerializableTypeString<
531  vtkm::cont::ArrayHandleCompositeVector<vtkm::cont::ArrayHandle<T, STs>...>>
532 {
533 };
534 }
535 } // vtkm::cont
536 
537 namespace mangled_diy_namespace
538 {
539 
540 template <typename... AHs>
541 struct Serialization<vtkm::cont::ArrayHandleCompositeVector<AHs...>>
542 {
543 private:
544  using Type = typename vtkm::cont::ArrayHandleCompositeVector<AHs...>;
546 
547  struct SaveFunctor
548  {
549  BinaryBuffer& Buffer;
550  SaveFunctor(BinaryBuffer& bb)
551  : Buffer(bb)
552  {
553  }
554 
555  template <typename AH>
556  void operator()(const AH& ah) const
557  {
558  vtkmdiy::save(this->Buffer, ah);
559  }
560  };
561 
562  struct LoadFunctor
563  {
564  BinaryBuffer& Buffer;
565  LoadFunctor(BinaryBuffer& bb)
566  : Buffer(bb)
567  {
568  }
569 
570  template <typename AH>
571  void operator()(AH& ah) const
572  {
573  vtkmdiy::load(this->Buffer, ah);
574  }
575  };
576 
577  static BaseType Create(const AHs&... arrays) { return Type(arrays...); }
578 
579 public:
580  static VTKM_CONT void save(BinaryBuffer& bb, const BaseType& obj)
581  {
582  Type(obj).GetArrayTuple().ForEach(SaveFunctor{ bb });
583  }
584 
585  static VTKM_CONT void load(BinaryBuffer& bb, BaseType& obj)
586  {
587  vtkm::Tuple<AHs...> tuple;
588  tuple.ForEach(LoadFunctor{ bb });
589  obj = tuple.Apply(Create);
590  }
591 };
592 
593 template <typename T, typename... STs>
594 struct Serialization<
595  vtkm::cont::ArrayHandle<vtkm::Vec<T, static_cast<vtkm::IdComponent>(sizeof...(STs))>,
596  vtkm::cont::StorageTagCompositeVec<STs...>>>
597  : Serialization<vtkm::cont::ArrayHandleCompositeVector<vtkm::cont::ArrayHandle<T, STs>...>>
598 {
599 };
600 } // diy
602 
603 #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:719
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:431
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)
Definition: ArrayHandleCompositeVector.h:417
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:407
mangled_diy_namespace
Definition: Particle.h:351
vtkm::cont::ArrayHandleCompositeVector::GetArrayTuple
vtkm::Tuple< ArrayTs... > GetArrayTuple() const
Definition: ArrayHandleCompositeVector.h:422
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:414
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:414
VTKM_SUPPRESS_EXEC_WARNINGS
#define VTKM_SUPPRESS_EXEC_WARNINGS
Definition: ExportMacros.h:53
Tuple.h
VecTraits.h