Add map iteration.
This commit is contained in:
parent
a835d115cb
commit
d1b16c8722
3 changed files with 64 additions and 4 deletions
28
src/map.c
28
src/map.c
|
@ -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),
|
||||||
|
|
10
src/map.h
10
src/map.h
|
@ -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
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue