144#ifndef vtkCellArray_h
145#define vtkCellArray_h
147#include "vtkCommonDataModelModule.h"
153#include "vtkFeatures.h"
155#include "vtkTypeInt32Array.h"
156#include "vtkTypeInt64Array.h"
160#include <initializer_list>
161#include <type_traits>
184#define VTK_CELL_ARRAY_V2
238 return this->AllocateExact(sz, sz) ? 1 : 0;
252 return this->AllocateExact(numCells, numCells * maxCellSize);
387 void SetData(vtkTypeInt32Array* offsets, vtkTypeInt32Array* connectivity);
388 void SetData(vtkTypeInt64Array* offsets, vtkTypeInt64Array* connectivity);
507 return this->GetOffsetsArray64();
511 return this->GetOffsetsArray32();
528 return this->GetConnectivityArray64();
532 return this->GetConnectivityArray32();
558 void InitTraversal();
607 VTK_EXPECTS(0 <= cellId && cellId < GetNumberOfCells());
640 return this->InsertNextCell(
static_cast<vtkIdType>(cell.size()), cell.begin());
661 void UpdateCellCount(
int npts);
701 return this->ReplaceCellAtId(cellId,
static_cast<vtkIdType>(cell.size()), cell.begin());
776 unsigned long GetActualMemorySize() const;
784 template <
typename ArrayT>
789 using CellRangeType =
decltype(vtk::DataArrayValueRange<1>(std::declval<ArrayType>()));
822 this->Offsets->InsertNextValue(0);
825 this->IsInMemkind =
true;
829 void*
operator new(
size_t nSize)
832#ifdef VTK_USE_MEMKIND
839 void operator delete(
void* p)
841#ifdef VTK_USE_MEMKIND
862 bool IsInMemkind =
false;
866 template <
typename Functor,
typename... Args>
867 using GetReturnType =
decltype(
868 std::declval<Functor>()(std::declval<VisitState<ArrayType32>&>(), std::declval<Args>()...));
870 template <
typename Functor,
typename... Args>
871 struct ReturnsVoid : std::is_same<GetReturnType<Functor, Args...>, void>
945 template <
typename Functor,
typename... Args,
946 typename =
typename std::enable_if<ReturnsVoid<Functor, Args...>
::value>
::type>
947 void Visit(Functor&& functor, Args&&... args)
965 template <
typename Functor,
typename... Args,
966 typename =
typename std::enable_if<ReturnsVoid<Functor, Args...>
::value>
::type>
967 void Visit(Functor&& functor, Args&&... args)
const
985 template <
typename Functor,
typename... Args,
986 typename =
typename std::enable_if<!ReturnsVoid<Functor, Args...>
::value>
::type>
987 GetReturnType<Functor, Args...>
Visit(Functor&& functor, Args&&... args)
1004 template <
typename Functor,
typename... Args,
1005 typename =
typename std::enable_if<!ReturnsVoid<Functor, Args...>
::value>
::type>
1006 GetReturnType<Functor, Args...>
Visit(Functor&& functor, Args&&... args)
const
1089 VTK_EXPECTS(0 <= loc && loc < GetNumberOfConnectivityEntries());
1184#ifdef VTK_USE_MEMKIND
1192#ifdef VTK_USE_64BIT_IDS
1195 this->StorageIs64Bit =
true;
1200 this->StorageIs64Bit =
false;
1203#ifdef VTK_USE_MEMKIND
1206 this->IsInMemkind =
true;
1209 (void)this->IsInMemkind;
1215 if (this->StorageIs64Bit)
1217 this->Arrays->Int64->~VisitState();
1218 delete this->Arrays->Int64;
1222 this->Arrays->Int32->~VisitState();
1223 delete this->Arrays->Int32;
1225#ifdef VTK_USE_MEMKIND
1226 if (this->IsInMemkind)
1235 delete this->Arrays;
1243 if (!this->StorageIs64Bit)
1248 this->Arrays->Int64->~VisitState();
1249 delete this->Arrays->Int64;
1251 this->StorageIs64Bit =
false;
1260 if (this->StorageIs64Bit)
1265 this->Arrays->Int32->~VisitState();
1266 delete this->Arrays->Int32;
1268 this->StorageIs64Bit =
true;
1274 bool Is64Bit()
const {
return this->StorageIs64Bit; }
1279 assert(!this->StorageIs64Bit);
1280 return *this->Arrays->Int32;
1285 assert(!this->StorageIs64Bit);
1286 return *this->Arrays->Int32;
1292 assert(this->StorageIs64Bit);
1293 return *this->Arrays->Int64;
1298 assert(this->StorageIs64Bit);
1299 return *this->Arrays->Int64;
1305 ArraySwitch* Arrays;
1306 bool StorageIs64Bit;
1307 bool IsInMemkind =
false;
1321template <
typename ArrayT>
1324 return this->Offsets->GetNumberOfValues() - 1;
1327template <
typename ArrayT>
1330 return static_cast<vtkIdType>(this->Offsets->GetValue(cellId));
1333template <
typename ArrayT>
1336 return static_cast<vtkIdType>(this->Offsets->GetValue(cellId + 1));
1339template <
typename ArrayT>
1342 return this->GetEndOffset(cellId) - this->GetBeginOffset(cellId);
1345template <
typename ArrayT>
1349 return vtk::DataArrayValueRange<1>(
1350 this->
GetConnectivity(), this->GetBeginOffset(cellId), this->GetEndOffset(cellId));
1359 template <
typename CellStateT>
1362 using ValueType =
typename CellStateT::ValueType;
1363 auto* conn = state.GetConnectivity();
1364 auto* offsets = state.GetOffsets();
1366 const vtkIdType cellId = offsets->GetNumberOfValues() - 1;
1368 offsets->InsertNextValue(
static_cast<ValueType
>(conn->GetNumberOfValues() + npts));
1372 conn->InsertNextValue(
static_cast<ValueType
>(pts[i]));
1379 template <
typename CellStateT>
1382 using ValueType =
typename CellStateT::ValueType;
1383 auto* conn = state.GetConnectivity();
1384 auto* offsets = state.GetOffsets();
1386 const vtkIdType cellId = offsets->GetNumberOfValues() - 1;
1388 offsets->InsertNextValue(
static_cast<ValueType
>(conn->GetNumberOfValues() + npts));
1397 template <
typename CellStateT>
1400 using ValueType =
typename CellStateT::ValueType;
1402 auto* offsets = state.GetOffsets();
1403 const ValueType cellBegin = offsets->GetValue(offsets->GetMaxId() - 1);
1404 offsets->SetValue(offsets->GetMaxId(),
static_cast<ValueType
>(cellBegin + npts));
1410 template <
typename CellStateT>
1413 return state.GetCellSize(cellId);
1419 template <
typename CellStateT>
1422 using ValueType =
typename CellStateT::ValueType;
1424 const auto cellPts = state.GetCellRange(cellId);
1429 for (ValueType ptId : cellPts)
1431 *idPtr++ =
static_cast<vtkIdType>(ptId);
1437 template <
typename CellStateT>
1441 using ValueType =
typename CellStateT::ValueType;
1442 using ArrayType =
typename CellStateT::ArrayType;
1444 static constexpr bool ValueTypeCompat = CellStateT::ValueTypeIsSameAsIdType;
1448 static constexpr bool value = ValueTypeCompat && ArrayTypeCompat;
1451 template <
typename CellStateT>
1456 const vtkIdType beginOffset = state.GetBeginOffset(cellId);
1457 const vtkIdType endOffset = state.GetEndOffset(cellId);
1458 cellSize = endOffset - beginOffset;
1460 cellPoints =
reinterpret_cast<vtkIdType*
>(state.GetConnectivity()->GetPointer(beginOffset));
1463 template <
typename CellStateT>
1468 using ValueType =
typename CellStateT::ValueType;
1470 const auto cellPts = state.GetCellRange(cellId);
1471 cellSize = cellPts.size();
1477 for (ValueType ptId : cellPts)
1479 *tempPtr++ =
static_cast<vtkIdType>(ptId);
1488 template <
typename CellStateT>
1491 state.GetOffsets()->Reset();
1492 state.GetConnectivity()->Reset();
1493 state.GetOffsets()->InsertNextValue(0);
1508 if (this->TraversalCellId < this->GetNumberOfCells())
1510 this->GetCellAtId(this->TraversalCellId, npts, pts);
1511 ++this->TraversalCellId;
1570 using ValueType =
typename ArrayType64::ValueType;
1575 using ValueType =
typename ArrayType32::ValueType;
Encapsulate traversal logic for vtkCellArray.
object to represent cell connectivity
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 GetNumberOfConnectivityEntries()
Return the size of the array that would be returned from ExportLegacyFormat().
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.
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.
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...
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.
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.
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.
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 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.
typename vtkTypeList::Unique< vtkTypeList::Create< vtkAOSDataArrayTemplate< int >, vtkAOSDataArrayTemplate< long >, vtkAOSDataArrayTemplate< long long > > >::Result InputArrayList
List of possible ArrayTypes that are compatible with internal storage.
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.
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)
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.
abstract superclass for arrays of numeric data
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
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...
abstract base class for most VTK objects
static vtkSmartPointer< T > New()
Create an instance of a VTK object.
vtkSmartPointer< vtkCellArray > GetConnectivity(Ioss::GroupingEntity *group_entity, int &vtk_topology_type, Cache *cache=nullptr)
Read connectivity information from the group_entity.
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.
VisitState< ArrayType64 > & GetArrays64()
const VisitState< ArrayType64 > & GetArrays64() const
const VisitState< ArrayType32 > & GetArrays32() const
VisitState< ArrayType32 > & GetArrays32()
vtkIdType GetNumberOfCells() const
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()
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(...)