示例#1
0
文件: aa.c 项目: 1100110/dmd
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;
}
示例#2
0
文件: aa.c 项目: DmitryOlshansky/dmd
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);
}
示例#3
0
文件: aa.c 项目: DmitryOlshansky/dmd
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;
}
示例#4
0
文件: aa.c 项目: 1100110/dmd
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;
}