129#ifndef vtkCellArray_h
130#define vtkCellArray_h
133#include "vtkCommonDataModelModule.h"
139#include "vtkFeatures.h"
141#include "vtkTypeInt32Array.h"
142#include "vtkTypeInt64Array.h"
146#include <initializer_list>
147#include <type_traits>
170#define VTK_CELL_ARRAY_V2
172VTK_ABI_NAMESPACE_BEGIN
239 return this->
AllocateExact(numCells, numCells * maxCellSize);
408 void SetData(vtkTypeInt32Array* offsets, vtkTypeInt32Array* connectivity);
409 void SetData(vtkTypeInt64Array* offsets, vtkTypeInt64Array* connectivity);
694 void UpdateCellCount(
int npts);
826 template <
typename ArrayT>
864 this->
Offsets->InsertNextValue(0);
867 this->IsInMemkind =
true;
871 void*
operator new(
size_t nSize)
874#ifdef VTK_USE_MEMKIND
881 void operator delete(
void* p)
883#ifdef VTK_USE_MEMKIND
904 bool IsInMemkind =
false;
908 template <
typename Functor,
typename... Args>
909 using GetReturnType =
decltype(std::declval<Functor>()(
910 std::declval<VisitState<ArrayType32>&>(), std::declval<Args>()...));
912 template <
typename Functor,
typename... Args>
913 struct ReturnsVoid : std::is_same<GetReturnType<Functor, Args...>, void>
987 template <
typename Functor,
typename... Args,
988 typename =
typename std::enable_if<ReturnsVoid<Functor, Args...>::value>::type>
989 void Visit(Functor&& functor, Args&&... args)
1007 template <
typename Functor,
typename... Args,
1008 typename =
typename std::enable_if<ReturnsVoid<Functor, Args...>::value>::type>
1009 void Visit(Functor&& functor, Args&&... args)
const
1027 template <
typename Functor,
typename... Args,
1028 typename =
typename std::enable_if<!ReturnsVoid<Functor, Args...>::value>::type>
1029 GetReturnType<Functor, Args...>
Visit(Functor&& functor, Args&&... args)
1046 template <
typename Functor,
typename... Args,
1047 typename =
typename std::enable_if<!ReturnsVoid<Functor, Args...>::value>::type>
1048 GetReturnType<Functor, Args...>
Visit(Functor&& functor, Args&&... args)
const
1237#ifdef VTK_USE_MEMKIND
1248 this->StorageIs64Bit =
true;
1253 this->StorageIs64Bit =
false;
1256#ifdef VTK_USE_MEMKIND
1259 this->IsInMemkind =
true;
1262 (void)this->IsInMemkind;
1268 if (this->StorageIs64Bit)
1270 this->Arrays->Int64->~VisitState();
1271 delete this->Arrays->Int64;
1275 this->Arrays->Int32->~VisitState();
1276 delete this->Arrays->Int32;
1278#ifdef VTK_USE_MEMKIND
1279 if (this->IsInMemkind)
1288 delete this->Arrays;
1296 if (!this->StorageIs64Bit)
1301 this->Arrays->Int64->~VisitState();
1302 delete this->Arrays->Int64;
1304 this->StorageIs64Bit =
false;
1313 if (this->StorageIs64Bit)
1318 this->Arrays->Int32->~VisitState();
1319 delete this->Arrays->Int32;
1321 this->StorageIs64Bit =
true;
1327 bool Is64Bit()
const {
return this->StorageIs64Bit; }
1332 assert(!this->StorageIs64Bit);
1333 return *this->Arrays->Int32;
1338 assert(!this->StorageIs64Bit);
1339 return *this->Arrays->Int32;
1345 assert(this->StorageIs64Bit);
1346 return *this->Arrays->Int64;
1351 assert(this->StorageIs64Bit);
1352 return *this->Arrays->Int64;
1358 ArraySwitch* Arrays;
1359 bool StorageIs64Bit;
1360 bool IsInMemkind =
false;
1375template <
typename ArrayT>
1378 return this->
Offsets->GetNumberOfValues() - 1;
1381template <
typename ArrayT>
1387template <
typename ArrayT>
1393template <
typename ArrayT>
1399template <
typename ArrayT>
1406VTK_ABI_NAMESPACE_END
1410VTK_ABI_NAMESPACE_BEGIN
1415 template <
typename CellStateT>
1418 using ValueType =
typename CellStateT::ValueType;
1419 auto* conn = state.GetConnectivity();
1420 auto* offsets = state.GetOffsets();
1422 const vtkIdType cellId = offsets->GetNumberOfValues() - 1;
1424 offsets->InsertNextValue(
static_cast<ValueType
>(conn->GetNumberOfValues() + npts));
1428 conn->InsertNextValue(
static_cast<ValueType
>(pts[i]));
1435 template <
typename CellStateT>
1438 using ValueType =
typename CellStateT::ValueType;
1439 auto* conn = state.GetConnectivity();
1440 auto* offsets = state.GetOffsets();
1442 const vtkIdType cellId = offsets->GetNumberOfValues() - 1;
1444 offsets->InsertNextValue(
static_cast<ValueType
>(conn->GetNumberOfValues() + npts));
1453 template <
typename CellStateT>
1456 using ValueType =
typename CellStateT::ValueType;
1458 auto* offsets = state.GetOffsets();
1459 const ValueType cellBegin = offsets->GetValue(offsets->GetMaxId() - 1);
1460 offsets->SetValue(offsets->GetMaxId(),
static_cast<ValueType
>(cellBegin + npts));
1466 template <
typename CellStateT>
1469 return state.GetCellSize(cellId);
1475 template <
typename CellStateT>
1478 using ValueType =
typename CellStateT::ValueType;
1480 const vtkIdType beginOffset = state.GetBeginOffset(cellId);
1481 const vtkIdType endOffset = state.GetEndOffset(cellId);
1482 const vtkIdType cellSize = endOffset - beginOffset;
1483 const auto cellConnectivity = state.GetConnectivity()->GetPointer(beginOffset);
1488 for (ValueType i = 0; i < cellSize; ++i)
1490 idPtr[i] =
static_cast<vtkIdType>(cellConnectivity[i]);
1494 template <
typename CellStateT>
1498 using ValueType =
typename CellStateT::ValueType;
1500 const vtkIdType beginOffset = state.GetBeginOffset(cellId);
1501 const vtkIdType endOffset = state.GetEndOffset(cellId);
1502 cellSize = endOffset - beginOffset;
1503 const ValueType* cellConnectivity = state.GetConnectivity()->GetPointer(beginOffset);
1506 for (
vtkIdType i = 0; i < cellSize; ++i)
1508 cellPoints[i] =
static_cast<vtkIdType>(cellConnectivity[i]);
1514 template <
typename CellStateT>
1518 using ValueType =
typename CellStateT::ValueType;
1519 using ArrayType =
typename CellStateT::ArrayType;
1521 static constexpr bool ValueTypeCompat = CellStateT::ValueTypeIsSameAsIdType;
1522 static constexpr bool ArrayTypeCompat = std::is_base_of<AOSArrayType, ArrayType>::value;
1525 static constexpr bool value = ValueTypeCompat && ArrayTypeCompat;
1528 template <
typename CellStateT>
1529 typename std::enable_if<CanShareConnPtr<CellStateT>::value,
void>::type
operator()(
1533 const vtkIdType beginOffset = state.GetBeginOffset(cellId);
1534 const vtkIdType endOffset = state.GetEndOffset(cellId);
1535 cellSize = endOffset - beginOffset;
1537 cellPoints =
reinterpret_cast<vtkIdType*
>(state.GetConnectivity()->GetPointer(beginOffset));
1540 template <
typename CellStateT>
1541 typename std::enable_if<!CanShareConnPtr<CellStateT>::value,
void>::type
operator()(
1545 using ValueType =
typename CellStateT::ValueType;
1547 const vtkIdType beginOffset = state.GetBeginOffset(cellId);
1548 const vtkIdType endOffset = state.GetEndOffset(cellId);
1549 cellSize = endOffset - beginOffset;
1550 const ValueType* cellConnectivity = state.GetConnectivity()->GetPointer(beginOffset);
1555 for (
vtkIdType i = 0; i < cellSize; ++i)
1557 tempPtr[i] =
static_cast<vtkIdType>(cellConnectivity[i]);
1566 template <
typename CellStateT>
1570 cells.GetConnectivity()->GetValue(cells.GetBeginOffset(cellId) + cellPointIndex));
1576 template <
typename CellStateT>
1579 state.GetOffsets()->Reset();
1580 state.GetConnectivity()->Reset();
1581 state.GetOffsets()->InsertNextValue(0);
1585VTK_ABI_NAMESPACE_END
1588VTK_ABI_NAMESPACE_BEGIN
1672 using ValueType =
typename ArrayType64::ValueType;
1677 using ValueType =
typename ArrayType32::ValueType;
1709VTK_ABI_NAMESPACE_END
Array-Of-Structs implementation of vtkGenericDataArray.
virtual vtkIdType GetNumberOfCells() const =0
Get the number of cells in the array.
void GetCellAtId(vtkIdType cellId, vtkIdType &cellSize, vtkIdType const *&cellPoints)
Return the point ids for the cell at cellId.
Encapsulate traversal logic for vtkCellArray.
vtkIdType GetCellSize(vtkIdType cellId) const override
Return the size of the cell at cellId.
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 IsHomogeneous() override
Check if all cells have the same number of vertices.
vtkIdType GetOffset(vtkIdType cellId) override
Get the offset (into the connectivity) for a specified cell id.
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.
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.:
static void SetDefaultStorageIs64Bit(bool val)
Control the default internal storage size.
void DeepCopy(vtkAbstractCellArray *ca) override
Perform a deep copy (no reference counting) of the given cell array.
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 ShallowCopy(vtkAbstractCellArray *ca) override
Shallow copy ca into this cell array.
vtkIdType GetNumberOfOffsets() const override
Get the number of elements in the offsets array.
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
vtkIdType GetNumberOfCells() const override
Get the number of cells in the array.
ArrayType64 * GetConnectivityArray64()
Return the array used to store the point ids that define the cells' connectivity.
vtkIdType GetNumberOfConnectivityIds() const override
Get the size of the connectivity array that stores the point ids.
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.
vtkTypeInt64Array ArrayType64
vtkIdType TraversalCellId
bool IsStorageShareable() const override
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.
static bool DefaultStorageIs64Bit
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 GetCellAtId(vtkIdType cellId, vtkIdType &cellSize, vtkIdType const *&cellPoints, vtkIdList *ptIds) override
Return the point ids for the cell at cellId.
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.
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 Initialize() override
Free any memory and reset to an empty state.
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.
void Visit(Functor &&functor, Args &&... args) const
ArrayType64 * GetOffsetsArray64()
Return the array used to store cell offsets.
void SetOffset(vtkIdType cellId, vtkIdType offset)
Set the offset (into the connectivity) for a specified cell id.
bool ConvertToSmallestStorage()
Convert internal data structures to use 32- or 64-bit storage.
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.
vtkIdType GetCellPointAtId(vtkIdType cellId, vtkIdType cellPointIndex) const
Return the point id at cellPointIndex for the cell at cellId.
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.
static bool GetDefaultStorageIs64Bit()
Control the default internal storage size.
int GetMaxCellSize() override
Returns the size of the largest cell.
vtkIdType InsertNextCell(vtkCell *cell)
Insert a cell object.
virtual void SetNumberOfCells(vtkIdType)
Set the number of cells in the array.
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.
void ReplaceCellPointAtId(vtkIdType cellId, vtkIdType cellPointIndex, vtkIdType newPointId)
Replaces the pointId at cellPointIndex of a cell with newPointId.
vtkIdType GetSize()
Get the size of the allocated connectivity array.
vtkTypeList::Create< ArrayType32, ArrayType64 > StorageArrayList
List of possible array types used for storage.
void Append(vtkCellArray *src, vtkIdType pointOffset=0)
Append cells from src into this.
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
void SetNumberOfIds(vtkIdType number)
Specify the number of ids for this object to hold.
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(vtkIdType i)
Get a pointer to a particular data index.
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, ForceValueTypeForVtkDataArray >::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()
vtkIdType operator()(CellStateT &cells, vtkIdType cellId, vtkIdType cellPointIndex) const
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)
void operator()(CellStateT &state, const vtkIdType cellId, vtkIdType &cellSize, vtkIdType *cellPoints)
vtkIdType operator()(CellStateT &state, 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.
void Reset()
Initializes the field list to empty.
#define VTK_SIZEHINT(...)
#define VTK_MARSHALMANUAL