mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-23 03:32:51 -06:00
added GuEnum interface for iterating over maps in the C runtime
This commit is contained in:
@@ -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
|
size_t
|
||||||
gu_map_count(GuMap* map)
|
gu_map_count(GuMap* map)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -4,8 +4,9 @@
|
|||||||
#include <gu/hash.h>
|
#include <gu/hash.h>
|
||||||
#include <gu/mem.h>
|
#include <gu/mem.h>
|
||||||
#include <gu/exn.h>
|
#include <gu/exn.h>
|
||||||
|
#include <gu/enum.h>
|
||||||
|
|
||||||
typedef const struct GuMapItor GuMapItor;
|
typedef struct GuMapItor GuMapItor;
|
||||||
|
|
||||||
struct GuMapItor {
|
struct GuMapItor {
|
||||||
void (*fn)(GuMapItor* self, const void* key, void* value,
|
void (*fn)(GuMapItor* self, const void* key, void* value,
|
||||||
@@ -67,6 +68,13 @@ gu_map_insert(GuMap* ht, const void* key);
|
|||||||
void
|
void
|
||||||
gu_map_iter(GuMap* ht, GuMapItor* itor, GuExn* err);
|
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;
|
typedef GuMap GuIntMap;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user