2022-08-14 18:18:34 +03:00
|
|
|
/* This software is licensed by the MIT License, see LICENSE file */
|
|
|
|
/* Copyright © 2022 Gregory Lirent */
|
|
|
|
|
2022-08-24 11:43:27 +03:00
|
|
|
#include "bits/__generics.h"
|
2022-08-14 18:18:34 +03:00
|
|
|
#include "vtype.h"
|
|
|
|
|
|
|
|
#ifndef LIBCDSB_DICT_H
|
|
|
|
#define LIBCDSB_DICT_H
|
|
|
|
|
|
|
|
typedef int (*dict_access_callback)(const void* key, vtype key_type, void* value, vtype value_type, void* data);
|
|
|
|
|
2022-08-17 22:20:04 +03:00
|
|
|
/*#####################################################################################################################*/
|
|
|
|
|
2022-08-19 20:00:10 +03:00
|
|
|
inline void dict_init(vtype_dict* x) Always_inline__ Nonnull__(1);
|
|
|
|
|
|
|
|
inline void dict_init(vtype_dict* x) { x->nodes = (void*)(x->capacity = x->size = 0); }
|
2022-08-14 18:18:34 +03:00
|
|
|
|
2022-08-19 19:32:52 +03:00
|
|
|
/*#####################################################################################################################*/
|
2022-08-14 18:18:34 +03:00
|
|
|
|
2022-08-19 19:32:52 +03:00
|
|
|
#define dict_pop(x, key, data, callback) libcdsb_dict_find (x, _LIBCDSB_value_pointer(key), _LIBCDSB_vtypeof(key), data, callback, 1)
|
|
|
|
#define dict_get(x, key, data, callback) libcdsb_dict_find (x, _LIBCDSB_value_pointer(key), _LIBCDSB_vtypeof(key), data, callback, 0)
|
2022-08-26 17:54:27 +03:00
|
|
|
#define dict_update(x, key, value) libcdsb_dict_update (x, _LIBCDSB_value_pointer(key), _LIBCDSB_vtypeof(key), _LIBCDSB_value_pointer(value), _LIBCDSB_vtypeof(value), 0, 0)
|
|
|
|
#define dict_inject(x, key, value) libcdsb_dict_inject (x, _LIBCDSB_value_pointer(key), _LIBCDSB_vtypeof(key), _LIBCDSB_value_pointer(value), _LIBCDSB_vtypeof(value), 0, 0)
|
2022-08-19 19:32:52 +03:00
|
|
|
#define dict_foreach(x, data, callback) libcdsb_dict_foreach (x, data, callback, 0)
|
|
|
|
#define dict_remove(x, key) dict_pop (x, key, 0, 0)
|
2022-08-14 18:18:34 +03:00
|
|
|
|
2022-08-19 19:32:52 +03:00
|
|
|
#define in_dict(x, key) (dict_get(&x, key, 0, 0) == 0)
|
2022-08-14 18:18:34 +03:00
|
|
|
|
2022-08-19 19:32:52 +03:00
|
|
|
/*#####################################################################################################################*/
|
2022-08-14 18:18:34 +03:00
|
|
|
|
2022-08-26 17:54:27 +03:00
|
|
|
extern bool libcdsb_dict_update (vtype_dict* x, const void* key, vtype key_type, const void* value, vtype value_type, void* data, dict_access_callback) Nonnull__(1);
|
|
|
|
extern bool libcdsb_dict_inject (vtype_dict* x, const void* key, vtype key_type, const void* value, vtype value_type, void* data, dict_access_callback) Nonnull__(1);
|
|
|
|
extern int libcdsb_dict_find (vtype_dict* x, const void* key, vtype key_type, void* data, dict_access_callback, bool cut) Nonnull__(1);
|
|
|
|
extern int libcdsb_dict_foreach (vtype_dict* x, void* data, dict_access_callback, bool flush) Nonnull__(1,3);
|
|
|
|
extern bool libcdsb_dict_shrink_to_fit(vtype_dict* x) Nonnull__(1);
|
2022-08-14 18:18:34 +03:00
|
|
|
|
|
|
|
#endif /* LIBCDSB_DICT_H */
|