48#include <TargConfig.h>
56typedef struct DoubleLink
60 void operator delete(
void* d) {
if(d)
::baFree(d); }
61 void *
operator new(size_t,
void *place) {
return place; }
62 void operator delete(
void*,
void *) { }
65 void insertAfter(DoubleLink* newLink);
66 void insertBefore(DoubleLink* newLink);
69 DoubleLink* getNext();
71 struct DoubleLink* next;
72 struct DoubleLink* prev;
77typedef struct DoubleList
81 void insertFirst(DoubleLink* newLink);
82 void insertLast(DoubleLink* newLink);
83 bool isLast(DoubleLink* n);
84 DoubleLink* firstNode();
85 DoubleLink* lastNode();
87 DoubleLink* removeFirst();
88 bool isInList(DoubleLink* n);
95#define DoubleLink_constructor(o) do { \
96 ((DoubleLink*)o)->next = 0; \
97 ((DoubleLink*)o)->prev = 0; \
101#define DoubleLink_destructor(o) do { \
102 if(DoubleLink_isLinked(o)) \
103 DoubleLink_unlink((DoubleLink*)o); \
106#define DoubleLink_insertAfter(o, newLink) do { \
107 baAssert(((DoubleLink*)newLink)->prev==0&&((DoubleLink*)newLink)->next==0);\
108 ((DoubleLink*)newLink)->next = ((DoubleLink*)o)->next; \
109 ((DoubleLink*)newLink)->prev = ((DoubleLink*)o); \
110 ((DoubleLink*)o)->next->prev = ((DoubleLink*)newLink); \
111 ((DoubleLink*)o)->next = ((DoubleLink*)newLink); \
115#define DoubleLink_insertBefore(o, newLink) do { \
116 baAssert(((DoubleLink*)newLink)->prev==0&&((DoubleLink*)newLink)->next==0);\
117 ((DoubleLink*)newLink)->prev = ((DoubleLink*)o)->prev; \
118 ((DoubleLink*)newLink)->next = ((DoubleLink*)o); \
119 ((DoubleLink*)o)->prev->next = ((DoubleLink*) newLink); \
120 ((DoubleLink*)o)->prev = ((DoubleLink*) newLink); \
125#define DoubleLink_isLinked(o) \
126 (((DoubleLink*)o)->prev ? TRUE : FALSE)
128#define DoubleLink_isLinked(o) \
129 (((DoubleLink*)o)->prev ? (baAssert(((DoubleLink*)o)->next), TRUE) : FALSE)
132#define DoubleLink_getNext(o) ((DoubleLink*)(o))->next
134#define DoubleLink_unlink(o) do { \
135 baAssert(((DoubleLink*)o)->prev && ((DoubleLink*)o)->next);\
136 ((DoubleLink*) o)->next->prev = ((DoubleLink*)o)->prev; \
137 ((DoubleLink*) o)->prev->next = ((DoubleLink*)o)->next; \
138 ((DoubleLink*) o)->next = 0; \
139 ((DoubleLink*) o)->prev = 0; \
142#define DoubleList_constructor(o) do { \
143 (o)->next = (DoubleLink*)o; \
144 (o)->prev = (DoubleLink*)o; \
148#define DoubleList_insertFirst(o, newLink) do { \
149 baAssert(((DoubleLink*)newLink)->prev==0&&((DoubleLink*)newLink)->next==0);\
150 ((DoubleLink*)newLink)->next = (o)->next; \
151 ((DoubleLink*)newLink)->prev = (DoubleLink*)o; \
152 (o)->next->prev = ((DoubleLink*) newLink); \
153 (o)->next = ((DoubleLink*) newLink); \
157#define DoubleList_insertLast(o, newLink) do { \
158 baAssert(((DoubleLink*)newLink)->prev==0&&((DoubleLink*)newLink)->next==0);\
159 ((DoubleLink*)newLink)->next = (DoubleLink*)o; \
160 ((DoubleLink*)newLink)->prev = (o)->prev; \
161 (o)->prev->next = ((DoubleLink*)newLink); \
162 (o)->prev = ((DoubleLink*)newLink); \
166#define DoubleList_isLast(o, n) (((DoubleLink*)(n))->next == (DoubleLink*)(o))
167#define DoubleList_isEnd(o, n) ((DoubleLink*)(n) == (DoubleLink*)(o))
169#define DoubleList_firstNode(o) \
170 ((o)->next != (DoubleLink*)o ? (o)->next : 0)
171#define DoubleList_lastNode(o) \
172 ((o)->prev != (DoubleLink*)o ? (o)->prev : 0)
176#define DoubleList_isEmpty(o) \
177 ((o)->next == ((DoubleLink*)(o)))
184BA_API DoubleLink* DoubleList_removeFirst(DoubleList* o);
193#if defined(NDEBUG) || defined(ESP_PLATFORM)
194#define DoubleList_isInList(o, node) (((DoubleLink*)node)->prev ? TRUE : FALSE)
196#define DoubleList_isInList(o, node) DoubleList_isInListF(o, node, __FILE__, __LINE__)
197BA_API
BaBool DoubleList_isInListF(DoubleList* o,
void* node,
const char* file,
int line);
201BA_API
void DoubleLink_constructor(
void* o);
202BA_API
void DoubleLink_destructor(
void* o);
203BA_API
void DoubleLink_insertAfter(
void* o,
void* newLink);
204BA_API
void DoubleLink_insertBefore(
void* o,
void* newLink);
205BA_API
int DoubleLink_isLinked(
void* o);
206BA_API DoubleLink* DoubleLink_getNext(
void* o);
207BA_API
void DoubleLink_unlink(DoubleLink* o);
208BA_API
void DoubleList_constructor(DoubleList* o);
209BA_API
void DoubleList_insertFirst(DoubleList* o,
void* newLink);
210BA_API
void DoubleList_insertLast(DoubleList* o,
void* newLink);
211BA_API
int DoubleList_isLast(DoubleList* o,
void* n);
212BA_API
int DoubleList_isEnd(DoubleList* o,
void* n);
213BA_API DoubleLink* DoubleList_firstNode(DoubleList* o);
214BA_API DoubleLink* DoubleList_lastNode(DoubleList* o);
220inline DoubleLink::DoubleLink() {
221 DoubleLink_constructor(
this);
223inline DoubleLink::~DoubleLink() {
224 DoubleLink_destructor(
this);
226inline void DoubleLink::insertAfter(DoubleLink* newLink) {
227 DoubleLink_insertAfter(
this, newLink);
229inline void DoubleLink::insertBefore(DoubleLink* newLink) {
230 DoubleLink_insertBefore(
this, newLink);
232inline void DoubleLink::unlink() {
233 DoubleLink_unlink(
this);
235inline bool DoubleLink::isLinked() {
236 return DoubleLink_isLinked(
this) ? true :
false;
238inline DoubleLink* DoubleLink::getNext() {
239 return DoubleLink_getNext(
this);
241inline DoubleList::DoubleList() {
242 DoubleList_constructor(
this);
244inline void DoubleList::insertFirst(DoubleLink* newLink) {
245 DoubleList_insertFirst(
this, newLink);
247inline void DoubleList::insertLast(DoubleLink* newLink) {
248 DoubleList_insertLast(
this, newLink);
250inline bool DoubleList::isLast(DoubleLink* n) {
251 return DoubleList_isLast(
this, n) ? true :
false;
253inline DoubleLink* DoubleList::firstNode() {
254 return DoubleList_firstNode(
this);
256inline DoubleLink* DoubleList::lastNode() {
257 return DoubleList_lastNode(
this);
259inline bool DoubleList::isEmpty() {
260 return DoubleList_isEmpty(
this) ? true :
false;
262inline DoubleLink* DoubleList::removeFirst() {
263 return DoubleList_removeFirst(
this);
265inline bool DoubleList::isInList(DoubleLink* n) {
266 return DoubleList_isInList(
this, n) ? true :
false;
293typedef struct DoubleListEnumerator
296 DoubleListEnumerator(){}
297 DoubleListEnumerator(DoubleList* list);
298 DoubleLink* getElement();
299 DoubleLink* nextElement();
300 DoubleLink* removeElement();
304 DoubleLink* curElement;
305} DoubleListEnumerator;
307#define DoubleListEnumerator_getElement(o) (o)->curElement
310#define DoubleListEnumerator_constructor(o, listMA) do \
312 (o)->list = listMA; \
313 (o)->curElement = DoubleList_firstNode((o)->list);\
316#define DoubleListEnumerator_nextElement(o) \
317 ((o)->curElement ? ( \
318 (o)->curElement = (o)->curElement->next == (DoubleLink*)(o)->list ? 0 : (o)->curElement->next, \
328BA_API
void DoubleListEnumerator_constructor(DoubleListEnumerator* o, DoubleList* list);
329BA_API DoubleLink* DoubleListEnumerator_nextElement(DoubleListEnumerator* o);
333BA_API DoubleLink* DoubleListEnumerator_removeElement(DoubleListEnumerator* o);
336inline DoubleListEnumerator::DoubleListEnumerator(DoubleList* list) {
337 DoubleListEnumerator_constructor(
this, list); }
339DoubleListEnumerator::removeElement() {
340 return DoubleListEnumerator_removeElement(
this); }
342DoubleListEnumerator::getElement() {
return DoubleListEnumerator_getElement(
this);}
344DoubleListEnumerator::nextElement() {
return DoubleListEnumerator_nextElement(
this); }
void * baMalloc(size_t size)
Allocate uninitialized storage using the target's configured allocator.
void baFree(void *p)
Release storage using the target's configured allocator.
U8 BaBool
Boolean stored in an unsigned byte; FALSE is zero and TRUE is one.
Definition: GenPrimT.h:118