nothing will break.
* glib.h: New function g_hash_table_foreach_remove is similar to
g_hash_table_foreach, but the callback's return value indicates
whether to remove the element (if TRUE) or not (if FALSE).
+Sun Sep 20 02:09:44 1998 Josh MacDonald <jmacd@axis.hip.berkeley.edu>
+
+ * glib.h: New function g_hash_table_foreach_remove is similar to
+ g_hash_table_foreach, but the callback's return value indicates
+ whether to remove the element (if TRUE) or not (if FALSE).
+ Returns the number of elements deleted.
+
Fri Sep 18 11:31:50 PDT 1998 Manish Singh <yosh@gimp.org>
* glib.h
+Sun Sep 20 02:09:44 1998 Josh MacDonald <jmacd@axis.hip.berkeley.edu>
+
+ * glib.h: New function g_hash_table_foreach_remove is similar to
+ g_hash_table_foreach, but the callback's return value indicates
+ whether to remove the element (if TRUE) or not (if FALSE).
+ Returns the number of elements deleted.
+
Fri Sep 18 11:31:50 PDT 1998 Manish Singh <yosh@gimp.org>
* glib.h
+Sun Sep 20 02:09:44 1998 Josh MacDonald <jmacd@axis.hip.berkeley.edu>
+
+ * glib.h: New function g_hash_table_foreach_remove is similar to
+ g_hash_table_foreach, but the callback's return value indicates
+ whether to remove the element (if TRUE) or not (if FALSE).
+ Returns the number of elements deleted.
+
Fri Sep 18 11:31:50 PDT 1998 Manish Singh <yosh@gimp.org>
* glib.h
+Sun Sep 20 02:09:44 1998 Josh MacDonald <jmacd@axis.hip.berkeley.edu>
+
+ * glib.h: New function g_hash_table_foreach_remove is similar to
+ g_hash_table_foreach, but the callback's return value indicates
+ whether to remove the element (if TRUE) or not (if FALSE).
+ Returns the number of elements deleted.
+
Fri Sep 18 11:31:50 PDT 1998 Manish Singh <yosh@gimp.org>
* glib.h
+Sun Sep 20 02:09:44 1998 Josh MacDonald <jmacd@axis.hip.berkeley.edu>
+
+ * glib.h: New function g_hash_table_foreach_remove is similar to
+ g_hash_table_foreach, but the callback's return value indicates
+ whether to remove the element (if TRUE) or not (if FALSE).
+ Returns the number of elements deleted.
+
Fri Sep 18 11:31:50 PDT 1998 Manish Singh <yosh@gimp.org>
* glib.h
+Sun Sep 20 02:09:44 1998 Josh MacDonald <jmacd@axis.hip.berkeley.edu>
+
+ * glib.h: New function g_hash_table_foreach_remove is similar to
+ g_hash_table_foreach, but the callback's return value indicates
+ whether to remove the element (if TRUE) or not (if FALSE).
+ Returns the number of elements deleted.
+
Fri Sep 18 11:31:50 PDT 1998 Manish Singh <yosh@gimp.org>
* glib.h
+Sun Sep 20 02:09:44 1998 Josh MacDonald <jmacd@axis.hip.berkeley.edu>
+
+ * glib.h: New function g_hash_table_foreach_remove is similar to
+ g_hash_table_foreach, but the callback's return value indicates
+ whether to remove the element (if TRUE) or not (if FALSE).
+ Returns the number of elements deleted.
+
Fri Sep 18 11:31:50 PDT 1998 Manish Singh <yosh@gimp.org>
* glib.h
+Sun Sep 20 02:09:44 1998 Josh MacDonald <jmacd@axis.hip.berkeley.edu>
+
+ * glib.h: New function g_hash_table_foreach_remove is similar to
+ g_hash_table_foreach, but the callback's return value indicates
+ whether to remove the element (if TRUE) or not (if FALSE).
+ Returns the number of elements deleted.
+
Fri Sep 18 11:31:50 PDT 1998 Manish Singh <yosh@gimp.org>
* glib.h
g_hash_table_resize (hash_table);
}
+gint
+g_hash_table_foreach_remove (GHashTable *hash_table,
+ GHRFunc func,
+ gpointer user_data)
+{
+ gint deleted = 0, i;
+ GHashNode *node, *prev;
+
+ g_return_val_if_fail (hash_table && func, -1);
+
+ for (i = 0; i < hash_table->size; i++)
+ {
+ restart:
+
+ prev = NULL;
+
+ for (node = hash_table->nodes[i]; node; prev = node, node = node->next)
+ {
+ if ((* func) (node->key, node->value, user_data))
+ {
+ deleted += 1;
+
+ hash_table->nnodes -= 1;
+
+ if (prev)
+ {
+ prev->next = node->next;
+ g_hash_node_destroy (node);
+ node = prev;
+ }
+ else
+ {
+ hash_table->nodes[i] = node->next;
+ g_hash_node_destroy (node);
+ goto restart;
+ }
+ }
+ }
+ }
+
+ if (! hash_table->frozen)
+ g_hash_table_resize (hash_table);
+
+ return deleted;
+}
+
void
g_hash_table_foreach (GHashTable *hash_table,
GHFunc func,
typedef void (*GHFunc) (gpointer key,
gpointer value,
gpointer user_data);
+typedef gboolean (*GHRFunc) (gpointer key,
+ gpointer value,
+ gpointer user_data);
typedef void (*GLogFunc) (const gchar *log_domain,
GLogLevelFlags log_level,
const gchar *message,
void g_hash_table_foreach (GHashTable *hash_table,
GHFunc func,
gpointer user_data);
+gint g_hash_table_foreach_remove (GHashTable *hash_table,
+ GHRFunc func,
+ gpointer user_data);
gint g_hash_table_size (GHashTable *hash_table);
g_hash_table_resize (hash_table);
}
+gint
+g_hash_table_foreach_remove (GHashTable *hash_table,
+ GHRFunc func,
+ gpointer user_data)
+{
+ gint deleted = 0, i;
+ GHashNode *node, *prev;
+
+ g_return_val_if_fail (hash_table && func, -1);
+
+ for (i = 0; i < hash_table->size; i++)
+ {
+ restart:
+
+ prev = NULL;
+
+ for (node = hash_table->nodes[i]; node; prev = node, node = node->next)
+ {
+ if ((* func) (node->key, node->value, user_data))
+ {
+ deleted += 1;
+
+ hash_table->nnodes -= 1;
+
+ if (prev)
+ {
+ prev->next = node->next;
+ g_hash_node_destroy (node);
+ node = prev;
+ }
+ else
+ {
+ hash_table->nodes[i] = node->next;
+ g_hash_node_destroy (node);
+ goto restart;
+ }
+ }
+ }
+ }
+
+ if (! hash_table->frozen)
+ g_hash_table_resize (hash_table);
+
+ return deleted;
+}
+
void
g_hash_table_foreach (GHashTable *hash_table,
GHFunc func,
typedef void (*GHFunc) (gpointer key,
gpointer value,
gpointer user_data);
+typedef gboolean (*GHRFunc) (gpointer key,
+ gpointer value,
+ gpointer user_data);
typedef void (*GLogFunc) (const gchar *log_domain,
GLogLevelFlags log_level,
const gchar *message,
void g_hash_table_foreach (GHashTable *hash_table,
GHFunc func,
gpointer user_data);
+gint g_hash_table_foreach_remove (GHashTable *hash_table,
+ GHRFunc func,
+ gpointer user_data);
gint g_hash_table_size (GHashTable *hash_table);
g_print ("ok\n");
}
+gboolean
+my_hash_callback_remove (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ int *d = value;
+
+ if ((*d) % 2)
+ return TRUE;
+
+ return FALSE;
+}
+
+void
+my_hash_callback_remove_test (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ int *d = value;
+
+ if ((*d) % 2)
+ g_print ("bad!\n");
+}
+
void
my_hash_callback (gpointer key,
gpointer value,
for (i = 0; i < 10000; i++)
g_hash_table_remove (hash_table, &array[i]);
+ for (i = 0; i < 10000; i++)
+ {
+ array[i] = i;
+ g_hash_table_insert (hash_table, &array[i], &array[i]);
+ }
+
+ if (g_hash_table_foreach_remove (hash_table, my_hash_callback_remove, NULL) != 5000 ||
+ g_hash_table_size (hash_table) != 5000)
+ g_print ("bad!\n");
+
+ g_hash_table_foreach (hash_table, my_hash_callback_remove_test, NULL);
+
+
g_hash_table_destroy (hash_table);
g_print ("ok\n");
g_print ("ok\n");
}
+gboolean
+my_hash_callback_remove (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ int *d = value;
+
+ if ((*d) % 2)
+ return TRUE;
+
+ return FALSE;
+}
+
+void
+my_hash_callback_remove_test (gpointer key,
+ gpointer value,
+ gpointer user_data)
+{
+ int *d = value;
+
+ if ((*d) % 2)
+ g_print ("bad!\n");
+}
+
void
my_hash_callback (gpointer key,
gpointer value,
for (i = 0; i < 10000; i++)
g_hash_table_remove (hash_table, &array[i]);
+ for (i = 0; i < 10000; i++)
+ {
+ array[i] = i;
+ g_hash_table_insert (hash_table, &array[i], &array[i]);
+ }
+
+ if (g_hash_table_foreach_remove (hash_table, my_hash_callback_remove, NULL) != 5000 ||
+ g_hash_table_size (hash_table) != 5000)
+ g_print ("bad!\n");
+
+ g_hash_table_foreach (hash_table, my_hash_callback_remove_test, NULL);
+
+
g_hash_table_destroy (hash_table);
g_print ("ok\n");