b33c0a58ce4d4651e5181f676cc3987b75b5d434
[platform/upstream/aspell.git] / common / objstack.cpp
1
2 #include "objstack.hpp"
3
4 namespace acommon {
5
6 using namespace std;
7
8 void ObjStack::setup_chunk()
9 {
10   bottom = first_free->data;
11   align_bottom(min_align);
12   top    = (byte *)first_free + chunk_size;
13   align_top(min_align);
14 }
15
16
17 ObjStack::ObjStack(size_t chunk_s, size_t align)
18   : chunk_size(chunk_s), min_align(align), temp_end(0)
19 {
20   first_free = first = (Node *)malloc(chunk_size);
21   first->next = 0;
22   reserve = 0;
23   setup_chunk();
24 }
25
26 ObjStack::~ObjStack()
27 {
28   while (first) {
29     Node * tmp = first->next;
30     free(first);
31     first = tmp;
32   }
33   trim();
34 }
35
36 size_t ObjStack::calc_size()
37 {
38   size_t size = 0;
39   for (Node * p = first; p; p = p->next)
40     size += chunk_size;
41   return size;
42 }
43
44 void ObjStack::new_chunk()
45 {
46   if (reserve) {
47     first_free->next = reserve;
48     reserve = reserve->next;
49     first_free = first_free->next;
50     first_free->next = 0;
51   } else {
52     first_free->next = (Node *)malloc(chunk_size);
53     first_free = first_free->next;
54   }
55   first_free->next = 0;
56   setup_chunk();
57 }
58
59 void ObjStack::reset()
60 {
61   assert(first_free->next == 0);
62   if (first->next) {
63     first_free->next = reserve;
64     reserve = first->next;
65     first->next = 0;
66   } 
67   first_free = first;
68   setup_chunk();
69 }
70
71 void ObjStack::trim()
72 {
73   while (reserve) {
74     Node * tmp = reserve->next;
75     free(reserve);
76     reserve = tmp;
77   }
78 }
79
80 }