Salome HOME
Update copyright information
[modules/smesh.git] / src / SMESHDS / SMESHDS_Mesh.hxx
index 61d223ebb96dce135aa8546c014aa6e717aa81ba..d3df2e688e116420ec8bed330a7da7aee267da29 100644 (file)
@@ -1,32 +1,33 @@
-//  SMESH SMESHDS : management of mesh data and SMESH document
+//  Copyright (C) 2007-2008  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
 //
-//  Copyright (C) 2003  OPEN CASCADE, EADS/CCR, LIP6, CEA/DEN,
-//  CEDRAT, EDF R&D, LEG, PRINCIPIA R&D, BUREAU VERITAS 
-// 
-//  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. 
-// 
-//  This library is distributed in the hope that it will be useful, 
-//  but WITHOUT ANY WARRANTY; without even the implied warranty of 
-//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU 
-//  Lesser General Public License for more details. 
-// 
-//  You should have received a copy of the GNU Lesser General Public 
-//  License along with this library; if not, write to the Free Software 
-//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA 
-// 
-//  See http://www.opencascade.org/SALOME/ or email : webmaster.salome@opencascade.org 
+//  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.
 //
+//  This library is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+//  Lesser General Public License for more details.
 //
+//  You should have received a copy of the GNU Lesser General Public
+//  License along with this library; if not, write to the Free Software
+//  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 //
+//  See http://www.salome-platform.org/ or email : webmaster.salome@opencascade.com
+//
+//  SMESH SMESHDS : management of mesh data and SMESH document
 //  File   : SMESHDS_Mesh.hxx
 //  Module : SMESH
-
+//
 #ifndef _SMESHDS_Mesh_HeaderFile
 #define _SMESHDS_Mesh_HeaderFile
 
+#include "SMESH_SMESHDS.hxx"
+
 #include "SMDS_Mesh.hxx"
 #include "SMDS_MeshNode.hxx"
 #include "SMDS_MeshEdge.hxx"
 #include <TopoDS_Face.hxx>
 #include <TopoDS_Vertex.hxx>
 #include <TopoDS_Edge.hxx>
-#include <map>
-#ifdef WNT
-#include <hash_map>
-#endif
-
-//Not portable see http://gcc.gnu.org/onlinedocs/libstdc++/faq/index.html#5_4 to know more.
-#ifdef __GNUC__
-  #if __GNUC__ < 3
-    #include <hash_map.h>
-    namespace gstd { using ::hash_map; }; // inherit globals
-  #elif __GNUC__ == 3
-    #include <ext/hash_map>
-    #if __GNUC_MINOR__ == 0
-      namespace gstd = std;               // GCC 3.0
-    #else
-      namespace gstd = ::__gnu_cxx;       // GCC 3.1 and later
-    #endif
-  #else                                   // GCC 4.0 and later
-    #include <ext/hash_map>
-    namespace gstd = ::__gnu_cxx;
-  #endif
-#else      // ...  there are other compilers, right?
-  namespace gstd = std;
-#endif
 
-#if defined WNT && defined WIN32 && defined SMESHDS_EXPORTS
-#define SMESHDS_WNT_EXPORT __declspec( dllexport )
-#else
-#define SMESHDS_WNT_EXPORT
-#endif
+#include <NCollection_DataMap.hxx>
+#include <map>
+/*
+ * Using of native haah_map isn't portable and don't work on WIN32 platform.
+ * So this functionality implement on new NCollection_DataMap technology
+ */
+#include "SMESHDS_DataMapOfShape.hxx"
 
 class SMESHDS_GroupBase;
 
-class SMESHDS_WNT_EXPORT SMESHDS_Mesh:public SMDS_Mesh{
+class SMESHDS_EXPORT SMESHDS_Mesh:public SMDS_Mesh{
 public:
   SMESHDS_Mesh(int theMeshID, bool theIsEmbeddedMode);
   bool IsEmbeddedMode();
 
   void ShapeToMesh(const TopoDS_Shape & S);
+  TopoDS_Shape ShapeToMesh() const;
   bool AddHypothesis(const TopoDS_Shape & SS, const SMESHDS_Hypothesis * H);
   bool RemoveHypothesis(const TopoDS_Shape & S, const SMESHDS_Hypothesis * H);
   
@@ -398,8 +378,10 @@ public:
    *  Methods do not work for meshes with descendants.
    *  Implemented for fast cleaning of meshes.
    */
-  void RemoveFreeNode(const SMDS_MeshNode *, SMESHDS_SubMesh *);
-  void RemoveFreeElement(const SMDS_MeshElement *, SMESHDS_SubMesh *);
+  void RemoveFreeNode   (const SMDS_MeshNode *,    SMESHDS_SubMesh *, bool fromGroups=true);
+  void RemoveFreeElement(const SMDS_MeshElement *, SMESHDS_SubMesh *, bool fromGroups=true);
+
+  void ClearMesh();
 
   bool ChangeElementNodes(const SMDS_MeshElement * elem,
                           const SMDS_MeshNode    * nodes[],
@@ -421,12 +403,11 @@ public:
                             const TopoDS_Shape & S);
   void UnSetMeshElementOnShape(const SMDS_MeshElement * anElt,
                               const TopoDS_Shape & S);
-  TopoDS_Shape ShapeToMesh() const;
   bool HasMeshElements(const TopoDS_Shape & S);
   SMESHDS_SubMesh * MeshElements(const TopoDS_Shape & S) const;
   SMESHDS_SubMesh * MeshElements(const int Index);
   std::list<int> SubMeshIndices();
-  const std::map<int,SMESHDS_SubMesh*>& SubMeshes()
+  const std::map<int,SMESHDS_SubMesh*>& SubMeshes() const
   { return myShapeIndexToSubMesh; }
 
   bool HasHypothesis(const TopoDS_Shape & S);
@@ -435,6 +416,7 @@ public:
   void ClearScript();
   int ShapeToIndex(const TopoDS_Shape & aShape) const;
   const TopoDS_Shape& IndexToShape(int ShapeIndex) const;
+  int MaxShapeIndex() const { return myIndexToShape.Extent(); }
 
   SMESHDS_SubMesh * NewSubMesh(int Index);
   int AddCompoundSubmesh(const TopoDS_Shape& S, TopAbs_ShapeEnum type = TopAbs_SHAPE);
@@ -454,38 +436,23 @@ public:
   ~SMESHDS_Mesh();
   
 private:
-#ifndef WNT
-  struct HashTopoDS_Shape{
-    size_t operator()(const TopoDS_Shape& S) const {
-      return S.HashCode(2147483647);
+  void addNodeToSubmesh( const SMDS_MeshNode* aNode, int Index )
+  {
+    //Update or build submesh
+    std::map<int,SMESHDS_SubMesh*>::iterator it = myShapeIndexToSubMesh.find( Index );
+    if ( it == myShapeIndexToSubMesh.end() )
+      it = myShapeIndexToSubMesh.insert( std::make_pair(Index, new SMESHDS_SubMesh() )).first;
+    it->second->AddNode( aNode ); // add aNode to submesh
     }
-  };
-#else
-  typedef gstd::hash_compare< TopoDS_Shape, less<TopoDS_Shape> > HashTopoDS;
-
-  class HashTopoDS_Shape : public HashTopoDS {
-  public:
   
-    size_t operator()(const TopoDS_Shape& S) const {
+  /*int HashCode( const TopoDS_Shape& S, const Standard_Integer theUpper ) const
+  {
       return S.HashCode(2147483647);
-    }
-
-       bool operator()(const TopoDS_Shape& S1,const TopoDS_Shape& S2) const {
-               return S1==S2;
-       }
-  };
-
-
-
-#endif
+  }*/ 
 
   typedef std::list<const SMESHDS_Hypothesis*> THypList;
 
-#ifndef WNT
-  typedef gstd::hash_map<TopoDS_Shape,THypList,HashTopoDS_Shape> ShapeToHypothesis;
-#else
-  typedef gstd::hash_map<TopoDS_Shape,THypList,HashTopoDS_Shape> ShapeToHypothesis;
-#endif
+  typedef NCollection_DataMap< TopoDS_Shape, THypList > ShapeToHypothesis;
 
   ShapeToHypothesis          myShapeToHypothesis;