void* AArray::in(void *pkey) { //printf("_aaIn(), .length = %d, .ptr = %x\n", aa.a.length, cast(uint)aa.a.ptr); size_t len = buckets_length; if (len) { hash_t key_hash = keyti->getHash(pkey); //printf("hash = %d\n", key_hash); size_t i = key_hash % len; aaA *e = buckets[i]; while (e != NULL) { int c; c = key_hash - e->hash; if (c == 0) { c = keyti->compare(pkey, e + 1); if (c == 0) return (char *)(e + 1) + aligntsize(keyti->tsize()); } if (c < 0) e = e->left; else e = e->right; } } // Not found return NULL; }
void* AArray::get(void *pkey) { //printf("AArray::get()\n"); size_t i; aaA* e; const size_t keysize = keyti->tsize(); const size_t aligned_keysize = aligntsize(keysize); if (!buckets_length) { typedef aaA* aaAp; buckets_length = prime_list[0]; buckets = new aaAp[buckets_length]; memset(buckets, 0, buckets_length * sizeof(buckets[0])); } hash_t key_hash = keyti->getHash(pkey); i = key_hash % buckets_length; //printf("key_hash = %x, buckets_length = %d, i = %d\n", key_hash, buckets_length, i); aaA** pe = &buckets[i]; while ((e = *pe) != NULL) { int c; c = hashCmp(key_hash, e->hash); if (c == 0) { c = keyti->compare(pkey, e + 1); if (c == 0) goto Lret; } if (c < 0) pe = &e->left; else pe = &e->right; } // Not found, create new elem //printf("create new one\n"); e = (aaA *) new char[sizeof(aaA) + aligned_keysize + valuesize]; memcpy(e + 1, pkey, keysize); memset((unsigned char *)(e + 1) + aligned_keysize, 0, valuesize); e->hash = key_hash; e->left = NULL; e->right = NULL; *pe = e; ++nodes; //printf("length = %d, nodes = %d\n", buckets_length, nodes); if (nodes > buckets_length * 4) { //printf("rehash()\n"); rehash(); } Lret: return (void *)((char *)(e + 1) + aligned_keysize); }
void *AArray::values_x(aaA *e, void *p) { const size_t keysize = keyti->tsize(); const size_t aligned_keysize = aligntsize(keysize); do { memcpy(p, (char *)(e + 1) + aligned_keysize, valuesize); p = (void *)((char *)p + valuesize); if (e->left) { if (!e->right) { e = e->left; continue; } p = values_x(e->left, p); } e = e->right; } while (e != NULL); return p; }
int AArray::apply(void *parameter, dg2_t dg) { int result = 0; //printf("_aaApply(aa = %p, keysize = %d, dg = %p)\n", this, keyti->tsize(), dg); if (nodes) { size_t keysize = aligntsize(keyti->tsize()); for (size_t i = 0; i < buckets_length; i++) { aaA* e = buckets[i]; if (e) { result = apply_x(e, dg, keysize, parameter); if (result) break; } } } return result; }