source: tags/cvs_2_svn/PARSIMONY/AP_buffer.cxx

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