xref: /aosp_15_r20/external/fastrpc/inc/AEEQList.h (revision 418b791d679beb2078b579a3b6936cf330c41799)
1*418b791dSBob Badour /**
2*418b791dSBob Badour  * Copyright (c) 2019, The Linux Foundation. All rights reserved.
3*418b791dSBob Badour  *
4*418b791dSBob Badour  * Redistribution and use in source and binary forms, with or without
5*418b791dSBob Badour  * modification, are permitted provided that the following conditions are
6*418b791dSBob Badour  * met:
7*418b791dSBob Badour  *    * Redistributions of source code must retain the above copyright
8*418b791dSBob Badour  *      notice, this list of conditions and the following disclaimer.
9*418b791dSBob Badour  *    * Redistributions in binary form must reproduce the above
10*418b791dSBob Badour  *      copyright notice, this list of conditions and the following
11*418b791dSBob Badour  *      disclaimer in the documentation and/or other materials provided
12*418b791dSBob Badour  *      with the distribution.
13*418b791dSBob Badour  *    * Neither the name of The Linux Foundation nor the names of its
14*418b791dSBob Badour  *      contributors may be used to endorse or promote products derived
15*418b791dSBob Badour  *      from this software without specific prior written permission.
16*418b791dSBob Badour  *
17*418b791dSBob Badour  * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
18*418b791dSBob Badour  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19*418b791dSBob Badour  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
20*418b791dSBob Badour  * ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
21*418b791dSBob Badour  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22*418b791dSBob Badour  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23*418b791dSBob Badour  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
24*418b791dSBob Badour  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
25*418b791dSBob Badour  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
26*418b791dSBob Badour  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27*418b791dSBob Badour  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28*418b791dSBob Badour  */
29*418b791dSBob Badour 
30*418b791dSBob Badour /*===========================================================================
31*418b791dSBob Badour 
32*418b791dSBob Badour FILE:  AEEQList.h
33*418b791dSBob Badour 
34*418b791dSBob Badour GENERAL DESCRIPTION:  Doubly-linked circular list implementation
35*418b791dSBob Badour 
36*418b791dSBob Badour ===========================================================================*/
37*418b791dSBob Badour #ifndef _AEEQLIST_H_
38*418b791dSBob Badour #define _AEEQLIST_H_
39*418b791dSBob Badour 
40*418b791dSBob Badour 
41*418b791dSBob Badour typedef struct QNode QNode;
42*418b791dSBob Badour struct QNode {
43*418b791dSBob Badour    QNode *pNext;
44*418b791dSBob Badour    QNode *pPrev;
45*418b791dSBob Badour };
46*418b791dSBob Badour 
47*418b791dSBob Badour #define QLIST_DEFINE_INIT(f) QList f = { { &f.n, &f.n } }
48*418b791dSBob Badour 
49*418b791dSBob Badour typedef struct QList QList;
50*418b791dSBob Badour struct QList {
51*418b791dSBob Badour    QNode n;
52*418b791dSBob Badour };
53*418b791dSBob Badour 
54*418b791dSBob Badour 
55*418b791dSBob Badour 
QNode_InsPrev(QNode * me,QNode * pn)56*418b791dSBob Badour static __inline void QNode_InsPrev(QNode *me, QNode *pn)
57*418b791dSBob Badour {
58*418b791dSBob Badour    QNode *pPrev = me->pPrev;
59*418b791dSBob Badour 
60*418b791dSBob Badour    pn->pNext    = me;
61*418b791dSBob Badour    pn->pPrev    = pPrev;
62*418b791dSBob Badour    pPrev->pNext = pn;
63*418b791dSBob Badour    me->pPrev    = pn;
64*418b791dSBob Badour }
65*418b791dSBob Badour 
66*418b791dSBob Badour 
QNode_InsNext(QNode * me,QNode * pn)67*418b791dSBob Badour static __inline void QNode_InsNext(QNode *me, QNode *pn)
68*418b791dSBob Badour {
69*418b791dSBob Badour    QNode *pNext = me->pNext;
70*418b791dSBob Badour 
71*418b791dSBob Badour    pn->pPrev    = me;
72*418b791dSBob Badour    pn->pNext    = pNext;
73*418b791dSBob Badour    pNext->pPrev = pn;
74*418b791dSBob Badour    me->pNext    = pn;
75*418b791dSBob Badour }
76*418b791dSBob Badour 
77*418b791dSBob Badour 
78*418b791dSBob Badour 
QNode_Dequeue(QNode * me)79*418b791dSBob Badour static __inline void QNode_Dequeue(QNode *me)
80*418b791dSBob Badour {
81*418b791dSBob Badour    QNode *pNext = me->pNext;
82*418b791dSBob Badour    QNode *pPrev = me->pPrev;
83*418b791dSBob Badour 
84*418b791dSBob Badour    pPrev->pNext = pNext;
85*418b791dSBob Badour    pNext->pPrev = pPrev;
86*418b791dSBob Badour }
87*418b791dSBob Badour 
QNode_CtorZ(QNode * me)88*418b791dSBob Badour static __inline void QNode_CtorZ(QNode *me)
89*418b791dSBob Badour {
90*418b791dSBob Badour    me->pNext = me->pPrev = 0;
91*418b791dSBob Badour }
92*418b791dSBob Badour 
QNode_IsQueuedZ(QNode * me)93*418b791dSBob Badour static __inline int QNode_IsQueuedZ(QNode *me)
94*418b791dSBob Badour {
95*418b791dSBob Badour    return (0 != me->pNext);
96*418b791dSBob Badour }
97*418b791dSBob Badour 
QNode_DequeueZ(QNode * me)98*418b791dSBob Badour static __inline void QNode_DequeueZ(QNode *me)
99*418b791dSBob Badour {
100*418b791dSBob Badour    if (QNode_IsQueuedZ(me)) {
101*418b791dSBob Badour       QNode_Dequeue(me);
102*418b791dSBob Badour       me->pNext = me->pPrev = 0;
103*418b791dSBob Badour    }
104*418b791dSBob Badour }
105*418b791dSBob Badour 
106*418b791dSBob Badour //--------------------------------------------------------------------
107*418b791dSBob Badour //--  QList functions  ----------------------------------------------
108*418b791dSBob Badour //--------------------------------------------------------------------
109*418b791dSBob Badour 
110*418b791dSBob Badour 
QList_Zero(QList * me)111*418b791dSBob Badour static __inline void QList_Zero(QList *me)
112*418b791dSBob Badour {
113*418b791dSBob Badour    me->n.pNext = me->n.pPrev = &me->n;
114*418b791dSBob Badour }
115*418b791dSBob Badour 
116*418b791dSBob Badour 
QList_Ctor(QList * me)117*418b791dSBob Badour static __inline void QList_Ctor(QList *me)
118*418b791dSBob Badour {
119*418b791dSBob Badour    QList_Zero(me);
120*418b791dSBob Badour }
121*418b791dSBob Badour 
122*418b791dSBob Badour 
QList_IsEmpty(QList * me)123*418b791dSBob Badour static __inline int QList_IsEmpty(QList *me)
124*418b791dSBob Badour {
125*418b791dSBob Badour    return me->n.pNext == &me->n;
126*418b791dSBob Badour }
127*418b791dSBob Badour 
QList_IsNull(QList * me)128*418b791dSBob Badour static __inline int QList_IsNull(QList *me)
129*418b791dSBob Badour {
130*418b791dSBob Badour    return ((0 == me->n.pNext) && (0 == me->n.pPrev));
131*418b791dSBob Badour }
132*418b791dSBob Badour 
133*418b791dSBob Badour 
QList_AppendNode(QList * me,QNode * pn)134*418b791dSBob Badour static __inline void QList_AppendNode(QList *me, QNode *pn)
135*418b791dSBob Badour {
136*418b791dSBob Badour    QNode_InsPrev(&me->n, pn);
137*418b791dSBob Badour }
138*418b791dSBob Badour 
139*418b791dSBob Badour 
QList_PrependNode(QList * me,QNode * pn)140*418b791dSBob Badour static __inline void QList_PrependNode(QList *me, QNode *pn)
141*418b791dSBob Badour {
142*418b791dSBob Badour    QNode_InsNext(&me->n, pn);
143*418b791dSBob Badour }
144*418b791dSBob Badour 
145*418b791dSBob Badour 
QList_CtorFrom(QList * me,QList * psrc)146*418b791dSBob Badour static __inline void QList_CtorFrom(QList *me, QList *psrc)
147*418b791dSBob Badour {
148*418b791dSBob Badour    QNode *s = &psrc->n;
149*418b791dSBob Badour    QNode *d = &me->n;
150*418b791dSBob Badour 
151*418b791dSBob Badour    s->pNext->pPrev = d;
152*418b791dSBob Badour    d->pPrev        = s->pPrev;
153*418b791dSBob Badour    d->pNext        = s->pNext;
154*418b791dSBob Badour    s->pPrev->pNext = d;
155*418b791dSBob Badour 
156*418b791dSBob Badour    QList_Zero(psrc);
157*418b791dSBob Badour }
158*418b791dSBob Badour 
159*418b791dSBob Badour 
160*418b791dSBob Badour 
QList_AppendList(QList * me,QList * psrc)161*418b791dSBob Badour static __inline void QList_AppendList(QList *me, QList *psrc)
162*418b791dSBob Badour {
163*418b791dSBob Badour    QNode *s = &psrc->n;
164*418b791dSBob Badour    QNode *d = &me->n;
165*418b791dSBob Badour    QNode *dp = d->pPrev;
166*418b791dSBob Badour    QNode *sn = s->pNext;
167*418b791dSBob Badour    QNode *sp;
168*418b791dSBob Badour 
169*418b791dSBob Badour    sn->pPrev   = dp;
170*418b791dSBob Badour    dp->pNext   = sn;
171*418b791dSBob Badour    d->pPrev    = (sp = s->pPrev);
172*418b791dSBob Badour    sp->pNext   = d;
173*418b791dSBob Badour 
174*418b791dSBob Badour    QList_Zero(psrc);
175*418b791dSBob Badour }
176*418b791dSBob Badour 
177*418b791dSBob Badour 
178*418b791dSBob Badour #define QLIST_FOR_ALL(pList, pNode) \
179*418b791dSBob Badour    for ((pNode) = (pList)->n.pNext; \
180*418b791dSBob Badour         (pNode) != &(pList)->n; \
181*418b791dSBob Badour         (pNode) = (pNode)->pNext)
182*418b791dSBob Badour 
183*418b791dSBob Badour #define QLIST_FOR_REST(pList, pNode) \
184*418b791dSBob Badour    for (; \
185*418b791dSBob Badour         (pNode) != &(pList)->n; \
186*418b791dSBob Badour         (pNode) = (pNode)->pNext)
187*418b791dSBob Badour 
188*418b791dSBob Badour #define QLIST_REV_FOR_ALL(pList, pNode) \
189*418b791dSBob Badour    for ((pNode) = (pList)->n.pPrev; \
190*418b791dSBob Badour         (pNode) != &(pList)->n; \
191*418b791dSBob Badour         (pNode) = (pNode)->pPrev)
192*418b791dSBob Badour 
193*418b791dSBob Badour #define QLIST_REV_FOR_REST(pList, pNode) \
194*418b791dSBob Badour    for (; \
195*418b791dSBob Badour         (pNode) != &(pList)->n; \
196*418b791dSBob Badour         (pNode) = (pNode)->pPrev)
197*418b791dSBob Badour 
198*418b791dSBob Badour /* Allows dequeing QNodes during iteration */
199*418b791dSBob Badour #define QLIST_NEXTSAFE_FOR_ALL(pList, pNode, pNodeNext) \
200*418b791dSBob Badour     for ((pNode) = (pList)->n.pNext, (pNodeNext) = (pNode)->pNext; \
201*418b791dSBob Badour          (pNode) != &(pList)->n; \
202*418b791dSBob Badour          (pNode) = (pNodeNext), (pNodeNext) = (pNode)->pNext)
203*418b791dSBob Badour 
QList_GetFirst(QList * me)204*418b791dSBob Badour static __inline QNode *QList_GetFirst(QList *me)
205*418b791dSBob Badour {
206*418b791dSBob Badour    QNode *pn = me->n.pNext;
207*418b791dSBob Badour 
208*418b791dSBob Badour    return (pn == &me->n ? 0 : pn);
209*418b791dSBob Badour }
210*418b791dSBob Badour 
QList_GetLast(QList * me)211*418b791dSBob Badour static __inline QNode *QList_GetLast(QList *me)
212*418b791dSBob Badour {
213*418b791dSBob Badour    QNode *pn = me->n.pPrev;
214*418b791dSBob Badour 
215*418b791dSBob Badour    return (pn == &me->n ? 0 : pn);
216*418b791dSBob Badour }
217*418b791dSBob Badour 
QList_Pop(QList * me)218*418b791dSBob Badour static __inline QNode *QList_Pop(QList *me)
219*418b791dSBob Badour {
220*418b791dSBob Badour    QNode *pn = me->n.pNext;
221*418b791dSBob Badour    QNode *pnn = pn->pNext;
222*418b791dSBob Badour 
223*418b791dSBob Badour    me->n.pNext = pnn;
224*418b791dSBob Badour    pnn->pPrev   = &me->n;
225*418b791dSBob Badour 
226*418b791dSBob Badour    return (pn == &me->n ? 0 : pn);
227*418b791dSBob Badour }
228*418b791dSBob Badour 
QList_PopZ(QList * me)229*418b791dSBob Badour static __inline QNode *QList_PopZ(QList *me)
230*418b791dSBob Badour {
231*418b791dSBob Badour    QNode *pn = QList_Pop(me);
232*418b791dSBob Badour    if (0 != pn) {
233*418b791dSBob Badour       QNode_CtorZ(pn);
234*418b791dSBob Badour    }
235*418b791dSBob Badour    return pn;
236*418b791dSBob Badour }
237*418b791dSBob Badour 
QList_PopLast(QList * me)238*418b791dSBob Badour static __inline QNode *QList_PopLast(QList *me)
239*418b791dSBob Badour {
240*418b791dSBob Badour    QNode *pp = me->n.pPrev;
241*418b791dSBob Badour    QNode *ppp = pp->pPrev;
242*418b791dSBob Badour 
243*418b791dSBob Badour    me->n.pPrev = ppp;
244*418b791dSBob Badour    ppp->pNext  = &me->n;
245*418b791dSBob Badour 
246*418b791dSBob Badour    return (pp == &me->n ? 0 : pp);
247*418b791dSBob Badour }
248*418b791dSBob Badour 
QList_PopLastZ(QList * me)249*418b791dSBob Badour static __inline QNode *QList_PopLastZ(QList *me)
250*418b791dSBob Badour {
251*418b791dSBob Badour    QNode *pn = QList_PopLast(me);
252*418b791dSBob Badour    if (0 != pn) {
253*418b791dSBob Badour       QNode_CtorZ(pn);
254*418b791dSBob Badour    }
255*418b791dSBob Badour    return pn;
256*418b791dSBob Badour }
257*418b791dSBob Badour 
258*418b791dSBob Badour /*=====================================================================
259*418b791dSBob Badour =======================================================================
260*418b791dSBob Badour DATA STRUCTURE DOCUMENTATION
261*418b791dSBob Badour =======================================================================
262*418b791dSBob Badour 
263*418b791dSBob Badour QNode
264*418b791dSBob Badour 
265*418b791dSBob Badour Description:
266*418b791dSBob Badour  Qnode is the structure that is queued.  One or more Qnodes may be
267*418b791dSBob Badour  embedded in other structures. An object can contain multiple QNodes if
268*418b791dSBob Badour  it needs to be in different lists at the same time.
269*418b791dSBob Badour 
270*418b791dSBob Badour Definition:
271*418b791dSBob Badour 
272*418b791dSBob Badour    typedef struct QNode QNode;
273*418b791dSBob Badour    struct QNode {
274*418b791dSBob Badour       QNode *pNext;
275*418b791dSBob Badour       QNode *pPrev;
276*418b791dSBob Badour    };
277*418b791dSBob Badour 
278*418b791dSBob Badour Members:
279*418b791dSBob Badour 
280*418b791dSBob Badour See Also:
281*418b791dSBob Badour 
282*418b791dSBob Badour =======================================================================
283*418b791dSBob Badour 
284*418b791dSBob Badour QList
285*418b791dSBob Badour 
286*418b791dSBob Badour Description:
287*418b791dSBob Badour  QList keeps a doubly-linked list of QNode structures.
288*418b791dSBob Badour  Each queue is represented by a 'head' node, not a head pointer,
289*418b791dSBob Badour  simplifying and streamlining many operations.
290*418b791dSBob Badour  Because it is doubly-linked it permits constant-time insertion or removal
291*418b791dSBob Badour  of items or of entire queues.
292*418b791dSBob Badour  Because it is circular it permits constant-time operations at both the
293*418b791dSBob Badour  tail and the head of the queue.  Circularity also streamlines some
294*418b791dSBob Badour  operations by eliminating conditional branches.
295*418b791dSBob Badour 
296*418b791dSBob Badour  General rules:
297*418b791dSBob Badour  QLists are always in a defined state; they should be constructed
298*418b791dSBob Badour  before use, using one of the supplied Ctor...() functions.
299*418b791dSBob Badour  QNodes do not track queued vs. unqueued state.  The client should
300*418b791dSBob Badour  never dequeue an un-queued node or queue an already-queued node.
301*418b791dSBob Badour  When not queued, QNode internal state is undefined.   A client may
302*418b791dSBob Badour  implement marking and assertion externally.
303*418b791dSBob Badour 
304*418b791dSBob Badour Definition:
305*418b791dSBob Badour 
306*418b791dSBob Badour    typedef struct QList QList;
307*418b791dSBob Badour    struct QList {
308*418b791dSBob Badour       QNode n;
309*418b791dSBob Badour    };
310*418b791dSBob Badour 
311*418b791dSBob Badour Members:
312*418b791dSBob Badour 
313*418b791dSBob Badour See Also:
314*418b791dSBob Badour 
315*418b791dSBob Badour =======================================================================
316*418b791dSBob Badour INTERFACE DOCUMENTATION
317*418b791dSBob Badour =======================================================================
318*418b791dSBob Badour QNode Interface
319*418b791dSBob Badour 
320*418b791dSBob Badour   QNode is a statically-linked interface.
321*418b791dSBob Badour 
322*418b791dSBob Badour =======================================================================
323*418b791dSBob Badour QNode_CtorZ()
324*418b791dSBob Badour 
325*418b791dSBob Badour Description:
326*418b791dSBob Badour    Zero initialize a QNode.
327*418b791dSBob Badour 
328*418b791dSBob Badour Prototype:
329*418b791dSBob Badour 
330*418b791dSBob Badour    void QNode_CtorZ(QNode *me);
331*418b791dSBob Badour 
332*418b791dSBob Badour Parameters:
333*418b791dSBob Badour    me: the QNode
334*418b791dSBob Badour 
335*418b791dSBob Badour Return Value:
336*418b791dSBob Badour    None
337*418b791dSBob Badour 
338*418b791dSBob Badour Comments:
339*418b791dSBob Badour    None
340*418b791dSBob Badour 
341*418b791dSBob Badour Side Effects:
342*418b791dSBob Badour    None
343*418b791dSBob Badour 
344*418b791dSBob Badour See Also:
345*418b791dSBob Badour    QNode_IsQueued(), QNode_DequeueZ(), QList_PopZ()
346*418b791dSBob Badour 
347*418b791dSBob Badour =======================================================================
348*418b791dSBob Badour QNode_IsQueuedZ()
349*418b791dSBob Badour 
350*418b791dSBob Badour Description:
351*418b791dSBob Badour    Whether a QNode belongs in a Queue.
352*418b791dSBob Badour 
353*418b791dSBob Badour Prototype:
354*418b791dSBob Badour 
355*418b791dSBob Badour    int QNode_IsQueuedZ(QNode *me);
356*418b791dSBob Badour 
357*418b791dSBob Badour Parameters:
358*418b791dSBob Badour    me: the QNode
359*418b791dSBob Badour 
360*418b791dSBob Badour Return Value:
361*418b791dSBob Badour    None
362*418b791dSBob Badour 
363*418b791dSBob Badour Comments:
364*418b791dSBob Badour    None
365*418b791dSBob Badour 
366*418b791dSBob Badour Side Effects:
367*418b791dSBob Badour    Does not work if a node needs to live at address 0x0.
368*418b791dSBob Badour 
369*418b791dSBob Badour See Also:
370*418b791dSBob Badour    QNode_CtorZ(), QNode_DequeueZ(), QList_PopZ()
371*418b791dSBob Badour 
372*418b791dSBob Badour =======================================================================
373*418b791dSBob Badour QNode_DequeueZ()
374*418b791dSBob Badour 
375*418b791dSBob Badour Description:
376*418b791dSBob Badour    Dequeue a QNode if it is in a queue. Idempotent operation.
377*418b791dSBob Badour 
378*418b791dSBob Badour Prototype:
379*418b791dSBob Badour 
380*418b791dSBob Badour    void QNode_DequeueZ(QNode *me);
381*418b791dSBob Badour 
382*418b791dSBob Badour Parameters:
383*418b791dSBob Badour    me: the QNode
384*418b791dSBob Badour 
385*418b791dSBob Badour Return Value:
386*418b791dSBob Badour    None
387*418b791dSBob Badour 
388*418b791dSBob Badour Comments:
389*418b791dSBob Badour    None
390*418b791dSBob Badour 
391*418b791dSBob Badour Side Effects:
392*418b791dSBob Badour    None
393*418b791dSBob Badour 
394*418b791dSBob Badour See Also:
395*418b791dSBob Badour    QNode_CtorZ(), QNode_IsQueued(), QList_PopZ()
396*418b791dSBob Badour 
397*418b791dSBob Badour =======================================================================
398*418b791dSBob Badour 
399*418b791dSBob Badour QNode_InsPrev()
400*418b791dSBob Badour 
401*418b791dSBob Badour Description:
402*418b791dSBob Badour 	insert a node before this one.
403*418b791dSBob Badour 
404*418b791dSBob Badour Prototype:
405*418b791dSBob Badour 	static __inline void QNode_InsPrev(QNode *me, QNode *pn)
406*418b791dSBob Badour 
407*418b791dSBob Badour Parameters:
408*418b791dSBob Badour 	me: the QNode
409*418b791dSBob Badour 	pn: the node to be inserted.
410*418b791dSBob Badour Return Value:
411*418b791dSBob Badour    None
412*418b791dSBob Badour 
413*418b791dSBob Badour Comments:
414*418b791dSBob Badour    None
415*418b791dSBob Badour 
416*418b791dSBob Badour Side Effects:
417*418b791dSBob Badour    None
418*418b791dSBob Badour 
419*418b791dSBob Badour See Also:
420*418b791dSBob Badour    None
421*418b791dSBob Badour 
422*418b791dSBob Badour =======================================================================
423*418b791dSBob Badour 
424*418b791dSBob Badour QNode_InsNext()
425*418b791dSBob Badour 
426*418b791dSBob Badour Description:
427*418b791dSBob Badour 	insert a node after this one.
428*418b791dSBob Badour 
429*418b791dSBob Badour Prototype:
430*418b791dSBob Badour 	static __inline void QNode_InsNext(QNode *me, QNode *pn)
431*418b791dSBob Badour 
432*418b791dSBob Badour Parameters:
433*418b791dSBob Badour 	me: the QNode
434*418b791dSBob Badour 	pn: the node to be inserted.
435*418b791dSBob Badour 
436*418b791dSBob Badour Return Value:
437*418b791dSBob Badour    None
438*418b791dSBob Badour 
439*418b791dSBob Badour Comments:
440*418b791dSBob Badour    None
441*418b791dSBob Badour 
442*418b791dSBob Badour Side Effects:
443*418b791dSBob Badour    None
444*418b791dSBob Badour 
445*418b791dSBob Badour See Also:
446*418b791dSBob Badour    None
447*418b791dSBob Badour 
448*418b791dSBob Badour =======================================================================
449*418b791dSBob Badour QNode_Dequeue()
450*418b791dSBob Badour 
451*418b791dSBob Badour Description:
452*418b791dSBob Badour 	dequeue this node.
453*418b791dSBob Badour 
454*418b791dSBob Badour Prototype:
455*418b791dSBob Badour 	static __inline void QNode_Dequeue(QNode *me)
456*418b791dSBob Badour 
457*418b791dSBob Badour Parameters:
458*418b791dSBob Badour 	me: the QNode to be dequeued
459*418b791dSBob Badour 
460*418b791dSBob Badour Return Value:
461*418b791dSBob Badour    None
462*418b791dSBob Badour 
463*418b791dSBob Badour Comments:
464*418b791dSBob Badour    None
465*418b791dSBob Badour 
466*418b791dSBob Badour Side Effects:
467*418b791dSBob Badour    None
468*418b791dSBob Badour 
469*418b791dSBob Badour See Also:
470*418b791dSBob Badour    None
471*418b791dSBob Badour 
472*418b791dSBob Badour =======================================================================
473*418b791dSBob Badour QList Interface
474*418b791dSBob Badour 
475*418b791dSBob Badour   QList is a statically-linked interface.  It provides a Queue of
476*418b791dSBob Badour   doubly linked nodes.
477*418b791dSBob Badour 
478*418b791dSBob Badour =======================================================================
479*418b791dSBob Badour QList_Zero()
480*418b791dSBob Badour 
481*418b791dSBob Badour Description:
482*418b791dSBob Badour    discard all queued nodes.
483*418b791dSBob Badour 
484*418b791dSBob Badour Prototype:
485*418b791dSBob Badour 
486*418b791dSBob Badour    void QList_Zero(QList *me)
487*418b791dSBob Badour 
488*418b791dSBob Badour Parameters:
489*418b791dSBob Badour    me: the QList
490*418b791dSBob Badour 
491*418b791dSBob Badour Return Value:
492*418b791dSBob Badour    None
493*418b791dSBob Badour 
494*418b791dSBob Badour Comments:
495*418b791dSBob Badour    None
496*418b791dSBob Badour 
497*418b791dSBob Badour Side Effects:
498*418b791dSBob Badour    None
499*418b791dSBob Badour 
500*418b791dSBob Badour See Also:
501*418b791dSBob Badour    None
502*418b791dSBob Badour 
503*418b791dSBob Badour =======================================================================
504*418b791dSBob Badour QList_Ctor()
505*418b791dSBob Badour 
506*418b791dSBob Badour Description:
507*418b791dSBob Badour    Initialize a queue to an empty state
508*418b791dSBob Badour 
509*418b791dSBob Badour Prototype:
510*418b791dSBob Badour 
511*418b791dSBob Badour    void QList_Ctor(QList *me)
512*418b791dSBob Badour 
513*418b791dSBob Badour Parameters:
514*418b791dSBob Badour    me: the QList
515*418b791dSBob Badour 
516*418b791dSBob Badour Return Value:
517*418b791dSBob Badour    None
518*418b791dSBob Badour 
519*418b791dSBob Badour Comments:
520*418b791dSBob Badour    None
521*418b791dSBob Badour 
522*418b791dSBob Badour Side Effects:
523*418b791dSBob Badour    None
524*418b791dSBob Badour 
525*418b791dSBob Badour See Also:
526*418b791dSBob Badour    None
527*418b791dSBob Badour 
528*418b791dSBob Badour =======================================================================
529*418b791dSBob Badour QList_IsEmpty()
530*418b791dSBob Badour 
531*418b791dSBob Badour Description:
532*418b791dSBob Badour    Check whether queue is empty.
533*418b791dSBob Badour 
534*418b791dSBob Badour Prototype:
535*418b791dSBob Badour 
536*418b791dSBob Badour    int QList_IsEmpty(QList *me)
537*418b791dSBob Badour 
538*418b791dSBob Badour Parameters:
539*418b791dSBob Badour    me: the QList
540*418b791dSBob Badour 
541*418b791dSBob Badour Return Value:
542*418b791dSBob Badour    TRUE if queue is empty.
543*418b791dSBob Badour 
544*418b791dSBob Badour Comments:
545*418b791dSBob Badour    None
546*418b791dSBob Badour 
547*418b791dSBob Badour Side Effects:
548*418b791dSBob Badour    None
549*418b791dSBob Badour 
550*418b791dSBob Badour See Also:
551*418b791dSBob Badour    None
552*418b791dSBob Badour 
553*418b791dSBob Badour =======================================================================
554*418b791dSBob Badour QList_AppendNode()
555*418b791dSBob Badour 
556*418b791dSBob Badour Description:
557*418b791dSBob Badour    Append the node to the queue. Make it the last 'next' (and the
558*418b791dSBob Badour    first 'prev')
559*418b791dSBob Badour 
560*418b791dSBob Badour Prototype:
561*418b791dSBob Badour 
562*418b791dSBob Badour    void QList_AppendNode(QList *me, QNode *pn)
563*418b791dSBob Badour 
564*418b791dSBob Badour Parameters:
565*418b791dSBob Badour    me: the QList
566*418b791dSBob Badour    pn: the node to append.
567*418b791dSBob Badour 
568*418b791dSBob Badour Return Value:
569*418b791dSBob Badour    None
570*418b791dSBob Badour 
571*418b791dSBob Badour Comments:
572*418b791dSBob Badour    None
573*418b791dSBob Badour 
574*418b791dSBob Badour Side Effects:
575*418b791dSBob Badour    None
576*418b791dSBob Badour 
577*418b791dSBob Badour See Also:
578*418b791dSBob Badour    None
579*418b791dSBob Badour 
580*418b791dSBob Badour =======================================================================
581*418b791dSBob Badour QList_PrependNode()
582*418b791dSBob Badour 
583*418b791dSBob Badour Description:
584*418b791dSBob Badour    Prepend a node to the queue. Make it the first 'next' (and the
585*418b791dSBob Badour    last 'prev').
586*418b791dSBob Badour 
587*418b791dSBob Badour Prototype:
588*418b791dSBob Badour 
589*418b791dSBob Badour    void QList_PrependNode(QList *me, QNode *pn)
590*418b791dSBob Badour 
591*418b791dSBob Badour Parameters:
592*418b791dSBob Badour    me: the QList
593*418b791dSBob Badour    pn: the node to prepend.
594*418b791dSBob Badour 
595*418b791dSBob Badour Return Value:
596*418b791dSBob Badour    None
597*418b791dSBob Badour 
598*418b791dSBob Badour Comments:
599*418b791dSBob Badour    None
600*418b791dSBob Badour 
601*418b791dSBob Badour Side Effects:
602*418b791dSBob Badour    None
603*418b791dSBob Badour 
604*418b791dSBob Badour See Also:
605*418b791dSBob Badour    None
606*418b791dSBob Badour 
607*418b791dSBob Badour =======================================================================
608*418b791dSBob Badour QList_CtorFrom()
609*418b791dSBob Badour 
610*418b791dSBob Badour Description:
611*418b791dSBob Badour    Move nodes from one queue to a newly constructed queue.
612*418b791dSBob Badour    Weird aliasing voodoo allows this to work without conditional branches, even
613*418b791dSBob Badour    when psrc is empty.  In that case, "s->pNext->pPrev = d" overwrites s->pPrev with d,
614*418b791dSBob Badour    so that "s->pPrev->pNext = d" will later overwrite d->pNext with d.
615*418b791dSBob Badour 
616*418b791dSBob Badour Prototype:
617*418b791dSBob Badour 
618*418b791dSBob Badour    void QList_CtorFrom(QList *me, QList *psrc)
619*418b791dSBob Badour 
620*418b791dSBob Badour Parameters:
621*418b791dSBob Badour    me: the QList
622*418b791dSBob Badour    psrc: the Qlist from
623*418b791dSBob Badour 
624*418b791dSBob Badour Return Value:
625*418b791dSBob Badour    None
626*418b791dSBob Badour 
627*418b791dSBob Badour Comments:
628*418b791dSBob Badour    None
629*418b791dSBob Badour 
630*418b791dSBob Badour Side Effects:
631*418b791dSBob Badour    None
632*418b791dSBob Badour 
633*418b791dSBob Badour See Also:
634*418b791dSBob Badour    None
635*418b791dSBob Badour 
636*418b791dSBob Badour =======================================================================
637*418b791dSBob Badour QList_AppendList()
638*418b791dSBob Badour 
639*418b791dSBob Badour Description:
640*418b791dSBob Badour   Move all nodes from a source queue to the end of this queue.
641*418b791dSBob Badour   Note that weird aliasing voodoo allows this to work without conditional
642*418b791dSBob Badour   branches when psrc is empty.  A summary:
643*418b791dSBob Badour 
644*418b791dSBob Badour       SNP = DP      =>  SP = DP, because SNP aliases SP
645*418b791dSBob Badour       DPN = SN      =>  DPN = S
646*418b791dSBob Badour       DP = SP       =>  DP = DP, because SP was overwritten with DP
647*418b791dSBob Badour       SPN = D       =>  DPN = D
648*418b791dSBob Badour 
649*418b791dSBob Badour Prototype:
650*418b791dSBob Badour 
651*418b791dSBob Badour    void QList_AppendList(QList *me, QList *psrc)
652*418b791dSBob Badour 
653*418b791dSBob Badour Parameters:
654*418b791dSBob Badour    me: the QList
655*418b791dSBob Badour    psrc: the source Qlist.
656*418b791dSBob Badour 
657*418b791dSBob Badour Return Value:
658*418b791dSBob Badour    None
659*418b791dSBob Badour 
660*418b791dSBob Badour Comments:
661*418b791dSBob Badour    None
662*418b791dSBob Badour 
663*418b791dSBob Badour Side Effects:
664*418b791dSBob Badour    None
665*418b791dSBob Badour 
666*418b791dSBob Badour See Also:
667*418b791dSBob Badour    None
668*418b791dSBob Badour 
669*418b791dSBob Badour =======================================================================
670*418b791dSBob Badour QList_GetFirst()
671*418b791dSBob Badour 
672*418b791dSBob Badour Description:
673*418b791dSBob Badour    Get the first item on the queue
674*418b791dSBob Badour 
675*418b791dSBob Badour Prototype:
676*418b791dSBob Badour 
677*418b791dSBob Badour    QNode *QList_GetFirst(QList *me)
678*418b791dSBob Badour 
679*418b791dSBob Badour Parameters:
680*418b791dSBob Badour    me: the QList
681*418b791dSBob Badour 
682*418b791dSBob Badour Return Value:
683*418b791dSBob Badour    pointer to QNode or 0 if queue is empty.
684*418b791dSBob Badour 
685*418b791dSBob Badour Comments:
686*418b791dSBob Badour    None
687*418b791dSBob Badour 
688*418b791dSBob Badour Side Effects:
689*418b791dSBob Badour    None
690*418b791dSBob Badour 
691*418b791dSBob Badour See Also:
692*418b791dSBob Badour    QList_GetLast
693*418b791dSBob Badour 
694*418b791dSBob Badour =======================================================================
695*418b791dSBob Badour QList_GetLast()
696*418b791dSBob Badour 
697*418b791dSBob Badour Description:
698*418b791dSBob Badour    Get the last item on the queue
699*418b791dSBob Badour 
700*418b791dSBob Badour Prototype:
701*418b791dSBob Badour 
702*418b791dSBob Badour    QNode *QList_GetLast(QList *me)
703*418b791dSBob Badour 
704*418b791dSBob Badour Parameters:
705*418b791dSBob Badour    me: the QList
706*418b791dSBob Badour 
707*418b791dSBob Badour Return Value:
708*418b791dSBob Badour    pointer to QNode or 0 if queue is empty.
709*418b791dSBob Badour 
710*418b791dSBob Badour Comments:
711*418b791dSBob Badour    None
712*418b791dSBob Badour 
713*418b791dSBob Badour Side Effects:
714*418b791dSBob Badour    None
715*418b791dSBob Badour 
716*418b791dSBob Badour See Also:
717*418b791dSBob Badour    QList_GetFirst
718*418b791dSBob Badour 
719*418b791dSBob Badour =======================================================================
720*418b791dSBob Badour QList_Pop()
721*418b791dSBob Badour 
722*418b791dSBob Badour Description:
723*418b791dSBob Badour    Remove and return the first item on the queue (FIFO).
724*418b791dSBob Badour 
725*418b791dSBob Badour Prototype:
726*418b791dSBob Badour 
727*418b791dSBob Badour    QNode *QList_Pop(QList *me)
728*418b791dSBob Badour 
729*418b791dSBob Badour Parameters:
730*418b791dSBob Badour    me: the QList
731*418b791dSBob Badour 
732*418b791dSBob Badour Return Value:
733*418b791dSBob Badour    pointer to QNode or 0 if queue is empty
734*418b791dSBob Badour 
735*418b791dSBob Badour Comments:
736*418b791dSBob Badour    None
737*418b791dSBob Badour 
738*418b791dSBob Badour Side Effects:
739*418b791dSBob Badour    None
740*418b791dSBob Badour 
741*418b791dSBob Badour See Also:
742*418b791dSBob Badour    QNode_PopZ, QNode_PopLast(), QNode_PopLastZ, QNode_CtorZ(), QNode_IsQueued(),
743*418b791dSBob Badour    QNode_DequeueZ()
744*418b791dSBob Badour 
745*418b791dSBob Badour =======================================================================
746*418b791dSBob Badour QList_PopZ()
747*418b791dSBob Badour 
748*418b791dSBob Badour Description:
749*418b791dSBob Badour    Remove and return the first item on the queue (FIFO). Same as QList_Pop(),
750*418b791dSBob Badour    except the node retured is zero-initialized.
751*418b791dSBob Badour 
752*418b791dSBob Badour Prototype:
753*418b791dSBob Badour 
754*418b791dSBob Badour    QNode *QList_PopZ(QList *me)
755*418b791dSBob Badour 
756*418b791dSBob Badour Parameters:
757*418b791dSBob Badour    me: the QList
758*418b791dSBob Badour 
759*418b791dSBob Badour Return Value:
760*418b791dSBob Badour    pointer to QNode or 0 if queue is empty
761*418b791dSBob Badour 
762*418b791dSBob Badour Comments:
763*418b791dSBob Badour    None
764*418b791dSBob Badour 
765*418b791dSBob Badour Side Effects:
766*418b791dSBob Badour    None
767*418b791dSBob Badour 
768*418b791dSBob Badour See Also:
769*418b791dSBob Badour    QNode_Pop, QNode_PopLast(), QNode_PopLastZ, QNode_CtorZ(), QNode_IsQueued(),
770*418b791dSBob Badour    QNode_DequeueZ()
771*418b791dSBob Badour 
772*418b791dSBob Badour =======================================================================
773*418b791dSBob Badour QList_PopLast()
774*418b791dSBob Badour 
775*418b791dSBob Badour Description:
776*418b791dSBob Badour    Remove and return the first item on the queue (FILO).
777*418b791dSBob Badour 
778*418b791dSBob Badour Prototype:
779*418b791dSBob Badour 
780*418b791dSBob Badour    QNode *QList_PopLast(QList *me)
781*418b791dSBob Badour 
782*418b791dSBob Badour Parameters:
783*418b791dSBob Badour    me: the QList
784*418b791dSBob Badour 
785*418b791dSBob Badour Return Value:
786*418b791dSBob Badour    pointer to QNode or 0 if queue is empty
787*418b791dSBob Badour 
788*418b791dSBob Badour Comments:
789*418b791dSBob Badour    None
790*418b791dSBob Badour 
791*418b791dSBob Badour Side Effects:
792*418b791dSBob Badour    None
793*418b791dSBob Badour 
794*418b791dSBob Badour See Also:
795*418b791dSBob Badour    QNode_PopLastZ, QNode_Pop(), QNode_PopZ, QNode_CtorZ(), QNode_IsQueued(),
796*418b791dSBob Badour    QNode_DequeueZ()
797*418b791dSBob Badour 
798*418b791dSBob Badour =======================================================================
799*418b791dSBob Badour 
800*418b791dSBob Badour QList_IsNull()
801*418b791dSBob Badour 
802*418b791dSBob Badour Description:
803*418b791dSBob Badour Checks if the QList is null or not.
804*418b791dSBob Badour 
805*418b791dSBob Badour Prototype:
806*418b791dSBob Badour static __inline int QList_IsNull(QList *me)
807*418b791dSBob Badour 
808*418b791dSBob Badour Parameters:
809*418b791dSBob Badour    me: the QList
810*418b791dSBob Badour 
811*418b791dSBob Badour Return Value:
812*418b791dSBob Badour    True or False.
813*418b791dSBob Badour 
814*418b791dSBob Badour Comments:
815*418b791dSBob Badour    None
816*418b791dSBob Badour 
817*418b791dSBob Badour Side Effects:
818*418b791dSBob Badour    None
819*418b791dSBob Badour 
820*418b791dSBob Badour See Also:
821*418b791dSBob Badour 	None
822*418b791dSBob Badour 
823*418b791dSBob Badour =======================================================================
824*418b791dSBob Badour 
825*418b791dSBob Badour QList_PopLastZ()
826*418b791dSBob Badour 
827*418b791dSBob Badour Description:
828*418b791dSBob Badour    Remove and return the first item on the queue (FILO).
829*418b791dSBob Badour    Same as QList_PopLast(), except the node retured is zero-initialized.
830*418b791dSBob Badour 
831*418b791dSBob Badour Prototype:
832*418b791dSBob Badour 
833*418b791dSBob Badour    QNode *QList_PopLastZ(QList *me)
834*418b791dSBob Badour 
835*418b791dSBob Badour Parameters:
836*418b791dSBob Badour    me: the QList
837*418b791dSBob Badour 
838*418b791dSBob Badour Return Value:
839*418b791dSBob Badour    pointer to QNode or 0 if queue is empty
840*418b791dSBob Badour 
841*418b791dSBob Badour Comments:
842*418b791dSBob Badour    None
843*418b791dSBob Badour 
844*418b791dSBob Badour Side Effects:
845*418b791dSBob Badour    None
846*418b791dSBob Badour 
847*418b791dSBob Badour See Also:
848*418b791dSBob Badour    QNode_Pop(), QNode_PopZ, QNode_CtorZ(), QNode_IsQueued(), QNode_DequeueZ()
849*418b791dSBob Badour 
850*418b791dSBob Badour =====================================================================*/
851*418b791dSBob Badour #endif // _AEEQLIST_H_
852