VTK  9.3.1
vtkAOSDataArrayTemplate.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
2 // SPDX-License-Identifier: BSD-3-Clause
22 #ifndef vtkAOSDataArrayTemplate_h
23 #define vtkAOSDataArrayTemplate_h
24 
25 #include "vtkBuffer.h" // For storage buffer.
26 #include "vtkBuild.h" // For VTK_BUILD_SHARED_LIBS
27 #include "vtkCommonCoreModule.h" // For export macro
28 #include "vtkCompiler.h" // for VTK_USE_EXTERN_TEMPLATE
29 #include "vtkGenericDataArray.h"
30 
31 // The export macro below makes no sense, but is necessary for older compilers
32 // when we export instantiations of this class from vtkCommonCore.
33 VTK_ABI_NAMESPACE_BEGIN
34 template <class ValueTypeT>
35 class VTKCOMMONCORE_EXPORT vtkAOSDataArrayTemplate
36  : public vtkGenericDataArray<vtkAOSDataArrayTemplate<ValueTypeT>, ValueTypeT>
37 {
39 
40 public:
42  vtkTemplateTypeMacro(SelfType, GenericDataArrayType);
43  typedef typename Superclass::ValueType ValueType;
44 
46  {
48  VTK_DATA_ARRAY_DELETE = vtkAbstractArray::VTK_DATA_ARRAY_DELETE,
49  VTK_DATA_ARRAY_ALIGNED_FREE = vtkAbstractArray::VTK_DATA_ARRAY_ALIGNED_FREE,
50  VTK_DATA_ARRAY_USER_DEFINED = vtkAbstractArray::VTK_DATA_ARRAY_USER_DEFINED
51  };
52 
53  static vtkAOSDataArrayTemplate* New();
54 
58  ValueType GetValue(vtkIdType valueIdx) const
59  VTK_EXPECTS(0 <= valueIdx && valueIdx < GetNumberOfValues())
60  {
61  return this->Buffer->GetBuffer()[valueIdx];
62  }
63 
67  void SetValue(vtkIdType valueIdx, ValueType value)
68  VTK_EXPECTS(0 <= valueIdx && valueIdx < GetNumberOfValues())
69  {
70  this->Buffer->GetBuffer()[valueIdx] = value;
71  }
72 
74 
77  void GetTypedTuple(vtkIdType tupleIdx, ValueType* tuple) const
78  VTK_EXPECTS(0 <= tupleIdx && tupleIdx < GetNumberOfTuples())
79  {
80  const vtkIdType valueIdx = tupleIdx * this->NumberOfComponents;
81  std::copy(this->Buffer->GetBuffer() + valueIdx,
82  this->Buffer->GetBuffer() + valueIdx + this->NumberOfComponents, tuple);
83  }
85 
87 
90  void SetTypedTuple(vtkIdType tupleIdx, const ValueType* tuple)
91  VTK_EXPECTS(0 <= tupleIdx && tupleIdx < GetNumberOfTuples())
92  {
93  const vtkIdType valueIdx = tupleIdx * this->NumberOfComponents;
94  std::copy(tuple, tuple + this->NumberOfComponents, this->Buffer->GetBuffer() + valueIdx);
95  }
97 
101  ValueType GetTypedComponent(vtkIdType tupleIdx, int comp) const VTK_EXPECTS(0 <= tupleIdx &&
102  tupleIdx < GetNumberOfTuples()) VTK_EXPECTS(0 <= comp && comp < GetNumberOfComponents())
103  {
104  return this->Buffer->GetBuffer()[this->NumberOfComponents * tupleIdx + comp];
105  }
106 
108 
111  void SetTypedComponent(vtkIdType tupleIdx, int comp, ValueType value) VTK_EXPECTS(0 <= tupleIdx &&
112  tupleIdx < GetNumberOfTuples()) VTK_EXPECTS(0 <= comp && comp < GetNumberOfComponents())
113  {
114  const vtkIdType valueIdx = tupleIdx * this->NumberOfComponents + comp;
115  this->SetValue(valueIdx, value);
116  }
118 
120 
123  void FillTypedComponent(int compIdx, ValueType value) override;
125 
127 
130  void FillValue(ValueType value) override;
131  void Fill(double value) override;
133 
135 
140  ValueType* WritePointer(vtkIdType valueIdx, vtkIdType numValues);
141  void* WriteVoidPointer(vtkIdType valueIdx, vtkIdType numValues) override;
143 
145 
152  ValueType* GetPointer(vtkIdType valueIdx);
153  void* GetVoidPointer(vtkIdType valueIdx) override;
155 
157 
171  void SetArray(VTK_ZEROCOPY ValueType* array, vtkIdType size, int save, int deleteMethod);
172  void SetArray(VTK_ZEROCOPY ValueType* array, vtkIdType size, int save);
173  void SetVoidArray(void* array, vtkIdType size, int save) override;
174  void SetVoidArray(void* array, vtkIdType size, int save, int deleteMethod) override;
176 
183  void SetArrayFreeFunction(void (*callback)(void*)) override;
184 
185  // Overridden for optimized implementations:
186  void SetTuple(vtkIdType tupleIdx, const float* tuple) override;
187  void SetTuple(vtkIdType tupleIdx, const double* tuple) override;
188  // MSVC doesn't like 'using' here (error C2487). Just forward instead:
189  // using Superclass::SetTuple;
190  void SetTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx, vtkAbstractArray* source) override
191  {
192  this->Superclass::SetTuple(dstTupleIdx, srcTupleIdx, source);
193  }
194  void InsertTuple(vtkIdType tupleIdx, const float* source) override;
195  void InsertTuple(vtkIdType tupleIdx, const double* source) override;
196  // MSVC doesn't like 'using' here (error C2487). Just forward instead:
197  // using Superclass::InsertTuple;
198  void InsertTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx, vtkAbstractArray* source) override
199  {
200  this->Superclass::InsertTuple(dstTupleIdx, srcTupleIdx, source);
201  }
202  void InsertComponent(vtkIdType tupleIdx, int compIdx, double value) override;
203  vtkIdType InsertNextTuple(const float* tuple) override;
204  vtkIdType InsertNextTuple(const double* tuple) override;
205  // MSVC doesn't like 'using' here (error C2487). Just forward instead:
206  // using Superclass::InsertNextTuple;
208  {
209  return this->Superclass::InsertNextTuple(srcTupleIdx, source);
210  }
211  void GetTuple(vtkIdType tupleIdx, double* tuple) override;
212  double* GetTuple(vtkIdType tupleIdx) override;
213 
225 
230  typedef ValueType* Iterator;
231  Iterator Begin() { return Iterator(this->GetVoidPointer(0)); }
232  Iterator End() { return Iterator(this->GetVoidPointer(this->MaxId + 1)); }
233 
235 
244 
245  int GetArrayType() const override { return vtkAbstractArray::AoSDataArrayTemplate; }
247  bool HasStandardMemoryLayout() const override { return true; }
248  void ShallowCopy(vtkDataArray* other) override;
249 
250  // Reimplemented for efficiency:
251  void InsertTuples(
252  vtkIdType dstStart, vtkIdType n, vtkIdType srcStart, vtkAbstractArray* source) override;
253  // MSVC doesn't like 'using' here (error C2487). Just forward instead:
254  // using Superclass::InsertTuples;
255  void InsertTuples(vtkIdList* dstIds, vtkIdList* srcIds, vtkAbstractArray* source) override
256  {
257  this->Superclass::InsertTuples(dstIds, srcIds, source);
258  }
260  vtkIdType dstStart, vtkIdList* srcIds, vtkAbstractArray* source) override
261  {
262  this->Superclass::InsertTuplesStartingAt(dstStart, srcIds, source);
263  }
264 
265 protected:
267  ~vtkAOSDataArrayTemplate() override;
268 
273  bool AllocateTuples(vtkIdType numTuples);
274 
279  bool ReallocateTuples(vtkIdType numTuples);
280 
282 
283 private:
285  void operator=(const vtkAOSDataArrayTemplate&) = delete;
286 
287  friend class vtkGenericDataArray<vtkAOSDataArrayTemplate<ValueTypeT>, ValueTypeT>;
288 };
289 
290 // Declare vtkArrayDownCast implementations for AoS containers:
292 
293 VTK_ABI_NAMESPACE_END
294 
295 // This macro is used by the subclasses to create dummy
296 // declarations for these functions such that the wrapper
297 // can see them. The wrappers ignore vtkAOSDataArrayTemplate.
298 #define vtkCreateWrappedArrayInterface(T) \
299  int GetDataType() const override; \
300  void GetTypedTuple(vtkIdType i, T* tuple) VTK_EXPECTS(0 <= i && i < GetNumberOfTuples()); \
301  void SetTypedTuple(vtkIdType i, const T* tuple) VTK_EXPECTS(0 <= i && i < GetNumberOfTuples()); \
302  void InsertTypedTuple(vtkIdType i, const T* tuple) VTK_EXPECTS(0 <= i); \
303  vtkIdType InsertNextTypedTuple(const T* tuple); \
304  T GetValue(vtkIdType id) const VTK_EXPECTS(0 <= id && id < GetNumberOfValues()); \
305  void SetValue(vtkIdType id, T value) VTK_EXPECTS(0 <= id && id < GetNumberOfValues()); \
306  bool SetNumberOfValues(vtkIdType number) override; \
307  void InsertValue(vtkIdType id, T f) VTK_EXPECTS(0 <= id); \
308  vtkIdType InsertNextValue(T f); \
309  T* GetValueRange(int comp) VTK_SIZEHINT(2); \
310  T* GetValueRange() VTK_SIZEHINT(2); \
311  T* WritePointer(vtkIdType id, vtkIdType number); \
312  T* GetPointer(vtkIdType id); \
313  void SetArray(VTK_ZEROCOPY T* array, vtkIdType size, int save); \
314  void SetArray(VTK_ZEROCOPY T* array, vtkIdType size, int save, int deleteMethod)
315 
316 #endif // header guard
317 
318 // This portion must be OUTSIDE the include blockers. This is used to tell
319 // libraries other than vtkCommonCore that instantiations of
320 // vtkAOSDataArrayTemplate can be found externally. This prevents each library
321 // from instantiating these on their own.
322 #ifdef VTK_AOS_DATA_ARRAY_TEMPLATE_INSTANTIATING
323 #define VTK_AOS_DATA_ARRAY_TEMPLATE_INSTANTIATE(T) \
324  namespace vtkDataArrayPrivate \
325  { \
326  VTK_ABI_NAMESPACE_BEGIN \
327  VTK_INSTANTIATE_VALUERANGE_ARRAYTYPE(vtkAOSDataArrayTemplate<T>, double); \
328  VTK_ABI_NAMESPACE_END \
329  } \
330  VTK_ABI_NAMESPACE_BEGIN \
331  template class VTKCOMMONCORE_EXPORT vtkAOSDataArrayTemplate<T>; \
332  VTK_ABI_NAMESPACE_END
333 
334 #elif defined(VTK_USE_EXTERN_TEMPLATE)
335 #ifndef VTK_AOS_DATA_ARRAY_TEMPLATE_EXTERN
336 #define VTK_AOS_DATA_ARRAY_TEMPLATE_EXTERN
337 #ifdef _MSC_VER
338 #pragma warning(push)
339 // The following is needed when the vtkAOSDataArrayTemplate is declared
340 // dllexport and is used from another class in vtkCommonCore
341 #pragma warning(disable : 4910) // extern and dllexport incompatible
342 #endif
343 VTK_ABI_NAMESPACE_BEGIN
344 vtkExternTemplateMacro(extern template class VTKCOMMONCORE_EXPORT vtkAOSDataArrayTemplate);
345 VTK_ABI_NAMESPACE_END
346 #ifdef _MSC_VER
347 #pragma warning(pop)
348 #endif
349 #endif // VTK_AOS_DATA_ARRAY_TEMPLATE_EXTERN
350 
351 // The following clause is only for MSVC
352 #elif defined(_MSC_VER) && !defined(VTK_BUILD_SHARED_LIBS)
353 #pragma warning(push)
354 
355 // C4091: 'extern ' : ignored on left of 'int' when no variable is declared
356 #pragma warning(disable : 4091)
357 
358 // Compiler-specific extension warning.
359 #pragma warning(disable : 4231)
360 
361 // We need to disable warning 4910 and do an extern dllexport
362 // anyway. When deriving vtkCharArray and other types from an
363 // instantiation of this template the compiler does an explicit
364 // instantiation of the base class. From outside the vtkCommon
365 // library we block this using an extern dllimport instantiation.
366 // For classes inside vtkCommon we should be able to just do an
367 // extern instantiation, but VS complains about missing
368 // definitions. We cannot do an extern dllimport inside vtkCommon
369 // since the symbols are local to the dll. An extern dllexport
370 // seems to be the only way to convince VS to do the right
371 // thing, so we just disable the warning.
372 #pragma warning(disable : 4910) // extern and dllexport incompatible
373 
374 // Use an "extern explicit instantiation" to give the class a DLL
375 // interface. This is a compiler-specific extension.
376 VTK_ABI_NAMESPACE_BEGIN
377 vtkInstantiateTemplateMacro(extern template class VTKCOMMONCORE_EXPORT vtkAOSDataArrayTemplate);
378 VTK_ABI_NAMESPACE_END
379 
380 #pragma warning(pop)
381 
382 #endif
383 
384 // VTK-HeaderTest-Exclude: vtkAOSDataArrayTemplate.h
void SetValue(vtkIdType valueIdx, ValueType value)
Set the value at valueIdx to value.
void SetTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx, vtkAbstractArray *source) override
See documentation from parent class.
void InsertTuplesStartingAt(vtkIdType dstStart, vtkIdList *srcIds, vtkAbstractArray *source) override
Copy the tuples indexed in srcIds from the source array to the tuple locations starting at index dstS...
int GetArrayType() const override
Method for type-checking in FastDownCast implementations.
virtual void ShallowCopy(vtkDataArray *other)
Create a shallow copy of other into this, if possible.
vtkIdType InsertNextTuple(vtkIdType srcTupleIdx, vtkAbstractArray *source) override
See documentation from parent class.
Abstract superclass for all arrays.
ValueType * GetPointer(vtkIdType valueIdx)
Default implementation raises a runtime error.
void SetTypedComponent(vtkIdType tupleIdx, int comp, ValueType value)
Set component comp of the tuple at tupleIdx to value.
void SetArrayFreeFunction(void(*callback)(void *)) override
Default implementation raises a runtime error.
ValueType GetValue(vtkIdType valueIdx) const
Get the value at valueIdx.
int vtkIdType
Definition: vtkType.h:315
Base interface for all typed vtkDataArray subclasses.
void SetVoidArray(void *, vtkIdType, int) override
Default implementation raises a runtime error.
bool HasStandardMemoryLayout() const override
Returns true if this array uses the standard memory layout defined in the VTK user guide...
vtkAOSDataArrayTemplate< ValueTypeT > SelfType
vtkIdType GetNumberOfValues() const
Get the total number of values in the array.
virtual void Fill(double value)
Fill all values of a data array with a specified value.
void InsertTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx, vtkAbstractArray *source) override
See documentation from parent class.
vtkInstantiateTemplateMacro(extern template class VTKCOMMONCORE_EXPORT vtkArrayIteratorTemplate)
double * GetTuple(vtkIdType tupleIdx) override
Get the data tuple at tupleIdx.
Array-Of-Structs implementation of vtkGenericDataArray.
list of point or cell ids
Definition: vtkIdList.h:22
bool AllocateTuples(vtkIdType numTuples)
Allocate space for numTuples.
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:44
void SetValue(vtkIdType valueIdx, ValueType value)
Set the value at valueIdx to value.
void GetTypedTuple(vtkIdType tupleIdx, ValueType *tuple) const
Copy the tuple at tupleIdx into tuple.
void InsertTuples(vtkIdList *dstIds, vtkIdList *srcIds, vtkAbstractArray *source) override
See documentation from parent class.
vtkTemplateTypeMacro(SelfType, vtkDataArray)
virtual void FillValue(ValueType value)
Set all the values in array to value.
void * WriteVoidPointer(vtkIdType valueIdx, vtkIdType numValues) override
Default implementation raises a runtime error.
ValueType * WritePointer(vtkIdType valueIdx, vtkIdType numValues)
Default implementation raises a runtime error.
void save(Archiver &ar, const std::string &str, const unsigned int vtkNotUsed(version))
Abstract superclass to iterate over elements in an vtkAbstractArray.
vtkIdType GetNumberOfTuples() const
Get the number of complete tuples (a component group) in the array.
vtkArrayIterator * NewIterator() override
Subclasses must override this method and provide the right kind of templated vtkArrayIteratorTemplate...
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
void DataChanged() override
Tell the array explicitly that the data has changed.
#define VTK_NEWINSTANCE
void * GetVoidPointer(vtkIdType valueIdx) override
Default implementation raises a runtime error.
ValueType GetTypedComponent(vtkIdType tupleIdx, int comp) const
Get component comp of the tuple at tupleIdx.
static vtkDataArray * FastDownCast(vtkAbstractArray *source)
Perform a fast, safe cast from a vtkAbstractArray to a vtkDataArray.
Definition: vtkDataArray.h:685
void DataElementChanged(vtkIdType)
Tell the array explicitly that a single data element has changed.
#define VTK_ZEROCOPY
vtkArrayDownCast_TemplateFastCastMacro(vtkAOSDataArrayTemplate)
virtual void FillTypedComponent(int compIdx, ValueType value)
Set component comp of all tuples to value.
void SetTypedTuple(vtkIdType tupleIdx, const ValueType *tuple)
Set this array's tuple at tupleIdx to the values in tuple.
Superclass::ValueType ValueType
void InsertComponent(vtkIdType tupleIdx, int compIdx, double value) override
Insert value at the location specified by tupleIdx and compIdx.
ValueType * Iterator
Legacy support for array-of-structs value iteration.
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on...
bool ReallocateTuples(vtkIdType numTuples)
Allocate space for numTuples.
vtkIdType InsertNextTuple(vtkIdType srcTupleIdx, vtkAbstractArray *source) override
Insert the tuple from srcTupleIdx in the source array at the end of this array.
void SetTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx, vtkAbstractArray *source) override
Set the tuple at dstTupleIdx in this array to the tuple at srcTupleIdx in the source array...
#define VTK_EXPECTS(x)
void InsertTuples(vtkIdList *dstIds, vtkIdList *srcIds, vtkAbstractArray *source) override
Copy the tuples indexed in srcIds from the source array to the tuple locations indexed by dstIds in t...
void InsertTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx, vtkAbstractArray *source) override
Insert the tuple at srcTupleIdx in the source array into this array at dstTupleIdx.
vtkExternTemplateMacro(extern template class VTKCOMMONCORE_EXPORT vtkAOSDataArrayTemplate)
vtkBuffer< ValueType > * Buffer