VTK  9.7.1
vtkDataArrayAccessor.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
3 
85 #include "vtkDataArray.h"
86 #include "vtkGenericDataArray.h"
87 
88 #ifndef vtkDataArrayAccessor_h
89 #define vtkDataArrayAccessor_h
90 
91 // Generic form for all (non-bit) vtkDataArray subclasses.
92 VTK_ABI_NAMESPACE_BEGIN
93 template <typename ArrayT>
95 {
96  typedef ArrayT ArrayType;
97  typedef typename ArrayType::ValueType APIType;
98 
99  ArrayType* Array;
100 
101  vtkDataArrayAccessor(ArrayType* array)
102  : Array(array)
103  {
104  }
105 
106  VTK_ALWAYS_INLINE
107  APIType Get(vtkIdType tupleIdx, int compIdx) const
108  {
109  return this->Array->GetTypedComponent(tupleIdx, compIdx);
110  }
111 
112  VTK_ALWAYS_INLINE
113  APIType Get(vtkIdType valueIdx) const { return this->Array->GetValue(valueIdx); }
114 
115  VTK_ALWAYS_INLINE
116  void Set(vtkIdType tupleIdx, int compIdx, APIType val) const
117  {
118  this->Array->SetTypedComponent(tupleIdx, compIdx, val);
119  }
120 
121  VTK_ALWAYS_INLINE
122  void Set(vtkIdType valueIdx, APIType val) const { this->Array->SetValue(valueIdx, val); }
123 
124  VTK_ALWAYS_INLINE
125  void Insert(vtkIdType tupleIdx, int compIdx, APIType val) const
126  {
127  this->Array->InsertTypedComponent(tupleIdx, compIdx, val);
128  }
129 
130  VTK_ALWAYS_INLINE
131  void Insert(vtkIdType valueIdx, APIType val) const { this->Array->InsertValue(valueIdx, val); }
132 
133  VTK_ALWAYS_INLINE
134  void InsertNext(APIType val) const { this->Array->InsertNextValue(val); }
135 
136  VTK_ALWAYS_INLINE
137  void InsertNext(APIType* tuple) const { this->Array->InsertNextTypedTuple(tuple); }
138 
139  VTK_ALWAYS_INLINE
140  void Get(vtkIdType tupleIdx, APIType* tuple) const
141  {
142  this->Array->GetTypedTuple(tupleIdx, tuple);
143  }
144 
145  VTK_ALWAYS_INLINE
146  void Set(vtkIdType tupleIdx, const APIType* tuple) const
147  {
148  this->Array->SetTypedTuple(tupleIdx, tuple);
149  }
150 
151  VTK_ALWAYS_INLINE
152  void Insert(vtkIdType tupleIdx, const APIType* tuple) const
153  {
154  this->Array->InsertTypedTuple(tupleIdx, tuple);
155  }
156 };
157 
158 // Specialization for vtkDataArray.
159 template <>
161 {
163  typedef double APIType;
164 
165  ArrayType* Array;
166 
167  vtkDataArrayAccessor(ArrayType* array)
168  : Array(array)
169  {
170  }
171 
172  VTK_ALWAYS_INLINE
173  APIType Get(vtkIdType tupleIdx, int compIdx) const
174  {
175  return this->Array->GetComponent(tupleIdx, compIdx);
176  }
177 
178  VTK_ALWAYS_INLINE
179  APIType Get(vtkIdType valueIdx) const
180  {
181  auto div = std::div(valueIdx, static_cast<vtkIdType>(this->Array->GetNumberOfComponents()));
182  return this->Array->GetComponent(div.quot, div.rem);
183  }
184 
185  VTK_ALWAYS_INLINE
186  void Set(vtkIdType tupleIdx, int compIdx, APIType val) const
187  {
188  this->Array->SetComponent(tupleIdx, compIdx, val);
189  }
190 
191  VTK_ALWAYS_INLINE
192  void Set(vtkIdType valueIdx, APIType val) const
193  {
194  auto div = std::div(valueIdx, static_cast<vtkIdType>(this->Array->GetNumberOfComponents()));
195  this->Array->SetComponent(div.quot, div.rem, val);
196  }
197 
198  VTK_ALWAYS_INLINE
199  void Insert(vtkIdType tupleIdx, int compIdx, APIType val) const
200  {
201  this->Array->InsertComponent(tupleIdx, compIdx, val);
202  }
203 
204  VTK_ALWAYS_INLINE
205  void Insert(vtkIdType valueIdx, APIType val) const
206  {
207  auto div = std::div(valueIdx, static_cast<vtkIdType>(this->Array->GetNumberOfComponents()));
208  this->Array->InsertComponent(div.quot, div.rem, val);
209  }
210 
211  VTK_ALWAYS_INLINE
212  void InsertNext(APIType val) const { this->Array->InsertNextTuple1(val); }
213 
214  VTK_ALWAYS_INLINE
215  void InsertNext(APIType* tuple) const { this->Array->InsertNextTuple(tuple); }
216 
217  VTK_ALWAYS_INLINE
218  void Get(vtkIdType tupleIdx, APIType* tuple) const { this->Array->GetTuple(tupleIdx, tuple); }
219 
220  VTK_ALWAYS_INLINE
221  void Set(vtkIdType tupleIdx, const APIType* tuple) const
222  {
223  this->Array->SetTuple(tupleIdx, tuple);
224  }
225 
226  VTK_ALWAYS_INLINE
227  void Insert(vtkIdType tupleIdx, const APIType* tuple) const
228  {
229  this->Array->InsertTuple(tupleIdx, tuple);
230  }
231 };
232 
233 VTK_ABI_NAMESPACE_END
234 #endif // vtkDataArrayAccessor_h
235 // VTK-HeaderTest-Exclude: vtkDataArrayAccessor.h
VTK_ALWAYS_INLINE void Get(vtkIdType tupleIdx, APIType *tuple) const
VTK_ALWAYS_INLINE void Insert(vtkIdType tupleIdx, const APIType *tuple) const
int GetNumberOfComponents() const
Set/Get the dimension (n) of the components.
virtual double * GetTuple(vtkIdType tupleIdx)=0
Get the data tuple at tupleIdx.
VTK_ALWAYS_INLINE void Set(vtkIdType valueIdx, APIType val) const
void SetTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx, vtkAbstractArray *source) override
See documentation from parent class.
VTK_ALWAYS_INLINE void InsertNext(APIType *tuple) const
vtkDataArrayAccessor(ArrayType *array)
void InsertTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx, vtkAbstractArray *source) override
See documentation from parent class.
VTK_ALWAYS_INLINE void Insert(vtkIdType valueIdx, APIType val) const
VTK_ALWAYS_INLINE void Get(vtkIdType tupleIdx, APIType *tuple) const
VTK_ALWAYS_INLINE void Set(vtkIdType tupleIdx, const APIType *tuple) const
int vtkIdType
Definition: vtkType.h:363
VTK_ALWAYS_INLINE void Set(vtkIdType tupleIdx, const APIType *tuple) const
VTK_ALWAYS_INLINE APIType Get(vtkIdType valueIdx) const
VTK_ALWAYS_INLINE APIType Get(vtkIdType valueIdx) const
virtual void SetComponent(vtkIdType tupleIdx, int compIdx, double value)
Set the data component at the location specified by tupleIdx and compIdx to value.
VTK_ALWAYS_INLINE void Set(vtkIdType tupleIdx, int compIdx, APIType val) const
VTK_ALWAYS_INLINE void Insert(vtkIdType valueIdx, APIType val) const
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:44
ArrayType::ValueType APIType
virtual void InsertComponent(vtkIdType tupleIdx, int compIdx, double value)
Insert value at the location specified by tupleIdx and compIdx.
vtkIdType InsertNextTuple(vtkIdType srcTupleIdx, vtkAbstractArray *source) override
See documentation from parent class.
VTK_ALWAYS_INLINE APIType Get(vtkIdType tupleIdx, int compIdx) const
VTK_ALWAYS_INLINE void Set(vtkIdType tupleIdx, int compIdx, APIType val) const
virtual double GetComponent(vtkIdType tupleIdx, int compIdx)
Return the data component at the location specified by tupleIdx and compIdx.
VTK_ALWAYS_INLINE void Set(vtkIdType valueIdx, APIType val) const
VTK_ALWAYS_INLINE void Insert(vtkIdType tupleIdx, int compIdx, APIType val) const
VTK_ALWAYS_INLINE void InsertNext(APIType *tuple) const
VTK_ALWAYS_INLINE void Insert(vtkIdType tupleIdx, int compIdx, APIType val) const
VTK_ALWAYS_INLINE APIType Get(vtkIdType tupleIdx, int compIdx) const
void InsertNextTuple1(double value)
These methods are included as convenience for the wrappers.
VTK_ALWAYS_INLINE void Insert(vtkIdType tupleIdx, const APIType *tuple) const
VTK_ALWAYS_INLINE void InsertNext(APIType val) const
VTK_ALWAYS_INLINE void InsertNext(APIType val) const
Efficient templated access to vtkDataArray.