1 #ifndef BAG_H
2 #define BAG_H
3 /* general utilities for C */
4 
5 
6 #include <vstr.h>
7 
8 typedef struct Bag_obj
9 {
10  const char *key;
11  void *val;
12 } Bag_obj;
13 
14 typedef struct Bag
15 {
16  size_t num;
17  size_t sz;
18  void (*free_key_func)(void *);
19  void (*free_val_func)(void *);
20 
21  unsigned int can_resize : 1;
22 
23  Bag_obj VSTR__STRUCT_HACK_ARRAY(data);
24 } Bag;
25 
26 typedef struct Bag_iter
27 {
28  Bag *bag;
29  size_t num;
30 } Bag_iter;
31 
32 extern Bag *bag_make(size_t, void (*)(void *), void (*)(void *));
33 extern void bag_free(Bag *);
34 
35 extern Bag *bag_add_obj(Bag *, const char *, void *);
36 extern Bag *bag_add_cstr(Bag *, const char *, char *);
37 
38 extern void bag_del_all(Bag *);
39 
40 extern void bag_sort(Bag *, int (*)(const void *, const void *));
41 extern int bag_cb_sort_key_coll(const void *, const void *);
42 extern int bag_cb_sort_key_case(const void *, const void *);
43 extern int bag_cb_sort_key_vers(const void *, const void *);
44 extern int bag_cb_sort_key_cmp(const void *, const void *);
45 
46 extern const Bag_obj *bag_iter_beg(Bag *, Bag_iter *);
47 extern const Bag_obj *bag_iter_nxt(Bag_iter *);
48 
49 extern const Bag_obj *bag_srch_eq(Bag *,
50                                   int (*)(const Bag_obj *, const void *),
51                                   const void *);
52 extern int bag_cb_srch_eq_key_ptr(const Bag_obj *, const void *);
53 extern int bag_cb_srch_eq_val_ptr(const Bag_obj *, const void *);
54 
55 extern void bag_cb_free_nothing(void *);
56 extern void bag_cb_free_ref(void *);
57 extern void bag_cb_free_malloc(void *);
58 
59 #endif
60