vide_public/external/libsdf/include/libsdf/dll.h

90 lines
2.8 KiB
C

#ifndef _DLLdotH_
#define _DLLdotH_
#include "chn.h"
#ifdef __cplusplus
extern "C"{
#endif
typedef struct Dll_elmt_s{
struct Dll_elmt_s *up, *down;
void *stuff[1]; /* Will be alloc'ed to something else! */
/* DON'T PUT ANYTHING HERE!!! It will be silently mangleded */
} Dll_elmt;
typedef struct {
Dll_elmt Sup, Inf;
Chn *chn;
int length; /* why not? */
} Dll ;
/* Create a Chain suitable for passing to DllCreate */
void DllCreateChn(Chn *chn, int sz, int n);
/* Create a new Dll */
void DllCreate(Dll *dll, Chn *chn);
/* Terminate a Dll */
void DllTerminate(Dll *dll);
/* Return a new element just above 'DOWN' */
Dll_elmt *DllInsertAbove(Dll *dll, Dll_elmt *down);
/* Return a new element just below 'UP' */
Dll_elmt *DllInsertBelow(Dll *dll, Dll_elmt *up);
/* Delete OLD. Return nothing. */
void DllDelete(Dll *dll, Dll_elmt *old);
/* Delete OLD. Return the entry that used to be above it. */
Dll_elmt *DllDeleteUp(Dll *dll, Dll_elmt *old);
/* Delete OLD. Return the entry that used to be below it. */
Dll_elmt *DllDeleteDown(Dll *dll, Dll_elmt *old);
/* Extract the 'mover' and place it immediately above 'down'.
Like DllDelete, followed by DllInsertAbove, but preserve the
data in the object. */
void DllMoveAbove(Dll *dll, Dll_elmt *mover, Dll_elmt *down);
/* Extract the 'mover' and place it immediately below 'up'.
Like DllDelete, followed by DllInsertBelow, but preserve the
data in the object. */
void DllMoveBelow(Dll *dll, Dll_elmt *mover, Dll_elmt *up);
/* These would require __inline__ to be done properly. */
/* Insert a new element at the bottom, equivalent to:
DllInsertAbove(dll, DllInf(dll)); */
Dll_elmt *DllInsertAtBottom(Dll *dll);
/* Insert a new element at the top, equivalent to:
DllInsertBelow(dll, DllSup(dll)); */
Dll_elmt *DllInsertAtTop(Dll *dll);
/* Move to bottom */
void DllMoveToBottom(Dll *dll, Dll_elmt *mover);
/* Move to top */
void DllMoveToTop(Dll *dll, Dll_elmt *mover);
/* Should we bother with __inline__. These are simple enough that #define
is sufficient. */
/* How many elements? */
int DllLength(Dll *dll);
#define DllLength(dll) ((dll)->length)
/* One past the topmost 'user' element */
Dll_elmt *DllSup(Dll *dll);
#define DllSup(dll) (&((dll)->Sup))
/* One below the lowest 'user' element */
Dll_elmt *DllInf(Dll *dll);
#define DllInf(dll) (&((dll)->Inf))
/* The highest 'user' element */
Dll_elmt *DllTop(Dll *dll);
#define DllTop(dll) ((dll)->Sup.down)
/* The lowest 'user' element */
Dll_elmt *DllBottom(Dll *dll);
#define DllBottom(dll) ((dll)->Inf.up)
/* The 'user' data */
void *DllData(Dll_elmt *elmt);
#define DllData(elmt) ((void *)((elmt)->stuff))
/* The next elements, both up and down */
Dll_elmt *DllUp(Dll_elmt *elmt);
#define DllUp(elmt) ((elmt)->up)
Dll_elmt *DllDown(Dll_elmt *elmt);
#define DllDown(elmt) ((elmt)->down)
#ifdef __cplusplus
}
#endif
#endif /* _DLLdotH_ */