#ifndef FX_DS_DICT_H_ #define FX_DS_DICT_H_ #include #include #include #include #include #include FX_DECLS_BEGIN; #define FX_TYPE_DICT (fx_dict_get_type()) #define FX_TYPE_DICT_ITERATOR (fx_dict_iterator_get_type()) struct fx_dict_p; FX_DECLARE_TYPE(fx_dict); FX_DECLARE_TYPE(fx_dict_iterator); FX_TYPE_CLASS_DECLARATION_BEGIN(fx_dict) FX_TYPE_CLASS_DECLARATION_END(fx_dict) FX_TYPE_CLASS_DECLARATION_BEGIN(fx_dict_iterator) FX_TYPE_CLASS_DECLARATION_END(fx_dict_iterator) #define FX_DICT_ITEM(k, v) {.key = (k), .value = (v)} #define FX_DICT_ITEM_END {.key = NULL, .value = NULL} #define fx_dict_foreach(it, dict) \ for (int z__fx_unique_name() = fx_dict_iterator_begin(dict, it); \ (it)->key != NULL; \ fx_dict_iterator_next(it)) typedef struct fx_dict_item { const fx_string *key; fx_object *value; } fx_dict_item; FX_API fx_type_id fx_dict_get_type(void); FX_API fx_type_id fx_dict_iterator_get_type(void); FX_TYPE_DEFAULT_CONSTRUCTOR(fx_dict, FX_TYPE_DICT); #if 0 FX_API fx_dict *fx_dict_create_with_items(const fx_dict_item *items); #endif FX_API fx_status fx_dict_put(fx_dict *dict, const char *key, fx_object *value); FX_API fx_status fx_dict_put_sk(fx_dict *dict, const fx_string *key, fx_object *value); FX_API fx_object *fx_dict_at(const fx_dict *dict, const char *key); FX_API fx_object *fx_dict_at_sk(const fx_dict *dict, const fx_string *key); FX_API fx_object *fx_dict_get(fx_dict *dict, const char *key); FX_API fx_object *fx_dict_get_sk(fx_dict *dict, const fx_string *key); FX_API bool fx_dict_has_key(const fx_dict *dict, const char *key); FX_API bool fx_dict_has_skey(const fx_dict *dict, const fx_string *key); FX_API size_t fx_dict_get_size(const fx_dict *dict); FX_API bool fx_dict_is_empty(const fx_dict *dict); FX_DECLS_END; #endif