1 // MeCab -- Yet Another Part-of-Speech and Morphological Analyzer
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
16 template <class T> class FreeList {
18 std::vector<T *> freeList;
24 void free() { li_ = pi_ = 0; }
31 if (li_ == freeList.size()) freeList.push_back(new T[size]);
32 return freeList[li_] + (pi_++);
35 explicit FreeList(size_t _size): pi_(0), li_(0), size(_size) {}
38 for (li_ = 0; li_ < freeList.size(); li_++)
39 delete [] freeList[li_];
43 template <class T> class ChunkFreeList {
45 std::vector<std::pair<size_t, T *> > freelist_;
51 void free() { li_ = pi_ = 0; }
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_;
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;
73 return freelist_[li_].second;
76 explicit ChunkFreeList(size_t _size):
77 pi_(0), li_(0), default_size(_size) {}
79 virtual ~ChunkFreeList() {
80 for (li_ = 0; li_ < freelist_.size(); li_++)
81 delete [] freelist_[li_].second;