141#ifndef vtkCellArray_h
142#define vtkCellArray_h
144#include "vtkCommonDataModelModule.h"
150#include "vtkFeatures.h"
152#include "vtkTypeInt32Array.h"
153#include "vtkTypeInt64Array.h"
157#include <initializer_list>
158#include <type_traits>
181#define VTK_CELL_ARRAY_V2
249 return this->
AllocateExact(numCells, numCells * maxCellSize);
399 void SetData(vtkTypeInt32Array* offsets, vtkTypeInt32Array* connectivity);
400 void SetData(vtkTypeInt64Array* offsets, vtkTypeInt64Array* connectivity);
686 void UpdateCellCount(
int npts);
809 template <
typename ArrayT>
847 this->
Offsets->InsertNextValue(0);
850 this->IsInMemkind =
true;
854 void*
operator new(
size_t nSize)
857#ifdef VTK_USE_MEMKIND
864 void operator delete(
void* p)
866#ifdef VTK_USE_MEMKIND
887 bool IsInMemkind =
false;
891 template <
typename Functor,
typename... Args>
892 using GetReturnType =
decltype(
893 std::declval<Functor>()(std::declval<VisitState<ArrayType32>&>(), std::declval<Args>()...));
895 template <
typename Functor,
typename... Args>
896 struct ReturnsVoid : std::is_same<GetReturnType<Functor, Args...>, void>
970 template <
typename Functor,
typename... Args,
971 typename =
typename std::enable_if<ReturnsVoid<Functor, Args...>::value>::type>
972 void Visit(Functor&& functor, Args&&... args)
990 template <
typename Functor,
typename... Args,
991 typename =
typename std::enable_if<ReturnsVoid<Functor, Args...>::value>::type>
992 void Visit(Functor&& functor, Args&&... args)
const
1010 template <
typename Functor,
typename... Args,
1011 typename =
typename std::enable_if<!ReturnsVoid<Functor, Args...>::value>::type>
1012 GetReturnType<Functor, Args...>
Visit(Functor&& functor, Args&&... args)
1029 template <
typename Functor,
typename... Args,
1030 typename =
typename std::enable_if<!ReturnsVoid<Functor, Args...>::value>::type>
1031 GetReturnType<Functor, Args...>
Visit(Functor&& functor, Args&&... args)
const
1209#ifdef VTK_USE_MEMKIND
1217#ifdef VTK_USE_64BIT_IDS
1220 this->StorageIs64Bit =
true;
1225 this->StorageIs64Bit =
false;
1228#ifdef VTK_USE_MEMKIND
1231 this->IsInMemkind =
true;
1234 (void)this->IsInMemkind;
1240 if (this->StorageIs64Bit)
1242 this->Arrays->Int64->~VisitState();
1243 delete this->Arrays->Int64;
1247 this->Arrays->Int32->~VisitState();
1248 delete this->Arrays->Int32;
1250#ifdef VTK_USE_MEMKIND
1251 if (this->IsInMemkind)
1260 delete this->Arrays;
1268 if (!this->StorageIs64Bit)
1273 this->Arrays->Int64->~VisitState();
1274 delete this->Arrays->Int64;
1276 this->StorageIs64Bit =
false;
1285 if (this->StorageIs64Bit)
1290 this->Arrays->Int32->~VisitState();
1291 delete this->Arrays->Int32;
1293 this->StorageIs64Bit =
true;
1299 bool Is64Bit()
const {
return this->StorageIs64Bit; }
1304 assert(!this->StorageIs64Bit);
1305 return *this->Arrays->Int32;
1310 assert(!this->StorageIs64Bit);
1311 return *this->Arrays->Int32;
1317 assert(this->StorageIs64Bit);
1318 return *this->Arrays->Int64;
1323 assert(this->StorageIs64Bit);
1324 return *this->Arrays->Int64;
1330 ArraySwitch* Arrays;
1331 bool StorageIs64Bit;
1332 bool IsInMemkind =
false;
1346template <
typename ArrayT>
1349 return this->
Offsets->GetNumberOfValues() - 1;
1352template <
typename ArrayT>
1358template <
typename ArrayT>
1364template <
typename ArrayT>
1370template <
typename ArrayT>
1384 template <
typename CellStateT>
1387 using ValueType =
typename CellStateT::ValueType;
1388 auto* conn = state.GetConnectivity();
1389 auto* offsets = state.GetOffsets();
1391 const vtkIdType cellId = offsets->GetNumberOfValues() - 1;
1393 offsets->InsertNextValue(
static_cast<ValueType
>(conn->GetNumberOfValues() + npts));
1397 conn->InsertNextValue(
static_cast<ValueType
>(pts[i]));
1404 template <
typename CellStateT>
1407 using ValueType =
typename CellStateT::ValueType;
1408 auto* conn = state.GetConnectivity();
1409 auto* offsets = state.GetOffsets();
1411 const vtkIdType cellId = offsets->GetNumberOfValues() - 1;
1413 offsets->InsertNextValue(
static_cast<ValueType
>(conn->GetNumberOfValues() + npts));
1422 template <
typename CellStateT>
1425 using ValueType =
typename CellStateT::ValueType;
1427 auto* offsets = state.GetOffsets();
1428 const ValueType cellBegin = offsets->GetValue(offsets->GetMaxId() - 1);
1429 offsets->SetValue(offsets->GetMaxId(),
static_cast<ValueType
>(cellBegin + npts));
1435 template <
typename CellStateT>
1438 return state.GetCellSize(cellId);
1444 template <
typename CellStateT>
1447 using ValueType =
typename CellStateT::ValueType;
1449 const auto cellPts = state.GetCellRange(cellId);
1454 for (ValueType ptId : cellPts)
1456 *idPtr++ =
static_cast<vtkIdType>(ptId);
1462 template <
typename CellStateT>
1466 using ValueType =
typename CellStateT::ValueType;
1467 using ArrayType =
typename CellStateT::ArrayType;
1469 static constexpr bool ValueTypeCompat = CellStateT::ValueTypeIsSameAsIdType;
1470 static constexpr bool ArrayTypeCompat = std::is_base_of<AOSArrayType, ArrayType>::value;
1473 static constexpr bool value = ValueTypeCompat && ArrayTypeCompat;
1476 template <
typename CellStateT>
1477 typename std::enable_if<CanShareConnPtr<CellStateT>::value,
void>::type
operator()(
1481 const vtkIdType beginOffset = state.GetBeginOffset(cellId);
1482 const vtkIdType endOffset = state.GetEndOffset(cellId);
1483 cellSize = endOffset - beginOffset;
1485 cellPoints =
reinterpret_cast<vtkIdType*
>(state.GetConnectivity()->GetPointer(beginOffset));
1488 template <
typename CellStateT>
1489 typename std::enable_if<!CanShareConnPtr<CellStateT>::value,
void>::type
operator()(
1493 using ValueType =
typename CellStateT::ValueType;
1495 const auto cellPts = state.GetCellRange(cellId);
1496 cellSize = cellPts.size();
1502 for (ValueType ptId : cellPts)
1504 *tempPtr++ =
static_cast<vtkIdType>(ptId);
1513 template <
typename CellStateT>
1516 state.GetOffsets()->Reset();
1517 state.GetConnectivity()->Reset();
1518 state.GetOffsets()->InsertNextValue(0);
1602 using ValueType =
typename ArrayType64::ValueType;
1607 using ValueType =
typename ArrayType32::ValueType;
Array-Of-Structs implementation of vtkGenericDataArray.
Encapsulate traversal logic for vtkCellArray.
void SetData(vtkAOSDataArrayTemplate< int > *offsets, vtkAOSDataArrayTemplate< int > *connectivity)
Set the internal data arrays to the supplied offsets and connectivity arrays.
int GetNextCell(vtkIdType &npts, vtkIdType const *&pts)
vtkIdTypeArray * GetData()
Return the underlying data as a data array.
vtkIdType GetNumberOfConnectivityEntries()
Return the size of the array that would be returned from ExportLegacyFormat().
void SetData(vtkTypeInt32Array *offsets, vtkTypeInt32Array *connectivity)
Set the internal data arrays to the supplied offsets and connectivity arrays.
vtkTypeBool Allocate(vtkIdType sz, vtkIdType vtkNotUsed(ext)=1000)
Allocate memory.
void UseDefaultStorage()
Initialize internal data structures to use 32- or 64-bit storage.
vtkIdType GetOffset(vtkIdType cellId)
Get the offset (into the connectivity) for a specified cell id.
bool AllocateCopy(vtkCellArray *other)
Pre-allocate memory in internal data structures to match the used size of the input vtkCellArray.
void AppendLegacyFormat(vtkIdTypeArray *data, vtkIdType ptOffset=0)
Append an array of data with the legacy vtkCellArray layout, e.g.:
bool IsStorageShareable() const
bool IsValid()
Check that internal storage is consistent and in a valid state.
void AppendLegacyFormat(const vtkIdType *data, vtkIdType len, vtkIdType ptOffset=0)
Append an array of data with the legacy vtkCellArray layout, e.g.:
friend class vtkCellArrayIterator
GetReturnType< Functor, Args... > Visit(Functor &&functor, Args &&... args) const
bool SetData(vtkIdType cellSize, vtkDataArray *connectivity)
Sets the internal arrays to the supported connectivity array with an offsets array automatically gene...
void ReplaceCell(vtkIdType loc, int npts, const vtkIdType pts[])
Replace the point ids of the cell at the legacy location with a different list of point ids.
vtkIdType GetTraversalCellId()
Get/Set the current cellId for traversal.
void Visit(Functor &&functor, Args &&... args)
vtkTypeInt32Array ArrayType32
ArrayType64 * GetConnectivityArray64()
Return the array used to store the point ids that define the cells' connectivity.
vtkIdType GetTraversalLocation()
Get/Set the current traversal legacy location.
typename vtkTypeList::Unique< vtkTypeList::Create< vtkAOSDataArrayTemplate< int >, vtkAOSDataArrayTemplate< long >, vtkAOSDataArrayTemplate< long long > > >::Result InputArrayList
List of possible ArrayTypes that are compatible with internal storage.
ArrayType32 * GetConnectivityArray32()
Return the array used to store the point ids that define the cells' connectivity.
void SetData(vtkAOSDataArrayTemplate< long long > *offsets, vtkAOSDataArrayTemplate< long long > *connectivity)
Set the internal data arrays to the supplied offsets and connectivity arrays.
bool AllocateExact(vtkIdType numCells, vtkIdType connectivitySize)
Pre-allocate memory in internal data structures.
bool ResizeExact(vtkIdType numCells, vtkIdType connectivitySize)
ResizeExact() resizes the internal structures to hold numCells total cell offsets and connectivitySiz...
vtkIdType EstimateSize(vtkIdType numCells, int maxPtsPerCell)
Utility routines help manage memory of cell array.
ArrayType32 * GetOffsetsArray32()
Return the array used to store cell offsets.
bool AllocateEstimate(vtkIdType numCells, vtkIdType maxCellSize)
Pre-allocate memory in internal data structures.
void ReverseCell(vtkIdType loc)
Special method inverts ordering of cell at the specified legacy location.
vtkIdType GetNumberOfOffsets() const
Get the number of elements in the offsets array.
vtkTypeInt64Array ArrayType64
vtkIdType TraversalCellId
void Use64BitStorage()
Initialize internal data structures to use 32- or 64-bit storage.
bool ConvertToDefaultStorage()
Convert internal data structures to use 32- or 64-bit storage.
bool CanConvertToDefaultStorage() const
Check if the existing data can safely be converted to use 32- or 64- bit storage.
void GetCell(vtkIdType loc, vtkIdType &npts, const vtkIdType *&pts)
Internal method used to retrieve a cell given a legacy offset location.
bool CanConvertTo32BitStorage() const
Check if the existing data can safely be converted to use 32- or 64- bit storage.
vtkDataArray * GetConnectivityArray()
Return the array used to store the point ids that define the cells' connectivity.
void InsertCellPoint(vtkIdType id)
Used in conjunction with InsertNextCell(npts) to add another point to the list of cells.
unsigned long GetActualMemorySize() const
Return the memory in kibibytes (1024 bytes) consumed by this cell array.
void GetCellAtId(vtkIdType cellId, vtkIdType &cellSize, vtkIdType const *&cellPoints)
Return the point ids for the cell at cellId.
vtkCellArrayIterator * NewIterator()
NewIterator returns a new instance of vtkCellArrayIterator that is initialized to point at the first ...
void SetTraversalLocation(vtkIdType loc)
Get/Set the current traversal legacy location.
void ReplaceCellAtId(vtkIdType cellId, vtkIdList *list)
Replaces the point ids for the specified cell with the supplied list.
void ReverseCellAtId(vtkIdType cellId)
Reverses the order of the point ids for the specified cell.
bool SetData(vtkDataArray *offsets, vtkDataArray *connectivity)
Sets the internal arrays to the supplied offsets and connectivity arrays.
void Squeeze()
Reclaim any extra memory while preserving data.
void SetData(vtkIdTypeArray *offsets, vtkIdTypeArray *connectivity)
Set the internal data arrays to the supplied offsets and connectivity arrays.
bool ConvertTo32BitStorage()
Convert internal data structures to use 32- or 64-bit storage.
vtkIdType IsHomogeneous()
Check if all cells have the same number of vertices.
void Visit(Functor &&functor, Args &&... args) const
int GetMaxCellSize()
Returns the size of the largest cell.
ArrayType64 * GetOffsetsArray64()
Return the array used to store cell offsets.
bool ConvertToSmallestStorage()
Convert internal data structures to use 32- or 64-bit storage.
void ShallowCopy(vtkCellArray *ca)
Shallow copy ca into this cell array.
void ExportLegacyFormat(vtkIdTypeArray *data)
Fill data with the old-style vtkCellArray data layout, e.g.
bool ConvertTo64BitStorage()
Convert internal data structures to use 32- or 64-bit storage.
void SetData(vtkAOSDataArrayTemplate< long > *offsets, vtkAOSDataArrayTemplate< long > *connectivity)
Set the internal data arrays to the supplied offsets and connectivity arrays.
void ImportLegacyFormat(const vtkIdType *data, vtkIdType len)
Import an array of data with the legacy vtkCellArray layout, e.g.:
void ImportLegacyFormat(vtkIdTypeArray *data)
Import an array of data with the legacy vtkCellArray layout, e.g.:
void Use32BitStorage()
Initialize internal data structures to use 32- or 64-bit storage.
void Initialize()
Free any memory and reset to an empty state.
void DeepCopy(vtkCellArray *ca)
Perform a deep copy (no reference counting) of the given cell array.
void SetTraversalCellId(vtkIdType cellId)
Get/Set the current cellId for traversal.
void SetData(vtkTypeInt64Array *offsets, vtkTypeInt64Array *connectivity)
Set the internal data arrays to the supplied offsets and connectivity arrays.
vtkIdType GetNumberOfCells() const
Get the number of cells in the array.
vtkIdType InsertNextCell(vtkCell *cell)
Insert a cell object.
virtual void SetNumberOfCells(vtkIdType)
Set the number of cells in the array.
vtkIdType GetNumberOfConnectivityIds() const
Get the size of the connectivity array that stores the point ids.
vtkDataArray * GetOffsetsArray()
Return the array used to store cell offsets.
vtkNew< vtkIdTypeArray > LegacyData
void PrintSelf(ostream &os, vtkIndent indent) override
Standard methods for instantiation, type information, and printing.
void PrintDebug(ostream &os)
Standard methods for instantiation, type information, and printing.
vtkIdType GetInsertLocation(int npts)
Computes the current legacy insertion location within the internal array.
void UpdateCellCount(int npts)
Used in conjunction with InsertNextCell(int npts) and InsertCellPoint() to update the number of point...
GetReturnType< Functor, Args... > Visit(Functor &&functor, Args &&... args)
void SetCells(vtkIdType ncells, vtkIdTypeArray *cells)
Define multiple cells by providing a connectivity list.
static vtkCellArray * New()
Standard methods for instantiation, type information, and printing.
vtkNew< vtkIdList > TempCell
vtkIdType GetSize()
Get the size of the allocated connectivity array.
vtkTypeList::Create< ArrayType32, ArrayType64 > StorageArrayList
List of possible array types used for storage.
vtkIdType InsertNextCell(const std::initializer_list< vtkIdType > &cell)
Overload that allows InsertNextCell({0, 1, 2}) syntax.
void Append(vtkCellArray *src, vtkIdType pointOffset=0)
Append cells from src into this.
vtkIdType GetCellSize(const vtkIdType cellId) const
Return the size of the cell at cellId.
bool IsStorage64Bit() const
void ReplaceCellAtId(vtkIdType cellId, vtkIdType cellSize, const vtkIdType *cellPoints)
Replaces the point ids for the specified cell with the supplied list.
bool CanConvertTo64BitStorage() const
Check if the existing data can safely be converted to use 32- or 64- bit storage.
abstract class to specify cell behavior
vtkIdList * GetPointIds()
Return the list of point ids defining the cell.
list of point or cell ids
vtkIdType GetNumberOfIds() const noexcept
Return the number of id's in the list.
void Reset()
Reset to an empty state but retain previously allocated memory.
vtkIdType * GetPointer(const vtkIdType i)
Get a pointer to a particular data index.
void SetNumberOfIds(const vtkIdType number)
Specify the number of ids for this object to hold.
dynamic, self-adjusting array of vtkIdType
a simple class to control print indentation
Allocate and hold a VTK object.
static vtkMallocingFunction GetCurrentMallocFunction()
static vtkFreeingFunction GetAlternateFreeFunction()
static bool GetUsingMemkind()
A global state flag that controls whether vtkObjects are constructed in the usual way (the default) o...
Hold a reference to a vtkObjectBase instance.
static vtkSmartPointer< T > New()
Create an instance of a VTK object.
VTK_ITER_INLINE auto DataArrayValueRange(const ArrayTypePtr &array, ValueIdType start=-1, ValueIdType end=-1) -> typename detail::SelectValueRange< ArrayTypePtr, TupleSize >::type
Generate an stl and for-range compatible range of flat AOS iterators from a vtkDataArray.
VisitState< ArrayType64 > & GetArrays64()
const VisitState< ArrayType64 > & GetArrays64() const
const VisitState< ArrayType32 > & GetArrays32() const
VisitState< ArrayType32 > & GetArrays32()
vtkIdType GetNumberOfCells() const
friend class vtkCellArray
vtkIdType GetEndOffset(vtkIdType cellId) const
vtkSmartPointer< ArrayType > Offsets
vtkSmartPointer< ArrayType > Connectivity
static constexpr bool ValueTypeIsSameAsIdType
const ArrayType * GetOffsets() const
decltype(vtk::DataArrayValueRange< 1 >(std::declval< ArrayType >())) CellRangeType
CellRangeType GetCellRange(vtkIdType cellId)
vtkIdType GetBeginOffset(vtkIdType cellId) const
vtkIdType GetCellSize(vtkIdType cellId) const
const ArrayType * GetConnectivity() const
typename ArrayType::ValueType ValueType
ArrayType * GetConnectivity()
static constexpr bool value
std::enable_if<!CanShareConnPtr< CellStateT >::value, void >::type operator()(CellStateT &state, const vtkIdType cellId, vtkIdType &cellSize, vtkIdType const *&cellPoints, vtkIdList *temp)
std::enable_if< CanShareConnPtr< CellStateT >::value, void >::type operator()(CellStateT &state, const vtkIdType cellId, vtkIdType &cellSize, vtkIdType const *&cellPoints, vtkIdList *vtkNotUsed(temp))
void operator()(CellStateT &state, const vtkIdType cellId, vtkIdList *ids)
vtkIdType operator()(CellStateT &state, const vtkIdType cellId)
vtkIdType operator()(CellStateT &state, const vtkIdType npts, const vtkIdType pts[])
vtkIdType operator()(CellStateT &state, const vtkIdType npts)
void operator()(CellStateT &state)
void operator()(CellStateT &state, const vtkIdType npts)
Remove all duplicate types from TypeList TList, storing the new list in Result.
VisitState< ArrayType32 > * Int32
VisitState< ArrayType64 > * Int64
STL-compatible iterable ranges that provide access to vtkDataArray elements.
#define VTK_SIZEHINT(...)