OSDN Git Service

設定変更。
[wordring-tm/wordring-tm.git] / third-party / mecab-0.996 / src / freelist.h
1 //  MeCab -- Yet Another Part-of-Speech and Morphological Analyzer
2 //
3 //
4 //  Copyright(C) 2001-2006 Taku Kudo <taku@chasen.org>
5 //  Copyright(C) 2004-2006 Nippon Telegraph and Telephone Corporation
6 #ifndef MECAB_FREELIST_H
7 #define MECAB_FREELIST_H
8
9 #include <vector>
10 #include <algorithm>
11 #include "utils.h"
12 #include "common.h"
13
14 namespace MeCab {
15
16 template <class T> class FreeList {
17  private:
18   std::vector<T *> freeList;
19   size_t           pi_;
20   size_t           li_;
21   size_t           size;
22
23  public:
24   void free() { li_ = pi_ = 0; }
25
26   T* alloc() {
27     if (pi_ == size) {
28       li_++;
29       pi_ = 0;
30     }
31     if (li_ == freeList.size()) freeList.push_back(new T[size]);
32     return freeList[li_] + (pi_++);
33   }
34
35   explicit FreeList(size_t _size): pi_(0), li_(0), size(_size) {}
36
37   virtual ~FreeList() {
38     for (li_ = 0; li_ < freeList.size(); li_++)
39       delete [] freeList[li_];
40   }
41 };
42
43 template <class T> class ChunkFreeList {
44  private:
45   std::vector<std::pair<size_t, T *> > freelist_;
46   size_t pi_;
47   size_t li_;
48   size_t default_size;
49
50  public:
51   void free() { li_ = pi_ = 0; }
52
53   T* alloc(T *src) {
54     T* n = alloc(1);
55     *n = *src;
56     return n;
57   }
58
59   T* alloc(size_t req = 1) {
60     while (li_ < freelist_.size()) {
61       if ((pi_ + req) < freelist_[li_].first) {
62         T *r = freelist_[li_].second + pi_;
63         pi_ += req;
64         return r;
65       }
66       li_++;
67       pi_ = 0;
68     }
69     size_t _size = std::max(req, default_size);
70     freelist_.push_back(std::make_pair(_size, new T[_size]));
71     li_ = freelist_.size() - 1;
72     pi_ += req;
73     return freelist_[li_].second;
74   }
75
76   explicit ChunkFreeList(size_t _size):
77       pi_(0), li_(0), default_size(_size) {}
78
79   virtual ~ChunkFreeList() {
80     for (li_ = 0; li_ < freelist_.size(); li_++)
81       delete [] freelist_[li_].second;
82   }
83 };
84 }
85 #endif