agmemory.hh

00001 #ifndef DUNE_AGMEMORY_HH
00002 #define DUNE_AGMEMORY_HH
00003 
00004 #include <stack>
00005 
00006 namespace Dune
00007 {
00008 
00010 template <class Object>
00011 class AGMemoryProvider
00012 {
00013   std::stack < Object * > objStack_;
00014 
00015   typedef AGMemoryProvider < Object > MyType;
00016 public:
00017   typedef Object ObjectType;
00018 
00020   AGMemoryProvider() {};
00021 
00023   ~AGMemoryProvider ();
00024 
00026   /*
00027   Object * getObject()
00028   {
00029     if( objStack_.empty() )
00030     {
00031       return ( new Object () ); 
00032     }
00033     else
00034     {
00035       ObjectType * obj = objStack_.top();
00036       objStack_.pop();
00037       return obj;
00038     }
00039   }
00040   */
00041 
00043   template <class GridType, class ObjectImp>
00044   ObjectType * getNewObjectEntity(const GridType &grid, 
00045               const ObjectImp * fakePointer, int level, bool leafIt);
00046 
00048   template <class GridType>
00049   ObjectType * getObject(const GridType &grid, int level);
00050 
00052   ObjectType * getObjectCopy(const ObjectType & org);
00053 
00055   void freeObjectEntity (ObjectType * obj);
00056 
00058   void freeObject (ObjectType * obj) { freeObjectEntity(obj); }
00059 
00060 private:
00062   AGMemoryProvider(const AGMemoryProvider<Object> & org);
00063 };
00064 
00065 
00066 //************************************************************************
00067 //
00068 //  AGMemoryProvider implementation
00069 //
00070 //************************************************************************
00071 template <class Object> template <class GridType, class ObjectImp>
00072 inline typename AGMemoryProvider<Object>::ObjectType * 
00073 AGMemoryProvider<Object>::getNewObjectEntity
00074 (const GridType &grid, const ObjectImp *fakePointer , int level , bool leafIt )
00075 {
00076   if( objStack_.empty() )
00077   {
00078     return ( new Object (ObjectImp(grid,level,leafIt)) ); 
00079   }
00080   else
00081   {
00082     ObjectType * obj = objStack_.top();
00083     objStack_.pop();
00084     return obj;
00085   }
00086 }
00087 
00088 template <class Object> template <class GridType>
00089 inline typename AGMemoryProvider<Object>::ObjectType * 
00090 AGMemoryProvider<Object>::getObject
00091 (const GridType &grid, int level )
00092 {
00093   if( objStack_.empty() )
00094   {
00095     return ( new Object (grid,level) ); 
00096   }
00097   else
00098   {
00099     ObjectType * obj = objStack_.top();
00100     objStack_.pop();
00101     return obj;
00102   }
00103 }
00104 
00105 template <class Object>
00106 inline typename AGMemoryProvider<Object>::ObjectType * 
00107 AGMemoryProvider<Object>::getObjectCopy
00108 (const ObjectType & org) 
00109 {
00110   if( objStack_.empty() )
00111   {
00112     return ( new Object (org)); 
00113   }
00114   else
00115   {
00116     ObjectType * obj = objStack_.top();
00117     objStack_.pop();
00118     return obj;
00119   }
00120 }
00121 
00122 template <class Object>
00123 inline AGMemoryProvider<Object>::~AGMemoryProvider()
00124 {
00125   while ( !objStack_.empty() )
00126   {
00127     ObjectType * obj = objStack_.top();
00128     objStack_.pop();
00129     if( obj ) delete obj;
00130   }
00131 }
00132 
00133 template <class Object>
00134 inline void AGMemoryProvider<Object>::freeObjectEntity(Object * obj)
00135 {
00136   objStack_.push( obj );
00137 }
00138 
00139 typedef AGMemoryProvider < ALBERTA EL_INFO > ElInfoProvider;
00140 static ElInfoProvider elinfoProvider;
00141 
00142 } //end namespace 
00143 
00144 #endif 

Generated on 9 Apr 2008 with Doxygen (ver 1.5.2) [logfile].