summaryrefslogtreecommitdiff
path: root/json-glib/json-array.c
diff options
context:
space:
mode:
authorPhilip Withnall <philip.withnall@collabora.co.uk>2015-11-07 14:17:31 +0100
committerEmmanuele Bassi <ebassi@gnome.org>2016-03-01 14:53:00 +0000
commit58f479b60eb2db4c73605d469d68a8ffd8679327 (patch)
treeb414ce65be7a8d493234fcf325521a69d0ea5bd4 /json-glib/json-array.c
parenta82b93ba60dd0f54660990df86ba0cf7fc74c9a8 (diff)
downloadjson-glib-58f479b60eb2db4c73605d469d68a8ffd8679327.tar.gz
core: Add immutability support to core objects
Add an immutable mode to JsonNode, JsonObject, JsonArray and JsonValue. This is an optional mode which objects enter by calling json_*_seal(). It is a one-way transition, which means that we can build and manipulate objects as much as desired, before sealing them and enjoying the benefits of immutable objects: no need to take copies when handling them, persistent hash values (still to be implemented). https://bugzilla.gnome.org/show_bug.cgi?id=756121
Diffstat (limited to 'json-glib/json-array.c')
-rw-r--r--json-glib/json-array.c48
1 files changed, 48 insertions, 0 deletions
diff --git a/json-glib/json-array.c b/json-glib/json-array.c
index af67b4a..05cde4a 100644
--- a/json-glib/json-array.c
+++ b/json-glib/json-array.c
@@ -134,6 +134,54 @@ json_array_unref (JsonArray *array)
}
/**
+ * json_array_seal:
+ * @array: a #JsonArray
+ *
+ * Seals the #JsonArray, making it immutable to further changes. This will
+ * recursively seal all elements in the array too.
+ *
+ * If the @array is already immutable, this is a no-op.
+ *
+ * Since: UNRELEASED
+ */
+void
+json_array_seal (JsonArray *array)
+{
+ guint i;
+
+ g_return_if_fail (array != NULL);
+ g_return_if_fail (array->ref_count > 0);
+
+ if (array->immutable)
+ return;
+
+ /* Propagate to all members. */
+ for (i = 0; i < array->elements->len; i++)
+ json_node_seal (g_ptr_array_index (array->elements, i));
+
+ array->immutable = TRUE;
+}
+
+/**
+ * json_array_is_immutable:
+ * @array: a #JsonArray
+ *
+ * Check whether the given @array has been marked as immutable by calling
+ * json_array_seal() on it.
+ *
+ * Since: UNRELEASED
+ * Returns: %TRUE if the @array is immutable
+ */
+gboolean
+json_array_is_immutable (JsonArray *array)
+{
+ g_return_val_if_fail (array != NULL, FALSE);
+ g_return_val_if_fail (array->ref_count > 0, FALSE);
+
+ return array->immutable;
+}
+
+/**
* json_array_get_elements:
* @array: a #JsonArray
*