00001 #ifndef __si_sys_list_h__2e82ce77_7819_45a9_b682_5e4a386054d7
00002 #define __si_sys_list_h__2e82ce77_7819_45a9_b682_5e4a386054d7
00003
00004 #include <si_sys/defs.h>
00005 #include <si_sys/blkalloc.h>
00006
00014 typedef struct sc_listNodeAllocator sc_listNodeAllocator;
00015
00020 typedef struct sc_listNode
00021 {
00022 struct sc_listNode* next;
00023 struct sc_listNode* prev;
00024 void* ownr;
00025 } sc_listNode;
00026
00031 typedef struct sc_list {
00032 sc_listNode* head;
00033 sc_listNode end;
00034 s_int32 nodeCount;
00036 sc_listNodeAllocator* nodeAllocator;
00037 } sc_list;
00038
00039
00042 typedef sc_status (*sc_listNode_constructCopyf)(void* pitem, void* pothr);
00047 typedef sc_status (*sc_listNode_assignf)(void* pitem, void* pothr);
00052 typedef sc_status (*sc_listNode_destructf)(void* pitem);
00058
00063 typedef struct sc_listNodeDescriptor
00064 {
00065 s_int32 nodeSize;
00066
00067 sc_listNode_constructCopyf constructCopy;
00068 sc_listNode_assignf assign;
00069 sc_listNode_destructf destruct;
00070
00071 } sc_listNodeDescriptor;
00072
00075 typedef struct sc_listIterator
00076 {
00077 struct {
00078 sc_listNode* node;
00079 } priv_;
00080 } sc_listIterator;
00081
00082
00083 sc_status sc_listIterator_init(sc_listIterator* pit);
00085 sc_status sc_listIterator_next(sc_listIterator* pit);
00087 sc_status sc_listIterator_prev(sc_listIterator* pit);
00091 sc_status sc_list_construct(sc_list* pl,
00092 const sc_listNodeDescriptor* ndesc,
00093 s_int32 initialCapacity, s_int32 maxCapacity);
00105 sc_status sc_list_destruct(sc_list* pl);
00110 sc_status sc_list_getBegin(sc_list* pl, sc_listIterator* pit);
00119 sc_status sc_list_getEnd(sc_list* pl, sc_listIterator* pit);
00126 sc_status sc_list_getIsEmpty(sc_list* pl, s_bool* pIsEmpty);
00133 sc_status sc_list_clear(sc_list* pl);
00138 sc_status sc_list_insert(sc_list* pl, sc_listIterator* it, void* nt);
00147 sc_status sc_list_erase(sc_list* pl, sc_listIterator* it);
00156 sc_status sc_list_remove(sc_list* pl, sc_listIterator* it);
00166 sc_status sc_list_pushBack(sc_list* pl, void* pnt);
00175 sc_status sc_list_pushFront(sc_list* pl, void* pnt);
00184 sc_status sc_list_popBack(sc_list* pl, void* pnt);
00197 sc_status sc_list_popFront(sc_list* pl, void* pnt);
00211 sc_status sc_list_front(sc_list* pl, void** ppnt);
00220 sc_status sc_list_back(sc_list* pl, void** ppnt);
00229 sc_status sc_list_getSize(sc_list* pl, s_uint32* sz);
00237 #endif