Salome HOME
0022638: [CEA 1210] Wrong import of an UNV file
[modules/smesh.git] / src / SMDS / SMDS_MeshElement.hxx
index 918ebb668efe33ac67a27d406d4447f14296d1f7..f28ff597a8b6146066504b47f3f04f3c64b5c37f 100644 (file)
@@ -1,4 +1,4 @@
-// Copyright (C) 2007-2012  CEA/DEN, EDF R&D, OPEN CASCADE
+// Copyright (C) 2007-2014  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
@@ -65,9 +65,12 @@ public:
   SMDS_ElemIteratorPtr edgesIterator() const;
   SMDS_ElemIteratorPtr facesIterator() const;
   virtual SMDS_ElemIteratorPtr elementsIterator(SMDSAbs_ElementType type) const;
-  virtual SMDS_ElemIteratorPtr nodesIteratorToUNV() const;
   virtual SMDS_ElemIteratorPtr interlacedNodesElemIterator() const;
 
+  virtual SMDS_NodeIteratorPtr nodeIterator() const;
+  virtual SMDS_NodeIteratorPtr interlacedNodesIterator() const;
+  virtual SMDS_NodeIteratorPtr nodesIteratorToUNV() const;
+
   // std-like iteration on nodes
   typedef SMDS_StdIterator< const SMDS_MeshNode*, SMDS_ElemIteratorPtr > iterator;
   iterator begin_nodes() const { return iterator( nodesIterator() ); }
@@ -138,7 +141,7 @@ 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; }
@@ -148,19 +151,28 @@ public:
   /*!
    * \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) {}
@@ -196,6 +208,13 @@ protected:
  */
 // ============================================================
 
+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(); }