public static void Verify(Pool *self) { Should.NotNull("self", self); Should.TypeEqual("self", self->type, Type); Should.GreaterThanZero("self->len", self->len); Should.Equal("self->HeadSize", HeadSize, 3 * sizeof(int)); Should.Equal("self->TailSize", TailSize, sizeof(int)); int len = Mem.Verify(self->arr); Should.Equal("self->len", self->len, len); // Fdb.Dump(self->arr, len); byte *arr = self->arr; int * head; head = (int *)(arr + self->len - HeadSize); Should.Equal("endHead->prev", head[0], -1); // head.prev = -1 Should.Equal("endHead->next", head[1], -1); // head.next = -1 Should.Equal("endHead->size", head[2], 0); // head.size = 0 head = (int *)arr; Should.Equal("firstHead->prev", head[0], -1); // head.prev = -1 Should.Equal("firstHead->size", head[2], 0); // head.size = 0 Should.Equal("firstTail->size", head[3], -1); // tail.size = -1 int curFree = head[1], lastFree = 0; var dict = new System.Collections.Generic.Dictionary <int, int>(); while (curFree != -1) { head = (int *)(arr + curFree); Should.Equal("head" + curFree + "->prev", head[0], lastFree); Should.Equal("tail->size", *(int *)((byte *)head + HeadSize + head[2]), head[2]); dict.Add(curFree, head[2]); lastFree = curFree; curFree = head[1]; } head = (int *)(arr + HeadSize + TailSize); int *end = (int *)(arr + self->len); while (head < end) { int pos = (int)((byte *)head - self->arr); int prev = head[0], next = head[1], size = head[2]; int *tail = (int *)((byte *)head + HeadSize + size); if (tail < end) { int tailVal = tail[0]; if (tailVal == -1) // in use { Should.False("dict.ContainsKey(pos)", dict.ContainsKey(pos)); Should.Equal("prev", prev, -1); Should.Equal("next", next, -1); Should.GreaterThanZero("size", size); } else // free { Should.True("dict.ContainsKey(pos)" + pos, dict.ContainsKey(pos)); Should.GreaterThanOrEqualTo("prev", prev, 0); Should.GreaterThanOrEqualTo("next", next, -1); Should.Equal("size", size, dict[pos]); dict.Remove(pos); } } else // head is end sentinel, no tail { Should.Equal("head", head, (int *)(arr + len - HeadSize)); Should.Equal("endHead->prev", head[0], -1); // head.prev = -1 Should.Equal("endHead->next", head[1], -1); // head.next = -1 Should.Equal("endHead->size", head[2], 0); // head.size = 0 } head = (int *)((byte *)head + HeadSize + size + TailSize); } Should.Zero("dict.Count", dict.Count); }