NEURON
structpool.h
Go to the documentation of this file.
1 #ifndef structpool_h
2 #define structpool_h
3 
4 // same as ../nrncvode/pool.h but items do not require a clear method.
5 
6 // create and manage a vector of objects as a memory pool of those objects
7 // the object must have a void clear() method which takes care of any
8 // data the object contains which should be deleted upon free_all.
9 // clear() is NOT called on free, only on free_all.
10 
11 // the chain of Pool
12 // is only for extra items in a pool_ and no other fields are used.
13 // the pool doubles in size every time a chain Pool is added.
14 // maxget() tells the most number of pool items used at once.
15 
16 template<typename T>
17 class Pool {
18 public:
19  Pool(long count);
20  ~Pool();
21  T* alloc();
22  void hpfree(T*);
23  int maxget() { return maxget_;}
24  void free_all();
25  int is_valid_ptr(void*);
26 private:
27  void grow();
28 private:
29  T** items_;
30  T* pool_;
31  long pool_size_;
32  long count_;
33  long get_;
34  long put_;
35  long nget_;
36  long maxget_;
38 };
39 
40 
41 template<typename T>
42 Pool<T>::Pool(long count) {
43  count_ = count;
44  pool_ = new T[count_];
45  pool_size_ = count;
46  items_ = new T*[count_];
47  for (long i = 0; i < count_; ++i) items_[i] = pool_ + i;
48  get_ = 0;
49  put_ = 0;
50  nget_ = 0;
51  maxget_ = 0;
52  chain_ = 0;
53 }
54 
55 template<typename T>
56 void Pool<T>::grow() {
57  assert(get_ == put_);
58  Pool* p = new Pool(count_);
59  p->chain_ = chain_;
60  chain_ = p;
61  long newcnt = 2*count_;
62  T** itms = new T*[newcnt];
63  long i, j;
64  put_ += count_;
65  for (i = 0; i < get_; ++i) {
66  itms[i] = items_[i];
67  }
68  for (i = get_, j = 0; j < count_; ++i, ++j) {
69  itms[i] = p->items_[j];
70  }
71  for (i = put_, j = get_; j < count_; ++i, ++j) {
72  itms[i] = items_[j];
73  }
74  delete [] items_;
75  delete [] p->items_;
76  p->items_ = 0;
77  items_ = itms;
78  count_ = newcnt;
79 }
80 
81 template<typename T>
83  if (chain_) {
84  delete chain_;
85  }
86  delete [] pool_;
87  if (items_) {
88  delete [] items_;
89  }
90 }
91 
92 template<typename T>
94  Pool* pp;
95  for(pp = this; pp; pp = pp->chain_) {
96  void* vp = (void*)(pp->pool_);
97  if (v >= vp && v < (void*)(pp->pool_ + pp->pool_size_)) {
98  if (( ((char*)v - (char*)vp)%sizeof(T) ) == 0) {
99  return 1;
100  }else{
101  return 0;
102  }
103  }
104  }
105  return 0;
106 }
107 
108 template<typename T>
110  if (nget_ >= count_) { grow(); }
111  T* item = items_[get_];
112  get_ = (get_+1)%count_;
113  ++nget_;
114  if (nget_ > maxget_) { maxget_ = nget_; }
115  return item;
116 }
117 
118 template<typename T>
119 void Pool<T>::hpfree(T* item) {
120  assert(nget_ > 0);
121  items_[put_] = item;
122  put_ = (put_ + 1)%count_;
123  --nget_;
124 }
125 
126 template<typename T>
128  Pool* pp;
129  long i;
130  nget_ = 0;
131  get_ = 0;
132  put_ = 0;
133  for(pp = this; pp; pp = pp->chain_) {
134  for (i=0; i < pp->pool_size_; ++i) {
135  items_[put_++] = pp->pool_ + i;
136  }
137  }
138  assert(put_ == count_);
139  put_ = 0;
140 }
141 
142 #endif
Pool * chain_
Definition: structpool.h:37
#define assert(ex)
Definition: hocassrt.h:26
double T
Definition: rbtqueue.cpp:25
T ** items_
Definition: structpool.h:29
long count_
Definition: structpool.h:32
void free_all()
Definition: structpool.h:127
size_t p
int is_valid_ptr(void *)
Definition: structpool.h:93
#define v
Definition: md1redef.h:4
long maxget_
Definition: structpool.h:36
long pool_size_
Definition: structpool.h:31
T * pool_
Definition: structpool.h:30
size_t j
T * alloc()
Definition: structpool.h:109
void hpfree(T *)
Definition: structpool.h:119
#define i
Definition: md1redef.h:12
void grow()
Definition: structpool.h:56
~Pool()
Definition: structpool.h:82
long nget_
Definition: structpool.h:35
Pool(long count)
Definition: structpool.h:42
long put_
Definition: structpool.h:34
long get_
Definition: structpool.h:33
int maxget()
Definition: structpool.h:23