238 #ifndef vtkCellArray_h
239 #define vtkCellArray_h
242 #include "vtkCommonDataModelModule.h"
247 #include "vtkFeatures.h"
249 #include "vtkTypeInt32Array.h"
250 #include "vtkTypeInt64Array.h"
254 #include <initializer_list>
255 #include <type_traits>
278 #define VTK_CELL_ARRAY_V2
280 VTK_ABI_NAMESPACE_BEGIN
333 return this->AllocateExact(sz, sz) ? 1 : 0;
347 return this->AllocateExact(numCells, numCells * maxCellSize);
501 void SetData(vtkTypeInt32Array* offsets, vtkTypeInt32Array* connectivity);
502 void SetData(vtkTypeInt64Array* offsets, vtkTypeInt64Array* connectivity);
615 return this->GetOffsetsArray64();
619 return this->GetOffsetsArray32();
636 return this->GetConnectivityArray64();
640 return this->GetConnectivityArray32();
666 void InitTraversal();
759 return this->InsertNextCell(
static_cast<vtkIdType>(cell.size()), cell.begin());
780 void UpdateCellCount(
int npts);
829 return this->ReplaceCellAtId(cellId,
static_cast<vtkIdType>(cell.size()), cell.begin());
904 unsigned long GetActualMemorySize() const;
912 template <
typename ArrayT>
917 using CellRangeType = decltype(vtk::DataArrayValueRange<1>(std::declval<ArrayType>()));
950 this->Offsets->InsertNextValue(0);
953 this->IsInMemkind =
true;
957 void*
operator new(
size_t nSize)
960 #ifdef VTK_USE_MEMKIND
967 void operator delete(
void* p)
969 #ifdef VTK_USE_MEMKIND
990 bool IsInMemkind =
false;
994 template <
typename Functor,
typename... Args>
995 using GetReturnType = decltype(
998 template <
typename Functor,
typename... Args>
999 struct ReturnsVoid : std::is_same<GetReturnType<Functor, Args...>, void>
1073 template <
typename Functor,
typename... Args,
1074 typename =
typename std::enable_if<ReturnsVoid<Functor, Args...>
::value>
::type>
1075 void Visit(Functor&& functor, Args&&... args)
1093 template <
typename Functor,
typename... Args,
1094 typename =
typename std::enable_if<ReturnsVoid<Functor, Args...>
::value>
::type>
1095 void Visit(Functor&& functor, Args&&... args)
const
1113 template <
typename Functor,
typename... Args,
1114 typename =
typename std::enable_if<!ReturnsVoid<Functor, Args...>
::value>
::type>
1115 GetReturnType<Functor, Args...>
Visit(Functor&& functor, Args&&... args)
1132 template <
typename Functor,
typename... Args,
1133 typename =
typename std::enable_if<!ReturnsVoid<Functor, Args...>
::value>
::type>
1134 GetReturnType<Functor, Args...>
Visit(Functor&& functor, Args&&... args)
const
1227 VTK_EXPECTS(0 <= loc && loc < GetNumberOfConnectivityEntries());
1322 #ifdef VTK_USE_MEMKIND
1333 this->StorageIs64Bit =
true;
1338 this->StorageIs64Bit =
false;
1341 #ifdef VTK_USE_MEMKIND
1344 this->IsInMemkind =
true;
1347 (void)this->IsInMemkind;
1353 if (this->StorageIs64Bit)
1355 this->Arrays->Int64->~VisitState();
1356 delete this->Arrays->Int64;
1360 this->Arrays->Int32->~VisitState();
1361 delete this->Arrays->Int32;
1363 #ifdef VTK_USE_MEMKIND
1364 if (this->IsInMemkind)
1373 delete this->Arrays;
1381 if (!this->StorageIs64Bit)
1386 this->Arrays->Int64->~VisitState();
1387 delete this->Arrays->Int64;
1389 this->StorageIs64Bit =
false;
1398 if (this->StorageIs64Bit)
1403 this->Arrays->Int32->~VisitState();
1404 delete this->Arrays->Int32;
1406 this->StorageIs64Bit =
true;
1412 bool Is64Bit()
const {
return this->StorageIs64Bit; }
1417 assert(!this->StorageIs64Bit);
1418 return *this->Arrays->Int32;
1423 assert(!this->StorageIs64Bit);
1424 return *this->Arrays->Int32;
1430 assert(this->StorageIs64Bit);
1431 return *this->Arrays->Int64;
1436 assert(this->StorageIs64Bit);
1437 return *this->Arrays->Int64;
1443 ArraySwitch* Arrays;
1444 bool StorageIs64Bit;
1445 bool IsInMemkind =
false;
1460 template <
typename ArrayT>
1463 return this->Offsets->GetNumberOfValues() - 1;
1466 template <
typename ArrayT>
1469 return static_cast<vtkIdType>(this->Offsets->GetValue(cellId));
1472 template <
typename ArrayT>
1475 return static_cast<vtkIdType>(this->Offsets->GetValue(cellId + 1));
1478 template <
typename ArrayT>
1481 return this->GetEndOffset(cellId) - this->GetBeginOffset(cellId);
1484 template <
typename ArrayT>
1488 return vtk::DataArrayValueRange<1>(
1489 this->
GetConnectivity(), this->GetBeginOffset(cellId), this->GetEndOffset(cellId));
1491 VTK_ABI_NAMESPACE_END
1495 VTK_ABI_NAMESPACE_BEGIN
1500 template <
typename CellStateT>
1503 using ValueType =
typename CellStateT::ValueType;
1504 auto* conn = state.GetConnectivity();
1505 auto* offsets = state.GetOffsets();
1507 const vtkIdType cellId = offsets->GetNumberOfValues() - 1;
1509 offsets->InsertNextValue(
static_cast<ValueType
>(conn->GetNumberOfValues() + npts));
1513 conn->InsertNextValue(
static_cast<ValueType
>(pts[i]));
1520 template <
typename CellStateT>
1523 using ValueType =
typename CellStateT::ValueType;
1524 auto* conn = state.GetConnectivity();
1525 auto* offsets = state.GetOffsets();
1527 const vtkIdType cellId = offsets->GetNumberOfValues() - 1;
1529 offsets->InsertNextValue(
static_cast<ValueType
>(conn->GetNumberOfValues() + npts));
1538 template <
typename CellStateT>
1541 using ValueType =
typename CellStateT::ValueType;
1543 auto* offsets = state.GetOffsets();
1544 const ValueType cellBegin = offsets->GetValue(offsets->GetMaxId() - 1);
1545 offsets->SetValue(offsets->GetMaxId(),
static_cast<ValueType
>(cellBegin + npts));
1551 template <
typename CellStateT>
1554 return state.GetCellSize(cellId);
1560 template <
typename CellStateT>
1563 using ValueType =
typename CellStateT::ValueType;
1565 const vtkIdType beginOffset = state.GetBeginOffset(cellId);
1566 const vtkIdType endOffset = state.GetEndOffset(cellId);
1567 const vtkIdType cellSize = endOffset - beginOffset;
1568 const auto cellConnectivity = state.GetConnectivity()->GetPointer(beginOffset);
1573 for (ValueType i = 0; i < cellSize; ++i)
1575 idPtr[i] =
static_cast<vtkIdType>(cellConnectivity[i]);
1579 template <
typename CellStateT>
1583 using ValueType =
typename CellStateT::ValueType;
1585 const vtkIdType beginOffset = state.GetBeginOffset(cellId);
1586 const vtkIdType endOffset = state.GetEndOffset(cellId);
1587 cellSize = endOffset - beginOffset;
1588 const ValueType* cellConnectivity = state.GetConnectivity()->GetPointer(beginOffset);
1591 for (
vtkIdType i = 0; i < cellSize; ++i)
1593 cellPoints[i] =
static_cast<vtkIdType>(cellConnectivity[i]);
1599 template <
typename CellStateT>
1603 using ValueType =
typename CellStateT::ValueType;
1604 using ArrayType =
typename CellStateT::ArrayType;
1606 static constexpr
bool ValueTypeCompat = CellStateT::ValueTypeIsSameAsIdType;
1610 static constexpr
bool value = ValueTypeCompat && ArrayTypeCompat;
1613 template <
typename CellStateT>
1618 const vtkIdType beginOffset = state.GetBeginOffset(cellId);
1619 const vtkIdType endOffset = state.GetEndOffset(cellId);
1620 cellSize = endOffset - beginOffset;
1622 cellPoints =
reinterpret_cast<vtkIdType*
>(state.GetConnectivity()->GetPointer(beginOffset));
1625 template <
typename CellStateT>
1630 using ValueType =
typename CellStateT::ValueType;
1632 const vtkIdType beginOffset = state.GetBeginOffset(cellId);
1633 const vtkIdType endOffset = state.GetEndOffset(cellId);
1634 cellSize = endOffset - beginOffset;
1635 const ValueType* cellConnectivity = state.GetConnectivity()->GetPointer(beginOffset);
1640 for (
vtkIdType i = 0; i < cellSize; ++i)
1642 tempPtr[i] =
static_cast<vtkIdType>(cellConnectivity[i]);
1651 template <
typename CellStateT>
1654 state.GetOffsets()->Reset();
1655 state.GetConnectivity()->Reset();
1656 state.GetOffsets()->InsertNextValue(0);
1660 VTK_ABI_NAMESPACE_END
1663 VTK_ABI_NAMESPACE_BEGIN
1673 if (this->TraversalCellId < this->GetNumberOfCells())
1675 this->GetCellAtId(this->TraversalCellId, npts, pts);
1676 ++this->TraversalCellId;
1741 using ValueType =
typename ArrayType64::ValueType;
1746 using ValueType =
typename ArrayType32::ValueType;
1778 VTK_ABI_NAMESPACE_END
abstract object to represent cell connectivity
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.
virtual vtkIdType GetCellSize(vtkIdType cellId) const =0
Return the size of the cell at cellId.
Encapsulate traversal logic for vtkCellArray.
object to represent cell connectivity
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)
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.
ArrayType32 * GetOffsetsArray32()
Return the array used to store cell offsets.
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.
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.
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 * GetOffsetsArray64()
Return the array used to store cell offsets.
vtkIdType GetNumberOfConnectivityIds() const override
Get the size of the connectivity array that stores the point ids.
void SetData(vtkAOSDataArrayTemplate< long long > *offsets, vtkAOSDataArrayTemplate< long long > *connectivity)
Set the internal data arrays to the supplied offsets and connectivity arrays.
GetReturnType< Functor, Args... > Visit(Functor &&functor, Args &&... args)
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.
bool AllocateEstimate(vtkIdType numCells, vtkIdType maxCellSize)
Pre-allocate memory in internal data structures.
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.
void InsertCellPoint(vtkIdType id)
Used in conjunction with InsertNextCell(npts) to add another point to the list of cells.
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.
static vtkCellArray * New()
Standard methods for instantiation, type information, and printing.
ArrayType32 * GetConnectivityArray32()
Return the array used to store the point ids that define the cells' connectivity.
ArrayType64 * GetConnectivityArray64()
Return the array used to store the point ids that define the cells' connectivity.
bool ConvertTo32BitStorage()
Convert internal data structures to use 32- or 64-bit storage.
void Visit(Functor &&functor, Args &&... args) const
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.
typename vtkTypeList::Unique< vtkTypeList::Create< vtkAOSDataArrayTemplate< int >, vtkAOSDataArrayTemplate< long >, vtkAOSDataArrayTemplate< long long > >>::Result InputArrayList
List of possible ArrayTypes that are compatible with internal storage.
vtkDataArray * GetConnectivityArray()
Return the array used to store the point ids that define the cells' connectivity.
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.
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.
vtkCellArrayIterator * NewIterator()
NewIterator returns a new instance of vtkCellArrayIterator that is initialized to point at the first ...
void UpdateCellCount(int npts)
Used in conjunction with InsertNextCell(int npts) and InsertCellPoint() to update the number of point...
void GetCellAtId(vtkIdType cellId, vtkIdType &cellSize, vtkIdType const *&cellPoints)
Return the point ids for the cell at cellId.
GetReturnType< Functor, Args... > Visit(Functor &&functor, Args &&... args) const
vtkIdType GetSize()
Get the size of the allocated connectivity array.
vtkDataArray * GetOffsetsArray()
Return the array used to store cell offsets.
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.
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.
abstract superclass for arrays of numeric data
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
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...
static vtkSmartPointer< T > New()
Create an instance of a VTK object.
vtkSmartPointer< vtkDataArray > GetData(const Ioss::GroupingEntity *entity, const std::string &fieldname, Ioss::Transform *transform=nullptr, Cache *cache=nullptr, const std::string &cachekey=std::string())
Returns a VTK array for a given field (fieldname) on the chosen block (or set) entity.
vtkSmartPointer< vtkCellArray > GetConnectivity(Ioss::GroupingEntity *group_entity, int &vtk_topology_type, Cache *cache=nullptr)
Read connectivity information from the group_entity.
VisitState< ArrayType32 > & GetArrays32()
const VisitState< ArrayType64 > & GetArrays64() const
const VisitState< ArrayType32 > & GetArrays32() const
VisitState< ArrayType64 > & GetArrays64()
vtkIdType GetNumberOfCells() const
vtkIdType GetEndOffset(vtkIdType cellId) const
vtkSmartPointer< ArrayType > Offsets
vtkSmartPointer< ArrayType > Connectivity
ArrayType * GetConnectivity()
decltype(vtk::DataArrayValueRange< 1 >(std::declval< ArrayType >())) CellRangeType
CellRangeType GetCellRange(vtkIdType cellId)
const ArrayType * GetOffsets() const
vtkIdType GetBeginOffset(vtkIdType cellId) const
vtkIdType GetCellSize(vtkIdType cellId) const
const ArrayType * GetConnectivity() const
typename ArrayType::ValueType ValueType
void operator()(CellStateT &state, const vtkIdType cellId, vtkIdList *ids)
void operator()(CellStateT &state, const vtkIdType cellId, vtkIdType &cellSize, vtkIdType *cellPoints)
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))
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.
#define VTK_SIZEHINT(...)