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_
;
41
Pool
*
chain_
;
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>
87
Pool<T>::~Pool
() {
88
if
(chain_) {
89
delete
chain_;
90
}
91
delete
[] pool_;
92
if
(items_) {
93
delete
[] items_;
94
}
95
}
96
97
template
<
typename
T>
98
int
Pool<T>::is_valid_ptr
(
void
*
v
) {
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>
114
T
*
Pool<T>::alloc
() {
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>
136
void
Pool<T>::free_all
() {
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
Pool
Definition:
structpool.h:17
Pool::alloc
T * alloc()
Definition:
structpool.h:114
Pool::maxget
int maxget()
Definition:
structpool.h:23
Pool::is_valid_ptr
int is_valid_ptr(void *)
Definition:
structpool.h:98
Pool::pool_size_
long pool_size_
Definition:
structpool.h:35
Pool::free_all
void free_all()
Definition:
structpool.h:136
Pool::put_
long put_
Definition:
structpool.h:38
Pool::nget_
long nget_
Definition:
structpool.h:39
Pool::pool_
T * pool_
Definition:
structpool.h:34
Pool::items_
T ** items_
Definition:
structpool.h:33
Pool::get_
long get_
Definition:
structpool.h:37
Pool::hpfree
void hpfree(T *)
Definition:
structpool.h:128
Pool::Pool
Pool(long count)
Definition:
structpool.h:46
Pool::chain_
Pool * chain_
Definition:
structpool.h:41
Pool::~Pool
~Pool()
Definition:
structpool.h:87
Pool::count_
long count_
Definition:
structpool.h:36
Pool::grow
void grow()
Definition:
structpool.h:61
Pool::maxget_
long maxget_
Definition:
structpool.h:40
assert
#define assert(ex)
Definition:
hocassrt.h:32
v
#define v
Definition:
md1redef.h:4
i
#define i
Definition:
md1redef.h:12
p
size_t p
Definition:
nrngsl_hc_radix2.cpp:49
j
size_t j
Definition:
nrngsl_real_radix2.cpp:50
T
double T
Definition:
rbtqueue.cpp:25
src
nrniv
structpool.h