|
35 | 35 | * bool <name>_del(struct <name> *ht, const <type> *e); |
36 | 36 | * bool <name>_delkey(struct <name> *ht, const <keytype> *k); |
37 | 37 | * |
| 38 | + * Delete by iterator: |
| 39 | + * bool <name>_delval(struct <name> *ht, struct <name>_iter *i); |
| 40 | + * |
38 | 41 | * Find and return the (first) matching element, or NULL: |
39 | 42 | * type *<name>_get(const struct @name *ht, const <keytype> *k); |
40 | 43 | * |
|
48 | 51 | * type *<name>_first(const struct <name> *ht, struct <name>_iter *i); |
49 | 52 | * type *<name>_next(const struct <name> *ht, struct <name>_iter *i); |
50 | 53 | * type *<name>_prev(const struct <name> *ht, struct <name>_iter *i); |
51 | | - * |
| 54 | + * type *<name>_pick(const struct <name> *ht, size_t seed, |
| 55 | + * struct <name>_iter *i); |
52 | 56 | * It's currently safe to iterate over a changing hashtable, but you might |
53 | 57 | * miss an element. Iteration isn't very efficient, either. |
54 | 58 | * |
|
146 | 150 | return name##_del(ht, elem); \ |
147 | 151 | return false; \ |
148 | 152 | } \ |
| 153 | + static inline UNNEEDED void name##_delval(struct name *ht, \ |
| 154 | + struct name##_iter *iter) \ |
| 155 | + { \ |
| 156 | + htable_delval(&ht->raw, &iter->i); \ |
| 157 | + } \ |
| 158 | + static inline UNNEEDED type *name##_pick(const struct name *ht, \ |
| 159 | + size_t seed, \ |
| 160 | + struct name##_iter *iter) \ |
| 161 | + { \ |
| 162 | + /* Note &iter->i == NULL iff iter is NULL */ \ |
| 163 | + return htable_pick(&ht->raw, seed, &iter->i); \ |
| 164 | + } \ |
149 | 165 | static inline UNNEEDED type *name##_first(const struct name *ht, \ |
150 | 166 | struct name##_iter *iter) \ |
151 | 167 | { \ |
|
0 commit comments