gHash iterator initializer

To be able to have iterators on the stack/reuse iterators
This commit is contained in:
Martin Poirier
2008-05-27 13:22:17 +00:00
parent 8676e9f44e
commit e70573badd
2 changed files with 26 additions and 7 deletions

View File

@@ -34,7 +34,12 @@
struct GHash;
typedef struct GHash GHash;
typedef struct GHashIterator GHashIterator;
typedef struct GHashIterator {
GHash *gh;
int curBucket;
struct Entry *curEntry;
} GHashIterator;
typedef unsigned int (*GHashHashFP) (void *key);
typedef int (*GHashCmpFP) (void *a, void *b);
@@ -62,6 +67,15 @@ int BLI_ghash_size (GHash *gh);
* @return Pointer to a new DynStr.
*/
GHashIterator* BLI_ghashIterator_new (GHash *gh);
/**
* Init an already allocated GHashIterator. The hash table must not
* be mutated while the iterator is in use, and the iterator will
* step exactly BLI_ghash_size(gh) times before becoming done.
*
* @param ghi The GHashIterator to initialize.
* @param gh The GHash to iterate over.
*/
void BLI_ghashIterator_init(GHashIterator *ghi, GHash *gh);
/**
* Free a GHashIterator.
*

View File

@@ -198,12 +198,6 @@ void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreef
/***/
struct GHashIterator {
GHash *gh;
int curBucket;
Entry *curEntry;
};
GHashIterator *BLI_ghashIterator_new(GHash *gh) {
GHashIterator *ghi= malloc(sizeof(*ghi));
ghi->gh= gh;
@@ -217,6 +211,17 @@ GHashIterator *BLI_ghashIterator_new(GHash *gh) {
}
return ghi;
}
void BLI_ghashIterator_init(GHashIterator *ghi, GHash *gh) {
ghi->gh= gh;
ghi->curEntry= NULL;
ghi->curBucket= -1;
while (!ghi->curEntry) {
ghi->curBucket++;
if (ghi->curBucket==ghi->gh->nbuckets)
break;
ghi->curEntry= ghi->gh->buckets[ghi->curBucket];
}
}
void BLI_ghashIterator_free(GHashIterator *ghi) {
free(ghi);
}