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
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
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
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 }
00143
00144 #endif