dune-grid  2.2.1
memory.hh
Go to the documentation of this file.
1 #ifndef DUNE_ALU3DGRIDMEMORY_HH
2 #define DUNE_ALU3DGRIDMEMORY_HH
3 
4 #include <cassert>
5 #include <cstdlib>
6 #include <vector>
7 
8 namespace ALUGridSpace
9 {
10  template<class T, int length>
11  class ALUGridFiniteStack ;
12 }
13 
14 namespace Dune {
15 
17 template <class Object>
19 {
20  enum { maxStackObjects = 256 };
21  typedef ALUGridSpace :: ALUGridFiniteStack< Object* , maxStackObjects > StackType ;
22  StackType objStack_ ;
23 
25 
26  StackType& objStack() { return objStack_ ; }
27 
28 public:
29  typedef Object ObjectType;
30 
33 
36  : objStack_( org.objStack_ )
37  {}
38 
41 
43  template <class FactoryType>
44  ObjectType * getObject(const FactoryType &factory, int level);
45 
47  template <class FactoryType, class EntityImp>
48  inline ObjectType * getEntityObject(const FactoryType& factory, int level , EntityImp * fakePtr )
49  {
50  if( objStack().empty() )
51  {
52  return ( new ObjectType(EntityImp(factory,level) ));
53  }
54  else
55  {
56  return stackObject();
57  }
58  }
59 
61  ObjectType * getObjectCopy(const ObjectType & org);
62 
64  void freeObject (ObjectType * obj);
65 
66 protected:
67  inline ObjectType * stackObject()
68  {
69  assert( ! objStack().empty() );
70  // finite stack does also return object on pop
71  return objStack().pop();
72  }
73 
74 };
75 
76 
77 //************************************************************************
78 //
79 // ALUMemoryProvider implementation
80 //
81 //************************************************************************
82 template <class Object> template <class FactoryType>
83 inline typename ALUMemoryProvider<Object>::ObjectType *
85 (const FactoryType &factory, int level )
86 {
87  if( objStack().empty() )
88  {
89  return ( new Object (factory, level) );
90  }
91  else
92  {
93  return stackObject();
94  }
95 }
96 
97 template <class Object>
100 (const ObjectType & org )
101 {
102  if( objStack().empty() )
103  {
104  return ( new Object (org) );
105  }
106  else
107  {
108  return stackObject();
109  }
110 }
111 
112 template <class Object>
114 {
115  StackType& objStk = objStack_;
116  while ( ! objStk.empty() )
117  {
118  ObjectType * obj = objStk.pop();
119  delete obj;
120  }
121 }
122 
123 template <class Object>
124 inline void ALUMemoryProvider<Object>::freeObject(Object * obj)
125 {
126  StackType& stk = objStack();
127  if( stk.full() )
128  delete obj;
129  else
130  stk.push( obj );
131 }
132 
133 #undef USE_FINITE_STACK
134 
135 } // end namespace Dune
136 
137 #endif