31 #define DISABLE_DEBUGLOG
33 #include "idlist64_p.h"
34 #include <gwenhywfar/debug.h>
56 idt->freeEntries=GWEN_IDTABLE64_MAXENTRIES;
64 assert(idt->refCount);
65 if (--(idt->refCount)==0) {
74 void GWEN_IdTable64_Attach(GWEN_IDTABLE64 *idt) {
76 assert(idt->refCount);
86 for (i=0; i<GWEN_IDTABLE64_MAXENTRIES; i++) {
87 if (idt->entries[i]==0) {
99 if (idt->freeEntries) {
102 i=GWEN_IDTABLE64_MAXENTRIES-idt->freeEntries;
116 for (i=0; i<GWEN_IDTABLE64_MAXENTRIES; i++) {
117 if (idt->entries[i]==
id) {
129 for (i=0; i<GWEN_IDTABLE64_MAXENTRIES; i++) {
130 if (idt->entries[i]==
id) {
142 return GWEN_IDTABLE64_MAXENTRIES==idt->freeEntries;
148 return idt->freeEntries==0;
153 static inline unsigned int GWEN_IdTable64_GetCount(
const GWEN_IDTABLE64 *idt) {
154 return GWEN_IDTABLE64_MAXENTRIES-idt->freeEntries;
159 static inline uint64_t GWEN_IdTable64_GetFirstId(GWEN_IDTABLE64 *idt) {
164 for (i=0; i<GWEN_IDTABLE64_MAXENTRIES; i++) {
165 if (idt->entries[i]!=0) {
167 return idt->entries[i];
175 static inline uint64_t GWEN_IdTable64_GetNextId(GWEN_IDTABLE64 *idt) {
178 for (i=idt->current+1; i<GWEN_IDTABLE64_MAXENTRIES; i++) {
179 if (idt->entries[i]!=0) {
181 return idt->entries[i];
184 idt->current=GWEN_IDTABLE64_MAXENTRIES;
190 static inline uint64_t GWEN_IdTable64_GetFirstId2(
const GWEN_IDTABLE64 *idt,
194 for (i=0; i<GWEN_IDTABLE64_MAXENTRIES; i++) {
195 if (idt->entries[i]!=0) {
197 return idt->entries[i];
205 static inline uint64_t GWEN_IdTable64_GetNextId2(
const GWEN_IDTABLE64 *idt,
209 for (i=(*tabIdx)+1; i<GWEN_IDTABLE64_MAXENTRIES; i++) {
210 if (idt->entries[i]!=0) {
212 return idt->entries[i];
235 assert(idl->refCount);
243 assert(idl->refCount);
244 if (idl->refCount==1) {
257 GWEN_IDTABLE64 **tablePtr;
262 tablePtr=idl->pIdTablePointers;
263 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
268 if (idx>=idl->idTableCount) {
270 GWEN_IDTABLE64 **newPtr;
273 newCount=idl->idTableCount+GWEN_IDLIST64_STEP;
274 newPtr=(GWEN_IDTABLE64 **)realloc(idl->pIdTablePointers,
sizeof(GWEN_IDTABLE64*)*newCount);
277 memset((
void*)(newPtr+idl->idTableCount),
279 sizeof(GWEN_IDTABLE64*)*(newCount-idl->idTableCount));
280 idl->pIdTablePointers=newPtr;
281 idl->pIdTablePointers[idl->idTableCount]=idt;
282 idl->lastTableIdx=idl->idTableCount;
283 idl->idTableCount=newCount;
286 idl->pIdTablePointers[idx]=idt;
287 idl->lastTableIdx=idx;
294 #ifdef GWEN_IDLIST64_COMPACT
295 GWEN_IDTABLE64 *idt=
NULL;
296 GWEN_IDTABLE64 **tablePtr;
301 if (idl->pIdTablePointers==
NULL) {
303 idl->pIdTablePointers=(GWEN_IDTABLE64 **) malloc(
sizeof(GWEN_IDTABLE64*)*GWEN_IDLIST64_STEP);
304 assert(idl->pIdTablePointers);
305 memset(idl->pIdTablePointers, 0,
sizeof(GWEN_IDTABLE64*)*GWEN_IDLIST64_STEP);
306 idl->idTableCount=GWEN_IDLIST64_STEP;
309 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
315 if (idx>=idl->idTableCount) {
323 GWEN_IDTABLE64 *idt=
NULL;
328 if (idl->pIdTablePointers==
NULL) {
330 idl->pIdTablePointers=(GWEN_IDTABLE64 **) malloc(
sizeof(GWEN_IDTABLE64*)*GWEN_IDLIST64_STEP);
331 assert(idl->pIdTablePointers);
332 memset(idl->pIdTablePointers, 0,
sizeof(GWEN_IDTABLE64*)*GWEN_IDLIST64_STEP);
333 idl->idTableCount=GWEN_IDLIST64_STEP;
335 idx=idl->lastTableIdx;
336 idt=idl->pIdTablePointers[idx];
350 if (idl->pIdTablePointers) {
351 GWEN_IDTABLE64 *idt=
NULL;
352 GWEN_IDTABLE64 **tablePtr;
355 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
372 if (idl->pIdTablePointers) {
373 GWEN_IDTABLE64 *idt=
NULL;
374 GWEN_IDTABLE64 **tablePtr;
377 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
390 GWEN_IDTABLE64 *idt=
NULL;
391 GWEN_IDTABLE64 **tablePtr;
394 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
406 if (idl->pIdTablePointers) {
407 GWEN_IDTABLE64 *idt=
NULL;
408 GWEN_IDTABLE64 **tablePtr;
411 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
418 free(idl->pIdTablePointers);
419 idl->pIdTablePointers=
NULL;
428 uint64_t a=*((
const uint64_t*)pa);
429 uint64_t b=*((
const uint64_t*)pb);
442 uint64_t a=*((
const uint64_t*)pa);
443 uint64_t b=*((
const uint64_t*)pb);
457 assert(idl->refCount);
458 if (idl->pIdTablePointers && idl->entryCount) {
470 ptr=(uint64_t*)malloc(
sizeof(uint64_t)*cnt);
474 for (i=0; i<cnt; i++) {
495 for (i=0; i<cnt; i++) {
523 nidl->idTableCount=idl->idTableCount;
524 nidl->entryCount=idl->entryCount;
525 if (idl->pIdTablePointers) {
526 for (idx=0; idx<idl->idTableCount; idx++) {
529 idt=idl->pIdTablePointers[idx];
531 GWEN_IDTABLE64 *nidt;
534 memmove(nidt->entries, idt->entries, GWEN_IDTABLE64_MAXENTRIES*
sizeof(uint64_t));
535 nidt->freeEntries=idt->freeEntries;
548 assert(idl->refCount);
550 return idl->entryCount;
556 GWEN_IDTABLE64 *idt=
NULL;
557 GWEN_IDTABLE64 **tablePtr;
562 for (idx=0, tablePtr=idl->pIdTablePointers; idx<idl->idTableCount; idx++, tablePtr++) {
568 for (i=0; i<GWEN_IDTABLE64_MAXENTRIES; i++) {
569 if (idt->entries[i]!=0) {
576 idIndex+=GWEN_IDTABLE64_MAXENTRIES;
587 uint64_t tableNum=*pos / GWEN_IDTABLE64_MAXENTRIES;
588 uint64_t tableIdx=*pos % GWEN_IDTABLE64_MAXENTRIES;
589 GWEN_IDTABLE64 **tablePtr;
593 if (tableNum>idl->idTableCount) {
599 idIndex=(tableNum*GWEN_IDTABLE64_MAXENTRIES);
600 for (idx=tableNum, tablePtr=idl->pIdTablePointers+tableNum; idx<idl->idTableCount; idx++, tablePtr++) {
607 for (i=tableIdx; i<GWEN_IDTABLE64_MAXENTRIES; i++) {
608 if (idt->entries[i]!=0) {
616 for (i=0; i<GWEN_IDTABLE64_MAXENTRIES; i++) {
617 if (idt->entries[i]!=0) {
625 idIndex+=GWEN_IDTABLE64_MAXENTRIES;
635 #ifndef NO_DEPRECATED_SYMBOLS
657 #endif // ifndef NO_DEPRECATED_SYMBOLS
700 GWEN_IDTABLE64 *idt=
NULL;
704 if (idl->pIdTablePointers==
NULL) {
706 idl->pIdTablePointers=(GWEN_IDTABLE64 **) malloc(
sizeof(GWEN_IDTABLE64*)*GWEN_IDLIST64_STEP);
707 assert(idl->pIdTablePointers);
708 memset(idl->pIdTablePointers, 0,
sizeof(GWEN_IDTABLE64*)*GWEN_IDLIST64_STEP);
709 idl->idTableCount=GWEN_IDLIST64_STEP;
712 assert(idl->lastTableIdx<idl->idTableCount);
713 idt=idl->pIdTablePointers[idl->lastTableIdx];
728 uint64_t tableNum=idx / GWEN_IDTABLE64_MAXENTRIES;
729 uint64_t tableIdx=idx % GWEN_IDTABLE64_MAXENTRIES;
732 if (tableNum>idl->idTableCount) {
737 idt=idl->pIdTablePointers[tableNum];
743 return idt->entries[tableIdx];
uint64_t GWEN_IdList64_GetFirstId2(const GWEN_IDLIST64 *idl, uint64_t *pos)
int GWEN_IdList64_HasId(const GWEN_IDLIST64 *idl, uint64_t id)
GWEN_IDLIST64_ITERATOR * GWEN_IdList64_Iterator_new(GWEN_IDLIST64 *idl)
#define GWEN_FREE_OBJECT(varname)
static int GWEN_IdTable64_DelId(GWEN_IDTABLE64 *idt, uint64_t id)
static int GWEN_IdTable64_HasId(const GWEN_IDTABLE64 *idt, uint64_t id)
int GWEN_IdList64_DelId(GWEN_IDLIST64 *idl, uint64_t id)
static int __compDescending(const void *pa, const void *pb)
int GWEN_IdList64_Sort(GWEN_IDLIST64 *idl)
void GWEN_IdList64_free(GWEN_IDLIST64 *idl)
void GWEN_IdList64_Iterator_free(GWEN_IDLIST64_ITERATOR *it)
static int GWEN_IdTable64_AddId(GWEN_IDTABLE64 *idt, uint64_t id)
uint64_t GWEN_IdList64_GetFirstId(GWEN_IDLIST64 *idl)
uint64_t GWEN_IdList64_GetEntryCount(const GWEN_IDLIST64 *idl)
static int GWEN_IdList64__Sort(GWEN_IDLIST64 *idl, int ascending)
uint64_t GWEN_IdList64__GetNextId(const GWEN_IDLIST64 *idl, uint64_t *pos)
#define GWEN_NEW_OBJECT(typ, varname)
GWEN_IDTABLE64 * GWEN_IdTable64_new(void)
static int GWEN_IdTable64_IsFull(const GWEN_IDTABLE64 *idt)
void GWEN_IdList64_AddTable(GWEN_IDLIST64 *idl, GWEN_IDTABLE64 *idt)
uint64_t GWEN_IdList64_Iterator_GetFirstId(GWEN_IDLIST64_ITERATOR *it)
uint64_t GWEN_IdList64_GetNextId(GWEN_IDLIST64 *idl)
int GWEN_IdList64_AddId(GWEN_IDLIST64 *idl, uint64_t id)
static int __compAscending(const void *pa, const void *pb)
int GWEN_IdList64_AppendId(GWEN_IDLIST64 *idl, uint64_t id)
#define DBG_ERROR(dbg_logger, format, args...)
GWEN_IDLIST64 * GWEN_IdList64_dup(const GWEN_IDLIST64 *idl)
void GWEN_IdList64_Clear(GWEN_IDLIST64 *idl)
#define DBG_INFO(dbg_logger, format, args...)
void GWEN_IdList64_Attach(GWEN_IDLIST64 *idl)
GWEN_IDLIST64 * GWEN_IdList64_new(void)
static int GWEN_IdTable64_IsEmpty(const GWEN_IDTABLE64 *idt)
void GWEN_IdList64_Clean(GWEN_IDLIST64 *idl)
uint64_t GWEN_IdList64_Iterator_GetNextId(GWEN_IDLIST64_ITERATOR *it)
static int GWEN_IdTable64_AppendId(GWEN_IDTABLE64 *idt, uint64_t id)
uint64_t GWEN_IdList64__GetFirstId(const GWEN_IDLIST64 *idl, uint64_t *pos)
void GWEN_IdTable64_free(GWEN_IDTABLE64 *idt)
uint64_t GWEN_IdList64_GetNextId2(const GWEN_IDLIST64 *idl, uint64_t *pos)
uint64_t GWEN_IdList64_GetIdAt(const GWEN_IDLIST64 *idl, uint64_t idx)
struct GWEN_IDLIST64_ITERATOR GWEN_IDLIST64_ITERATOR
struct GWEN_IDLIST64 GWEN_IDLIST64
int GWEN_IdList64_ReverseSort(GWEN_IDLIST64 *idl)