59#ifndef vtkCellTypeSides_h
60#define vtkCellTypeSides_h
102VTK_ABI_NAMESPACE_BEGIN
111 [&maximum](
auto traits)
113 using Traits =
decltype(traits);
114 if constexpr (Traits::HasFixedSize)
116 maximum = std::max({ maximum, Traits::MaximumEdgeSize, Traits::MaximumFaceSize });
170template <
int CellType>
175 std::array<std::array<std::uint8_t, Traits::MaximumEdgeSize>, Traits::NumberOfEdges>
Edges{};
176 std::array<std::uint8_t, Traits::NumberOfEdges>
EdgeSizes{};
178 std::array<std::uint8_t, Traits::NumberOfEdges>
EdgeTypes{};
179 std::array<std::array<std::uint8_t, Traits::MaximumFaceSize>, Traits::NumberOfFaces>
Faces{};
180 std::array<std::uint8_t, Traits::NumberOfFaces>
FaceSizes{};
182 std::array<std::uint8_t, Traits::NumberOfFaces>
FaceTypes{};
186 if constexpr (Traits::NumberOfEdges > 0)
188 for (
int e = 0; e < Traits::NumberOfEdges; ++e)
190 SetRow(CellClass::GetEdgeArray(e), Traits::MaximumEdgeSize, this->Edges[e].data(),
191 this->EdgeSizes[e], this->EdgeCorners[e], this->EdgeTypes[e]);
194 if constexpr (Traits::NumberOfFaces > 0)
196 for (
int f = 0; f < Traits::NumberOfFaces; ++f)
198 SetRow(CellClass::GetFaceArray(f), Traits::MaximumFaceSize, this->Faces[f].data(),
199 this->FaceSizes[f], this->FaceCorners[f], this->FaceTypes[f]);
202 std::swap(this->Faces[f][2], this->Faces[f][3]);
208 static void SetRow(
const vtkIdType* row,
int maxSize, std::uint8_t* side, std::uint8_t& size,
209 std::uint8_t& corners, std::uint8_t& type)
212 for (; n < maxSize && row[n] >= 0; ++n)
214 side[n] =
static_cast<std::uint8_t
>(row[n]);
217 while (c < n && row[c] < Traits::NumberOfCorners)
221 size =
static_cast<std::uint8_t
>(n);
222 corners =
static_cast<std::uint8_t
>(c);
231template <
int CellType>
235 static_assert(Traits::HasFixedSize,
"only the cell types of a fixed size have static tables");
236 static_assert((Traits::NumberOfEdges > 0) == (Traits::Dimension >= 2) &&
237 (Traits::NumberOfFaces > 0) == (Traits::Dimension == 3),
238 "the cells have edges if they are 2D or 3D, and faces if they are 3D");
245 static constexpr int GetDimension(
unsigned char) {
return Traits::Dimension; }
247 template <
class DataSetT>
254 return Traits::NumberOfPoints;
256 return Traits::NumberOfEdges;
259 return Traits::NumberOfFaces;
270 if constexpr (Traits::Dimension >= 2)
272 return Tables.EdgeTypes[sideId];
280 if constexpr (Traits::Dimension == 3)
282 return Tables.FaceTypes[sideId];
295 if constexpr (Traits::MinimumEdgeSize == Traits::MaximumEdgeSize)
297 return Traits::MaximumEdgeSize;
301 return Tables.EdgeSizes[edge];
306 if constexpr (Traits::MinimumFaceSize == Traits::MaximumFaceSize)
308 return Traits::MaximumFaceSize;
312 return Tables.FaceSizes[face];
323 return Tables.FaceCorners[face];
327 template <
class DataSetT>
336 if constexpr (Traits::Dimension >= 2)
346 if constexpr (Traits::Dimension == 3)
357 template <
class DataSetT,
class Po
intsIterator>
366 ptIds[0] =
static_cast<vtkIdType>(pts[sideId]);
367 return numCorners = 1;
369 if constexpr (Traits::Dimension >= 2)
371 const auto& edge =
Tables.Edges[sideId];
373 for (
int k = 0; k < numEdgePts; ++k)
375 ptIds[k] =
static_cast<vtkIdType>(pts[edge[k]]);
382 return numCorners = 0;
386 if constexpr (Traits::Dimension == 3)
388 const auto& face =
Tables.Faces[sideId];
390 for (
int k = 0; k < numFacePts; ++k)
392 ptIds[k] =
static_cast<vtkIdType>(pts[face[k]]);
399 return numCorners = 0;
408template <
int CellType>
413 "only the cell types whose only sides are their vertices");
418 static constexpr int GetDimension(
unsigned char) {
return Traits::Dimension; }
420 template <
class DataSetT>
424 return sideDim == 0 ?
static_cast<int>(npts) : 0;
432 template <
class DataSetT>
436 return sideDim == 0 ? 1 : 0;
439 template <
class DataSetT,
class Po
intsIterator>
447 return numCorners = 0;
449 ptIds[0] =
static_cast<vtkIdType>(pts[sideId]);
450 return numCorners = 1;
466 template <
class DataSetT>
470 return sideDim < 2 ? static_cast<int>(npts) : 0;
487 template <
class DataSetT>
503 template <
class DataSetT,
class Po
intsIterator>
512 ptIds[0] =
static_cast<vtkIdType>(pts[sideId]);
513 return numCorners = 1;
525 else if (sideId == npts - 1)
530 ptIds[0] =
static_cast<vtkIdType>(pts[first]);
531 ptIds[1] =
static_cast<vtkIdType>(pts[second]);
532 return numCorners = 2;
536 return numCorners = 0;
546template <
bool Quadratic>
558 return Quadratic ? npts / 2 : npts;
561 template <
class DataSetT>
591 template <
class DataSetT>
600 return Quadratic ? 3 : 2;
607 template <
class DataSetT,
class Po
intsIterator>
616 ptIds[0] =
static_cast<vtkIdType>(pts[sideId]);
617 return numCorners = 1;
621 ptIds[0] =
static_cast<vtkIdType>(pts[sideId]);
622 ptIds[1] =
static_cast<vtkIdType>(pts[(sideId + 1) % n]);
624 if constexpr (Quadratic)
626 ptIds[2] =
static_cast<vtkIdType>(pts[sideId + n]);
636 return numCorners = 0;
668 return numSidePts / 2;
677template <
class DataSetT>
684 input->GetCell(cellId, cell);
702template <
class DataSetT>
711 return numCorners = 0;
713 sidePts->
DeepCopy(side->GetPointIds());
731 template <
class DataSetT>
738 return static_cast<int>(npts);
745 input->GetCell(cellId, cell);
765 template <
class DataSetT>
781 template <
class DataSetT,
class Po
intsIterator>
790 ptIds[0] =
static_cast<vtkIdType>(pts[sideId]);
791 return numCorners = 1;
793 return numCorners = 0;
816 template <
class DataSetT>
820 if constexpr (!std::is_same_v<DataSetT, vtkUnstructuredGrid>)
829 return static_cast<int>(npts);
831 return static_cast<int>(
832 input->GetPolyhedronCellArray()->GetCellNumberOfFacePoints(cellId) / 2);
835 return input->GetPolyhedronCellArray()->GetCellNumberOfFaces(cellId);
854 template <
class DataSetT>
858 if constexpr (!std::is_same_v<DataSetT, vtkUnstructuredGrid>)
872 return static_cast<int>(input->GetPolyhedronCellArray()->GetFaceSize(cellId, sideId));
877 template <
class DataSetT,
class Po
intsIterator>
882 if constexpr (!std::is_same_v<DataSetT, vtkUnstructuredGrid>)
884 return numCorners = 0;
892 ptIds[0] =
static_cast<vtkIdType>(pts[sideId]);
893 return numCorners = 1;
897 input, cellId, sideDim, sideId, sidePts, ids, numCorners, cell);
902 input->GetPolyhedronCellArray()->GetFacePoints(cellId, sideId, numFacePts, ids, sidePts);
903 return numCorners = numFacePts;
913template <
class DataSetT>
918 return side ?
static_cast<int>(side->GetNumberOfPoints()) : 0;
931template <
int CellType>
935 static_assert(!Traits::IsLinear && !Traits::HasFixedSize && Traits::NumberOfCorners > 0,
936 "only the higher order cell types, whose corners, edges and faces are known");
948 static constexpr int GetDimension(
unsigned char) {
return Traits::Dimension; }
950 template <
class DataSetT>
957 return static_cast<int>(npts);
959 return Traits::NumberOfEdges;
962 return Traits::NumberOfFaces;
966 static constexpr int GetSideType(
unsigned char,
int sideDim,
int sideId)
976 if constexpr (Traits::Dimension < 3)
993 template <
class DataSetT>
1000 template <
class DataSetT,
class Po
intsIterator>
1008 ptIds[0] =
static_cast<vtkIdType>(pts[sideId]);
1009 return numCorners = 1;
1018template <
class S
ides>
1025template <
class Functor>
1027 unsigned char cellType, Functor&& functor)
1123 "DispatchNonLinearCellSides() dispatches only nonlinear cell types");
1131 std::array<int, VTK_NUMBER_OF_CELL_TYPES> dimensions{};
1135 using Traits =
decltype(traits);
1136 dimensions[Traits::CellType] = Traits::Dimension;
1155 template <
class DataSetT>
1160 {
return sides.GetNumberOfSides(input, cellId, cellType, sideDim, npts, cell); });
1163 static VTK_NEVER_INLINE
int GetSideType(
unsigned char cellType,
int sideDim,
int sideId)
1166 {
return sides.GetSideType(cellType, sideDim, sideId); });
1169 template <
class DataSetT>
1174 {
return sides.GetSideSize(input, cellId, cellType, sideDim, sideId, cell); });
1177 template <
class DataSetT,
class Po
intsIterator>
1186 ptIds[0] =
static_cast<vtkIdType>(pts[sideId]);
1187 return numCorners = 1;
1192 [&](
auto sides) VTK_ALWAYS_INLINE_LAMBDA
1194 return sides.GetSidePoints(input, cellId, cellType, sideDim, sideId, npts, pts, ptIds,
1195 sidePts, ids, numCorners, cell);
1209template <
class Functor>
1211 unsigned char cellType, Functor&& functor)
1304 "DispatchCellSides() dispatches only the linear cell types to their classes, the others to "
1305 "NonLinearCellSides");
1313template <
class DataSetT>
1318 [&](
auto sides) VTK_ALWAYS_INLINE_LAMBDA
1320 if (
VTK_UNLIKELY(sideDim < 0 || sideDim >= sides.GetDimension(cellType)))
1325 if constexpr (
decltype(sides)::UsesNumberOfPoints)
1327 npts = input->GetCellSize(cellId);
1329 return sides.GetNumberOfSides(input, cellId, cellType, sideDim, npts, cell);
1343 [&](
auto sides) VTK_ALWAYS_INLINE_LAMBDA
1345 return VTK_LIKELY(sideDim >= 0 && sideDim < sides.GetDimension(cellType))
1346 ? sides.GetSideType(cellType, sideDim, sideId)
1357template <
class DataSetT>
1362 [&](
auto sides) VTK_ALWAYS_INLINE_LAMBDA
1364 return VTK_LIKELY(sideDim >= 0 && sideDim < sides.GetDimension(cellType))
1365 ? sides.GetSideSize(input, cellId, cellType, sideDim, sideId, cell)
1376template <
class DataSetT>
1382 [&](
auto sides) VTK_ALWAYS_INLINE_LAMBDA
1384 if (
VTK_UNLIKELY(sideDim < 0 || sideDim >= sides.GetDimension(cellType) || sideId < 0 ||
1385 sideId >= sides.GetNumberOfSides(input, cellId, cellType, sideDim, npts, cell)))
1397 const vtkIdType numSidePts = sides.GetSidePoints(input, cellId, cellType, sideDim, sideId,
1398 npts, pts, ptIds, sidePtIds, ids, numCorners, cell);
1402 std::copy_n(ids, numSidePts, sidePtIds->
GetPointer(0));
1410 const vtkIdType numSidePts = sides.GetSidePoints(input, cellId, cellType, sideDim, sideId,
1411 npts, pts, sidePtIds->
GetPointer(0), sidePtIds, ids, numCorners, cell);
1417VTK_ABI_NAMESPACE_END
abstract class to specify cell behavior
vtkIdType GetCellId()
Get the cell id of this cell from its originating vtkDataSet.
provides thread-safe access to cells
vtkCell * GetFace(int faceId) override
See the vtkCell API for descriptions of these methods.
int GetNumberOfFaces() override
See the vtkCell API for descriptions of these methods.
vtkCell * GetEdge(int edgeId) override
See the vtkCell API for descriptions of these methods.
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.
void DeepCopy(vtkIdList *ids)
Copy an id list by explicitly copying the internal array.
vtkIdType * GetPointer(vtkIdType i)
Get a pointer to a particular data index.
constexpr int GetMaximumCellSidePoints()
VTK_ALWAYS_INLINE constexpr decltype(auto) DispatchNonLinearCellSides(unsigned char cellType, Functor &&functor)
vtkCell * GetGenericSide(DataSetT *input, vtkIdType cellId, int sideDim, int sideId, vtkGenericCell *cell)
constexpr std::array< int, VTK_NUMBER_OF_CELL_TYPES > Dimensions
constexpr int GetFixedSizeSideType(int numPts, int numCorners)
int GetCellSideType(unsigned char cellType, int sideDim, int sideId)
constexpr Sides CellSidesInstance
VTK_ALWAYS_INLINE constexpr decltype(auto) DispatchCellSides(unsigned char cellType, Functor &&functor)
VTK_NEVER_INLINE vtkIdType GetGenericSidePoints(DataSetT *input, vtkIdType cellId, int sideDim, int sideId, vtkIdList *sidePts, const vtkIdType *&ids, vtkIdType &numCorners, vtkGenericCell *cell)
constexpr vtkIdType GetNumberOfSideCorners(int sideType, vtkIdType numSidePts)
constexpr int MaximumCellSidePoints
VTK_NEVER_INLINE int GetGenericSideSize(DataSetT *input, vtkIdType cellId, int sideDim, int sideId, vtkGenericCell *cell)
int GetCellSideSize(DataSetT *input, vtkIdType cellId, unsigned char cellType, int sideDim, int sideId, vtkGenericCell *cell)
constexpr std::array< int, VTK_NUMBER_OF_CELL_TYPES > GetDimensions()
VTK_ALWAYS_INLINE void GetCellSidePoints(DataSetT *input, vtkIdType cellId, unsigned char cellType, int sideDim, int sideId, vtkIdType npts, const vtkIdType *pts, vtkIdList *sidePtIds, vtkGenericCell *cell)
int GetCellNumberOfSides(DataSetT *input, vtkIdType cellId, unsigned char cellType, int sideDim, vtkGenericCell *cell)
static constexpr int MaximumFaceCorners
static constexpr bool UsesNumberOfPoints
static constexpr int GetSideType(unsigned char, int sideDim, int)
static constexpr int GetNumberOfSides(DataSetT *input, vtkIdType cellId, unsigned char, int sideDim, vtkIdType npts, vtkGenericCell *cell)
static constexpr int GetDimension(unsigned char)
static constexpr int MinimumFaceCorners
static constexpr int GetSideSize(DataSetT *, vtkIdType, unsigned char, int sideDim, int, vtkGenericCell *)
static vtkIdType GetSidePoints(DataSetT *input, vtkIdType cellId, unsigned char, int sideDim, int sideId, vtkIdType, PointsIterator pts, vtkIdType *ptIds, vtkIdList *sidePts, const vtkIdType *&ids, vtkIdType &numCorners, vtkGenericCell *cell)
std::array< std::uint8_t, Traits::NumberOfEdges > EdgeSizes
vtkCellTypeTraits< CellType > Traits
static void SetRow(const vtkIdType *row, int maxSize, std::uint8_t *side, std::uint8_t &size, std::uint8_t &corners, std::uint8_t &type)
typename Traits::CellClass CellClass
std::array< std::uint8_t, Traits::NumberOfFaces > FaceSizes
std::array< std::array< std::uint8_t, Traits::MaximumFaceSize >, Traits::NumberOfFaces > Faces
FixedSizeCellSideTables()
std::array< std::uint8_t, Traits::NumberOfFaces > FaceTypes
std::array< std::uint8_t, Traits::NumberOfFaces > FaceCorners
std::array< std::array< std::uint8_t, Traits::MaximumEdgeSize >, Traits::NumberOfEdges > Edges
std::array< std::uint8_t, Traits::NumberOfEdges > EdgeTypes
std::array< std::uint8_t, Traits::NumberOfEdges > EdgeCorners
static vtkIdType GetSidePoints(DataSetT *, vtkIdType, unsigned char, int sideDim, int sideId, vtkIdType, PointsIterator pts, vtkIdType *ptIds, vtkIdList *, const vtkIdType *&ids, vtkIdType &numCorners, vtkGenericCell *)
static constexpr int MaximumFaceCorners
static VTK_ALWAYS_INLINE int GetEdgeSize(int edge)
static VTK_ALWAYS_INLINE int GetFaceSize(int face)
static int GetSideSize(DataSetT *, vtkIdType, unsigned char, int sideDim, int sideId, vtkGenericCell *)
static constexpr bool UsesNumberOfPoints
static int GetSideType(unsigned char, int sideDim, int sideId)
static constexpr int GetDimension(unsigned char)
static VTK_ALWAYS_INLINE int GetFaceCorners(int face)
static constexpr int GetNumberOfSides(DataSetT *, vtkIdType, unsigned char, int sideDim, vtkIdType, vtkGenericCell *)
static constexpr int MinimumFaceCorners
vtkCellTypeTraits< CellType > Traits
static const FixedSizeCellSideTables< CellType > Tables
static constexpr int TriangleType
static vtkIdType GetSidePoints(DataSetT *input, vtkIdType cellId, unsigned char, int sideDim, int sideId, vtkIdType, PointsIterator pts, vtkIdType *ptIds, vtkIdList *sidePts, const vtkIdType *&ids, vtkIdType &numCorners, vtkGenericCell *cell)
static constexpr int GetSideType(unsigned char, int sideDim, int sideId)
vtkCellTypeTraits< CellType > Traits
static constexpr bool IsBezier
static constexpr int GetDimension(unsigned char)
static int GetSideSize(DataSetT *input, vtkIdType cellId, unsigned char, int sideDim, int sideId, vtkGenericCell *cell)
static constexpr int QuadrilateralType
static constexpr int CurveType
static constexpr int MaximumFaceCorners
static constexpr bool UsesNumberOfPoints
static constexpr int MinimumFaceCorners
static constexpr int GetNumberOfSides(DataSetT *, vtkIdType, unsigned char, int sideDim, vtkIdType npts, vtkGenericCell *)
static constexpr int GetDimension(unsigned char cellType)
static VTK_NEVER_INLINE int GetSideType(unsigned char cellType, int sideDim, int sideId)
static constexpr int MinimumFaceCorners
static VTK_NEVER_INLINE int GetSideSize(DataSetT *input, vtkIdType cellId, unsigned char cellType, int sideDim, int sideId, vtkGenericCell *cell)
static constexpr bool UsesNumberOfPoints
static VTK_NEVER_INLINE int GetNumberOfSides(DataSetT *input, vtkIdType cellId, unsigned char cellType, int sideDim, vtkIdType npts, vtkGenericCell *cell)
static vtkIdType GetSidePoints(DataSetT *input, vtkIdType cellId, unsigned char cellType, int sideDim, int sideId, vtkIdType npts, PointsIterator pts, vtkIdType *ptIds, vtkIdList *sidePts, const vtkIdType *&ids, vtkIdType &numCorners, vtkGenericCell *cell)
static constexpr int MaximumFaceCorners
static vtkIdType GetSidePoints(DataSetT *, vtkIdType, unsigned char, int sideDim, int sideId, vtkIdType, PointsIterator pts, vtkIdType *ptIds, vtkIdList *, const vtkIdType *&ids, vtkIdType &numCorners, vtkGenericCell *)
static constexpr int GetSideType(unsigned char, int sideDim, int)
vtkCellTypeTraits< CellType > Traits
static constexpr int MaximumFaceCorners
static constexpr int MinimumFaceCorners
static constexpr int GetSideSize(DataSetT *, vtkIdType, unsigned char, int sideDim, int, vtkGenericCell *)
static constexpr int GetNumberOfSides(DataSetT *, vtkIdType, unsigned char, int sideDim, vtkIdType npts, vtkGenericCell *)
static constexpr int GetDimension(unsigned char)
static constexpr bool UsesNumberOfPoints
static constexpr bool UsesNumberOfPoints
static vtkIdType GetSidePoints(DataSetT *, vtkIdType, unsigned char, int sideDim, int sideId, vtkIdType npts, PointsIterator pts, vtkIdType *ptIds, vtkIdList *, const vtkIdType *&ids, vtkIdType &numCorners, vtkGenericCell *)
static constexpr int MinimumFaceCorners
static constexpr int MaximumFaceCorners
static constexpr int GetDimension(unsigned char)
static constexpr int GetSideType(unsigned char, int sideDim, int)
static constexpr int GetNumberOfSides(DataSetT *, vtkIdType, unsigned char, int sideDim, vtkIdType npts, vtkGenericCell *)
static constexpr vtkIdType GetNumberOfCorners(vtkIdType npts)
static constexpr int GetSideSize(DataSetT *, vtkIdType, unsigned char, int sideDim, int, vtkGenericCell *)
static int GetSideSize(DataSetT *input, vtkIdType cellId, unsigned char, int sideDim, int sideId, vtkGenericCell *)
static vtkIdType GetSidePoints(DataSetT *input, vtkIdType cellId, unsigned char, int sideDim, int sideId, vtkIdType, PointsIterator pts, vtkIdType *ptIds, vtkIdList *sidePts, const vtkIdType *&ids, vtkIdType &numCorners, vtkGenericCell *cell)
static constexpr int MaximumFaceCorners
static constexpr int GetSideType(unsigned char, int sideDim, int)
static int GetNumberOfSides(DataSetT *input, vtkIdType cellId, unsigned char, int sideDim, vtkIdType npts, vtkGenericCell *)
static constexpr bool UsesNumberOfPoints
static constexpr int GetDimension(unsigned char)
static constexpr int MinimumFaceCorners
static vtkIdType GetSidePoints(DataSetT *, vtkIdType, unsigned char, int sideDim, int sideId, vtkIdType npts, PointsIterator pts, vtkIdType *ptIds, vtkIdList *, const vtkIdType *&ids, vtkIdType &numCorners, vtkGenericCell *)
static constexpr int GetSideType(unsigned char, int sideDim, int)
static constexpr bool UsesNumberOfPoints
static constexpr int MaximumFaceCorners
static constexpr int GetNumberOfSides(DataSetT *, vtkIdType, unsigned char, int sideDim, vtkIdType npts, vtkGenericCell *)
static constexpr int MinimumFaceCorners
static constexpr int GetDimension(unsigned char)
static constexpr int GetSideSize(DataSetT *, vtkIdType, unsigned char, int sideDim, int, vtkGenericCell *)
The traits of the cell type CellType, see the file description.
#define VTK_LIKELY(cond)
Hint that cond is expected to be true most of the time.
#define VTK_UNLIKELY(cond)
Hint that cond is expected to be false most of the time.
The metadata of the cell types of vtkCellType.h, known at compile time.
constexpr void vtkForEachCellType(Functor &&functor)
Call functor(vtkCellTypeTraits<CellType>{}) for every cell type with traits, in the order of vtkCellT...
@ VTK_QUADRATIC_HEXAHEDRON
@ VTK_BIQUADRATIC_QUADRATIC_HEXAHEDRON
@ VTK_LAGRANGE_QUADRILATERAL
@ VTK_TRIQUADRATIC_PYRAMID
@ VTK_TRIQUADRATIC_HEXAHEDRON
@ VTK_LAGRANGE_HEXAHEDRON
@ VTK_HIGHER_ORDER_TRIANGLE
@ VTK_LAGRANGE_TETRAHEDRON
@ VTK_BEZIER_QUADRILATERAL
@ VTK_QUADRATIC_LINEAR_WEDGE
@ VTK_HIGHER_ORDER_QUADRILATERAL
@ VTK_QUADRATIC_LINEAR_QUAD
@ VTK_BIQUADRATIC_QUADRATIC_WEDGE
@ VTK_BIQUADRATIC_TRIANGLE
@ Sides
A side specified by a cell ID and an integer index into sides.