AFEPack
MemoryReclaimer.h
浏览该文件的文档。
00001 
00011 #ifndef _MemoryReclaimer_h_
00012 #define _MemoryReclaimer_h_
00013 
00014 #include "HGeometry.h"
00015 
00045 template <int DIM, int DOW=DIM>
00046   class MemoryReclaimer {
00047  public:
00048  typedef HGeometryTree<DIM,DOW> tree_t;
00049  typedef IrregularMesh<DIM,DOW> ir_mesh_t;
00050  private:
00051  tree_t * h_tree;
00052  std::list<ir_mesh_t *> ir_mesh;
00053 
00054  public:
00055  MemoryReclaimer() : h_tree(NULL) {}
00056  MemoryReclaimer(tree_t& _h_tree) : h_tree(&_h_tree) {}
00057  virtual ~MemoryReclaimer() {}
00058 
00059  public:
00064  void setGeometryTree(tree_t& _h_tree) {
00065    h_tree = &_h_tree;
00066  }
00071  void addIrregularMesh(ir_mesh_t& _ir_mesh) {
00072    if (&(_ir_mesh.geometryTree()) != h_tree) {
00073      std::cout << "warning: the irregular mesh added is not based on the geometry tree used."
00074      << std::endl;
00075    }
00076    ir_mesh.push_back(&_ir_mesh);
00077  }
00078  void clear() {
00079    h_tree = NULL;
00080    ir_mesh.clear();
00081  }
00110  void reclaim();
00111 
00112  private:
00113  void reclaimIrregularMesh(ir_mesh_t&);
00114  void initialTreeLabel();
00115  void labelIrregularMesh(ir_mesh_t&);
00116  void reclaimTreeMemory();
00117 
00118  template <int DIM1> void labelHGeometry(HGeometry<DIM1,DOW>&, int lab);
00119  template <int DIM1> void labelHGeometryRecursively(HGeometry<DIM1,DOW>& g, int lab);
00120  template <int DIM1> int relabelHGeometryRecursively(HGeometry<DIM1,DOW>& g);
00121  template <int DIM1> int reclaimHGeometryRecursively(HGeometry<DIM1,DOW>& g);
00122 
00123  void labelHGeometry(HGeometry<0,DOW>&, int lab);
00124  void labelHGeometryRecursively(HGeometry<0,DOW>& g, int lab);
00125  int relabelHGeometryRecursively(HGeometry<0,DOW>& g);
00126  int reclaimHGeometryRecursively(HGeometry<0,DOW>& g);
00127 
00128  virtual void 
00129  reclaimHGeometry(void * p_geo, int dim) const {
00130    switch (dim) {
00131    case 0: delete ((HGeometry<0,DOW> *)(p_geo)); break;
00132    case 1: delete ((HGeometry<1,DOW> *)(p_geo)); break;
00133    case 2: delete ((HGeometry<2,DOW> *)(p_geo)); break;
00134    case 3: delete ((HGeometry<3,DOW> *)(p_geo)); break;
00135    }
00136  }
00137 
00138  protected:
00139  tree_t * get_tree_ptr() const { return h_tree; }
00140 };
00141 
00142 #include "MemoryReclaimer.templates.h"
00143 
00144 #endif // _MemoryReclaimer_h_
00145