VTK  9.3.1
vtkBitArray.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
19 #ifndef vtkBitArray_h
20 #define vtkBitArray_h
21 
22 #include "vtkCommonCoreModule.h" // For export macro
23 #include "vtkDataArray.h"
24 
25 VTK_ABI_NAMESPACE_BEGIN
26 class vtkBitArrayLookup;
27 
28 class VTKCOMMONCORE_EXPORT vtkBitArray : public vtkDataArray
29 {
30 public:
32  {
34  VTK_DATA_ARRAY_DELETE = vtkAbstractArray::VTK_DATA_ARRAY_DELETE,
35  VTK_DATA_ARRAY_ALIGNED_FREE = vtkAbstractArray::VTK_DATA_ARRAY_ALIGNED_FREE,
36  VTK_DATA_ARRAY_USER_DEFINED = vtkAbstractArray::VTK_DATA_ARRAY_USER_DEFINED
37  };
38 
39  static vtkBitArray* New();
40  vtkTypeMacro(vtkBitArray, vtkDataArray);
41  void PrintSelf(ostream& os, vtkIndent indent) override;
42 
47  vtkTypeBool Allocate(vtkIdType sz, vtkIdType ext = 1000) override;
48 
52  void Initialize() override;
53 
54  // satisfy vtkDataArray API
55  int GetDataType() const override { return VTK_BIT; }
56  int GetDataTypeSize() const override { return 0; }
57 
61  void SetNumberOfTuples(vtkIdType number) override;
62 
67  bool SetNumberOfValues(vtkIdType number) override;
68 
77  void SetTuple(vtkIdType i, vtkIdType j, vtkAbstractArray* source) override;
78 
86 
94  void InsertTuples(vtkIdList* dstIds, vtkIdList* srcIds, vtkAbstractArray* source) override;
95 
104  vtkIdType dstStart, vtkIdList* srcIds, vtkAbstractArray* source) override;
105 
113  void InsertTuples(
114  vtkIdType dstStart, vtkIdType n, vtkIdType srcStart, vtkAbstractArray* source) override;
115 
124 
129  double* GetTuple(vtkIdType i) override;
130 
134  void GetTuple(vtkIdType i, double* tuple) override;
135 
137 
142  void SetTuple(vtkIdType i, const float* tuple) override;
143  void SetTuple(vtkIdType i, const double* tuple) override;
145 
147 
153  void InsertTuple(vtkIdType i, const float* tuple) override;
154  void InsertTuple(vtkIdType i, const double* tuple) override;
156 
158 
163  vtkIdType InsertNextTuple(const float* tuple) override;
164  vtkIdType InsertNextTuple(const double* tuple) override;
166 
168 
175  void RemoveTuple(vtkIdType id) override;
176  void RemoveFirstTuple() override;
177  void RemoveLastTuple() override;
179 
188  void SetComponent(vtkIdType i, int j, double c) override;
189 
193  void Squeeze() override;
194 
198  vtkTypeBool Resize(vtkIdType numTuples) override;
199 
203  int GetValue(vtkIdType id) const;
204 
211  void SetValue(vtkIdType id, int value);
212 
218  void InsertValue(vtkIdType id, int i);
219 
225  void SetVariantValue(vtkIdType idx, vtkVariant value) override;
226 
232  void InsertVariantValue(vtkIdType idx, vtkVariant value) override;
233 
234  vtkIdType InsertNextValue(int i);
235 
242  void InsertComponent(vtkIdType i, int j, double c) override;
243 
247  unsigned char* GetPointer(vtkIdType id) { return this->Array + id / 8; }
248 
254  unsigned char* WritePointer(vtkIdType id, vtkIdType number);
255 
256  void* WriteVoidPointer(vtkIdType id, vtkIdType number) override
257  {
258  return this->WritePointer(id, number);
259  }
260 
261  void* GetVoidPointer(vtkIdType id) override { return static_cast<void*>(this->GetPointer(id)); }
262 
266  void DeepCopy(vtkDataArray* da) override;
267  void DeepCopy(vtkAbstractArray* aa) override { this->Superclass::DeepCopy(aa); }
268 
270 
281 #ifndef __VTK_WRAP__
282  void SetArray(
283  unsigned char* array, vtkIdType size, int save, int deleteMethod = VTK_DATA_ARRAY_DELETE);
284 #endif
285  void SetVoidArray(void* array, vtkIdType size, int save) override
286  {
287  this->SetArray(static_cast<unsigned char*>(array), size, save);
288  }
289  void SetVoidArray(void* array, vtkIdType size, int save, int deleteMethod) override
290  {
291  this->SetArray(static_cast<unsigned char*>(array), size, save, deleteMethod);
292  }
294 
301  void SetArrayFreeFunction(void (*callback)(void*)) override;
302 
307 
309 
313  void LookupValue(vtkVariant value, vtkIdList* ids) override;
315  void LookupValue(int value, vtkIdList* ids);
317 
326  void DataChanged() override;
327 
333  void ClearLookup() override;
334 
335 protected:
336  vtkBitArray();
337  ~vtkBitArray() override;
338 
350  virtual void InitializeUnusedBitsInLastByte();
351 
352  unsigned char* Array; // pointer to data
353  unsigned char* ResizeAndExtend(vtkIdType sz);
354  // function to resize data
355 
356  int TupleSize; // used for data conversion
357  double* Tuple;
358 
359  void (*DeleteFunction)(void*);
360 
361 private:
362  // hide superclass' DeepCopy() from the user and the compiler
363  void DeepCopy(vtkDataArray& da) { this->vtkDataArray::DeepCopy(&da); }
364 
365  vtkBitArray(const vtkBitArray&) = delete;
366  void operator=(const vtkBitArray&) = delete;
367 
368  vtkBitArrayLookup* Lookup;
369  void UpdateLookup();
370 };
371 
373 {
374  this->Array[id / 8] =
375  static_cast<unsigned char>((value != 0) ? (this->Array[id / 8] | (0x80 >> id % 8))
376  : (this->Array[id / 8] & (~(0x80 >> id % 8))));
377  this->DataChanged();
378 }
379 
380 inline void vtkBitArray::InsertValue(vtkIdType id, int i)
381 {
382  if (id >= this->Size)
383  {
384  if (!this->ResizeAndExtend(id + 1))
385  {
386  return;
387  }
388  }
389  this->Array[id / 8] =
390  static_cast<unsigned char>((i != 0) ? (this->Array[id / 8] | (0x80 >> id % 8))
391  : (this->Array[id / 8] & (~(0x80 >> id % 8))));
392  if (id > this->MaxId)
393  {
394  this->MaxId = id;
396  }
397  this->DataChanged();
398 }
399 
401 {
402  this->SetValue(id, value.ToInt());
403 }
404 
406 {
407  this->InsertValue(id, value.ToInt());
408 }
409 
411 {
412  this->InsertValue(this->MaxId + 1, i);
413  this->DataChanged();
414  return this->MaxId;
415 }
416 
417 inline void vtkBitArray::Squeeze()
418 {
419  this->ResizeAndExtend(this->MaxId + 1);
420 }
421 VTK_ABI_NAMESPACE_END
422 #endif
int GetDataType() const override
Return the underlying data type.
Definition: vtkBitArray.h:55
int GetDataTypeSize() const override
Return the size of the underlying data type.
Definition: vtkBitArray.h:56
void Squeeze() override
Free any unneeded memory.
Definition: vtkBitArray.h:417
virtual void DataChanged()=0
Tell the array explicitly that the data has changed.
virtual void DeepCopy(vtkAbstractArray *da)
Deep copy of data.
void SetVariantValue(vtkIdType idx, vtkVariant value) override
Set a value in the array from a variant.
Definition: vtkBitArray.h:400
Abstract superclass for all arrays.
virtual vtkIdType LookupValue(vtkVariant value)=0
Return the value indices where a specific value appears.
virtual double * GetTuple(vtkIdType tupleIdx)=0
Get the data tuple at tupleIdx.
void SetTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx, vtkAbstractArray *source) override
See documentation from parent class.
void InsertTuple(vtkIdType dstTupleIdx, vtkIdType srcTupleIdx, vtkAbstractArray *source) override
See documentation from parent class.
int vtkIdType
Definition: vtkType.h:315
void DeepCopy(vtkAbstractArray *aa) override
Deep copy of data.
void InsertValue(vtkIdType id, int i)
Inserts values and checks to make sure there is enough memory.
Definition: vtkBitArray.h:380
virtual void Initialize()=0
Release storage and reset array to initial state.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
virtual void RemoveLastTuple()
These methods remove tuples from the data array.
A type representing the union of many types.
Definition: vtkVariant.h:52
void SetValue(vtkIdType id, int value)
Set the data at a particular index.
Definition: vtkBitArray.h:372
int ToInt(bool *valid) const
Convert the variant to a numeric type: If it holds a numeric, cast to the appropriate type...
int vtkTypeBool
Definition: vtkABI.h:64
void * GetVoidPointer(vtkIdType id) override
Return a void pointer.
Definition: vtkBitArray.h:261
virtual void SetComponent(vtkIdType tupleIdx, int compIdx, double value)
Set the data component at the location specified by tupleIdx and compIdx to value.
unsigned char * GetPointer(vtkIdType id)
Direct manipulation of the underlying data.
Definition: vtkBitArray.h:247
double * Tuple
Definition: vtkBitArray.h:357
unsigned char * Array
Definition: vtkBitArray.h:352
virtual void ClearLookup()=0
Delete the associated fast lookup data structure on this array, if it exists.
a simple class to control print indentation
Definition: vtkIndent.h:28
list of point or cell ids
Definition: vtkIdList.h:22
void InsertVariantValue(vtkIdType idx, vtkVariant value) override
Inserts values from a variant and checks to ensure there is enough memory.
Definition: vtkBitArray.h:405
abstract superclass for arrays of numeric data
Definition: vtkDataArray.h:44
virtual vtkArrayIterator * NewIterator()=0
Subclasses must override this method and provide the right kind of templated vtkArrayIteratorTemplate...
void InsertTuplesStartingAt(vtkIdType dstStart, vtkIdList *srcIds, vtkAbstractArray *source) override
See documentation from parent class.
void DataChanged() override
Tell the array explicitly that the data has changed.
void save(Archiver &ar, const std::string &str, const unsigned int vtkNotUsed(version))
void SetVoidArray(void *array, vtkIdType size, int save, int deleteMethod) override
This method lets the user specify data to be held by the array.
Definition: vtkBitArray.h:289
virtual void InsertVariantValue(vtkIdType valueIdx, vtkVariant value)=0
Insert a value into the array from a variant.
Abstract superclass to iterate over elements in an vtkAbstractArray.
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.
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
#define VTK_NEWINSTANCE
unsigned char * ResizeAndExtend(vtkIdType sz)
virtual void InitializeUnusedBitsInLastByte()
This method should be called whenever MaxId needs to be changed, as this method fills the unused bits...
virtual vtkTypeBool Allocate(vtkIdType numValues, vtkIdType ext=1000)=0
Allocate memory for this array.
void DeepCopy(vtkAbstractArray *aa) override
Deep copy of data.
Definition: vtkBitArray.h:267
virtual vtkTypeBool Resize(vtkIdType numTuples)=0
Resize the array to the requested number of tuples and preserve data.
dynamic, self-adjusting array of bits
Definition: vtkBitArray.h:28
virtual void SetArrayFreeFunction(void(*callback)(void *))=0
This method allows the user to specify a custom free function to be called when the array is dealloca...
void * WriteVoidPointer(vtkIdType id, vtkIdType number) override
Get the address of a particular data index.
Definition: vtkBitArray.h:256
vtkIdType InsertNextValue(int i)
Definition: vtkBitArray.h:410
#define VTK_BIT
Definition: vtkType.h:32
virtual void RemoveTuple(vtkIdType tupleIdx)=0
These methods remove tuples from the data array.
void InsertTuples(vtkIdList *dstIds, vtkIdList *srcIds, vtkAbstractArray *source) override
See documentation from parent class.
virtual bool SetNumberOfValues(vtkIdType numValues)
Specify the number of values (tuples * components) for this object to hold.
virtual void SetNumberOfTuples(vtkIdType numTuples)=0
Set the number of tuples (a component group) in the array.
virtual void Squeeze()=0
Free any unnecessary memory.
static vtkObject * New()
Create an object with Debug turned off, modified time initialized to zero, and reference counting on...
virtual void SetVariantValue(vtkIdType valueIdx, vtkVariant value)=0
Set a value in the array from a variant.
void SetVoidArray(void *array, vtkIdType size, int save) override
This method lets the user specify data to be held by the array.
Definition: vtkBitArray.h:285
virtual void RemoveFirstTuple()
These methods remove tuples from the data array.
Definition: vtkDataArray.h:225