1
0
forked from GitHub/gf-core

added GuEnum interface for iterating over maps in the C runtime

This commit is contained in:
kr.angelov
2013-08-19 12:13:47 +00:00
parent b90443cebd
commit e3c188c8a8
2 changed files with 50 additions and 1 deletions

View File

@@ -303,6 +303,47 @@ gu_map_iter(GuMap* map, GuMapItor* itor, GuExn* err)
}
}
typedef struct {
GuEnum en;
GuMap* ht;
size_t i;
GuMapKeyValue x;
} GuMapEnum;
static void
gu_map_enum_next(GuEnum* self, void* to, GuPool* pool)
{
*((GuMapKeyValue**) to) = NULL;
size_t i;
GuMapEnum* en = (GuMapEnum*) self;
for (i = en->i; i < en->ht->data.n_entries; i++) {
if (gu_map_entry_is_free(en->ht, &en->ht->data, i)) {
continue;
}
en->x.key = &en->ht->data.keys[i * en->ht->key_size];
en->x.value = &en->ht->data.values[i * en->ht->value_size];
if (en->ht->kind == GU_MAP_ADDR) {
en->x.key = *(const void* const*) en->x.key;
}
*((GuMapKeyValue**) to) = &en->x;
break;
}
en->i = i+1;
}
GuEnum*
gu_map_enum(GuMap* ht, GuPool* pool)
{
GuMapEnum* en = gu_new(GuMapEnum, pool);
en->en.next = gu_map_enum_next;
en->ht = ht;
en->i = 0;
return &en->en;
}
size_t
gu_map_count(GuMap* map)
{

View File

@@ -4,8 +4,9 @@
#include <gu/hash.h>
#include <gu/mem.h>
#include <gu/exn.h>
#include <gu/enum.h>
typedef const struct GuMapItor GuMapItor;
typedef struct GuMapItor GuMapItor;
struct GuMapItor {
void (*fn)(GuMapItor* self, const void* key, void* value,
@@ -67,6 +68,13 @@ gu_map_insert(GuMap* ht, const void* key);
void
gu_map_iter(GuMap* ht, GuMapItor* itor, GuExn* err);
typedef struct {
const void* key;
void* value;
} GuMapKeyValue;
GuEnum*
gu_map_enum(GuMap* ht, GuPool* pool);
typedef GuMap GuIntMap;