freelist.h 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. //
  2. // CRF++ -- Yet Another CRF toolkit
  3. //
  4. // $Id: freelist.h 1588 2007-02-12 09:03:39Z taku $;
  5. //
  6. // Copyright(C) 2005-2007 Taku Kudo <taku@chasen.org>
  7. //
  8. #ifndef CRFPP_FREELIST_H__
  9. #define CRFPP_FREELIST_H__
  10. #include <vector>
  11. namespace CRFPP {
  12. template <class T>
  13. class Length {
  14. public:
  15. size_t operator()(const T *str) const { return 1; }
  16. };
  17. class charLength {
  18. public:
  19. size_t operator()(const char *str) const { return strlen(str) + 1; }
  20. };
  21. template <class T, class LengthFunc = Length<T> >
  22. class FreeList {
  23. private:
  24. std::vector<T *> freeList;
  25. size_t pi;
  26. size_t li;
  27. size_t size;
  28. public:
  29. void free() { li = pi = 0; }
  30. T *alloc(size_t len = 1) {
  31. if ((pi + len) >= size) {
  32. li++;
  33. pi = 0;
  34. }
  35. if (li == freeList.size()) {
  36. freeList.push_back(new T[size]);
  37. }
  38. T *r = freeList[li] + pi;
  39. pi += len;
  40. return r;
  41. }
  42. T *dup(T *src, size_t len = 0) {
  43. if (!len) len = LengthFunc()(src);
  44. T *p = alloc(len);
  45. if (src == 0)
  46. memset(p, 0, len * sizeof(T));
  47. else
  48. memcpy(p, src, len * sizeof(T));
  49. return p;
  50. }
  51. void set_size(size_t n) { size = n; }
  52. explicit FreeList(size_t _size) : pi(0), li(0), size(_size) {}
  53. explicit FreeList() : pi(0), li(0), size(0) {}
  54. virtual ~FreeList() {
  55. for (li = 0; li < freeList.size(); ++li) {
  56. delete[] freeList[li];
  57. }
  58. }
  59. };
  60. typedef FreeList<char, charLength> StrFreeList;
  61. }
  62. #endif