add pic_dict_next
This commit is contained in:
parent
aa2121b61c
commit
387ba469c8
|
@ -66,6 +66,23 @@ pic_dict_del(pic_state *pic, struct pic_dict *dict, pic_sym *key)
|
|||
kh_del(dict, h, it);
|
||||
}
|
||||
|
||||
bool
|
||||
pic_dict_next(pic_state PIC_UNUSED(*pic), struct pic_dict *dict, int *iter, pic_sym **key, pic_value *val)
|
||||
{
|
||||
khash_t(dict) *h = &dict->hash;
|
||||
int it = *iter;
|
||||
|
||||
for (it = *iter; it != kh_end(h); ++it) {
|
||||
if (kh_exist(h, it)) {
|
||||
if (key) *key = kh_key(h, it);
|
||||
if (val) *val = kh_val(h, it);
|
||||
*iter = ++it;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
static pic_value
|
||||
pic_dict_make_dictionary(pic_state *pic)
|
||||
{
|
||||
|
@ -198,15 +215,14 @@ static pic_value
|
|||
pic_dict_dictionary_to_alist(pic_state *pic)
|
||||
{
|
||||
struct pic_dict *dict;
|
||||
pic_value item, alist = pic_nil_value(pic);
|
||||
pic_value val, alist = pic_nil_value(pic);
|
||||
pic_sym *sym;
|
||||
khiter_t it;
|
||||
int it = 0;
|
||||
|
||||
pic_get_args(pic, "d", &dict);
|
||||
|
||||
pic_dict_for_each (sym, dict, it) {
|
||||
item = pic_cons(pic, pic_obj_value(sym), pic_dict_ref(pic, dict, sym));
|
||||
pic_push(pic, item, alist);
|
||||
while (pic_dict_next(pic, dict, &it, &sym, &val)) {
|
||||
pic_push(pic, pic_cons(pic, pic_obj_value(sym), val), alist);
|
||||
}
|
||||
|
||||
return alist;
|
||||
|
@ -234,14 +250,14 @@ static pic_value
|
|||
pic_dict_dictionary_to_plist(pic_state *pic)
|
||||
{
|
||||
struct pic_dict *dict;
|
||||
pic_value plist = pic_nil_value(pic);
|
||||
pic_value val, plist = pic_nil_value(pic);
|
||||
pic_sym *sym;
|
||||
khiter_t it;
|
||||
int it = 0;
|
||||
|
||||
pic_get_args(pic, "d", &dict);
|
||||
|
||||
pic_dict_for_each (sym, dict, it) {
|
||||
pic_push(pic, pic_dict_ref(pic, dict, sym), plist);
|
||||
while (pic_dict_next(pic, dict, &it, &sym, &val)) {
|
||||
pic_push(pic, val, plist);
|
||||
pic_push(pic, pic_obj_value(sym), plist);
|
||||
}
|
||||
|
||||
|
|
|
@ -360,11 +360,12 @@ gc_mark_object(pic_state *pic, struct pic_object *obj)
|
|||
}
|
||||
case PIC_TYPE_DICT: {
|
||||
pic_sym *sym;
|
||||
khiter_t it;
|
||||
pic_value val;
|
||||
int it = 0;
|
||||
|
||||
pic_dict_for_each (sym, &obj->u.dict, it) {
|
||||
while (pic_dict_next(pic, &obj->u.dict, &it, &sym, &val)) {
|
||||
gc_mark_object(pic, (struct pic_object *)sym);
|
||||
gc_mark(pic, pic_dict_ref(pic, &obj->u.dict, sym));
|
||||
gc_mark(pic, val);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -231,6 +231,7 @@ void pic_dict_set(pic_state *, struct pic_dict *, pic_sym *, pic_value);
|
|||
void pic_dict_del(pic_state *, struct pic_dict *, pic_sym *);
|
||||
bool pic_dict_has(pic_state *, struct pic_dict *, pic_sym *);
|
||||
int pic_dict_size(pic_state *, struct pic_dict *);
|
||||
bool pic_dict_next(pic_state *, struct pic_dict *, int *iter, pic_sym **key, pic_value *val);
|
||||
|
||||
/* ephemeron */
|
||||
struct pic_weak *pic_make_weak(pic_state *);
|
||||
|
|
|
@ -18,12 +18,6 @@ struct pic_dict {
|
|||
|
||||
#define pic_dict_ptr(v) ((struct pic_dict *)pic_obj_ptr(v))
|
||||
|
||||
#define pic_dict_for_each(sym, dict, it) \
|
||||
pic_dict_for_each_help(sym, (&(dict)->hash), it)
|
||||
#define pic_dict_for_each_help(sym, h, it) \
|
||||
for (it = kh_begin(h); it != kh_end(h); ++it) \
|
||||
if ((sym = kh_key(h, it)), kh_exist(h, it))
|
||||
|
||||
#if defined(__cplusplus)
|
||||
}
|
||||
#endif
|
||||
|
|
|
@ -107,13 +107,14 @@ void
|
|||
pic_import(pic_state *pic, const char *lib)
|
||||
{
|
||||
pic_sym *name, *realname, *uid;
|
||||
khiter_t it;
|
||||
int it = 0;
|
||||
pic_value val;
|
||||
struct pic_lib *libp;
|
||||
|
||||
libp = get_library(pic, lib);
|
||||
|
||||
pic_dict_for_each (name, libp->exports, it) {
|
||||
realname = pic_sym_ptr(pic_dict_ref(pic, libp->exports, name));
|
||||
while (pic_dict_next(pic, libp->exports, &it, &name, &val)) {
|
||||
realname = pic_sym_ptr(val);
|
||||
|
||||
if ((uid = pic_find_identifier(pic, (pic_id *)realname, libp->env)) == NULL) {
|
||||
pic_errorf(pic, "attempted to export undefined variable '~s'", pic_obj_value(realname));
|
||||
|
@ -220,14 +221,14 @@ pic_lib_library_exports(pic_state *pic)
|
|||
const char *lib;
|
||||
pic_value exports = pic_nil_value(pic);
|
||||
pic_sym *sym;
|
||||
khiter_t it;
|
||||
int it = 0;
|
||||
struct pic_lib *libp;
|
||||
|
||||
pic_get_args(pic, "z", &lib);
|
||||
|
||||
libp = get_library(pic, lib);
|
||||
|
||||
pic_dict_for_each (sym, libp->exports, it) {
|
||||
while (pic_dict_next(pic, libp->exports, &it, &sym, NULL)) {
|
||||
pic_push(pic, pic_obj_value(sym), exports);
|
||||
}
|
||||
|
||||
|
|
|
@ -242,13 +242,14 @@ write_dict(struct writer_control *p, struct pic_dict *dict)
|
|||
{
|
||||
pic_state *pic = p->pic;
|
||||
xFILE *file = p->file;
|
||||
pic_sym *sym;
|
||||
khiter_t it;
|
||||
pic_sym *key;
|
||||
pic_value val;
|
||||
int it = 0;
|
||||
|
||||
xfprintf(pic, file, "#.(dictionary");
|
||||
pic_dict_for_each (sym, dict, it) {
|
||||
xfprintf(pic, file, " '%s ", pic_str(pic, pic_sym_name(pic, sym)));
|
||||
write_core(p, pic_dict_ref(pic, dict, sym));
|
||||
while (pic_dict_next(pic, dict, &it, &key, &val)) {
|
||||
xfprintf(pic, file, " '%s ", pic_str(pic, pic_sym_name(pic, key)));
|
||||
write_core(p, val);
|
||||
}
|
||||
xfprintf(pic, file, ")");
|
||||
}
|
||||
|
@ -366,9 +367,10 @@ traverse(struct writer_control *p, pic_value obj)
|
|||
}
|
||||
} else {
|
||||
/* dictionary */
|
||||
pic_sym *sym;
|
||||
pic_dict_for_each (sym, pic_dict_ptr(obj), it) {
|
||||
traverse(p, pic_dict_ref(pic, pic_dict_ptr(obj), sym));
|
||||
int it = 0;
|
||||
pic_value val;
|
||||
while (pic_dict_next(pic, pic_dict_ptr(obj), &it, NULL, &val)) {
|
||||
traverse(p, val);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue