Add map iteration.

This commit is contained in:
Jonathan Schleifer 2012-04-22 04:21:14 +02:00
parent a835d115cb
commit d1b16c8722
3 changed files with 64 additions and 4 deletions

View file

@ -355,6 +355,34 @@ cfw_map_set(CFWMap *map, void *key, void *obj)
return true; return true;
} }
void
cfw_map_iter(CFWMap *map, cfw_map_iter_t *iter)
{
iter->key = NULL;
iter->obj = NULL;
iter->_map = map;
iter->_pos = 0;
}
void
cfw_map_iter_next(cfw_map_iter_t *iter)
{
CFWMap *map = iter->_map;
for (; iter->_pos < map->size &&
(map->data[iter->_pos] == NULL ||
map->data[iter->_pos] == &deleted); iter->_pos++);
if (iter->_pos < map->size) {
iter->key = map->data[iter->_pos]->key;
iter->obj = map->data[iter->_pos]->obj;
iter->_pos++;
} else {
iter->key = NULL;
iter->obj = NULL;
}
}
static CFWClass class = { static CFWClass class = {
.name = "CFWMap", .name = "CFWMap",
.size = sizeof(CFWMap), .size = sizeof(CFWMap),

View file

@ -30,9 +30,19 @@
#include "class.h" #include "class.h"
typedef struct CFWMap CFWMap; typedef struct CFWMap CFWMap;
typedef struct cfw_map_iter_t {
void *key, *obj;
/* private */
CFWMap *_map;
uint32_t _pos;
} cfw_map_iter_t;
extern CFWClass *cfw_map; extern CFWClass *cfw_map;
extern size_t cfw_map_size(CFWMap*); extern size_t cfw_map_size(CFWMap*);
extern void* cfw_map_get(CFWMap*, void*); extern void* cfw_map_get(CFWMap*, void*);
extern bool cfw_map_set(CFWMap*, void*, void*); extern bool cfw_map_set(CFWMap*, void*, void*);
extern void cfw_map_iter(CFWMap*, cfw_map_iter_t*);
extern void cfw_map_iter_next(cfw_map_iter_t*);
#endif #endif

View file

@ -31,6 +31,29 @@
#include "array.h" #include "array.h"
#include "map.h" #include "map.h"
void
print_map(CFWMap *map)
{
cfw_map_iter_t iter;
cfw_map_iter(map, &iter);
cfw_map_iter_next(&iter);
fputs("{\n", stdout);
while (iter.key != NULL) {
if (iter.obj != NULL)
printf("\t%s = %s\n", cfw_string_c(iter.key),
cfw_string_c(iter.obj));
else
printf("\t%s = NULL\n", cfw_string_c(iter.key));
cfw_map_iter_next(&iter);
}
fputs("}\n", stdout);
}
int int
main() main()
{ {
@ -68,19 +91,18 @@ main()
s[1] = cfw_new(cfw_string, "Welt!"); s[1] = cfw_new(cfw_string, "Welt!");
m = cfw_new(cfw_map, s[0], s[1], NULL); m = cfw_new(cfw_map, s[0], s[1], NULL);
cfw_unref(s[1]); cfw_unref(s[1]);
puts(cfw_string_c(cfw_map_get(m, s[0]))); print_map(m);
s[1] = cfw_new(cfw_string, "Test"); s[1] = cfw_new(cfw_string, "Test");
cfw_map_set(m, s[0], s[1]); cfw_map_set(m, s[0], s[1]);
cfw_unref(s[1]); cfw_unref(s[1]);
puts(cfw_string_c(cfw_map_get(m, s[0]))); print_map(m);
cfw_map_set(m, s[0], NULL); cfw_map_set(m, s[0], NULL);
printf("%p\n", cfw_map_get(m, s[0])); print_map(m);
cfw_unref(s[0]); cfw_unref(s[0]);
cfw_unref(m); cfw_unref(m);