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() {
24  return maxget_;
25  }
26  void free_all();
27  int is_valid_ptr(void*);
28 
29  private:
30  void grow();
31 
32  private:
33  T** items_;
34  T* pool_;
35  long pool_size_;
36  long count_;
37  long get_;
38  long put_;
39  long nget_;
40  long maxget_;
42 };
43 
44 
45 template <typename T>
46 Pool<T>::Pool(long count) {
47  count_ = count;
48  pool_ = new T[count_];
49  pool_size_ = count;
50  items_ = new T*[count_];
51  for (long i = 0; i < count_; ++i)
52  items_[i] = pool_ + i;
53  get_ = 0;
54  put_ = 0;
55  nget_ = 0;
56  maxget_ = 0;
57  chain_ = 0;
58 }
59 
60 template <typename T>
61 void Pool<T>::grow() {
62  assert(get_ == put_);
63  Pool* p = new Pool(count_);
64  p->chain_ = chain_;
65  chain_ = p;
66  long newcnt = 2 * count_;
67  T** itms = new T*[newcnt];
68  long i, j;
69  put_ += count_;
70  for (i = 0; i < get_; ++i) {
71  itms[i] = items_[i];
72  }
73  for (i = get_, j = 0; j < count_; ++i, ++j) {
74  itms[i] = p->items_[j];
75  }
76  for (i = put_, j = get_; j < count_; ++i, ++j) {
77  itms[i] = items_[j];
78  }
79  delete[] items_;
80  delete[] p->items_;
81  p->items_ = 0;
82  items_ = itms;
83  count_ = newcnt;
84 }
85 
86 template <typename T>
88  if (chain_) {
89  delete chain_;
90  }
91  delete[] pool_;
92  if (items_) {
93  delete[] items_;
94  }
95 }
96 
97 template <typename T>
99  Pool* pp;
100  for (pp = this; pp; pp = pp->chain_) {
101  void* vp = (void*) (pp->pool_);
102  if (v >= vp && v < (void*) (pp->pool_ + pp->pool_size_)) {
103  if ((((char*) v - (char*) vp) % sizeof(T)) == 0) {
104  return 1;
105  } else {
106  return 0;
107  }
108  }
109  }
110  return 0;
111 }
112 
113 template <typename T>
115  if (nget_ >= count_) {
116  grow();
117  }
118  T* item = items_[get_];
119  get_ = (get_ + 1) % count_;
120  ++nget_;
121  if (nget_ > maxget_) {
122  maxget_ = nget_;
123  }
124  return item;
125 }
126 
127 template <typename T>
128 void Pool<T>::hpfree(T* item) {
129  assert(nget_ > 0);
130  items_[put_] = item;
131  put_ = (put_ + 1) % count_;
132  --nget_;
133 }
134 
135 template <typename T>
137  Pool* pp;
138  long i;
139  nget_ = 0;
140  get_ = 0;
141  put_ = 0;
142  for (pp = this; pp; pp = pp->chain_) {
143  for (i = 0; i < pp->pool_size_; ++i) {
144  items_[put_++] = pp->pool_ + i;
145  }
146  }
147  assert(put_ == count_);
148  put_ = 0;
149 }
150 
151 #endif
T * alloc()
Definition: structpool.h:114
int maxget()
Definition: structpool.h:23
int is_valid_ptr(void *)
Definition: structpool.h:98
long pool_size_
Definition: structpool.h:35
void free_all()
Definition: structpool.h:136
long put_
Definition: structpool.h:38
long nget_
Definition: structpool.h:39
T * pool_
Definition: structpool.h:34
T ** items_
Definition: structpool.h:33
long get_
Definition: structpool.h:37
void hpfree(T *)
Definition: structpool.h:128
Pool(long count)
Definition: structpool.h:46
Pool * chain_
Definition: structpool.h:41
~Pool()
Definition: structpool.h:87
long count_
Definition: structpool.h:36
void grow()
Definition: structpool.h:61
long maxget_
Definition: structpool.h:40
#define assert(ex)
Definition: hocassrt.h:32
#define v
Definition: md1redef.h:4
#define i
Definition: md1redef.h:12
size_t p
size_t j
double T
Definition: rbtqueue.cpp:25