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:
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
vtkAOSDataArrayTemplate::InsertTuple
void InsertTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx, vtkAbstractArray *source) override
Insert the tuple at srcTupleIdx in the source array into this array at dstTupleIdx.
Definition: vtkAOSDataArrayTemplate.h:212
vtkAOSDataArrayTemplate::InsertNextTuple
vtkIdType InsertNextTuple(vtkIdType srcTupleIdx, vtkAbstractArray *source) override
Insert the tuple from srcTupleIdx in the source array at the end of this array.
Definition: vtkAOSDataArrayTemplate.h:221
vtkAbstractArray::DeleteMethod
DeleteMethod
Definition: vtkAbstractArray.h:333
VTK_ZEROCOPY
#define VTK_ZEROCOPY
Definition: vtkWrappingHints.h:40
vtkGenericDataArray::ValueType
ValueTypeT ValueType
Definition: vtkGenericDataArray.h:84
vtkAbstractArray::VTK_DATA_ARRAY_ALIGNED_FREE
Definition: vtkAbstractArray.h:337
vtkGenericDataArray::SetValue
void SetValue(vtkIdType valueIdx, ValueType value)
Set the value at valueIdx to value.
Definition: vtkGenericDataArray.h:116
vtkTypeTraits
Template defining traits of native types used by VTK.
Definition: vtkTypeTraits.h:32
VTK_EXPECTS
#define VTK_EXPECTS(x)
Definition: vtkWrappingHints.h:41
vtkAOSDataArrayTemplate::Begin
Iterator Begin()
Definition: vtkAOSDataArrayTemplate.h:244
vtkX3D::value
Definition: vtkX3D.h:220
vtkAbstractArray::VTK_DATA_ARRAY_DELETE
Definition: vtkAbstractArray.h:336
vtkIdType
int vtkIdType
Definition: vtkType.h:347
vtkGenericDataArray::GetVoidPointer
void * GetVoidPointer(vtkIdType valueIdx) override
Default implementation raises a runtime error.
vtkGenericDataArray::InsertTuple
void InsertTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx, vtkAbstractArray *source) override
Insert the tuple at srcTupleIdx in the source array into this array at dstTupleIdx.
vtkGenericDataArray::SetVoidArray
void SetVoidArray(void *, vtkIdType, int) override
vtkObject::New
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on.
vtkAOSDataArrayTemplate::SelfType
vtkAOSDataArrayTemplate< ValueTypeT > SelfType
Definition: vtkAOSDataArrayTemplate.h:50
save
void save(Archiver &ar, const vtkUnicodeString &str, const unsigned int vtkNotUsed(version))
Definition: vtkVariantBoostSerialization.h:65
vtkAbstractArray::VTK_DATA_ARRAY_FREE
Definition: vtkAbstractArray.h:335
vtkGenericDataArray::InsertNextTuple
vtkIdType InsertNextTuple(vtkIdType srcTupleIdx, vtkAbstractArray *source) override
Insert the tuple from srcTupleIdx in the source array at the end of this array.
vtkGenericDataArray
Base interface for all typed vtkDataArray subclasses.
Definition: vtkGenericDataArray.h:80
vtkDataArray
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:54
vtkGenericDataArray::SetTuple
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.
vtkAOSDataArrayTemplate::SetTypedComponent
void SetTypedComponent(vtkIdType tupleIdx, int comp, ValueType value)
Set component comp of the tuple at tupleIdx to value.
Definition: vtkAOSDataArrayTemplate.h:123
vtkGenericDataArray::GetTuple
double * GetTuple(vtkIdType tupleIdx) override
Get the data tuple at tupleIdx.
vtkGenericDataArray::SetArrayFreeFunction
void SetArrayFreeFunction(void(*callback)(void *)) override
This method allows the user to specify a custom free function to be called when the array is dealloca...
vtkGenericDataArray::DataChanged
void DataChanged() override
Tell the array explicitly that the data has changed.
vtkAOSDataArrayTemplate::GetTypedTuple
void GetTypedTuple(vtkIdType tupleIdx, ValueType *tuple) const
Copy the tuple at tupleIdx into tuple.
Definition: vtkAOSDataArrayTemplate.h:86
source
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
Definition: vtkBoostGraphAdapter.h:825
vtkAbstractArray::GetNumberOfTuples
vtkIdType GetNumberOfTuples()
Get the number of complete tuples (a component group) in the array.
Definition: vtkAbstractArray.h:174
vtkBuffer< ValueType >
vtkGenericDataArray::FillTypedComponent
virtual void FillTypedComponent(int compIdx, ValueType value)
Set component comp of all tuples to value.
vtkAbstractArray::AoSDataArrayTemplate
Definition: vtkAbstractArray.h:645
vtkGenericDataArray::InsertTuples
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...
vtkAbstractArray::GetNumberOfValues
vtkIdType GetNumberOfValues() const
Get the total number of values in the array.
Definition: vtkAbstractArray.h:183
vtkAOSDataArrayTemplate::HasStandardMemoryLayout
bool HasStandardMemoryLayout() override
Returns true if this array uses the standard memory layout defined in the VTK user guide,...
Definition: vtkAOSDataArrayTemplate.h:277
vtkBuffer.h
vtkGenericDataArray::AllocateTuples
bool AllocateTuples(vtkIdType numTuples)
Allocate space for numTuples.
Definition: vtkGenericDataArray.h:326
vtkAOSDataArrayTemplate::GetValue
ValueType GetValue(vtkIdType valueIdx) const
Get the value at valueIdx.
Definition: vtkAOSDataArrayTemplate.h:67
vtkExternTemplateMacro
#define vtkExternTemplateMacro(decl)
A macro to declare extern templates for all numerical types.
Definition: vtkType.h:415
vtkAbstractArray::VTK_DATA_ARRAY_USER_DEFINED
Definition: vtkAbstractArray.h:338
vtkGenericDataArray::vtkTemplateTypeMacro
vtkTemplateTypeMacro(SelfType, vtkDataArray) enum
Compile time access to the VTK type identifier.
Definition: vtkGenericDataArray.h:85
vtkGenericDataArray.h
vtkIdList
list of point or cell ids
Definition: vtkIdList.h:36
vtkX3D::size
Definition: vtkX3D.h:253
vtkAOSDataArrayTemplate::End
Iterator End()
Definition: vtkAOSDataArrayTemplate.h:245
vtkAOSDataArrayTemplate::DataElementChanged
void DataElementChanged(vtkIdType)
Tell the array explicitly that a single data element has changed.
Definition: vtkAOSDataArrayTemplate.h:237
vtkDataArray::Fill
virtual void Fill(double value)
Fill all values of a data array with a specified value.
vtkAOSDataArrayTemplate::SetValue
void SetValue(vtkIdType valueIdx, ValueType value)
Set the value at valueIdx to value.
Definition: vtkAOSDataArrayTemplate.h:76
vtkDataArray::ShallowCopy
virtual void ShallowCopy(vtkDataArray *other)
Create a shallow copy of other into this, if possible.
vtkGenericDataArray::FillValue
virtual void FillValue(ValueType value)
Set all the values in array to value.
vtkAOSDataArrayTemplate::GetArrayType
int GetArrayType() override
Method for type-checking in FastDownCast implementations.
Definition: vtkAOSDataArrayTemplate.h:275
vtkAbstractArray
Abstract superclass for all arrays.
Definition: vtkAbstractArray.h:78
vtkInstantiateTemplateMacro
#define vtkInstantiateTemplateMacro(decl)
A macro to instantiate a template over all numerical types.
Definition: vtkType.h:395
vtkGenericDataArray::NewIterator
vtkArrayIterator * NewIterator() override
Subclasses must override this method and provide the right kind of templated vtkArrayIteratorTemplate...
vtkGenericDataArray::InsertComponent
void InsertComponent(vtkIdType tupleIdx, int compIdx, double value) override
Insert value at the location specified by tupleIdx and compIdx.
vtkAOSDataArrayTemplate::GetTypedComponent
ValueType GetTypedComponent(vtkIdType tupleIdx, int comp) const
Get component comp of the tuple at tupleIdx.
Definition: vtkAOSDataArrayTemplate.h:112
vtkGenericDataArray::WritePointer
ValueType * WritePointer(vtkIdType valueIdx, vtkIdType numValues)
vtkArrayIterator
Abstract superclass to iterate over elements in an vtkAbstractArray.
Definition: vtkArrayIterator.h:52
vtkArrayDownCast_TemplateFastCastMacro
vtkArrayDownCast_TemplateFastCastMacro(vtkTypedDataArray) template< class Scalar > inline typename vtkTypedDataArray< Scalar >
Definition: vtkTypedDataArray.h:191
vtkAOSDataArrayTemplate::InsertTuples
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...
Definition: vtkAOSDataArrayTemplate.h:285
vtkGenericDataArray::GetPointer
ValueType * GetPointer(vtkIdType valueIdx)
vtkAOSDataArrayTemplate::Buffer
vtkBuffer< ValueType > * Buffer
Definition: vtkAOSDataArrayTemplate.h:305
vtkAOSDataArrayTemplate::FastDownCast
static vtkAOSDataArrayTemplate< ValueType > * FastDownCast(vtkAbstractArray *source)
Perform a fast, safe cast from a vtkAbstractArray to a vtkAOSDataArrayTemplate.
Definition: vtkAOSDataArrayTemplate.h:256
vtkAOSDataArrayTemplate
Array-Of-Structs implementation of vtkGenericDataArray.
Definition: vtkAOSDataArrayTemplate.h:44
vtkGenericDataArray::WriteVoidPointer
void * WriteVoidPointer(vtkIdType valueIdx, vtkIdType numValues) override
Get the address of a particular data index.
VTK_NEWINSTANCE
#define VTK_NEWINSTANCE
Definition: vtkWrappingHints.h:39
vtkAOSDataArrayTemplate::SetTypedTuple
void SetTypedTuple(vtkIdType tupleIdx, const ValueType *tuple)
Set this array's tuple at tupleIdx to the values in tuple.
Definition: vtkAOSDataArrayTemplate.h:100
vtkAOSDataArrayTemplate::Iterator
ValueType * Iterator
Legacy support for array-of-structs value iteration.
Definition: vtkAOSDataArrayTemplate.h:243
vtkGenericDataArray::ReallocateTuples
bool ReallocateTuples(vtkIdType numTuples)
Allocate space for numTuples.
Definition: vtkGenericDataArray.h:336
vtkAOSDataArrayTemplate::SetTuple
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.
Definition: vtkAOSDataArrayTemplate.h:205
vtkAbstractArray::NumberOfComponents
int NumberOfComponents
Definition: vtkAbstractArray.h:689