VTK  9.7.1
vtkmDataArray.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-FileCopyrightText: Copyright (c) Kitware, Inc.
3 // SPDX-FileCopyrightText: Copyright 2019 Sandia Corporation.
4 // SPDX-FileCopyrightText: Copyright 2019 UT-Battelle, LLC.
5 // SPDX-FileCopyrightText: Copyright 2019 Los Alamos National Security.
6 // SPDX-License-Identifier: LicenseRef-BSD-3-Clause-Sandia-LANL-USGov
28 #ifndef vtkmDataArray_h
29 #define vtkmDataArray_h
30 
31 #include "vtkAcceleratorsVTKmCoreModule.h" // For export macro
32 #include "vtkGenericDataArray.h"
33 #include "vtkmConfigCore.h" // For template export
34 
35 #include <viskores/VecTraits.h> // For viskores::VecTraits
36 #include <viskores/cont/ArrayHandle.h> // For viskores::cont::ArrayHandle
37 #include <viskores/cont/UnknownArrayHandle.h> // For viskores::cont::UnknownArrayHandle
38 
39 #include <memory> // For std::unique_ptr<>
40 #include <mutex> // For std::mutex
41 
42 namespace fromvtkm
43 {
44 VTK_ABI_NAMESPACE_BEGIN
45 
46 template <typename T>
48 
49 template <typename T>
51 
52 template <typename ArrayHandleType>
54 
55 template <typename ArrayHandleType>
57 
58 VTK_ABI_NAMESPACE_END
59 } // fromvtkm
60 
61 VTK_ABI_NAMESPACE_BEGIN
62 template <typename T>
64  : public vtkGenericDataArray<vtkmDataArray<T>, T, vtkArrayTypes::VTKM_DATA_ARRAY>
65 {
66  static_assert(std::is_arithmetic<T>::value, "T must be an integral or floating-point type");
67 
68  using GenericDataArrayType =
70 
71 public:
74  using typename Superclass::ArrayTypeTag;
75  using typename Superclass::DataTypeTag;
76  using typename Superclass::ValueType;
77 
78  static vtkmDataArray* New();
79 
82  void SetVtkmArrayHandle(const viskores::cont::UnknownArrayHandle& ah);
83 
86  viskores::cont::UnknownArrayHandle GetVtkmUnknownArrayHandle() const;
87 
91  void* GetVoidPointer(vtkIdType valueIdx) override;
92  VTK_DEPRECATED_IN_9_7_0("Use vtkmDataArray::WritePointer(valueIdx, numValues) or "
93  "vtkAbstractArray::SetNumberOf[Values/Tuples]() instead")
94  void* WriteVoidPointer(vtkIdType valueIdx, vtkIdType numValues) override;
95  T* GetPointer(vtkIdType valueIdx);
96  T* WritePointer(vtkIdType valueIdx, vtkIdType numValues);
98  void* GetDeviceVoidPointer(vtkIdType valueIdx) override;
100 
102  ValueType GetValue(vtkIdType valueIdx) const;
103  void SetValue(vtkIdType valueIdx, ValueType value);
104  void GetTypedTuple(vtkIdType tupleIdx, ValueType* tuple) const;
105  void SetTypedTuple(vtkIdType tupleIdx, const ValueType* tuple);
106  ValueType GetTypedComponent(vtkIdType tupleIdx, int compIdx) const;
107  void SetTypedComponent(vtkIdType tupleIdx, int compIdx, ValueType value);
108 
109 protected:
110  vtkmDataArray();
111  ~vtkmDataArray() override;
112 
116  bool ComputeScalarRange(
117  double* ranges, const unsigned char* ghosts, unsigned char ghostsToSkip = 0xff) override;
119  bool ComputeVectorRange(
120  double range[2], const unsigned char* ghosts, unsigned char ghostsToSkip = 0xff) override;
122  bool ComputeFiniteScalarRange(
123  double* ranges, const unsigned char* ghosts, unsigned char ghostsToSkip = 0xff) override;
125  bool ComputeFiniteVectorRange(
126  double range[2], const unsigned char* ghosts, unsigned char ghostsToSkip = 0xff) override;
127 
129  bool AllocateTuples(vtkIdType numberOfTuples);
130  bool ReallocateTuples(vtkIdType numberOfTuples);
131 
132 private:
133  // To access concept methods
135  friend fromvtkm::ArrayHandleHelperBase<T>;
136  friend fromvtkm::ArrayHandleHelperUnknown<T>;
137  template <typename ArrayHandleType>
138  friend class fromvtkm::ArrayHandleHelperRead;
139  template <typename ArrayHandleType>
140  friend class fromvtkm::ArrayHandleHelperWrite;
141 
142  mutable std::unique_ptr<fromvtkm::ArrayHandleHelperBase<T>> Helper;
143 
144  mutable std::mutex Mutex;
145 
146  vtkmDataArray(const vtkmDataArray&) = delete;
147  void operator=(const vtkmDataArray&) = delete;
148 };
149 
150 // Declare vtkArrayDownCast implementations for vtkmDataArray:
152 
153 //=============================================================================
154 template <typename T, typename S>
155 inline vtkmDataArray<typename viskores::VecTraits<T>::BaseComponentType>* make_vtkmDataArray(
156  const viskores::cont::ArrayHandle<T, S>& ah)
157 {
159  ret->SetVtkmArrayHandle(ah);
160  return ret;
161 }
162 
163 //=============================================================================
164 template <typename TCast, typename TReal, typename S>
166  const viskores::cont::ArrayHandle<TCast, viskores::cont::StorageTagCast<TReal, S>>& ah)
167 {
169  ret->SetVtkmArrayHandle(ah);
170  return ret;
171 }
172 
173 //=============================================================================
174 #ifndef vtkmDataArray_cxx
175 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<char>;
176 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<double>;
177 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<float>;
178 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<int>;
179 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<long>;
180 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<long long>;
181 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<short>;
182 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<signed char>;
183 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<unsigned char>;
184 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<unsigned int>;
185 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<unsigned long>;
186 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<unsigned long long>;
187 extern template class VTKACCELERATORSVTKMCORE_TEMPLATE_EXPORT vtkmDataArray<unsigned short>;
188 #endif // vtkmDataArray_cxx
189 
190 VTK_ABI_NAMESPACE_END
191 #endif // vtkmDataArray_h
192 
193 #include "vtkmlib/vtkmDataArray.hxx"
194 
195 // VTK-HeaderTest-Exclude: vtkmDataArray.h
bool ReallocateTuples(vtkIdType numberOfTuples)
void SetTypedTuple(vtkIdType tupleIdx, const ValueType *tuple)
abstract base class for most VTK objects
Definition: vtkObject.h:52
void SetVtkmArrayHandle(const viskores::cont::UnknownArrayHandle &ah)
Set the Viskores ArrayHandle to be wrapped.
Wraps a Viskores ArrayHandle inside a sub-class of vtkGenericDataArray.
Definition: vtkmDataArray.h:63
bool ComputeFiniteVectorRange(double range[2], const unsigned char *ghosts, unsigned char ghostsToSkip=0xff) override
Returns true if the range was computed.
int vtkIdType
Definition: vtkType.h:363
Base interface for all typed vtkDataArray subclasses.
void SetTypedComponent(vtkIdType tupleIdx, int compIdx, ValueType value)
void * GetVoidPointer(vtkIdType valueIdx) override
vtkmDataArray< typename viskores::VecTraits< T >::BaseComponentType > * make_vtkmDataArray(const viskores::cont::ArrayHandle< T, S > &ah)
static vtkmDataArray * New()
vtkArrayDownCast_TemplateFastCastMacro(vtkmDataArray)
void SetValue(vtkIdType valueIdx, ValueType value)
void * WriteVoidPointer(vtkIdType valueIdx, vtkIdType numValues) override
T * GetPointer(vtkIdType valueIdx)
void * GetDeviceVoidPointer(vtkIdType valueIdx) override
bool ComputeVectorRange(double range[2], const unsigned char *ghosts, unsigned char ghostsToSkip=0xff) override
Returns true if the range was computed.
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:44
void GetTypedTuple(vtkIdType tupleIdx, ValueType *tuple) const
ValueType GetValue(vtkIdType valueIdx) const
Support methods for vtkGenericDataArray.
bool ComputeFiniteScalarRange(double *ranges, const unsigned char *ghosts, unsigned char ghostsToSkip=0xff) override
Computes the range for each component of an array, the length of ranges must be two times the number ...
bool AllocateTuples(vtkIdType numberOfTuples)
concept methods for vtkGenericDataArray
bool ComputeScalarRange(double *ranges, const unsigned char *ghosts, unsigned char ghostsToSkip=0xff) override
Computes the range for each component of an array, the length of ranges must be two times the number ...
viskores::cont::UnknownArrayHandle GetVtkmUnknownArrayHandle() const
Get the underlying ArrayHandle.
vtkDataArray::MemorySpace GetMemorySpace() override
ValueType GetTypedComponent(vtkIdType tupleIdx, int compIdx) const
std::integral_constant< int, vtkArrayTypes::VTK_ABSTRACT_ARRAY > ArrayTypeTag
T * WritePointer(vtkIdType valueIdx, vtkIdType numValues)
#define VTK_DEPRECATED_IN_9_7_0(reason)
vtkTemplateTypeMacro(SelfType, GenericDataArrayType)