|
|
|
|
@ -326,6 +326,48 @@ INLINE void __g_hash_table_destroy(GHashTable **s) {
|
|
|
|
|
g_hash_table_destroy(*s);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int g_tree_find_first_cmp(void *, void *, void *);
|
|
|
|
|
int g_tree_find_all_cmp(void *, void *, void *);
|
|
|
|
|
INLINE void *g_tree_find_first(GTree *t, GEqualFunc f, void *data) {
|
|
|
|
|
void *p[3];
|
|
|
|
|
p[0] = data;
|
|
|
|
|
p[1] = f;
|
|
|
|
|
p[2] = NULL;
|
|
|
|
|
g_tree_foreach(t, g_tree_find_first_cmp, p);
|
|
|
|
|
return p[2];
|
|
|
|
|
}
|
|
|
|
|
INLINE void g_tree_find_all(GQueue *out, GTree *t, GEqualFunc f, void *data) {
|
|
|
|
|
void *p[3];
|
|
|
|
|
p[0] = data;
|
|
|
|
|
p[1] = f;
|
|
|
|
|
p[2] = out;
|
|
|
|
|
g_tree_foreach(t, g_tree_find_all_cmp, p);
|
|
|
|
|
}
|
|
|
|
|
INLINE void g_tree_get_values(GQueue *out, GTree *t) {
|
|
|
|
|
g_tree_find_all(out, t, NULL, NULL);
|
|
|
|
|
}
|
|
|
|
|
INLINE void g_tree_find_remove_all(GQueue *out, GTree *t) {
|
|
|
|
|
GList *l;
|
|
|
|
|
g_queue_init(out);
|
|
|
|
|
g_tree_find_all(out, t, NULL, NULL);
|
|
|
|
|
for (l = out->head; l; l = l->next)
|
|
|
|
|
g_tree_remove(t, l->data);
|
|
|
|
|
}
|
|
|
|
|
INLINE void g_tree_insert_coll(GTree *t, gpointer key, gpointer val, void (*cb)(gpointer, gpointer)) {
|
|
|
|
|
gpointer old = g_tree_lookup(t, key);
|
|
|
|
|
if (old)
|
|
|
|
|
cb(old, val);
|
|
|
|
|
g_tree_insert(t, key, val);
|
|
|
|
|
}
|
|
|
|
|
INLINE void g_tree_add_all(GTree *t, GQueue *q, void (*cb)(gpointer, gpointer)) {
|
|
|
|
|
GList *l;
|
|
|
|
|
for (l = q->head; l; l = l->next)
|
|
|
|
|
g_tree_insert_coll(t, l->data, l->data, cb);
|
|
|
|
|
g_queue_clear(q);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if !GLIB_CHECK_VERSION(2,68,0)
|
|
|
|
|
# define __g_memdup(a,b) g_memdup(a,b)
|
|
|
|
|
#else
|
|
|
|
|
|