source: branches/profile/PARSIMONY/AP_buffer.cxx

Last change on this file was 12936, checked in by westram, 10 years ago
  • remove artificial stack-limit (500000 pushs)
    • no idea what this was good for - maybe only to detect infinite loops or similar
    • fixes #608
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.7 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#include "ap_tree_nlen.hxx"
14
15#include <iostream>
16
17using namespace std;
18
19AP_STACK::AP_STACK() {
20    first = 0;
21    pointer = 0;
22    stacksize = 0;
23}
24
25AP_STACK::~AP_STACK() {
26    if (stacksize > 0) {
27        new AP_ERR("~AP_STACK()", "Stack is not empty !", 0);
28    }
29}
30
31void AP_STACK::push(void * element) {
32    AP_STACK_ELEM *stackelem = new AP_STACK_ELEM;
33    stackelem->node = element;
34    stackelem->next = first;
35    first = stackelem;
36    stacksize++;
37}
38
39void * AP_STACK::pop() {
40    void * pntr;
41    AP_STACK_ELEM * stackelem;
42    if (!first) return 0;
43    stackelem = first;
44    pntr = first->node;
45    first = first->next;
46    stacksize --;
47    delete stackelem;
48    return pntr;
49}
50
51void AP_STACK::clear() {
52    while (stacksize > 0) {
53        AP_STACK_ELEM *pntr = first;
54        first = first->next;
55        stacksize --;
56        delete pntr;
57    }
58}
59
60void AP_STACK::get_init() {
61    pointer = 0;
62}
63void  * AP_STACK::get_first() {
64    if (first != 0) {
65        return first->node;
66    }
67    else {
68        return 0;
69    }
70}
71
72void  * AP_STACK::get() {
73    if (0 == pointer) {
74        pointer = first;
75    }
76    else {
77        if (pointer->next == 0) {
78            new AP_ERR("AP_STACK: get()", " more get() than elements in stack");
79            pointer = 0;
80            return 0;
81        }
82        else {
83            pointer = pointer->next;
84        }
85    }
86    return pointer->node;
87}
88
89unsigned long AP_STACK::size() {
90    return stacksize;
91}
92
93// ----------------
94//      AP_LIST
95
96AP_list_elem * AP_LIST::element(void * elem) {
97    AP_list_elem *pntr = first;
98    while (pntr != 0) {
99        if (pntr->node == elem)
100            return pntr;
101        pntr = pntr->next;
102    }
103    return pntr;
104}
105
106int AP_LIST::len() {
107    return list_len;
108}
109
110int AP_LIST::is_element(void * node) {
111    if (element(node) == 0) return 0;
112    return 1;
113}
114
115int AP_LIST::eof() {
116    if (akt == list_len) return 1;
117    return 0;
118}
119
120void AP_LIST::insert(void * new_one) {
121    AP_list_elem * newelem = new AP_list_elem;
122    if (first == 0) {
123        first = newelem;
124        last = newelem;
125        newelem->next = 0;
126        newelem->prev = 0;
127        pointer = first;
128    }
129    else {
130        first->prev = newelem;
131        newelem->prev = 0;
132        newelem->next = first;
133        first = newelem;
134    }
135    newelem->node = new_one;
136    list_len++;
137    return;
138}
139
140void AP_LIST::append(void * new_one) {
141    AP_list_elem * newelem = new AP_list_elem;
142    if (last == 0) {
143        first = newelem;
144        last = newelem;
145        newelem->prev = 0;
146        newelem->next = 0;
147        pointer = first;
148    }
149    else {
150        last->next = newelem;
151        newelem->prev = last;
152        last = newelem;
153        newelem->next = 0;
154    }
155    newelem->node = new_one;
156    list_len++;
157    return;
158}
159
160void AP_LIST::remove(void * object) {
161    AP_list_elem  *elem = element(object);
162    if (elem) {
163        if (elem->prev) {
164            elem->prev->next = elem->next;
165        }
166        else {
167            first = elem->next;
168            elem->next->prev = 0;
169        }
170        if (elem->next) {
171            elem->next->prev = elem->prev;
172        }
173        else {
174            last = elem->prev;
175            elem->prev->next = 0;
176        }
177        if (elem == pointer) pointer = 0;
178        delete elem;
179        list_len --;
180        return;
181    }
182    new AP_ERR("AP_LIST::remove(void * object)", "no buffer element !\n");
183    return;
184}
185
186void AP_LIST::push(void *elem) {
187    AP_list_elem * newelem = new AP_list_elem;
188    if (first == 0) {
189        first = newelem;
190        last = newelem;
191        newelem->next = 0;
192        newelem->prev = 0;
193        pointer = first;
194    }
195    else {
196        first->prev = newelem;
197        newelem->prev = 0;
198        newelem->next = first;
199        first = newelem;
200    }
201    newelem->node = elem;
202    list_len++;
203    return;
204}
205
206void *AP_LIST::pop() {
207    AP_list_elem * pntr = first;
208    if (!first) return 0;
209    void * node = first->node;
210    list_len --;
211    if (0 == list_len) {
212        first = last = 0;
213        delete pntr;
214        return node;
215    }
216    else {
217        first = first->next;
218        first->prev = 0;
219    }
220    delete pntr;
221    return node;
222}
223
224
225void AP_LIST::clear() {
226    AP_list_elem*  npntr;
227    AP_list_elem* pntr = first;
228    while (pntr != 0) {
229        npntr = pntr->next;
230        delete pntr;
231        pntr = npntr;
232    }
233    first = last = 0;
234    akt = 0;
235    list_len = 0;
236}
237
238void AP_tree_buffer::print() {
239    cout  << "AP_tree_buffer                      " << this;
240    cout  << "\nfather " << father;
241    cout  << "\nlefts  " << leftson;
242    cout  << "\nrights " << rightson << "\n sequence " << sequence << "\n";
243}
244
245void AP_main_stack::print() {
246    unsigned long i = this->size();
247    cout << "AP_main_stack " << this << "  Size " << i << "\n";
248    get_init();
249    for (; i > 0; i--) {
250        AP_tree *elem = get();
251        cout << i << " - AP_tree *: " << elem << " \n";
252    }
253}
254
255
256void AP_tree_stack::print() {
257    unsigned long i = this->size();
258    cout << "AP_tree_stack :  Size " << i << "\n";
259    get_init();
260    for (; i > 0; i--) {
261        AP_tree_buffer *elem = get();
262        elem->print();
263    }
264}
Note: See TracBrowser for help on using the repository browser.