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