12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- //
- // CRF++ -- Yet Another CRF toolkit
- //
- // $Id: freelist.h 1588 2007-02-12 09:03:39Z taku $;
- //
- // Copyright(C) 2005-2007 Taku Kudo <taku@chasen.org>
- //
- #ifndef CRFPP_FREELIST_H__
- #define CRFPP_FREELIST_H__
- #include <vector>
- namespace CRFPP {
- template <class T>
- class Length {
- public:
- size_t operator()(const T *str) const { return 1; }
- };
- class charLength {
- public:
- size_t operator()(const char *str) const { return strlen(str) + 1; }
- };
- template <class T, class LengthFunc = Length<T> >
- class FreeList {
- private:
- std::vector<T *> freeList;
- size_t pi;
- size_t li;
- size_t size;
- public:
- void free() { li = pi = 0; }
- T *alloc(size_t len = 1) {
- if ((pi + len) >= size) {
- li++;
- pi = 0;
- }
- if (li == freeList.size()) {
- freeList.push_back(new T[size]);
- }
- T *r = freeList[li] + pi;
- pi += len;
- return r;
- }
- T *dup(T *src, size_t len = 0) {
- if (!len) len = LengthFunc()(src);
- T *p = alloc(len);
- if (src == 0)
- memset(p, 0, len * sizeof(T));
- else
- memcpy(p, src, len * sizeof(T));
- return p;
- }
- void set_size(size_t n) { size = n; }
- explicit FreeList(size_t _size) : pi(0), li(0), size(_size) {}
- explicit FreeList() : pi(0), li(0), size(0) {}
- virtual ~FreeList() {
- for (li = 0; li < freeList.size(); ++li) {
- delete[] freeList[li];
- }
- }
- };
- typedef FreeList<char, charLength> StrFreeList;
- }
- #endif
|