VTK-m  2.0
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 // GetFromPortals: -------------------------------------------------------------
70 // Given a set of array portals as arguments, returns a Vec comprising the values
71 // at the provided index.
73 template <typename... Portals>
74 VTKM_EXEC_CONT typename GetValueType<Portals...>::ValueType GetFromPortals(
75  vtkm::Id index,
76  const Portals&... portals)
77 {
78  return { portals.Get(index)... };
79 }
80 
81 // SetToPortals: ---------------------------------------------------------------
82 // Given a Vec-like object, and index, and a set of array portals, sets each of
83 // the portals to the respective component of the Vec.
85 template <typename ValueType, vtkm::IdComponent... I, typename... Portals>
86 VTKM_EXEC_CONT void SetToPortalsImpl(vtkm::Id index,
87  const ValueType& value,
88  vtkmstd::integer_sequence<vtkm::IdComponent, I...>,
89  const Portals&... portals)
90 {
91  using Traits = vtkm::VecTraits<ValueType>;
92  (void)std::initializer_list<bool>{ (portals.Set(index, Traits::GetComponent(value, I)),
93  false)... };
94 }
95 
97 template <typename ValueType, typename... Portals>
98 VTKM_EXEC_CONT void SetToPortals(vtkm::Id index, const ValueType& value, const Portals&... portals)
99 {
100  SetToPortalsImpl(
101  index,
102  value,
103  vtkmstd::make_integer_sequence<vtkm::IdComponent, vtkm::IdComponent(sizeof...(Portals))>{},
104  portals...);
105 }
106 
107 } // namespace compvec
108 
109 template <typename... PortalTypes>
110 class VTKM_ALWAYS_EXPORT ArrayPortalCompositeVector
111 {
112  using Writable = compvec::AllPortalsAreWritable<PortalTypes...>;
113  using TupleType = vtkm::Tuple<PortalTypes...>;
114  TupleType Portals;
115 
116 public:
117  using ValueType = typename compvec::GetValueType<PortalTypes...>::ValueType;
118 
120  ArrayPortalCompositeVector() {}
121 
122  VTKM_CONT
123  ArrayPortalCompositeVector(const PortalTypes&... portals)
124  : Portals(portals...)
125  {
126  }
127 
128  VTKM_CONT
129  ArrayPortalCompositeVector(const TupleType& portals)
130  : Portals(portals)
131  {
132  }
133 
135  vtkm::Id GetNumberOfValues() const { return vtkm::Get<0>(this->Portals).GetNumberOfValues(); }
136 
138  ValueType Get(vtkm::Id index) const
139  {
140  return this->Portals.Apply(compvec::GetFromPortals<PortalTypes...>, index);
141  }
142 
143  template <typename Writable_ = Writable,
144  typename = typename std::enable_if<Writable_::value>::type>
145  VTKM_EXEC_CONT void Set(vtkm::Id index, const ValueType& value) const
146  {
147  this->Portals.Apply(compvec::SetToPortals<ValueType, PortalTypes...>, index, value);
148  }
149 };
150 
151 }
152 } // vtkm::internal
153 
154 namespace vtkm
155 {
156 namespace cont
157 {
158 namespace internal
159 {
160 
161 namespace compvec
162 {
163 
164 template <typename ArrayType>
165 struct VerifyArrayHandle
166 {
167  VTKM_STATIC_ASSERT_MSG(vtkm::cont::internal::ArrayHandleCheck<ArrayType>::type::value,
168  "Template parameters for ArrayHandleCompositeVector "
169  "must be a list of ArrayHandle types.");
170 };
171 
172 } // end namespace compvec
173 
174 } // namespace internal
175 
176 template <typename... StorageTags>
178 {
179 };
180 
181 namespace internal
182 {
183 
184 template <typename... ArrayTs>
185 struct CompositeVectorTraits
186 {
187  // Need to check this here, since this traits struct is used in the
188  // ArrayHandleCompositeVector superclass definition before any other
189  // static_asserts could be used.
190  using CheckArrayHandles = vtkm::List<compvec::VerifyArrayHandle<ArrayTs>...>;
191 
192  using ValueType = typename vtkm::internal::compvec::GetValueType<ArrayTs...>::ValueType;
193  using StorageTag = vtkm::cont::StorageTagCompositeVec<typename ArrayTs::StorageTag...>;
194  using StorageType = Storage<ValueType, StorageTag>;
195  using Superclass = ArrayHandle<ValueType, StorageTag>;
196 };
197 
198 template <typename T, typename... StorageTags>
199 class Storage<vtkm::Vec<T, static_cast<vtkm::IdComponent>(sizeof...(StorageTags))>,
200  vtkm::cont::StorageTagCompositeVec<StorageTags...>>
201 {
202  using ValueType = vtkm::Vec<T, static_cast<vtkm::IdComponent>(sizeof...(StorageTags))>;
203 
204  struct Info
205  {
206  std::array<std::size_t, sizeof...(StorageTags) + 1> BufferOffset;
207  };
208 
209  template <typename S>
210  using StorageFor = vtkm::cont::internal::Storage<T, S>;
211 
212  using StorageTuple = vtkm::Tuple<StorageFor<StorageTags>...>;
213 
214  VTKM_CONT static std::vector<vtkm::cont::internal::Buffer> GetBuffers(
215  const std::vector<vtkm::cont::internal::Buffer>& buffers,
216  std::size_t subArray)
217  {
218  Info info = buffers[0].GetMetaData<Info>();
219  return std::vector<vtkm::cont::internal::Buffer>(buffers.begin() + info.BufferOffset[subArray],
220  buffers.begin() +
221  info.BufferOffset[subArray + 1]);
222  }
223 
224  template <std::size_t I>
225  VTKM_CONT static std::vector<vtkm::cont::internal::Buffer> Buffers(
226  const std::vector<vtkm::cont::internal::Buffer>& buffers)
227  {
228  return GetBuffers(buffers, I);
229  }
230 
231  using IndexList = vtkmstd::make_index_sequence<sizeof...(StorageTags)>;
232 
233 public:
234  using ReadPortalType =
235  vtkm::internal::ArrayPortalCompositeVector<typename StorageFor<StorageTags>::ReadPortalType...>;
236  using WritePortalType = vtkm::internal::ArrayPortalCompositeVector<
237  typename StorageFor<StorageTags>::WritePortalType...>;
238 
239 private:
240  template <std::size_t... Is>
241  static void ResizeBuffersImpl(vtkmstd::index_sequence<Is...>,
242  vtkm::Id numValues,
243  const std::vector<vtkm::cont::internal::Buffer>& buffers,
244  vtkm::CopyFlag preserve,
245  vtkm::cont::Token& token)
246  {
247  std::vector<std::vector<vtkm::cont::internal::Buffer>> bufferPartitions = { Buffers<Is>(
248  buffers)... };
250  numValues, bufferPartitions[Is], preserve, token),
251  false)... };
252  (void)init_list;
253  }
254 
255  template <std::size_t... Is>
256  static void FillImpl(vtkmstd::index_sequence<Is...>,
257  const std::vector<vtkm::cont::internal::Buffer>& buffers,
258  const ValueType& fillValue,
259  vtkm::Id startIndex,
260  vtkm::Id endIndex,
261  vtkm::cont::Token& token)
262  {
263  auto init_list = { (
265  fillValue[static_cast<vtkm::IdComponent>(Is)],
266  startIndex,
267  endIndex,
268  token),
269  false)... };
270  (void)init_list;
271  }
272 
273  template <std::size_t... Is>
274  static ReadPortalType CreateReadPortalImpl(
275  vtkmstd::index_sequence<Is...>,
276  const std::vector<vtkm::cont::internal::Buffer>& buffers,
278  vtkm::cont::Token& token)
279  {
281  Buffers<Is>(buffers), device, token)...);
282  }
283 
284  template <std::size_t... Is>
285  static WritePortalType CreateWritePortalImpl(
286  vtkmstd::index_sequence<Is...>,
287  const std::vector<vtkm::cont::internal::Buffer>& buffers,
289  vtkm::cont::Token& token)
290  {
292  Buffers<Is>(buffers), device, token)...);
293  }
294 
295 public:
296  VTKM_CONT static vtkm::Id GetNumberOfValues(
297  const std::vector<vtkm::cont::internal::Buffer>& buffers)
298  {
299  return vtkm::TupleElement<0, StorageTuple>::GetNumberOfValues(Buffers<0>(buffers));
300  }
301 
302  VTKM_CONT static void ResizeBuffers(vtkm::Id numValues,
303  const std::vector<vtkm::cont::internal::Buffer>& buffers,
304  vtkm::CopyFlag preserve,
305  vtkm::cont::Token& token)
306  {
307  ResizeBuffersImpl(IndexList{}, numValues, buffers, preserve, token);
308  }
309 
310  VTKM_CONT static void Fill(const std::vector<vtkm::cont::internal::Buffer>& buffers,
311  const ValueType& fillValue,
312  vtkm::Id startIndex,
313  vtkm::Id endIndex,
314  vtkm::cont::Token& token)
315  {
316  FillImpl(IndexList{}, buffers, fillValue, startIndex, endIndex, token);
317  }
318 
319  VTKM_CONT static ReadPortalType CreateReadPortal(
320  const std::vector<vtkm::cont::internal::Buffer>& buffers,
322  vtkm::cont::Token& token)
323  {
324  return CreateReadPortalImpl(IndexList{}, buffers, device, token);
325  }
326 
327  VTKM_CONT static WritePortalType CreateWritePortal(
328  const std::vector<vtkm::cont::internal::Buffer>& buffers,
330  vtkm::cont::Token& token)
331  {
332  return CreateWritePortalImpl(IndexList{}, buffers, device, token);
333  }
334 
335 public:
336  VTKM_CONT static std::vector<vtkm::cont::internal::Buffer> CreateBuffers(
338  {
339  auto numBuffers = { std::size_t{ 1 }, arrays.GetBuffers().size()... };
340  Info info;
341  std::partial_sum(numBuffers.begin(), numBuffers.end(), info.BufferOffset.begin());
342  return vtkm::cont::internal::CreateBuffers(info, arrays...);
343  }
344 
345  VTKM_CONT static std::vector<vtkm::cont::internal::Buffer> CreateBuffers()
346  {
347  return CreateBuffers(vtkm::cont::ArrayHandle<T, StorageTags>{}...);
348  }
349 
350 private:
351  using ArrayTupleType = vtkm::Tuple<vtkm::cont::ArrayHandle<T, StorageTags>...>;
352 
353  template <std::size_t... Is>
354  VTKM_CONT static ArrayTupleType GetArrayTupleImpl(
355  vtkmstd::index_sequence<Is...>,
356  const std::vector<vtkm::cont::internal::Buffer>& buffers)
357  {
358  return ArrayTupleType(vtkm::cont::ArrayHandle<T, StorageTags>(Buffers<Is>(buffers))...);
359  }
360 
361 public:
362  VTKM_CONT static ArrayTupleType GetArrayTuple(
363  const std::vector<vtkm::cont::internal::Buffer>& buffers)
364  {
365  return GetArrayTupleImpl(IndexList{}, buffers);
366  }
367 };
368 
369 // Special degenerative case when there is only one array being composited
370 template <typename T, typename StorageTag>
371 struct Storage<T, vtkm::cont::StorageTagCompositeVec<StorageTag>> : Storage<T, StorageTag>
372 {
373  VTKM_CONT static std::vector<vtkm::cont::internal::Buffer> CreateBuffers(
375  {
376  return vtkm::cont::internal::CreateBuffers(array);
377  }
378 
380  const std::vector<vtkm::cont::internal::Buffer>& buffers)
381  {
383  }
384 };
385 
386 } // namespace internal
387 
401 template <typename... ArrayTs>
403  : public ArrayHandle<typename internal::CompositeVectorTraits<ArrayTs...>::ValueType,
404  typename internal::CompositeVectorTraits<ArrayTs...>::StorageTag>
405 {
406 private:
407  using Traits = internal::CompositeVectorTraits<ArrayTs...>;
408  using StorageType = typename Traits::StorageType;
409 
410 public:
413  (typename Traits::Superclass));
414 
415  VTKM_CONT
416  ArrayHandleCompositeVector(const ArrayTs&... arrays)
417  : Superclass(StorageType::CreateBuffers(arrays...))
418  {
419  }
420 
421  VTKM_CONT vtkm::Tuple<ArrayTs...> GetArrayTuple() const
422  {
423  return StorageType::GetArrayTuple(this->GetBuffers());
424  }
425 };
426 
429 template <typename... ArrayTs>
431  const ArrayTs&... arrays)
432 {
433  // Will issue compiler error if any of ArrayTs is not a valid ArrayHandle.
435  (void)checkArrayHandles;
436  return ArrayHandleCompositeVector<ArrayTs...>(arrays...);
437 }
438 
439 //--------------------------------------------------------------------------------
440 // Specialization of ArrayExtractComponent
441 namespace internal
442 {
443 
444 namespace detail
445 {
446 
447 template <typename T>
448 struct ExtractComponentCompositeVecFunctor
449 {
451 
452  ResultArray operator()(vtkm::IdComponent, vtkm::IdComponent, vtkm::CopyFlag) const
453  {
454  throw vtkm::cont::ErrorBadValue("Invalid component index given to ArrayExtractComponent.");
455  }
456 
457  template <typename A0, typename... As>
458  ResultArray operator()(vtkm::IdComponent compositeIndex,
459  vtkm::IdComponent subIndex,
460  vtkm::CopyFlag allowCopy,
461  const A0& array0,
462  const As&... arrays) const
463  {
464  if (compositeIndex == 0)
465  {
466  return vtkm::cont::internal::ArrayExtractComponentImpl<typename A0::StorageTag>{}(
467  array0, subIndex, allowCopy);
468  }
469  else
470  {
471  return (*this)(--compositeIndex, subIndex, allowCopy, arrays...);
472  }
473  }
474 };
475 
476 } // namespace detail
477 
478 // Superclass will inherit the ArrayExtractComponentImplInefficient property if any
479 // of the sub-storage are inefficient (thus making everything inefficient).
480 template <typename... StorageTags>
481 struct ArrayExtractComponentImpl<StorageTagCompositeVec<StorageTags...>>
482  : vtkm::cont::internal::ArrayExtractComponentImplInherit<StorageTags...>
483 {
484  template <typename VecT>
485  auto operator()(
487  vtkm::IdComponent componentIndex,
488  vtkm::CopyFlag allowCopy) const
489  {
490  using T = typename vtkm::VecTraits<VecT>::ComponentType;
492  constexpr vtkm::IdComponent NUM_SUB_COMPONENTS = vtkm::VecFlat<T>::NUM_COMPONENTS;
493 
494  return array.GetArrayTuple().Apply(detail::ExtractComponentCompositeVecFunctor<T>{},
495  componentIndex / NUM_SUB_COMPONENTS,
496  componentIndex % NUM_SUB_COMPONENTS,
497  allowCopy);
498  }
499 };
500 
501 } // namespace internal
502 
503 }
504 } // namespace vtkm::cont
505 
506 //=============================================================================
507 // Specializations of serialization related classes
509 namespace vtkm
510 {
511 namespace cont
512 {
513 
514 template <typename... AHs>
515 struct SerializableTypeString<vtkm::cont::ArrayHandleCompositeVector<AHs...>>
516 {
517  static VTKM_CONT const std::string& Get()
518  {
519  static std::string name =
520  "AH_CompositeVector<" + internal::GetVariadicSerializableTypeString(AHs{}...) + ">";
521  return name;
522  }
523 };
524 
525 template <typename T, typename... STs>
526 struct SerializableTypeString<
527  vtkm::cont::ArrayHandle<vtkm::Vec<T, static_cast<vtkm::IdComponent>(sizeof...(STs))>,
528  vtkm::cont::StorageTagCompositeVec<STs...>>>
529  : SerializableTypeString<
530  vtkm::cont::ArrayHandleCompositeVector<vtkm::cont::ArrayHandle<T, STs>...>>
531 {
532 };
533 }
534 } // vtkm::cont
535 
536 namespace mangled_diy_namespace
537 {
538 
539 template <typename... AHs>
540 struct Serialization<vtkm::cont::ArrayHandleCompositeVector<AHs...>>
541 {
542 private:
543  using Type = typename vtkm::cont::ArrayHandleCompositeVector<AHs...>;
545 
546  struct SaveFunctor
547  {
548  BinaryBuffer& Buffer;
549  SaveFunctor(BinaryBuffer& bb)
550  : Buffer(bb)
551  {
552  }
553 
554  template <typename AH>
555  void operator()(const AH& ah) const
556  {
557  vtkmdiy::save(this->Buffer, ah);
558  }
559  };
560 
561  struct LoadFunctor
562  {
563  BinaryBuffer& Buffer;
564  LoadFunctor(BinaryBuffer& bb)
565  : Buffer(bb)
566  {
567  }
568 
569  template <typename AH>
570  void operator()(AH& ah) const
571  {
572  vtkmdiy::load(this->Buffer, ah);
573  }
574  };
575 
576  static BaseType Create(const AHs&... arrays) { return Type(arrays...); }
577 
578 public:
579  static VTKM_CONT void save(BinaryBuffer& bb, const BaseType& obj)
580  {
581  Type(obj).GetArrayTuple().ForEach(SaveFunctor{ bb });
582  }
583 
584  static VTKM_CONT void load(BinaryBuffer& bb, BaseType& obj)
585  {
586  vtkm::Tuple<AHs...> tuple;
587  tuple.ForEach(LoadFunctor{ bb });
588  obj = tuple.Apply(Create);
589  }
590 };
591 
592 template <typename T, typename... STs>
593 struct Serialization<
594  vtkm::cont::ArrayHandle<vtkm::Vec<T, static_cast<vtkm::IdComponent>(sizeof...(STs))>,
595  vtkm::cont::StorageTagCompositeVec<STs...>>>
596  : Serialization<vtkm::cont::ArrayHandleCompositeVector<vtkm::cont::ArrayHandle<T, STs>...>>
597 {
598 };
599 } // diy
601 
602 #endif //vtk_m_ArrayHandleCompositeVector_h
vtkm::cont::ArrayHandle::GetBuffers
const VTKM_CONT std::vector< vtkm::cont::internal::Buffer > & GetBuffers() const
Returns the internal Buffer structures that hold the data.
Definition: ArrayHandle.h:696
vtkm::cont::ArrayHandle
Manages an array-worth of data.
Definition: ArrayHandle.h:283
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
Groups connected points that have the same field value.
Definition: Atomic.h:19
vtkm::cont::StorageTagCompositeVec
Definition: ArrayHandleCompositeVector.h:177
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::Get
VTKM_SUPPRESS_EXEC_WARNINGS VTKM_EXEC_CONT auto Get(const vtkm::Tuple< Ts... > &tuple) -> decltype(tuple.template Get< Index >())
Retrieve the object from a vtkm::Tuple at the given index.
Definition: Tuple.h:83
vtkm::IdComponent
vtkm::Int32 IdComponent
Represents a component ID (index of component in a vector).
Definition: Types.h:168
vtkm::cont::ArrayHandleCompositeVector
An ArrayHandle that combines components from other arrays.
Definition: ArrayHandleCompositeVector.h:402
mangled_diy_namespace
Definition: Particle.h:331
vtkm::Id
vtkm::Int32 Id
Represents an ID (index into arrays).
Definition: Types.h:191
vtkm::exec::arg::load
VTKM_SUPPRESS_EXEC_WARNINGS VTKM_EXEC T load(const U &u, vtkm::Id v)
Definition: FetchTagArrayDirectIn.h:36
vtkm::cont::ArrayHandleStride
An ArrayHandle that accesses a basic array with strides and offsets.
Definition: ArrayHandleStride.h:251
vtkm::cont::Token
A token to hold the scope of an ArrayHandle or other object.
Definition: Token.h:35
vtkm::cont::make_ArrayHandleCompositeVector
VTKM_CONT ArrayHandleCompositeVector< ArrayTs... > make_ArrayHandleCompositeVector(const ArrayTs &... arrays)
Create a composite vector array from other arrays.
Definition: ArrayHandleCompositeVector.h:430
vtkm::cont::LogLevel::Info
@ Info
Information messages (detected hardware, etc) and temporary debugging output.
VTKM_STATIC_ASSERT_MSG
#define VTKM_STATIC_ASSERT_MSG(condition, message)
Definition: StaticAssert.h:18
vtkm::cont::ArrayHandleCompositeVector::ArrayHandleCompositeVector
VTKM_CONT ArrayHandleCompositeVector(const ArrayTs &... arrays)
Definition: ArrayHandleCompositeVector.h:416
VTKM_CONT
#define VTKM_CONT
Definition: ExportMacros.h:57
vtkm::VecFlat
Treat a Vec or Vec-like object as a flat Vec.
Definition: VecFlat.h:224
vtkm::cont::ArrayHandleCompositeVector::VTKM_ARRAY_HANDLE_SUBCLASS
VTKM_ARRAY_HANDLE_SUBCLASS(ArrayHandleCompositeVector,(ArrayHandleCompositeVector< ArrayTs... >),(typename Traits::Superclass))
vtkm::cont::DeviceAdapterId
Definition: DeviceAdapterTag.h:52
vtkm::Vec
A short fixed-length array.
Definition: Types.h:767
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::cont::ArrayHandle< internal::CompositeVectorTraits< ArrayTs... >::ValueType, internal::CompositeVectorTraits< ArrayTs... >::StorageTag >::StorageType
vtkm::cont::internal::Storage< ValueType, StorageTag > StorageType
Definition: ArrayHandle.h:292
vtkm::VecTraits::ComponentType
typename VecType::ComponentType ComponentType
Type of the components in the vector.
Definition: VecTraits.h:73
vtkm::List
Definition: List.h:34
vtkm::CopyFlag
CopyFlag
Definition: Flags.h:16
vtkm::VecTraits
The VecTraits class gives several static members that define how to use a given type as a vector.
Definition: VecTraits.h:66
vtkm::cont::ArrayHandleCompositeVector::GetArrayTuple
VTKM_CONT vtkm::Tuple< ArrayTs... > GetArrayTuple() const
Definition: ArrayHandleCompositeVector.h:421
VTKM_ALWAYS_EXPORT
#define VTKM_ALWAYS_EXPORT
Definition: ExportMacros.h:92
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:839
vtkm::cont::ArrayHandleCompositeVector< vtkm::cont::ArrayHandle< Precision >, vtkm::cont::ArrayHandle< Precision >, vtkm::cont::ArrayHandle< Precision > >::Traits
internal::CompositeVectorTraits< ArrayTs... > Traits
Definition: ArrayHandleCompositeVector.h:407
VTKM_SUPPRESS_EXEC_WARNINGS
#define VTKM_SUPPRESS_EXEC_WARNINGS
Definition: ExportMacros.h:53
Tuple.h
VecTraits.h