+{
+ // Number of nodes in standard element types
+ // n v f e
+ // o o a d
+ // d l c g
+ // e e e
+ // -----------
+ // 1
+ // 2 *
+ // 3 *
+ // 4 * * *
+ // 5 *
+ // 6 * *
+ // 7
+ // 8 * *
+ // 9
+ // 10 *
+ // 11
+ // 12
+ // 13 *
+ // 14
+ // 15 *
+ // 16
+ // 17
+ // 18
+ // 19
+ // 20 *
+ //
+ // So to have a unique index for each type basing on nb of nodes, we use a shift:
+ myShift.resize(SMDSAbs_Volume + 1, 0);
+ myShift[ SMDSAbs_Face ] = +8; // 3->11, 4->12, 6->14, 8->16
+ myShift[ SMDSAbs_Edge ] = -2; // 2->0, 4->2
+
+ myNb.resize( index( SMDSAbs_Volume,20 ) + 1, NULL);
+ myNb[ index( SMDSAbs_Node,1 )] = & myNbNodes;
+
+ myNb[ index( SMDSAbs_Edge,2 )] = & myNbEdges;
+ myNb[ index( SMDSAbs_Edge,4 )] = & myNbQuadEdges;
+
+ myNb[ index( SMDSAbs_Face,3 )] = & myNbTriangles;
+ myNb[ index( SMDSAbs_Face,4 )] = & myNbQuadrangles;
+ myNb[ index( SMDSAbs_Face,6 )] = & myNbQuadTriangles;
+ myNb[ index( SMDSAbs_Face,8 )] = & myNbQuadQuadrangles;
+
+ myNb[ index( SMDSAbs_Volume, 4)] = & myNbTetras;
+ myNb[ index( SMDSAbs_Volume, 5)] = & myNbPyramids;
+ myNb[ index( SMDSAbs_Volume, 6)] = & myNbPrisms;
+ myNb[ index( SMDSAbs_Volume, 8)] = & myNbHexas;
+ myNb[ index( SMDSAbs_Volume, 10)] = & myNbQuadTetras;
+ myNb[ index( SMDSAbs_Volume, 13)] = & myNbQuadPyramids;
+ myNb[ index( SMDSAbs_Volume, 15)] = & myNbQuadPrisms;
+ myNb[ index( SMDSAbs_Volume, 20)] = & myNbQuadHexas;
+}
+
+inline int // index
+SMDS_MeshInfo::index(SMDSAbs_ElementType type, int nbNodes)
+{ return nbNodes + myShift[ type ]; }
+
+inline void // remove
+SMDS_MeshInfo::remove(const SMDS_MeshElement* el)
+{ --(*myNb[ index(el->GetType(), el->NbNodes()) ]); }
+
+inline void // add
+SMDS_MeshInfo::add(const SMDS_MeshElement* el)
+{ ++(*myNb[ index(el->GetType(), el->NbNodes()) ]); }
+
+inline void // RemoveEdge
+SMDS_MeshInfo::RemoveEdge(const SMDS_MeshElement* el)
+{ if ( el->IsQuadratic() ) --myNbQuadEdges; else --myNbEdges; }
+
+inline void // RemoveFace
+SMDS_MeshInfo::RemoveFace(const SMDS_MeshElement* el)
+{ if ( el->IsPoly() ) --myNbPolygons; else remove( el ); }
+
+inline void // RemoveVolume
+SMDS_MeshInfo::RemoveVolume(const SMDS_MeshElement* el)
+{ if ( el->IsPoly() ) --myNbPolyhedrons; else remove( el ); }