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