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  enum {dim = DIM, dow = DOW};
00049 
00050  typedef HGeometryTree<DIM,DOW> tree_t;
00051  typedef IrregularMesh<DIM,DOW> ir_mesh_t;
00052  private:
00053  tree_t * h_tree;
00054  std::list<ir_mesh_t *> ir_mesh;
00055 
00056  public:
00057  MemoryReclaimer() : h_tree(NULL) {}
00058  MemoryReclaimer(tree_t& _h_tree) : h_tree(&_h_tree) {}
00059  virtual ~MemoryReclaimer() {}
00060 
00061  public:
00066  void setGeometryTree(tree_t& _h_tree) {
00067    h_tree = &_h_tree;
00068  }
00073  void addIrregularMesh(ir_mesh_t& _ir_mesh) {
00074    if (&(_ir_mesh.geometryTree()) != h_tree) {
00075      std::cout << "warning: the irregular mesh added is not based on the geometry tree used."
00076      << std::endl;
00077    }
00078    ir_mesh.push_back(&_ir_mesh);
00079  }
00080  void clear() {
00081    h_tree = NULL;
00082    ir_mesh.clear();
00083  }
00112  void reclaim();
00113 
00114  private:
00115  void reclaimIrregularMesh(ir_mesh_t&);
00116  void initialTreeLabel();
00117  void labelIrregularMesh(ir_mesh_t&);
00118  void reclaimTreeMemory();
00119 
00120  template <int DIM1> void labelHGeometry(HGeometry<DIM1,DOW>&, int lab);
00121  template <int DIM1> void labelHGeometryRecursively(HGeometry<DIM1,DOW>& g, int lab);
00122  template <int DIM1> int relabelHGeometryRecursively(HGeometry<DIM1,DOW>& g);
00123  template <int DIM1> int reclaimHGeometryRecursively(HGeometry<DIM1,DOW>& g);
00124 
00125  void labelHGeometry(HGeometry<0,DOW>&, int lab);
00126  void labelHGeometryRecursively(HGeometry<0,DOW>& g, int lab);
00127  int relabelHGeometryRecursively(HGeometry<0,DOW>& g);
00128  int reclaimHGeometryRecursively(HGeometry<0,DOW>& g);
00129 
00130  virtual void 
00131  reclaimHGeometry(void * p_geo, int dim) const {
00132    switch (dim) {
00133    case 0: delete ((HGeometry<0,DOW> *)(p_geo)); break;
00134    case 1: delete ((HGeometry<1,DOW> *)(p_geo)); break;
00135    case 2: delete ((HGeometry<2,DOW> *)(p_geo)); break;
00136    case 3: delete ((HGeometry<3,DOW> *)(p_geo)); break;
00137    }
00138  }
00139 
00140  protected:
00141  tree_t * get_tree_ptr() const { return h_tree; }
00142 };
00143 
00144 #include "MemoryReclaimer.templates.h"
00145 
00146 #endif // _MemoryReclaimer_h_
00147