31 #define DISABLE_DEBUGLOG 34 #include "pointerlist_p.h" 35 #include <gwenhywfar/debug.h> 46 GWEN_POINTERLIST_TABLE *idt;
51 idt->freeEntries=GWEN_POINTERLIST_TABLE_MAXENTRIES;
60 assert(idt->refCount);
61 if (--(idt->refCount)==0) {
73 for (i=0; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
74 if (idt->entries[i]==0) {
87 if (idt->freeEntries) {
90 i=GWEN_POINTERLIST_TABLE_MAXENTRIES-idt->freeEntries;
105 for (i=0; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
106 if (idt->entries[i]==ptr) {
119 for (i=0; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
120 if (idt->entries[i]==ptr) {
133 return GWEN_POINTERLIST_TABLE_MAXENTRIES==idt->freeEntries;
140 return idt->freeEntries==0;
145 static inline unsigned int GWEN_PointerListTable_GetCount(
const GWEN_POINTERLIST_TABLE *idt)
147 return GWEN_POINTERLIST_TABLE_MAXENTRIES-idt->freeEntries;
152 static inline void *GWEN_PointerListTable_GetFirstPtr(
const GWEN_POINTERLIST_TABLE *idt, uint64_t *tabIdx)
156 for (i=0; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
157 if (idt->entries[i]!=0) {
159 return idt->entries[i];
167 static inline void *GWEN_PointerListTable_GetNextPtr(
const GWEN_POINTERLIST_TABLE *idt, uint64_t *tabIdx)
171 for (i=(*tabIdx)+1; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
172 if (idt->entries[i]!=0) {
174 return idt->entries[i];
191 idl->tableStep=GWEN_POINTERLIST_DEFAULT_STEP;
200 assert(idl->refCount);
209 assert(idl->refCount);
210 if (idl->refCount==1) {
224 GWEN_POINTERLIST_TABLE **tablePtr;
229 tablePtr=idl->pIdTablePointers;
230 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
235 if (idx>=idl->idTableCount) {
237 GWEN_POINTERLIST_TABLE **newPtr;
240 newCount=idl->idTableCount+idl->tableStep;
241 newPtr=(GWEN_POINTERLIST_TABLE **)realloc(idl->pIdTablePointers,
sizeof(GWEN_POINTERLIST_TABLE *)*newCount);
244 memset((
void *)(newPtr+idl->idTableCount),
246 sizeof(GWEN_POINTERLIST_TABLE *)*(newCount-idl->idTableCount));
247 idl->pIdTablePointers=newPtr;
248 idl->pIdTablePointers[idl->idTableCount]=idt;
249 idl->lastTableIdx=idl->idTableCount;
250 idl->idTableCount=newCount;
253 idl->pIdTablePointers[idx]=idt;
254 idl->lastTableIdx=idx;
262 GWEN_POINTERLIST_TABLE *idt=
NULL;
263 GWEN_POINTERLIST_TABLE **tablePtr;
268 if (idl->pIdTablePointers==
NULL) {
270 idl->pIdTablePointers=(GWEN_POINTERLIST_TABLE **) malloc(
sizeof(GWEN_POINTERLIST_TABLE *)*(idl->tableStep));
271 assert(idl->pIdTablePointers);
272 memset(idl->pIdTablePointers, 0,
sizeof(
GWEN_POINTERLIST *)*(idl->tableStep));
273 idl->idTableCount=idl->tableStep;
276 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
282 if (idx>=idl->idTableCount) {
296 if (idl->pIdTablePointers) {
297 GWEN_POINTERLIST_TABLE *idt=
NULL;
298 GWEN_POINTERLIST_TABLE **tablePtr;
301 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
319 if (idl->pIdTablePointers) {
320 GWEN_POINTERLIST_TABLE *idt=
NULL;
321 GWEN_POINTERLIST_TABLE **tablePtr;
324 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
338 GWEN_POINTERLIST_TABLE *idt=
NULL;
339 GWEN_POINTERLIST_TABLE **tablePtr;
342 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
355 if (idl->pIdTablePointers) {
356 GWEN_POINTERLIST_TABLE *idt=
NULL;
357 GWEN_POINTERLIST_TABLE **tablePtr;
360 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
367 free(idl->pIdTablePointers);
368 idl->pIdTablePointers=
NULL;
382 nidl->tableStep=idl->tableStep;
384 nidl->idTableCount=idl->idTableCount;
385 nidl->entryCount=idl->entryCount;
386 if (idl->pIdTablePointers) {
387 for (idx=0; idx<idl->idTableCount; idx++) {
388 GWEN_POINTERLIST_TABLE *idt;
390 idt=idl->pIdTablePointers[idx];
392 GWEN_POINTERLIST_TABLE *nidt;
395 memmove(nidt->entries, idt->entries, GWEN_POINTERLIST_TABLE_MAXENTRIES*
sizeof(
void *));
396 nidt->freeEntries=idt->freeEntries;
410 assert(idl->refCount);
412 return idl->entryCount;
419 GWEN_POINTERLIST_TABLE *idt=
NULL;
420 GWEN_POINTERLIST_TABLE **tablePtr;
425 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
431 for (i=0; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
432 if (idt->entries[i]!=0) {
439 idIndex+=GWEN_POINTERLIST_TABLE_MAXENTRIES;
450 GWEN_POINTERLIST_TABLE *idt;
451 uint64_t tableNum=*pos / GWEN_POINTERLIST_TABLE_MAXENTRIES;
452 uint64_t tableIdx=*pos % GWEN_POINTERLIST_TABLE_MAXENTRIES;
453 GWEN_POINTERLIST_TABLE **tablePtr;
457 if (tableNum>idl->idTableCount) {
463 idIndex=(tableNum*GWEN_POINTERLIST_TABLE_MAXENTRIES);
464 for (idx=tableNum, tablePtr=idl->pIdTablePointers+tableNum; idx<idl->idTableCount; idx++, tablePtr++) {
471 for (i=tableIdx; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
472 if (idt->entries[i]!=0) {
480 for (i=0; i<GWEN_POINTERLIST_TABLE_MAXENTRIES; i++) {
481 if (idt->entries[i]!=0) {
489 idIndex+=GWEN_POINTERLIST_TABLE_MAXENTRIES;
541 GWEN_POINTERLIST_TABLE *idt=
NULL;
545 if (idl->pIdTablePointers==
NULL) {
547 idl->pIdTablePointers=(GWEN_POINTERLIST_TABLE **) malloc(
sizeof(GWEN_POINTERLIST_TABLE *)*(idl->tableStep));
548 assert(idl->pIdTablePointers);
549 memset(idl->pIdTablePointers, 0,
sizeof(GWEN_POINTERLIST_TABLE *)*(idl->tableStep));
550 idl->idTableCount=idl->tableStep;
553 idt=idl->pIdTablePointers[idl->lastTableIdx];
568 GWEN_POINTERLIST_TABLE *idt;
569 uint64_t tableNum=idx / GWEN_POINTERLIST_TABLE_MAXENTRIES;
570 uint64_t tableIdx=idx % GWEN_POINTERLIST_TABLE_MAXENTRIES;
573 if (tableNum>idl->idTableCount) {
578 idt=idl->pIdTablePointers[tableNum];
584 return idt->entries[tableIdx];
int GWEN_PointerList_AppendPtr(GWEN_POINTERLIST *idl, void *ptr)
void GWEN_PointerListTable_free(GWEN_POINTERLIST_TABLE *idt)
#define GWEN_FREE_OBJECT(varname)
GWEN_POINTERLIST_ITERATOR * GWEN_PointerList_Iterator_new(GWEN_POINTERLIST *idl)
static int GWEN_PointerListTable_HasPtr(const GWEN_POINTERLIST_TABLE *idt, void *ptr)
GWEN_POINTERLIST_TABLE * GWEN_PointerListTable_new(void)
void GWEN_PointerList_Clean(GWEN_POINTERLIST *idl)
uint64_t GWEN_PointerList_GetEntryCount(const GWEN_POINTERLIST *idl)
void GWEN_PointerList_free(GWEN_POINTERLIST *idl)
int GWEN_PointerList_AddPtr(GWEN_POINTERLIST *idl, void *ptr)
void * GWEN_PointerList_GetPtrAt(const GWEN_POINTERLIST *idl, uint64_t idx)
void GWEN_PointerList_AddTable(GWEN_POINTERLIST *idl, GWEN_POINTERLIST_TABLE *idt)
void GWEN_PointerList_Attach(GWEN_POINTERLIST *idl)
static int GWEN_PointerListTable_IsFull(const GWEN_POINTERLIST_TABLE *idt)
int GWEN_PointerList_DelPtr(GWEN_POINTERLIST *idl, void *ptr)
#define GWEN_NEW_OBJECT(typ, varname)
void * GWEN_PointerList_GetFirstPtr(const GWEN_POINTERLIST *idl, uint64_t *pos)
void GWEN_PointerList_Clear(GWEN_POINTERLIST *idl)
static int GWEN_PointerListTable_DelPtr(GWEN_POINTERLIST_TABLE *idt, void *ptr)
static int GWEN_PointerListTable_AppendPtr(GWEN_POINTERLIST_TABLE *idt, void *ptr)
static int GWEN_PointerListTable_AddPtr(GWEN_POINTERLIST_TABLE *idt, void *ptr)
int GWEN_PointerList_HasPtr(const GWEN_POINTERLIST *idl, void *ptr)
static int GWEN_PointerListTable_IsEmpty(const GWEN_POINTERLIST_TABLE *idt)
GWEN_POINTERLIST * GWEN_PointerList_dup(const GWEN_POINTERLIST *idl)
#define DBG_ERROR(dbg_logger, format, args...)
void * GWEN_PointerList_Iterator_GetFirstId(GWEN_POINTERLIST_ITERATOR *it)
void GWEN_PointerList_Iterator_free(GWEN_POINTERLIST_ITERATOR *it)
#define DBG_INFO(dbg_logger, format, args...)
void * GWEN_PointerList_Iterator_GetNextId(GWEN_POINTERLIST_ITERATOR *it)
struct GWEN_POINTERLIST GWEN_POINTERLIST
GWEN_POINTERLIST * GWEN_PointerList_new(void)
struct GWEN_POINTERLIST_ITERATOR GWEN_POINTERLIST_ITERATOR
void * GWEN_PointerList_GetNextPtr(const GWEN_POINTERLIST *idl, uint64_t *pos)