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_
;
40
Pool
*
chain_
;
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>
86
Pool<T>::~Pool
() {
87
if
(chain_) {
88
delete
chain_;
89
}
90
delete
[] pool_;
91
if
(items_) {
92
delete
[] items_;
93
}
94
}
95
96
template
<
typename
T>
97
int
Pool<T>::is_valid_ptr
(
void
*
v
) {
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>
113
T*
Pool<T>::alloc
() {
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>
135
void
Pool<T>::free_all
() {
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
}
Pool
Definition:
structpool.h:16
Pool::alloc
T * alloc()
Definition:
structpool.h:113
Pool::maxget
int maxget()
Definition:
structpool.h:22
Pool::is_valid_ptr
int is_valid_ptr(void *)
Definition:
structpool.h:97
Pool::pool_size_
long pool_size_
Definition:
structpool.h:34
Pool::free_all
void free_all()
Definition:
structpool.h:135
Pool::put_
long put_
Definition:
structpool.h:37
Pool::nget_
long nget_
Definition:
structpool.h:38
Pool::pool_
T * pool_
Definition:
structpool.h:33
Pool::items_
T ** items_
Definition:
structpool.h:32
Pool::get_
long get_
Definition:
structpool.h:36
Pool::hpfree
void hpfree(T *)
Definition:
structpool.h:127
Pool::Pool
Pool(long count)
Definition:
structpool.h:45
Pool::chain_
Pool * chain_
Definition:
structpool.h:40
Pool::~Pool
~Pool()
Definition:
structpool.h:86
Pool::count_
long count_
Definition:
structpool.h:35
Pool::grow
void grow()
Definition:
structpool.h:60
Pool::maxget_
long maxget_
Definition:
structpool.h:39
v
#define v
Definition:
md1redef.h:11
i
#define i
Definition:
md1redef.h:19
assert
#define assert(ex)
Definition:
hocassrt.h:24
p
size_t p
Definition:
nrngsl_hc_radix2.cpp:49
j
size_t j
Definition:
nrngsl_real_radix2.cpp:50
src
nrniv
structpool.h