state pool¶
ソースコード¶
1#include <cassert>
2#include <memory>
3#include <vector>
4#include <stack>
5using namespace std;
6
7// StatePool
8namespace titan23 {
9
10 // ノードプールクラス
11 template<typename T>
12 class StatePool {
13 private:
14 vector<T*> pool;
15 stack<int> unused_indx;
16
17 public:
18 StatePool() {}
19 StatePool(const int n) { init(n); }
20
21 //! clear
22 void clear() {
23 while (!unused_indx.empty()) unused_indx.pop();
24 for (int i = (int)pool.size()-1; i >= 0; --i) {
25 unused_indx.emplace(i);
26 }
27 }
28
29 //! n要素確保する。
30 void init(const int n) {
31 for (int i = 0; i < n; ++i) {
32 T* state = new T;
33 pool.emplace_back(state);
34 unused_indx.emplace(i);
35 }
36 }
37
38 //! id に対応する T のポインタを返す。
39 T* get(int id) const {
40 assert(0 <= id && id < pool.size());
41 return pool[id];
42 }
43
44 //! idに対応するTを仮想的に削除する。
45 void del(int id) {
46 assert(0 <= id && id < pool.size());
47 unused_indx.emplace(id);
48 }
49
50 //! T を作成し、それに対応する id を返す。
51 int gen() {
52 int state_id;
53 if (unused_indx.empty()) {
54 T* state = new T;
55 state_id = pool.size();
56 pool.emplace_back(state);
57 } else {
58 state_id = unused_indx.top();
59 unused_indx.pop();
60 }
61 return state_id;
62 }
63
64 //! id に対応するTをコピーし、コピー先のidを返す。
65 //! T のコピーメソッドを呼び出す。
66 int copy(const int id) {
67 int new_id = gen();
68 pool[id]->copy(pool[new_id]);
69 return new_id;
70 }
71
72 //! 内部サイズを呼び出す
73 int get_size() const {
74 return pool.size();
75 }
76 };
77} // namespace titan23
仕様¶
Warning
doxygenfile: Cannot find file “titan_cpplib/ahc/state_pool.cpp