Salome HOME
23414: EDF 14228 - Viscous Layer crashes SALOME
[modules/smesh.git] / src / SMDS / SMDS_MeshElement.hxx
index a8a3ad4224f038efcf96ad34d21b539b19eb4c58..620e4d82df2bc5e80ff00d21f3b8250bfc0475c5 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2013  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2016  CEA/DEN, EDF R&D, OPEN CASCADE
 //
 // Copyright (C) 2003-2007  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
 // CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS
@@ -6,7 +6,7 @@
 // This library is free software; you can redistribute it and/or
 // modify it under the terms of the GNU Lesser General Public
 // License as published by the Free Software Foundation; either
-// version 2.1 of the License.
+// version 2.1 of the License, or (at your option) any later version.
 //
 // This library is distributed in the hope that it will be useful,
 // but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -57,7 +57,7 @@ class SMDS_Mesh;
 // ============================================================
 
 
-class SMDS_EXPORT SMDS_MeshElement:public SMDS_MeshObject
+class SMDS_EXPORT SMDS_MeshElement : public SMDS_MeshObject
 {
 public:
 
@@ -79,16 +79,16 @@ public:
   virtual int NbNodes() const;
   virtual int NbEdges() const;
   virtual int NbFaces() const;
-  inline int GetID() const { return myID; };
+  inline int GetID() const { return myID; }
 
   ///Return the type of the current element
-  virtual SMDSAbs_ElementType GetType() const = 0;
-  virtual SMDSAbs_EntityType GetEntityType() const = 0;
+  virtual SMDSAbs_ElementType  GetType() const = 0;
+  virtual SMDSAbs_EntityType   GetEntityType() const = 0;
   virtual SMDSAbs_GeometryType GetGeomType() const = 0;
-  virtual vtkIdType GetVtkType() const = 0;
+  virtual vtkIdType            GetVtkType() const = 0;
+
   virtual bool IsPoly() const { return false; }
   virtual bool IsQuadratic() const;
-
   virtual bool IsMediumNode(const SMDS_MeshNode* node) const;
   virtual int  NbCornerNodes() const;
 
@@ -141,29 +141,42 @@ public:
     * \param node - the node to check
     * \retval int - node index within the element, -1 if not found
    */
-  int GetNodeIndex( const SMDS_MeshNode* node ) const;
+  virtual int GetNodeIndex( const SMDS_MeshNode* node ) const;
 
-  inline ShortType getMeshId()  const { return myMeshId; }
-  inline LongType  getshapeId() const { return myShapeId; }
-  inline int getIdInShape()     const { return myIdInShape; }
-  inline int getVtkId()         const { return myVtkID; }
+  inline ShortType getMeshId()    const { return myMeshId; }
+  inline LongType  getshapeId()   const { return myShapeId >> BITS_SHIFT; }
+  inline int       getIdInShape() const { return myIdInShape; }
+  inline int       getVtkId()     const { return myVtkID; }
+
+  // mark this element; to be used in algos
+  inline void setIsMarked( bool is ) const;
+  inline bool isMarked() const;
 
   /*!
    * \brief Filters of elements, to be used with SMDS_SetIterator
    */
-  struct TypeFilter
+  struct Filter
+  {
+    virtual bool operator()(const SMDS_MeshElement* e) const = 0;
+    virtual ~Filter() {}
+  };
+  struct NonNullFilter: public Filter
+  {
+    bool operator()(const SMDS_MeshElement* e) const { return e; }
+  };
+  struct TypeFilter : public Filter
   {
     SMDSAbs_ElementType _type;
     TypeFilter( SMDSAbs_ElementType t = SMDSAbs_NbElementTypes ):_type(t) {}
     bool operator()(const SMDS_MeshElement* e) const { return e && e->GetType() == _type; }
   };
-  struct EntityFilter
+  struct EntityFilter : public Filter
   {
     SMDSAbs_EntityType _type;
     EntityFilter( SMDSAbs_EntityType t = SMDSEntity_Last ):_type(t) {}
     bool operator()(const SMDS_MeshElement* e) const { return e && e->GetEntityType() == _type; }
   };
-  struct GeomFilter
+  struct GeomFilter : public Filter
   {
     SMDSAbs_GeometryType _type;
     GeomFilter( SMDSAbs_GeometryType t = SMDSGeom_NONE ):_type(t) {}
@@ -171,10 +184,10 @@ public:
   };
 
 protected:
-  inline void setId(int id) {myID = id; }
-  inline void setShapeId(LongType shapeId) {myShapeId = shapeId; }
-  inline void setIdInShape(int id) { myIdInShape = id; }
-  inline void setVtkId(int vtkId) { myVtkID = vtkId; }
+  inline void setId(int id)                { myID = id; }
+  inline void setVtkId(int vtkId)          { myVtkID = vtkId; }
+  inline void setIdInShape(int id)         { myIdInShape = id; }
+  inline void setShapeId(LongType shapeId) { myShapeId = ( shapeId << BITS_SHIFT ) | ( myShapeId & BIT_IS_MARKED ); }
   SMDS_MeshElement(int ID=-1);
   SMDS_MeshElement(int id, ShortType meshId, LongType shapeId = 0);
   virtual void init(int id = -1, ShortType meshId = -1, LongType shapeId = 0);
@@ -186,12 +199,25 @@ protected:
   int myVtkID;
   //! SMDS_Mesh identification in SMESH
   ShortType myMeshId;
-  //! SubShape and SubMesh identification in SMESHDS
+  //! SubShape and SubMesh identification in SMESHDS; one bit is used to mark the element
   LongType myShapeId;
   //! Element index in SMESHDS_SubMesh vector
   int myIdInShape;
+
+  enum Bits { // use the 1st right bit of myShapeId to set/unset a mark
+    BIT_IS_MARKED = 1,
+    BITS_SHIFT = 1
+  };
 };
 
+inline void SMDS_MeshElement::setIsMarked( bool is ) const
+{
+  const_cast< SMDS_MeshElement* >( this )->myShapeId = ( myShapeId & ~BIT_IS_MARKED ) | is;
+}
+inline bool SMDS_MeshElement::isMarked() const
+{
+  return myShapeId & BIT_IS_MARKED;
+}
 
 // ============================================================
 /*!
@@ -199,9 +225,16 @@ protected:
  */
 // ============================================================
 
-struct TIDCompare {
+struct TIDTypeCompare {
   bool operator () (const SMDS_MeshElement* e1, const SMDS_MeshElement* e2) const
   { return e1->GetType() == e2->GetType() ? e1->GetID() < e2->GetID() : e1->GetType() < e2->GetType(); }
 };
 
+// WARNING: this comparator makes impossible to store both nodes and elements in the same set
+// because there are nodes and elements with the same ID. Use TIDTypeCompare for such containers.
+struct TIDCompare {
+  bool operator () (const SMDS_MeshElement* e1, const SMDS_MeshElement* e2) const
+  { return e1->GetID() < e2->GetID(); }
+};
+
 #endif