VTK
vtkAOSDataArrayTemplate.h
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: Visualization Toolkit
4  Module: vtkAOSDataArrayTemplate.h
5 
6  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7  All rights reserved.
8  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
9 
10  This software is distributed WITHOUT ANY WARRANTY; without even
11  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12  PURPOSE. See the above copyright notice for more information.
13 
14 =========================================================================*/
34 #ifndef vtkAOSDataArrayTemplate_h
35 #define vtkAOSDataArrayTemplate_h
36 
37 #include "vtkCommonCoreModule.h" // For export macro
38 #include "vtkGenericDataArray.h"
39 #include "vtkBuffer.h" // For storage buffer.
40 
41 // The export macro below makes no sense, but is necessary for older compilers
42 // when we export instantiations of this class from vtkCommonCore.
43 template <class ValueTypeT>
44 class VTKCOMMONCORE_EXPORT vtkAOSDataArrayTemplate :
45  public vtkGenericDataArray<vtkAOSDataArrayTemplate<ValueTypeT>, ValueTypeT>
46 {
49 public:
51  vtkTemplateTypeMacro(SelfType, GenericDataArrayType)
52  typedef typename Superclass::ValueType ValueType;
53 
55  {
58  VTK_DATA_ARRAY_ALIGNED_FREE=vtkAbstractArray::VTK_DATA_ARRAY_ALIGNED_FREE,
60  };
61 
62  static vtkAOSDataArrayTemplate* New();
63 
67  ValueType GetValue(vtkIdType valueIdx) const
68  VTK_EXPECTS(0 <= valueIdx && valueIdx < GetNumberOfValues())
69  {
70  return this->Buffer->GetBuffer()[valueIdx];
71  }
72 
77  VTK_EXPECTS(0 <= valueIdx && valueIdx < GetNumberOfValues())
78  {
79  this->Buffer->GetBuffer()[valueIdx] = value;
80  }
81 
83 
86  void GetTypedTuple(vtkIdType tupleIdx, ValueType* tuple) const
87  VTK_EXPECTS(0 <= tupleIdx && tupleIdx < GetNumberOfTuples())
88  {
89  const vtkIdType valueIdx = tupleIdx * this->NumberOfComponents;
90  std::copy(this->Buffer->GetBuffer() + valueIdx,
91  this->Buffer->GetBuffer() + valueIdx + this->NumberOfComponents,
92  tuple);
93  }
95 
97 
100  void SetTypedTuple(vtkIdType tupleIdx, const ValueType* tuple)
101  VTK_EXPECTS(0 <= tupleIdx && tupleIdx < GetNumberOfTuples())
102  {
103  const vtkIdType valueIdx = tupleIdx * this->NumberOfComponents;
104  std::copy(tuple, tuple + this->NumberOfComponents,
105  this->Buffer->GetBuffer() + valueIdx);
106  }
108 
112  ValueType GetTypedComponent(vtkIdType tupleIdx, int comp) const
113  VTK_EXPECTS(0 <= tupleIdx && tupleIdx < GetNumberOfTuples())
114  VTK_EXPECTS(0 <= comp && comp < GetNumberOfComponents())
115  {
116  return this->Buffer->GetBuffer()[this->NumberOfComponents*tupleIdx + comp];
117  }
118 
120 
123  void SetTypedComponent(vtkIdType tupleIdx, int comp, ValueType value)
124  VTK_EXPECTS(0 <= tupleIdx && tupleIdx < GetNumberOfTuples())
125  VTK_EXPECTS(0 <= comp && comp < GetNumberOfComponents())
126  {
127  const vtkIdType valueIdx = tupleIdx * this->NumberOfComponents + comp;
128  this->SetValue(valueIdx, value);
129  }
131 
133 
136  void FillTypedComponent(int compIdx, ValueType value) override;
138 
140 
143  void FillValue(ValueType value) override;
144  void Fill(double value) override;
146 
148 
153  ValueType* WritePointer(vtkIdType valueIdx, vtkIdType numValues);
154  void* WriteVoidPointer(vtkIdType valueIdx, vtkIdType numValues) override;
156 
158 
165  ValueType* GetPointer(vtkIdType valueIdx);
166  void* GetVoidPointer(vtkIdType valueIdx) override;
168 
170 
184  void SetArray(VTK_ZEROCOPY ValueType* array, vtkIdType size, int save,
185  int deleteMethod);
186  void SetArray(VTK_ZEROCOPY ValueType* array, vtkIdType size, int save);
187  void SetVoidArray(void* array, vtkIdType size, int save) override;
188  void SetVoidArray(void* array, vtkIdType size, int save,
189  int deleteMethod) override;
191 
198  void SetArrayFreeFunction(void (*callback)(void *)) override;
199 
200  // Overridden for optimized implementations:
201  void SetTuple(vtkIdType tupleIdx, const float *tuple) override;
202  void SetTuple(vtkIdType tupleIdx, const double *tuple) override;
203  // MSVC doesn't like 'using' here (error C2487). Just forward instead:
204  // using Superclass::SetTuple;
205  void SetTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx,
206  vtkAbstractArray *source) override
207  { this->Superclass::SetTuple(dstTupleIdx, srcTupleIdx, source); }
208  void InsertTuple(vtkIdType tupleIdx, const float *source) override;
209  void InsertTuple(vtkIdType tupleIdx, const double *source) override;
210  // MSVC doesn't like 'using' here (error C2487). Just forward instead:
211  // using Superclass::InsertTuple;
212  void InsertTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx,
213  vtkAbstractArray *source) override
214  { this->Superclass::InsertTuple(dstTupleIdx, srcTupleIdx, source); }
215  void InsertComponent(vtkIdType tupleIdx, int compIdx,
216  double value) override;
217  vtkIdType InsertNextTuple(const float *tuple) override;
218  vtkIdType InsertNextTuple(const double *tuple) override;
219  // MSVC doesn't like 'using' here (error C2487). Just forward instead:
220  // using Superclass::InsertNextTuple;
222  vtkAbstractArray *source) override
223  { return this->Superclass::InsertNextTuple(srcTupleIdx, source); }
224  void GetTuple(vtkIdType tupleIdx, double * tuple) override;
225  double *GetTuple(vtkIdType tupleIdx) override;
226 
238 
243  typedef ValueType* Iterator;
244  Iterator Begin() { return Iterator(this->GetVoidPointer(0)); }
245  Iterator End() { return Iterator(this->GetVoidPointer(this->MaxId + 1)); }
246 
248 
257  {
258  if (source)
259  {
260  switch (source->GetArrayType())
261  {
263  if (vtkDataTypesCompare(source->GetDataType(),
265  {
266  return static_cast<vtkAOSDataArrayTemplate<ValueType>*>(source);
267  }
268  break;
269  }
270  }
271  return nullptr;
272  }
274 
277  bool HasStandardMemoryLayout() override { return true; }
278  void ShallowCopy(vtkDataArray *other) override;
279 
280  // Reimplemented for efficiency:
281  void InsertTuples(vtkIdType dstStart, vtkIdType n, vtkIdType srcStart,
282  vtkAbstractArray* source) override;
283  // MSVC doesn't like 'using' here (error C2487). Just forward instead:
284  // using Superclass::InsertTuples;
285  void InsertTuples(vtkIdList *dstIds, vtkIdList *srcIds,
286  vtkAbstractArray *source) override
287  { this->Superclass::InsertTuples(dstIds, srcIds, source); }
288 
289 protected:
291  ~vtkAOSDataArrayTemplate() override;
292 
297  bool AllocateTuples(vtkIdType numTuples);
298 
303  bool ReallocateTuples(vtkIdType numTuples);
304 
306 
307 private:
309  void operator=(const vtkAOSDataArrayTemplate&) = delete;
310 
311  friend class vtkGenericDataArray<vtkAOSDataArrayTemplate<ValueTypeT>,
312  ValueTypeT>;
313 
314 };
315 
316 // Declare vtkArrayDownCast implementations for AoS containers:
318 
319 // This macro is used by the subclasses to create dummy
320 // declarations for these functions such that the wrapper
321 // can see them. The wrappers ignore vtkAOSDataArrayTemplate.
322 #define vtkCreateWrappedArrayInterface(T) \
323  int GetDataType() override;\
324  void GetTypedTuple(vtkIdType i, T* tuple) \
325  VTK_EXPECTS(0 <= i && i < GetNumberOfTuples()); \
326  void SetTypedTuple(vtkIdType i, const T* tuple) \
327  VTK_EXPECTS(0 <= i && i < GetNumberOfTuples()); \
328  void InsertTypedTuple(vtkIdType i, const T* tuple) \
329  VTK_EXPECTS(0 <= i); \
330  vtkIdType InsertNextTypedTuple(const T* tuple); \
331  T GetValue(vtkIdType id) \
332  VTK_EXPECTS(0 <= id && id < GetNumberOfValues()); \
333  void SetValue(vtkIdType id, T value) \
334  VTK_EXPECTS(0 <= id && id < GetNumberOfValues()); \
335  void SetNumberOfValues(vtkIdType number) override;\
336  void InsertValue(vtkIdType id, T f) \
337  VTK_EXPECTS(0 <= id); \
338  vtkIdType InsertNextValue(T f); \
339  T *GetValueRange(int comp) VTK_SIZEHINT(2); \
340  T *GetValueRange() VTK_SIZEHINT(2); \
341  T* WritePointer(vtkIdType id, vtkIdType number); \
342  T* GetPointer(vtkIdType id); \
343  void SetArray(VTK_ZEROCOPY T* array, vtkIdType size, int save); \
344  void SetArray(VTK_ZEROCOPY T* array, vtkIdType size, int save, int deleteMethod)
345 
346 #endif // header guard
347 
348 // This portion must be OUTSIDE the include blockers. This is used to tell
349 // libraries other than vtkCommonCore that instantiations of
350 // vtkAOSDataArrayTemplate can be found externally. This prevents each library
351 // from instantiating these on their own.
352 #ifdef VTK_AOS_DATA_ARRAY_TEMPLATE_INSTANTIATING
353 #define VTK_AOS_DATA_ARRAY_TEMPLATE_INSTANTIATE(T) \
354  template class VTKCOMMONCORE_EXPORT vtkAOSDataArrayTemplate< T >
355 #elif defined(VTK_USE_EXTERN_TEMPLATE)
356 #ifndef VTK_AOS_DATA_ARRAY_TEMPLATE_EXTERN
357 #define VTK_AOS_DATA_ARRAY_TEMPLATE_EXTERN
358 #ifdef _MSC_VER
359 #pragma warning (push)
360 // The following is needed when the vtkAOSDataArrayTemplate is declared
361 // dllexport and is used from another class in vtkCommonCore
362 #pragma warning (disable: 4910) // extern and dllexport incompatible
363 #endif
365  extern template class VTKCOMMONCORE_EXPORT vtkAOSDataArrayTemplate)
366 #ifdef _MSC_VER
367 #pragma warning (pop)
368 #endif
369 #endif // VTK_AOS_DATA_ARRAY_TEMPLATE_EXTERN
370 
371 // The following clause is only for MSVC
372 #elif defined(_MSC_VER) && !defined(VTK_BUILD_SHARED_LIBS)
373 #pragma warning (push)
374 
375 // C4091: 'extern ' : ignored on left of 'int' when no variable is declared
376 #pragma warning (disable: 4091)
377 
378 // Compiler-specific extension warning.
379 #pragma warning (disable: 4231)
380 
381 // We need to disable warning 4910 and do an extern dllexport
382 // anyway. When deriving vtkCharArray and other types from an
383 // instantiation of this template the compiler does an explicit
384 // instantiation of the base class. From outside the vtkCommon
385 // library we block this using an extern dllimport instantiation.
386 // For classes inside vtkCommon we should be able to just do an
387 // extern instantiation, but VS complains about missing
388 // definitions. We cannot do an extern dllimport inside vtkCommon
389 // since the symbols are local to the dll. An extern dllexport
390 // seems to be the only way to convince VS to do the right
391 // thing, so we just disable the warning.
392 #pragma warning (disable: 4910) // extern and dllexport incompatible
393 
394 // Use an "extern explicit instantiation" to give the class a DLL
395 // interface. This is a compiler-specific extension.
397  extern template class VTKCOMMONCORE_EXPORT vtkAOSDataArrayTemplate)
398 
399 #pragma warning (pop)
400 
401 #endif
402 
403 // 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
Set the tuple at dstTupleIdx in this array to the tuple at srcTupleIdx in the source array...
abstract base class for most VTK objects
Definition: vtkObject.h:59
virtual void ShallowCopy(vtkDataArray *other)
Create a shallow copy of other into this, if possible.
vtkIdType GetNumberOfTuples()
Get the number of complete tuples (a component group) in the array.
vtkIdType InsertNextTuple(vtkIdType srcTupleIdx, vtkAbstractArray *source) override
Insert the tuple from srcTupleIdx in the source array at the end of this array.
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.
vtkTemplateTypeMacro(SelfType, vtkDataArray) enum
Compile time access to the VTK type identifier.
void SetArrayFreeFunction(void(*callback)(void *)) override
Default implementation raises a runtime error.
ValueType GetValue(vtkIdType valueIdx) const
Get the value at valueIdx.
virtual int GetDataType()=0
Return the underlying data type.
virtual int GetArrayType()
Method for type-checking in FastDownCast implementations.
int vtkIdType
Definition: vtkType.h:347
Base interface for all typed vtkDataArray subclasses.
void SetVoidArray(void *, vtkIdType, int) override
Default implementation raises a runtime error.
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
Insert the tuple at srcTupleIdx in the source array into this array at dstTupleIdx.
double * GetTuple(vtkIdType tupleIdx) override
Get the data tuple at tupleIdx.
#define vtkExternTemplateMacro(decl)
A macro to declare extern templates for all numerical types.
Definition: vtkType.h:415
Array-Of-Structs implementation of vtkGenericDataArray.
list of point or cell ids
Definition: vtkIdList.h:36
bool AllocateTuples(vtkIdType numTuples)
Allocate space for numTuples.
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:54
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
Copy the tuples indexed in srcIds from the source array to the tuple locations indexed by dstIds in t...
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.
Abstract superclass to iterate over elements in an vtkAbstractArray.
bool HasStandardMemoryLayout() override
Returns true if this array uses the standard memory layout defined in the VTK user guide...
vtkArrayIterator * NewIterator() override
Subclasses must override this method and provide the right kind of templated vtkArrayIteratorTemplate...
void DataChanged() override
Tell the array explicitly that the data has changed.
#define VTK_NEWINSTANCE
#define vtkInstantiateTemplateMacro(decl)
A macro to instantiate a template over all numerical types.
Definition: vtkType.h:395
void * GetVoidPointer(vtkIdType valueIdx) override
Default implementation raises a runtime error.
int GetArrayType() override
Method for type-checking in FastDownCast implementations.
ValueType GetTypedComponent(vtkIdType tupleIdx, int comp) const
Get component comp of the tuple at tupleIdx.
void save(Archiver &ar, const vtkUnicodeString &str, const unsigned int vtkNotUsed(version))
vtkArrayDownCast_TemplateFastCastMacro(vtkTypedDataArray) template< class Scalar > inline typename vtkTypedDataArray< Scalar >
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
void DataElementChanged(vtkIdType)
Tell the array explicitly that a single data element has changed.
#define VTK_ZEROCOPY
virtual void FillTypedComponent(int compIdx, ValueType value)
Set component comp of all tuples to value.
static vtkAOSDataArrayTemplate< ValueType > * FastDownCast(vtkAbstractArray *source)
Perform a fast, safe cast from a vtkAbstractArray to a vtkAOSDataArrayTemplate.
void SetTypedTuple(vtkIdType tupleIdx, const ValueType *tuple)
Set this array&#39;s tuple at tupleIdx to the values in tuple.
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.
Template defining traits of native types used by VTK.
Definition: vtkTypeTraits.h:32
vtkBuffer< ValueType > * Buffer