diff --git a/src/map.c b/src/map.c index 0d4600b..01c5046 100644 --- a/src/map.c +++ b/src/map.c @@ -355,6 +355,34 @@ cfw_map_set(CFWMap *map, void *key, void *obj) 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 = { .name = "CFWMap", .size = sizeof(CFWMap), diff --git a/src/map.h b/src/map.h index e8b7cd0..25e3108 100644 --- a/src/map.h +++ b/src/map.h @@ -30,9 +30,19 @@ #include "class.h" 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 size_t cfw_map_size(CFWMap*); extern void* cfw_map_get(CFWMap*, 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 diff --git a/tests/tests.c b/tests/tests.c index a9eae5f..4aa89a9 100644 --- a/tests/tests.c +++ b/tests/tests.c @@ -31,6 +31,29 @@ #include "array.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 main() { @@ -68,19 +91,18 @@ main() s[1] = cfw_new(cfw_string, "Welt!"); m = cfw_new(cfw_map, s[0], s[1], NULL); - cfw_unref(s[1]); - puts(cfw_string_c(cfw_map_get(m, s[0]))); + print_map(m); s[1] = cfw_new(cfw_string, "Test"); cfw_map_set(m, s[0], 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); - printf("%p\n", cfw_map_get(m, s[0])); + print_map(m); cfw_unref(s[0]); cfw_unref(m);