VTK  9.6.20260225
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
18
19#ifndef vtkBitArray_h
20#define vtkBitArray_h
21
22#include "vtkBuffer.h" // For vtkBuffer
23#include "vtkCommonCoreModule.h" // For export macro
24#include "vtkDataArray.h"
25
26#include <cassert> // for assert
27#include <vector> // for vector
28
29VTK_ABI_NAMESPACE_BEGIN
30class vtkBitArrayLookup;
31
32class VTKCOMMONCORE_EXPORT vtkBitArray : public vtkDataArray
33{
34public:
42 using ArrayTypeTag = std::integral_constant<int, vtkArrayTypes::VTK_BIT_ARRAY>;
43 using DataTypeTag = std::integral_constant<int, VTK_BIT>;
44 using ValueType = unsigned char;
45
46 static vtkBitArray* New();
47 vtkTypeMacro(vtkBitArray, vtkDataArray);
48 void PrintSelf(ostream& os, vtkIndent indent) override;
49
57
62 vtkTypeBool Allocate(vtkIdType sz, vtkIdType ext = 1000) override;
63
67 void Initialize() override;
68
69 // satisfy vtkDataArray API
70 int GetArrayType() const override { return vtkBitArray::ArrayTypeTag::value; }
71 int GetDataType() const override { return vtkBitArray::DataTypeTag::value; }
72 int GetDataTypeSize() const override { return 0; }
73
77 void SetNumberOfTuples(vtkIdType number) override;
78
83 bool SetNumberOfValues(vtkIdType number) override;
84
94
102
110 void InsertTuples(vtkIdList* dstIds, vtkIdList* srcIds, vtkAbstractArray* source) override;
111
120 vtkIdType dstStart, vtkIdList* srcIds, vtkAbstractArray* source) override;
121
130 vtkIdType dstStart, vtkIdType n, vtkIdType srcStart, vtkAbstractArray* source) override;
131
140
145 double* GetTuple(vtkIdType i) override;
146
150 void GetTuple(vtkIdType i, double* tuple) override;
151
153
158 void SetTuple(vtkIdType i, const float* tuple) override;
159 void SetTuple(vtkIdType i, const double* tuple) override;
161
163
169 void InsertTuple(vtkIdType i, const float* tuple) override;
170 void InsertTuple(vtkIdType i, const double* tuple) override;
172
174
179 vtkIdType InsertNextTuple(const float* tuple) override;
180 vtkIdType InsertNextTuple(const double* tuple) override;
182
184
191 void RemoveTuple(vtkIdType id) override;
192 void RemoveFirstTuple() override;
193 void RemoveLastTuple() override;
195
197
205 double GetComponent(vtkIdType tupleIdx, int compIdx) override;
206 void SetComponent(vtkIdType i, int j, double c) override;
208
212 void Squeeze() override { this->Resize(this->GetNumberOfTuples()); }
213
217 vtkTypeBool Resize(vtkIdType numTuples) override;
218
222 ValueType GetTypedComponent(vtkIdType tupleIdx, int comp) const
223 VTK_EXPECTS(0 <= tupleIdx && GetNumberOfComponents() * tupleIdx + comp < GetNumberOfValues())
224 VTK_EXPECTS(0 <= comp && comp < GetNumberOfComponents());
225
227
230 void SetTypedComponent(vtkIdType tupleIdx, int comp, ValueType value)
231 VTK_EXPECTS(0 <= tupleIdx && GetNumberOfComponents() * tupleIdx + comp < GetNumberOfValues())
232 VTK_EXPECTS(0 <= comp && comp < GetNumberOfComponents());
234
236
239 void GetTypedTuple(vtkIdType tupleIdx, ValueType* tuple) const
240 VTK_EXPECTS(0 <= tupleIdx && tupleIdx < GetNumberOfTuples());
242
244
247 void SetTypedTuple(vtkIdType tupleIdx, const ValueType* tuple)
248 VTK_EXPECTS(0 <= tupleIdx && tupleIdx < GetNumberOfTuples());
250
254 int GetValue(vtkIdType id) const;
255
262 void SetValue(vtkIdType id, int value);
263
269 void InsertValue(vtkIdType id, int i);
270
275
281 void SetVariantValue(vtkIdType idx, vtkVariant value) override;
282
288 void InsertVariantValue(vtkIdType idx, vtkVariant value) override;
289
291
298 void InsertComponent(vtkIdType i, int j, double c) override;
299
303 ValueType* GetPointer(vtkIdType id) { return this->Buffer->GetBuffer() + id / 8; }
304
311
312 void* WriteVoidPointer(vtkIdType id, vtkIdType number) override
313 {
314 return this->WritePointer(id, number);
315 }
316
317 void* GetVoidPointer(vtkIdType id) override { return static_cast<void*>(this->GetPointer(id)); }
318
324#ifdef __VTK_WRAP__
325 vtkAbstractBuffer* GetBuffer() { return this->Buffer; }
326#else
328#endif // __VTK_WRAP__
329
331
334 void DeepCopy(vtkDataArray* da) override;
335 void DeepCopy(vtkAbstractArray* aa) override { this->Superclass::DeepCopy(aa); }
337
341 void ShallowCopy(vtkDataArray* da) override;
343
345
356#ifndef __VTK_WRAP__
358 ValueType* array, vtkIdType size, int save, int deleteMethod = VTK_DATA_ARRAY_DELETE);
359#endif
360 void SetVoidArray(void* array, vtkIdType size, int save) override
361 {
362 this->SetArray(static_cast<ValueType*>(array), size, save);
363 }
364 void SetVoidArray(void* array, vtkIdType size, int save, int deleteMethod) override
365 {
366 this->SetArray(static_cast<ValueType*>(array), size, save, deleteMethod);
367 }
368
369
376 void SetArrayFreeFunction(void (*callback)(void*)) override;
377
381 VTK_DEPRECATED_IN_9_7_0("Use vtk::DataArrayValueRange, or the array directly")
383
385
389 void LookupValue(vtkVariant value, vtkIdList* ids) override;
391 void LookupValue(int value, vtkIdList* ids);
393
402 void DataChanged() override;
403
409 void ClearLookup() override;
410
411protected:
413 ~vtkBitArray() override;
414
427
432 bool AllocateTuples(vtkIdType numTuples);
433
438
439 vtkBuffer<ValueType>* Buffer; // pointer to data
440 std::vector<double> LegacyTuple;
441
445 VTK_DEPRECATED_IN_9_7_0("Use Resize")
447 {
448 if (!this->Resize(size / this->NumberOfComponents + 1))
449 {
450 return nullptr;
451 }
452 return this->Buffer->GetBuffer();
453 }
454
455private:
456 // hide superclass' DeepCopy() from the user and the compiler
457 void DeepCopy(vtkDataArray& da) { this->vtkDataArray::DeepCopy(&da); }
458
459 vtkBitArray(const vtkBitArray&) = delete;
460 void operator=(const vtkBitArray&) = delete;
461
462 vtkBitArrayLookup* Lookup;
463 void UpdateLookup();
464};
465
466// Declare vtkArrayDownCast implementations for vtkBitArray:
468
469inline void vtkBitArray::SetValue(vtkIdType id, int value)
470{
471 const auto bitsetDiv = std::div(id, static_cast<vtkIdType>(8));
472 const vtkIdType &bitsetId = bitsetDiv.quot, &bitId = bitsetDiv.rem;
473 ValueType mask = 0x80 >> bitId; // NOLINT(clang-analyzer-core.BitwiseShift)
474 this->Buffer->GetBuffer()[bitsetId] =
475 static_cast<ValueType>((value != 0) ? (this->Buffer->GetBuffer()[bitsetId] | mask)
476 : (this->Buffer->GetBuffer()[bitsetId] & (~mask)));
477 this->DataChanged();
478}
479
480inline void vtkBitArray::InsertValue(vtkIdType valueIdx, int value)
481{
482 if (valueIdx >= this->Size)
483 {
484 if (!this->Resize((valueIdx + 1) / this->NumberOfComponents + 1))
485 {
486 return;
487 }
488 }
489 this->SetValue(valueIdx, value);
490 if (valueIdx > this->MaxId)
491 {
492 this->MaxId = valueIdx;
494 }
495}
496
498{
499 return vtkVariant(this->GetValue(id));
500}
501
503{
504 this->SetValue(id, value.ToInt());
505}
506
508{
509 this->InsertValue(id, value.ToInt());
510}
511
513{
514 this->InsertValue(this->MaxId + 1, i);
515 return this->MaxId;
516}
517VTK_ABI_NAMESPACE_END
518#endif
int GetNumberOfComponents() const
Set/Get the dimension (n) of the components.
vtkIdType GetNumberOfTuples() const
Get the number of complete tuples (a component group) in the array.
vtkIdType GetNumberOfValues() const
Get the total number of values in the array.
virtual void ShallowCopy(vtkAbstractArray *src)
This method will copy the data from the source array to this array.
Abstract base class for vtkBuffer providing buffer protocol support.
Abstract superclass to iterate over elements in an vtkAbstractArray.
dynamic, self-adjusting array of bits
Definition vtkBitArray.h:33
int GetValue(vtkIdType id) const
Get the data at a particular index.
void * WriteVoidPointer(vtkIdType id, vtkIdType number) override
Get the address of a particular data index.
unsigned char ValueType
Definition vtkBitArray.h:44
vtkIdType InsertNextTuple(vtkIdType j, vtkAbstractArray *source) override
Insert the jth tuple in the source array, at the end in this array.
void GetTypedTuple(vtkIdType tupleIdx, ValueType *tuple) const
Copy the tuple at tupleIdx into tuple.
static vtkBitArray * FastDownCast(vtkAbstractArray *source)
Perform a fast, safe cast from a vtkAbstractArray to a vtkBitArray.
vtkIdType InsertNextTuple(const double *tuple) override
Insert (memory allocation performed) the tuple onto the end of the array.
void DataChanged() override
Tell the array explicitly that the data has changed.
bool AllocateTuples(vtkIdType numTuples)
Allocate space for numTuples.
void InsertTuples(vtkIdType dstStart, vtkIdType n, vtkIdType srcStart, vtkAbstractArray *source) override
Copy n consecutive tuples starting at srcStart from the source array to this array,...
void SetNumberOfTuples(vtkIdType number) override
Set the number of n-tuples in the array.
void SetVariantValue(vtkIdType idx, vtkVariant value) override
Set a value in the array from a variant.
std::integral_constant< int, vtkArrayTypes::VTK_BIT_ARRAY > ArrayTypeTag
Definition vtkBitArray.h:42
void SetValue(vtkIdType id, int value)
Set the data at a particular index.
vtkTypeBool Allocate(vtkIdType sz, vtkIdType ext=1000) override
Allocate memory for this array.
void InsertTuple(vtkIdType i, const double *tuple) override
Insert (memory allocation performed) the tuple into the ith location in the array.
void ShallowCopy(vtkDataArray *da) override
Shallow copy of another bit array.
void GetTuple(vtkIdType i, double *tuple) override
Copy the tuple value into a user-provided array.
std::vector< double > LegacyTuple
void SetTuple(vtkIdType i, const double *tuple) override
Set the tuple value at the ith location in the array.
void InsertComponent(vtkIdType i, int j, double c) override
Insert the data component at ith tuple and jth component location.
vtkBuffer< ValueType > * GetBuffer()
Return the underlying buffer object.
ValueType * WritePointer(vtkIdType id, vtkIdType number)
Get the address of a particular data index.
void DeepCopy(vtkAbstractArray *aa) override
Deep copy of another bit array.
double GetComponent(vtkIdType tupleIdx, int compIdx) override
Set/Get the data component at the ith tuple and jth component location.
void SetComponent(vtkIdType i, int j, double c) override
Set/Get the data component at the ith tuple and jth component location.
void SetTuple(vtkIdType i, const float *tuple) override
Set the tuple value at the ith location in the array.
vtkIdType InsertNextTuple(const float *tuple) override
Insert (memory allocation performed) the tuple onto the end of the array.
bool ReallocateTuples(vtkIdType numTuples)
Allocate space for numTuples.
vtkArrayIterator * NewIterator() override
Returns a new vtkBitArrayIterator instance.
vtkBuffer< ValueType > * Buffer
void SetTypedTuple(vtkIdType tupleIdx, const ValueType *tuple)
Set this array's tuple at tupleIdx to the values in tuple.
vtkTypeBool Resize(vtkIdType numTuples) override
Resize the array while conserving the data.
void InsertValue(vtkIdType id, int i)
Inserts values and checks to make sure there is enough memory.
ValueType * GetPointer(vtkIdType id)
Direct manipulation of the underlying data.
void RemoveFirstTuple() override
These methods remove tuples from the data array.
void InsertTuple(vtkIdType i, const float *tuple) override
Insert (memory allocation performed) the tuple into the ith location in the array.
void SetTypedComponent(vtkIdType tupleIdx, int comp, ValueType value)
Set component comp of the tuple at tupleIdx to value.
void Initialize() override
Release storage and reset array to initial state.
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...
bool SetNumberOfValues(vtkIdType number) override
In addition to setting the number of values, this method also sets the unused bits of the last byte o...
void SetVoidArray(void *array, vtkIdType size, int save, int deleteMethod) override
This method lets the user specify data to be held by the array.
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...
std::integral_constant< int, VTK_BIT > DataTypeTag
Definition vtkBitArray.h:43
vtkIdType InsertNextValue(int i)
double * GetTuple(vtkIdType i) override
Get a pointer to a tuple at the ith location.
void InsertTuple(vtkIdType i, vtkIdType j, vtkAbstractArray *source) override
Insert the jth tuple in the source array, at ith location in this array.
void PrintSelf(ostream &os, vtkIndent indent) override
Methods invoked by print to print information about the object including superclasses.
void SetVoidArray(void *array, vtkIdType size, int save) override
This method lets the user specify data to be held by the array.
void RemoveTuple(vtkIdType id) override
These methods remove tuples from the data array.
void * GetVoidPointer(vtkIdType id) override
Return a void pointer.
int GetDataTypeSize() const override
Return the size of the underlying data type.
Definition vtkBitArray.h:72
void RemoveLastTuple() override
These methods remove tuples from the data array.
int GetArrayType() const override
Method for type-checking in FastDownCast implementations.
Definition vtkBitArray.h:70
void SetTuple(vtkIdType i, vtkIdType j, vtkAbstractArray *source) override
Set the tuple at the ith location using the jth tuple in the source array.
void DeepCopy(vtkDataArray *da) override
Deep copy of another bit array.
void SetArray(ValueType *array, vtkIdType size, int save, int deleteMethod=VTK_DATA_ARRAY_DELETE)
This method lets the user specify data to be held by the array.
@ VTK_DATA_ARRAY_FREE
Definition vtkBitArray.h:37
@ VTK_DATA_ARRAY_DELETE
Definition vtkBitArray.h:38
@ VTK_DATA_ARRAY_USER_DEFINED
Definition vtkBitArray.h:40
@ VTK_DATA_ARRAY_ALIGNED_FREE
Definition vtkBitArray.h:39
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...
int GetDataType() const override
Return the underlying data type.
Definition vtkBitArray.h:71
vtkVariant GetVariantValue(vtkIdType idx) override
Get a value in the array as a variant.
vtkIdType LookupValue(vtkVariant value) override
Return the indices where a specific value appears.
static vtkBitArray * New()
void InsertVariantValue(vtkIdType idx, vtkVariant value) override
Inserts values from a variant and checks to ensure there is enough memory.
void Squeeze() override
Free any unneeded memory.
ValueType GetTypedComponent(vtkIdType tupleIdx, int comp) const
Get component comp of the tuple at tupleIdx.
virtual void InitializeUnusedBitsInLastByte()
This method should be called whenever MaxId needs to be changed, as this method fills the unused bits...
ValueType * ResizeAndExtend(vtkIdType size)
Function to resize data.
void ClearLookup() override
Delete the associated fast lookup data structure on this array, if it exists.
internal storage class used by vtkSOADataArrayTemplate, vtkAOSDataArrayTemplate, and others.
Definition vtkBuffer.h:32
void DeepCopy(vtkAbstractArray *aa) override
Deep copy of data.
list of point or cell ids
Definition vtkIdList.h:133
a simple class to control print indentation
Definition vtkIndent.h:108
A type representing the union of many types.
Definition vtkVariant.h:162
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
#define vtkArrayDownCast_FastCastMacro(ArrayT)
This macro is used to tell vtkArrayDownCast to use FastDownCast instead of SafeDownCast.
boost::graph_traits< vtkGraph * >::vertex_descriptor source(boost::graph_traits< vtkGraph * >::edge_descriptor e, vtkGraph *)
#define vtkDataArray
#define VTK_DEPRECATED_IN_9_7_0(reason)
int vtkIdType
Definition vtkType.h:363
void save(Archiver &ar, const std::string &str, const unsigned int version)
#define VTK_EXPECTS(x)
#define VTK_NEWINSTANCE