/src/aspell/common/objstack.cpp
Line | Count | Source |
1 | | |
2 | | #include "objstack.hpp" |
3 | | |
4 | | namespace acommon { |
5 | | |
6 | | void ObjStack::setup_chunk() |
7 | 727k | { |
8 | 727k | bottom = first_free->data; |
9 | 727k | align_bottom(min_align); |
10 | 727k | top = (byte *)first_free + chunk_size; |
11 | 727k | align_top(min_align); |
12 | 727k | } |
13 | | |
14 | | |
15 | | ObjStack::ObjStack(size_t chunk_s, size_t align) |
16 | 74.7k | : chunk_size(chunk_s), min_align(align), temp_end(0) |
17 | 74.7k | { |
18 | 74.7k | first_free = first = (Node *)malloc(chunk_size); |
19 | 74.7k | first->next = 0; |
20 | 74.7k | reserve = 0; |
21 | 74.7k | setup_chunk(); |
22 | 74.7k | } |
23 | | |
24 | | ObjStack::~ObjStack() |
25 | 74.5k | { |
26 | 149k | while (first) { |
27 | 74.4k | Node * tmp = first->next; |
28 | 74.4k | free(first); |
29 | 74.4k | first = tmp; |
30 | 74.4k | } |
31 | 74.5k | trim(); |
32 | 74.5k | } |
33 | | |
34 | | size_t ObjStack::calc_size() |
35 | 0 | { |
36 | 0 | size_t size = 0; |
37 | 0 | for (Node * p = first; p; p = p->next) |
38 | 0 | size += chunk_size; |
39 | 0 | return size; |
40 | 0 | } |
41 | | |
42 | | void ObjStack::new_chunk() |
43 | 219k | { |
44 | 219k | if (reserve) { |
45 | 40.8k | first_free->next = reserve; |
46 | 40.8k | reserve = reserve->next; |
47 | 40.8k | first_free = first_free->next; |
48 | 40.8k | first_free->next = 0; |
49 | 178k | } else { |
50 | 178k | first_free->next = (Node *)malloc(chunk_size); |
51 | 178k | first_free = first_free->next; |
52 | 178k | } |
53 | 219k | first_free->next = 0; |
54 | 219k | setup_chunk(); |
55 | 219k | } |
56 | | |
57 | | void ObjStack::reset() |
58 | 432k | { |
59 | 432k | assert(first_free->next == 0); |
60 | 432k | if (first->next) { |
61 | 4.44k | first_free->next = reserve; |
62 | 4.44k | reserve = first->next; |
63 | 4.44k | first->next = 0; |
64 | 4.44k | } |
65 | 432k | first_free = first; |
66 | 432k | setup_chunk(); |
67 | 432k | } |
68 | | |
69 | | void ObjStack::trim() |
70 | 92.7k | { |
71 | 100k | while (reserve) { |
72 | 7.91k | Node * tmp = reserve->next; |
73 | 7.91k | free(reserve); |
74 | 7.91k | reserve = tmp; |
75 | 7.91k | } |
76 | 92.7k | } |
77 | | |
78 | 18.2k | ObjStack::Memory * ObjStack::freeze() { |
79 | 18.2k | trim(); |
80 | 18.2k | Node * tmp = first; |
81 | 18.2k | first = 0; |
82 | 18.2k | first_free = 0; |
83 | 18.2k | top = 0; |
84 | 18.2k | bottom = 0; |
85 | 18.2k | temp_end = 0; |
86 | 18.2k | return tmp; |
87 | 18.2k | } |
88 | | |
89 | 18.2k | void ObjStack::dealloc(Memory * ptr) { |
90 | 189k | while (ptr) { |
91 | 170k | Node * tmp = ptr->next; |
92 | 170k | free(ptr); |
93 | 170k | ptr = tmp; |
94 | 170k | } |
95 | 18.2k | } |
96 | | |
97 | | } |