X-Git-Url: https://git.rrq.au/?a=blobdiff_plain;f=vector%2Fhashvector.c;h=4d89890e172b0874deafd6329c29d4625f18d936;hb=813b52397a92922f2540a41c9076a77ca93e1a48;hp=c26125376e9d811abc67e80e02f0f6cad572dcb5;hpb=fff7d7c2ac83984bd2fc7ec3c72dc455c7c72807;p=rrq%2Frrqmisc.git diff --git a/vector/hashvector.c b/vector/hashvector.c index c261253..4d89890 100644 --- a/vector/hashvector.c +++ b/vector/hashvector.c @@ -56,16 +56,27 @@ static void **hashvector_find_slot( } } -// Find the keyed element, and assign the x pointer, or assign 0. -// Returns 1 if element is found and 0 otherwise. -int hashvector_find(hashvector *hv,void *key,void **x) { - unsigned long i; - void **p = hashvector_find_slot( hv, key, &i, 0 ); - if ( p && *p && *p != HV_HOLE ) { - if ( x ) { - *x = *p; +// Find the keyed element at or after the index. Update index and +// return item. +void *hashvector_next(hashvector *hv,vector_index *index,void *key) { + unsigned long i = index? *index : 0; + for ( ; i < hv->table.size; i++ ) { + void **p = hashvector_find_slot( hv, key, &i, 0 ); + if ( p == 0 ) { + break; } - return 1; + if ( *p && *p != HV_HOLE ) { + if ( key && hv->type->haskey( hv->type, key, *p ) == 0 ) { + continue; + } + if ( index ) { + (*index) = i; + } + return *p; + } + } + if ( index ) { + (*index) = hv->table.size; } return 0; } @@ -176,12 +187,12 @@ unsigned long hashvector_hashcode(unsigned char *key,unsigned long n) { } -hashvector *hashvector_create(int variant,itemkeyfun *type) { +hashvector *hashvector_create(enum vector_variant variant,itemkeyfun *type) { hashvector *hv = (hashvector*) malloc( sizeof( hashvector ) ); (*hv) = (hashvector) { .table = (vector) { .variant = variant, - .size = 0, + .size = 16, .entries = 0 }, .fill = 0,