source: tags/svn.1.5.4/PARSIMONY/AP_buffer.cxx

Last change on this file was 6656, checked in by westram, 14 years ago
  • removed unneeded 'struct' keyword
  • renamed several structs (especially things like 'blabla_struct')
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 6.1 KB
Line 
1// =============================================================== //
2//                                                                 //
3//   File      : AP_buffer.cxx                                     //
4//   Purpose   :                                                   //
5//                                                                 //
6//   Institute of Microbiology (Technical University Munich)       //
7//   http://www.arb-home.de/                                       //
8//                                                                 //
9// =============================================================== //
10
11#include "AP_buffer.hxx"
12#include "AP_error.hxx"
13
14#include <iostream>
15
16using namespace std;
17
18#define MAX_SPECIES 250000L
19#define MAX_DSTACKSIZE (MAX_SPECIES*2)   // defaultwert fuer dynamischen stack
20
21AP_STACK::AP_STACK() {
22    first = 0;
23    pointer = 0;
24    stacksize = 0;
25    max_stacksize = MAX_DSTACKSIZE;
26}
27
28AP_STACK::~AP_STACK() {
29    if (stacksize > 0) {
30        new AP_ERR("~AP_STACK()", "Stack is not empty !", 0);
31    }
32}
33
34void AP_STACK::push(void * element) {
35    AP_STACK_ELEM * stackelem = new AP_STACK_ELEM;
36    if (stacksize > max_stacksize) {
37        new AP_ERR("AP_STACK:push()", "Stack owerflow!", 0);
38    }
39    stackelem->node = element;
40    stackelem->next = first;
41    first = stackelem;
42    stacksize ++;
43}
44
45void * AP_STACK::pop() {
46    void * pntr;
47    AP_STACK_ELEM * stackelem;
48    if (!first) return 0;
49    stackelem = first;
50    pntr = first->node;
51    first = first->next;
52    stacksize --;
53    delete stackelem;
54    return pntr;
55}
56
57void AP_STACK::clear() {
58    AP_STACK_ELEM * pntr;
59    while (stacksize > 0) {
60        pntr = first;
61        first = first->next;
62        stacksize --;
63        delete pntr;
64    }
65    return;
66}
67
68void AP_STACK::get_init() {
69    pointer = 0;
70}
71void  * AP_STACK::get_first() {
72    if (first != 0) {
73        return first->node;
74    }
75    else {
76        return 0;
77    }
78}
79
80void  * AP_STACK::get() {
81    if (0 == pointer) {
82        pointer = first;
83    }
84    else {
85        if (pointer->next == 0) {
86            new AP_ERR("AP_STACK: get()", " more get() than elements in stack");
87            pointer = 0;
88            return 0;
89        }
90        else {
91            pointer = pointer->next;
92        }
93    }
94    return pointer->node;
95}
96
97unsigned long AP_STACK::size() {
98    return stacksize;
99}
100
101// ----------------
102//      AP_LIST
103
104AP_LIST::AP_LIST() {
105    list_len = 0;
106    first =  0;
107    last = 0;
108    akt = 0;
109}
110
111AP_LIST::~AP_LIST() {
112}
113
114
115AP_list_elem * AP_LIST::element(void * elem) {
116    AP_list_elem *pntr = first;
117    while (pntr != 0) {
118        if (pntr->node == elem)
119            return pntr;
120        pntr = pntr->next;
121    }
122    return pntr;
123}
124
125int AP_LIST::len() {
126    return list_len;
127}
128
129int AP_LIST::is_element(void * node) {
130    if (element(node) == 0) return 0;
131    return 1;
132}
133
134int AP_LIST::eof() {
135    if (akt == list_len) return 1;
136    return 0;
137}
138
139void AP_LIST::insert(void * new_one) {
140    AP_list_elem * newelem = new AP_list_elem;
141    if (first == 0) {
142        first = newelem;
143        last = newelem;
144        newelem->next = 0;
145        newelem->prev = 0;
146        pointer = first;
147    }
148    else {
149        first->prev = newelem;
150        newelem->prev = 0;
151        newelem->next = first;
152        first = newelem;
153    }
154    newelem->node = new_one;
155    list_len++;
156    return;
157}
158
159void AP_LIST::append(void * new_one) {
160    AP_list_elem * newelem = new AP_list_elem;
161    if (last == 0) {
162        first = newelem;
163        last = newelem;
164        newelem->prev = 0;
165        newelem->next = 0;
166        pointer = first;
167    }
168    else {
169        last->next = newelem;
170        newelem->prev = last;
171        last = newelem;
172        newelem->next = 0;
173    }
174    newelem->node = new_one;
175    list_len++;
176    return;
177}
178
179void AP_LIST::remove(void * object) {
180    AP_list_elem  *elem = element(object);
181    if (elem) {
182        if (elem->prev) {
183            elem->prev->next = elem->next;
184        }
185        else {
186            first = elem->next;
187            elem->next->prev = 0;
188        }
189        if (elem->next) {
190            elem->next->prev = elem->prev;
191        }
192        else {
193            last = elem->prev;
194            elem->prev->next = 0;
195        }
196        if (elem == pointer) pointer = 0;
197        delete elem;
198        list_len --;
199        return;
200    }
201    new AP_ERR("AP_LIST::remove(void * object)", "no buffer element !\n");
202    return;
203}
204
205void AP_LIST::push(void *elem) {
206    AP_list_elem * newelem = new AP_list_elem;
207    if (first == 0) {
208        first = newelem;
209        last = newelem;
210        newelem->next = 0;
211        newelem->prev = 0;
212        pointer = first;
213    }
214    else {
215        first->prev = newelem;
216        newelem->prev = 0;
217        newelem->next = first;
218        first = newelem;
219    }
220    newelem->node = elem;
221    list_len++;
222    return;
223}
224
225void *AP_LIST::pop() {
226    AP_list_elem * pntr = first;
227    if (!first) return 0;
228    void * node = first->node;
229    list_len --;
230    if (0 == list_len) {
231        first = last = 0;
232        delete pntr;
233        return node;
234    }
235    else {
236        first = first->next;
237        first->prev = 0;
238    }
239    delete pntr;
240    return node;
241}
242
243
244void AP_LIST::clear() {
245    AP_list_elem*  npntr;
246    AP_list_elem* pntr = first;
247    while (pntr != 0) {
248        npntr = pntr->next;
249        delete pntr;
250        pntr = npntr;
251    }
252    first = last = 0;
253    akt = 0;
254    list_len = 0;
255}
256
257void AP_tree_buffer::print() {
258    cout  << "AP_tree_buffer                      " << this;
259    cout  << "\nfather " << father;
260    cout  << "\nlefts  " << leftson;
261    cout  << "\nrights " << rightson << "\n sequence " << sequence << "\n";
262}
263
264void AP_main_stack::print() {
265    class AP_tree *elem;
266    unsigned long i = this->size();
267    cout << "AP_main_stack " << this << "  Size " << i << "\n";
268    get_init();
269    for (; i > 0; i--) {
270        elem = (AP_tree *)get();
271        cout << i << " - AP_tree *: " << elem << " \n";
272    }
273    return;
274}
275
276
277void AP_tree_stack::print() {
278    AP_tree_buffer *elem;
279    unsigned long i = this->size();
280    cout << "AP_tree_stack :  Size " << i << "\n";
281    get_init();
282    for (; i > 0; i--) {
283        elem = (AP_tree_buffer *)get();
284        elem->print();
285    }
286    return;
287}
Note: See TracBrowser for help on using the repository browser.