public static void Verify(PtrLst *self) { Should.NotNull("self", self); Should.TypeEqual("self", self->type, Type); int len = Mem.Verify(self->arr) / sizeof(void *); Should.Equal("self->len", self->len, len); Should.InRange("self->count", self->count, 0, self->len); Should.Equal("self->size", self->size, sizeof(void *)); }
public static void RemoveAt(PtrLst *self, int idx) { #if FDB Verify(self); Should.InRange("idx", idx, 0, self->count - 1); #endif byte *src = (byte *)(self->arr + idx); int size = self->size; int count = self->count -= 1; // void **arr = self->arr; // for (int i = idx; i < count; i += 1) arr[i] = arr[i + 1]; Mem.Memmove(src, src + size, (count - idx) * size); }
public static void Verify(PtrIntDict *self) { Should.NotNull("self", self); Should.InRange("self->level", self->level, 0, Const.Lens.Length - 1); Should.Equal("self->len", self->len, Const.Lens[self->level]); Should.InRange("self->count", self->count, 0, self->len); Should.InRange("self->free", self->free, -1, self->len - 1); Mem.Verify(self->entries); Should.NotNull("self->arr", self->arr); int len = self->len; int count = self->count; int j = 0; for (int i = 0; i < len; i += 1) { var entry = self->entries + i; if (entry->val != null) // a real key { j += 1; } } Should.Equal("j", j, count); int freeCount = len - count; int free = self->free; while (free != -1) { freeCount -= 1; free = self->entries[free].next; } Should.Zero("freeCount", freeCount); j = 0; for (int i = 0; i < len; i += 1) { int idx = self->arr[i]; while (idx != -1) { var entry = self->entries + idx; Should.Equal("entry->hash % len", (uint)entry->hash % len, i); j += 1; idx = entry->next; } } // Fdb.Dump(self->arr, self->len * IntSize); // Fdb.Dump(self->entries, self->len * EntrySize, EntrySize); Should.Equal("j", j, count); }
public static void Free(Pool *self, void *ptr) { #if FDB Verify(self); Should.InRange("ptr", ptr, self->arr, self->arr + self->len); #endif byte *arr = self->arr; // Fdb.Dump(arr, self->len); int *head = (int *)ptr - 3; SetFreeMetaAndInsert(arr, head, head[2]); #if FDB Verify(self); #endif MergeRight(arr, head); #if FDB Verify(self); #endif MergeLeft(arr, head); #if FDB Verify(self); #endif }