diff options
author | Garrett Regier <garrettregier@gmail.com> | 2016-10-20 19:42:56 -0700 |
---|---|---|
committer | Garrett Regier <garrettregier@gmail.com> | 2017-06-16 17:16:32 -0700 |
commit | 7b3c405df41c0b6f6fe58fdb05c922614f08c4c4 (patch) | |
tree | 3fbea4693820fcff7c2f47a04cea01557dc7f53f /json-glib/json-object.c | |
parent | af82351b8b41cb8c04e5d6e39446ce9baddb43aa (diff) | |
download | json-glib-7b3c405df41c0b6f6fe58fdb05c922614f08c4c4.tar.gz |
object: Use a GQueue for members_ordered
This makes the list always ordered
and removes the g_list_reverse()
in json_object_get_members().
https://bugzilla.gnome.org/show_bug.cgi?id=773504
Diffstat (limited to 'json-glib/json-object.c')
-rw-r--r-- | json-glib/json-object.c | 27 |
1 files changed, 10 insertions, 17 deletions
diff --git a/json-glib/json-object.c b/json-glib/json-object.c index be458ed..b6c08a5 100644 --- a/json-glib/json-object.c +++ b/json-glib/json-object.c @@ -67,7 +67,7 @@ json_object_new (void) object->members = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, (GDestroyNotify) json_node_unref); - object->members_ordered = NULL; + g_queue_init (&object->members_ordered); return object; } @@ -108,9 +108,8 @@ json_object_unref (JsonObject *object) if (--object->ref_count == 0) { - g_list_free (object->members_ordered); + g_queue_clear (&object->members_ordered); g_hash_table_destroy (object->members); - object->members_ordered = NULL; object->members = NULL; g_slice_free (JsonObject, object); @@ -177,7 +176,7 @@ object_set_member_internal (JsonObject *object, gchar *name = g_strdup (member_name); if (g_hash_table_lookup (object->members, name) == NULL) - object->members_ordered = g_list_prepend (object->members_ordered, name); + g_queue_push_tail (&object->members_ordered, name); else { GList *l; @@ -186,7 +185,7 @@ object_set_member_internal (JsonObject *object, * pointer to its name, to avoid keeping invalid pointers * once we replace the key in the hash table */ - l = g_list_find_custom (object->members_ordered, name, (GCompareFunc) strcmp); + l = g_queue_find_custom (&object->members_ordered, name, (GCompareFunc) strcmp); if (l != NULL) l->data = name; } @@ -483,13 +482,9 @@ json_object_set_object_member (JsonObject *object, GList * json_object_get_members (JsonObject *object) { - GList *copy; - g_return_val_if_fail (object != NULL, NULL); - copy = g_list_copy (object->members_ordered); - - return g_list_reverse (copy); + return g_list_copy (object->members_ordered.head); } /** @@ -512,7 +507,7 @@ json_object_get_values (JsonObject *object) g_return_val_if_fail (object != NULL, NULL); values = NULL; - for (l = object->members_ordered; l != NULL; l = l->next) + for (l = object->members_ordered.tail; l != NULL; l = l->prev) values = g_list_prepend (values, g_hash_table_lookup (object->members, l->data)); return values; @@ -855,13 +850,13 @@ json_object_remove_member (JsonObject *object, g_return_if_fail (object != NULL); g_return_if_fail (member_name != NULL); - for (l = object->members_ordered; l != NULL; l = l->next) + for (l = object->members_ordered.head; l != NULL; l = l->next) { const gchar *name = l->data; if (g_strcmp0 (name, member_name) == 0) { - object->members_ordered = g_list_delete_link (object->members_ordered, l); + g_queue_delete_link (&object->members_ordered, l); break; } } @@ -889,14 +884,12 @@ json_object_foreach_member (JsonObject *object, JsonObjectForeach func, gpointer data) { - GList *members, *l; + GList *l; g_return_if_fail (object != NULL); g_return_if_fail (func != NULL); - /* the list is stored in reverse order to have constant time additions */ - members = g_list_last (object->members_ordered); - for (l = members; l != NULL; l = l->prev) + for (l = object->members_ordered.head; l != NULL; l = l->next) { const gchar *member_name = l->data; JsonNode *member_node = g_hash_table_lookup (object->members, member_name); |