71#include <TargConfig.h>
82struct SingleListEnumerator;
94typedef struct SingleLink
98 SingleLink* getNext();
100 friend struct SingleList;
101 friend struct SingleListEnumerator;
103 struct SingleLink* next;
105#define SingleLink_constructor(o) ((SingleLink*)(o))->next = 0
106#define SingleLink_getNext(o) ((SingleLink*)(o))->next
107#define SingleLink_isLinked(o) \
108 (((SingleLink*)o)->next ? TRUE : FALSE)
111inline SingleLink::SingleLink() {SingleLink_constructor(
this);}
112inline SingleLink* SingleLink::getNext() {
return SingleLink_getNext(
this);}
122typedef struct SingleList
126 void insertLast(SingleLink* link);
127 SingleLink* removeFirst();
128 SingleLink* peekFirst();
130 bool isLast(SingleLink* link);
132 friend struct SingleListEnumerator;
138#define SingleList_insertLast(o, linkMA) do \
140 baAssert((SingleLink*)(linkMA) != (SingleLink*)(o)); \
141 baAssert(((SingleLink*)(linkMA))->next == 0); \
142 (o)->last->next = (SingleLink*)(linkMA); \
143 (o)->last = (SingleLink*)(linkMA); \
144 ((SingleLink*)(linkMA))->next = (SingleLink*)(o); \
147#define SingleList_peekFirst(o) ((o)->link.next == (SingleLink*)(o) ? 0 : (o)->link.next)
149#define SingleList_isEmpty(o) ((o)->link.next == (SingleLink*)(o))
150#define SingleList_isLast(o, n) ((n)->next == (SingleLink*)(o))
155BA_API
void SingleList_constructor(SingleList* o);
156BA_API SingleLink* SingleList_removeFirst(SingleList* o);
160SingleList::SingleList() { SingleList_constructor(
this); }
162SingleList::insertLast(SingleLink* link) { SingleList_insertLast(
this, link); }
164SingleList::peekFirst() {
return SingleList_peekFirst(
this); }
166SingleList::isEmpty() {
return SingleList_isEmpty(
this); }
168SingleList::isLast(SingleLink* link) {
return SingleList_isLast(
this,link); }
170SingleList::removeFirst() {
return SingleList_removeFirst(
this); }
193typedef struct SingleListEnumerator
196 SingleListEnumerator(){}
197 SingleListEnumerator(SingleList* list);
198 SingleLink* getElement();
199 SingleLink* nextElement();
200 SingleLink* removeElement();
201 int insertBefore(SingleLink* l);
205 SingleLink* prevElement;
206 SingleLink* curElement;
207} SingleListEnumerator;
209#define SingleListEnumerator_constructor(o, listMA) do \
211 (o)->list = listMA; \
212 (o)->prevElement = (SingleLink*)listMA; \
213 (o)->curElement = SingleList_isEmpty(listMA) ? 0 : (o)->list->link.next; \
216#define SingleListEnumerator_getElement(o) (o)->curElement
218#define SingleListEnumerator_nextElement(o) \
219 ((o)->curElement ? ( \
220 (o)->prevElement = (o)->prevElement->next, \
221 (o)->curElement = (o)->curElement == (o)->list->last ? 0 : (o)->curElement->next, \
228BA_API
int SingleListEnumerator_insertBefore(
229 SingleListEnumerator*, SingleLink*);
230BA_API SingleLink* SingleListEnumerator_removeElement(SingleListEnumerator* o);
233inline SingleListEnumerator::SingleListEnumerator(SingleList* list) {
234 SingleListEnumerator_constructor(
this, list); }
236SingleListEnumerator::removeElement() {
237 return SingleListEnumerator_removeElement(
this); }
239SingleListEnumerator::getElement() {
return SingleListEnumerator_getElement(
this);}
241SingleListEnumerator::nextElement() {
return SingleListEnumerator_nextElement(
this); }
242inline int SingleListEnumerator::insertBefore(SingleLink* l) {
243 return SingleListEnumerator_insertBefore(
this, l); }
250#if defined(SingleListCode) && ! defined(SingleListCodeIncluded)
251#define SingleListCodeIncluded
254SingleList_constructor(SingleList* o)
256 SingleLink_constructor((SingleLink*)o);
257 o->last = ((SingleLink*)o);
258 o->last->next = ((SingleLink*)o);
259 o->link.next = ((SingleLink*)o);
264SingleListEnumerator_insertBefore(SingleListEnumerator* o, SingleLink* l)
269 if(SingleList_isEmpty(o->list))
270 SingleList_insertLast(o->list, l);
273 l->next = o->prevElement->next;
274 o->prevElement->next = l;
282SingleListEnumerator_removeElement(SingleListEnumerator* o)
287 SingleLink* cur = o->curElement;
289 if(cur == o->list->last)
292 o->list->last = o->prevElement;
293 o->prevElement->next = (SingleLink*)o->list;
297 o->curElement = o->curElement->next;
298 o->prevElement->next = o->curElement;
302 return o->curElement;
307SingleList_removeFirst(SingleList* o)
309 SingleLink* link2Remove;
310 link2Remove = o->link.next;
311 if(o->link.next == o->last)
313 if(o->link.next == (SingleLink*)o)
315 o->link.next = o->last = (SingleLink*)o;
318 o->link.next = o->link.next->next;
319 link2Remove->next = 0;