source: tags/initial/PARSIMONY/AP_buffer.cxx

Last change on this file was 2, checked in by oldcode, 24 years ago

Initial revision

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