source: branches/port5/NALIGNER/ali_tlist.cxx

Last change on this file was 4912, checked in by westram, 18 years ago
  • untabified + indented
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 5.9 KB
Line 
1
2#include <stdio.h>
3#include "ali_misc.hxx"
4
5#include "ali_tlist.hxx"
6
7
8
9template <class T>
10void ALI_TLIST<T>::append_end(T &a)
11{
12    ALI_TLIST_ELEM<T> *elem = new ALI_TLIST_ELEM<T>(a);
13
14    if (last_elem != 0) {
15        last_elem->next_elem = elem;
16        elem->prev_elem = last_elem;
17        last_elem = elem;
18    }
19    else {
20        last_elem = first_elem = current_elem = elem;
21    }
22    cardinal++;
23}
24
25template <class T>
26void ALI_TLIST<T>::append_end(ALI_TLIST<T> &a)
27{
28    ALI_TLIST_ELEM<T> *elem, *akt_elem;
29
30    for (akt_elem = a.first_elem; akt_elem != 0; 
31         akt_elem = akt_elem->next_elem) {
32        elem = new ALI_TLIST_ELEM<T>(akt_elem->info);
33        if (last_elem != 0) {
34            last_elem->next_elem = elem;
35            elem->prev_elem = last_elem;
36            last_elem = elem;
37        }
38        else {
39            last_elem = first_elem = current_elem = elem;
40        }
41        cardinal++;
42    }
43}
44
45template <class T>
46void ALI_TLIST<T>::append_front(T &a)
47{
48    ALI_TLIST_ELEM<T> *elem = new ALI_TLIST_ELEM<T>(a);
49
50    if (first_elem != 0) {
51        first_elem->prev_elem = elem;
52        elem->next_elem = first_elem;
53        first_elem = elem;
54    }
55    else {
56        last_elem = first_elem = current_elem = elem;
57    }
58    cardinal++;
59}
60
61template <class T>
62void ALI_TLIST<T>::append_front(ALI_TLIST<T> &a)
63{
64    ALI_TLIST_ELEM<T> *elem, *akt_elem;
65
66    for (akt_elem = a.last_elem; akt_elem != 0; 
67         akt_elem = akt_elem->prev_elem) {
68        elem = new ALI_TLIST_ELEM<T>(akt_elem->info);
69        if (first_elem != 0) {
70            first_elem->prev_elem = elem;
71            elem->next_elem = first_elem;
72            first_elem = elem;
73        }
74        else {
75            last_elem = first_elem = current_elem = elem;
76        }
77        cardinal++;
78    }
79}
80
81template <class T>
82void ALI_TLIST<T>::insert_after(T &a)
83{
84    ALI_TLIST_ELEM<T> *elem = new ALI_TLIST_ELEM<T>(a);
85
86    if (current_elem != 0) {
87        if (current_elem->next_elem != 0) {
88            elem->next_elem = current_elem->next_elem;
89            current_elem->next_elem->prev_elem = elem;
90        }
91        current_elem->next_elem = elem;
92        elem->prev_elem = current_elem;
93        if (current_elem == last_elem)
94            last_elem = elem;
95    }
96    else {
97        last_elem = first_elem = current_elem = elem;
98    }
99    cardinal++;
100}
101
102template <class T>
103void ALI_TLIST<T>::insert_after(ALI_TLIST<T> &a)
104{
105    ALI_TLIST_ELEM<T> *elem, *akt_elem;
106
107    for (akt_elem = a.first_elem; akt_elem != 0; 
108         akt_elem = akt_elem->next_elem) {
109        elem = new ALI_TLIST_ELEM<T>(akt_elem->info);
110        if (current_elem != 0) {
111            if (current_elem->next_elem != 0) {
112                elem->next_elem = current_elem->next_elem;
113                current_elem->next_elem->prev_elem = elem;
114            }
115            current_elem->next_elem = elem;
116            elem->prev_elem = current_elem;
117            if (current_elem == last_elem)
118                last_elem = elem;
119        }
120        else {
121            last_elem = first_elem = current_elem = elem;
122        }
123        cardinal++;
124    }
125}
126
127template <class T>
128void ALI_TLIST<T>::insert_bevor(T &a)
129{
130    ALI_TLIST_ELEM<T> *elem = new ALI_TLIST_ELEM<T>(a);
131
132    if (current_elem != 0) {
133        if (current_elem->prev_elem != 0) {
134            elem->prev_elem = current_elem->prev_elem;
135            current_elem->prev_elem->next_elem = elem;
136        }
137        current_elem->prev_elem = elem;
138        elem->next_elem = current_elem;
139        if (current_elem == first_elem)
140            first_elem = elem;
141    }
142    else {
143        last_elem = first_elem = current_elem = elem;
144    }
145    cardinal++;
146}
147
148template <class T>
149void ALI_TLIST<T>::insert_bevor(ALI_TLIST<T> &a)
150{
151    ALI_TLIST_ELEM<T> *elem, *akt_elem;
152
153    for (akt_elem = a.last_elem; akt_elem != 0; 
154         akt_elem = akt_elem->prev_elem) {
155        elem = new ALI_TLIST_ELEM<T>(akt_elem->info);
156        if (current_elem != 0) {
157            if (current_elem->prev_elem != 0) {
158                elem->prev_elem = current_elem->prev_elem;
159                current_elem->prev_elem->next_elem = elem;
160            }
161            current_elem->prev_elem = elem;
162            elem->next_elem = current_elem;
163            if (current_elem == first_elem)
164                first_elem = elem;
165        }
166        else {
167            last_elem = first_elem = current_elem = elem;
168        }
169        cardinal++;
170    }
171}
172
173template<class T>
174void ALI_TLIST<T>::delete_element(void)
175{
176    ALI_TLIST_ELEM<T> *elem;
177
178    if (current_elem != 0) {
179        if (current_elem == marked_elem) {
180            ali_warning("Delete marked element");
181            marked_elem = 0;
182        }
183        /*   prev_elem <--> current <--> next_elem   */
184        if (current_elem->prev_elem != 0 && current_elem->next_elem != 0) {
185            elem = current_elem;
186            current_elem->prev_elem->next_elem = current_elem->next_elem;
187            current_elem->next_elem->prev_elem = current_elem->prev_elem;
188            current_elem = current_elem->next_elem;
189            delete elem;
190        }
191        else {
192            /*   prev_elem <--> current -|   */
193            if (current_elem->prev_elem != 0) {
194                elem = current_elem;
195                current_elem->prev_elem->next_elem = 0;
196                current_elem = current_elem->prev_elem;
197                last_elem = current_elem;
198                delete elem;
199            }
200            else {
201                /*   |- current <--> next_elem   */
202                if (current_elem->next_elem != 0) {
203                    elem = current_elem;
204                    current_elem->next_elem->prev_elem = 0;
205                    current_elem = current_elem->next_elem;
206                    first_elem = current_elem;
207                    delete elem;
208                }
209                else {
210                    /*   |- current -|   */
211                    elem = current_elem;
212                    delete elem;
213                    first_elem = last_elem = current_elem = 0;
214                }
215            }
216        }
217        cardinal--;
218    }
219}
220
221
Note: See TracBrowser for help on using the repository browser.