[json-glib] Add JsonArray iteration function
- From: Emmanuele Bassi <ebassi src gnome org>
- To: svn-commits-list gnome org
- Subject: [json-glib] Add JsonArray iteration function
- Date: Sun, 17 May 2009 14:54:33 -0400 (EDT)
commit 930fdf4c4dff1f5310a946c2a9f5b6860f7c8ba8
Author: Emmanuele Bassi <ebassi linux intel com>
Date: Sun May 17 19:44:41 2009 +0100
Add JsonArray iteration function
Similarly to commit 3057a172 for JsonObject, the newly added
json_array_foreach_element() iterates over a JSON array data
type.
---
doc/reference/json-glib-sections.txt | 2 +
json-glib/json-array.c | 35 ++++++++++++++++++++++++
json-glib/json-types.h | 21 +++++++++++++++
json-glib/tests/array-test.c | 48 ++++++++++++++++++++++++++++++++++
4 files changed, 106 insertions(+), 0 deletions(-)
diff --git a/doc/reference/json-glib-sections.txt b/doc/reference/json-glib-sections.txt
index 368af77..6872eaa 100644
--- a/doc/reference/json-glib-sections.txt
+++ b/doc/reference/json-glib-sections.txt
@@ -56,6 +56,8 @@ json_array_dup_element
json_array_get_elements
json_array_get_length
json_array_remove_element
+JsonArrayForeach
+json_array_foreach_element
<SUBSECTION>
json_array_add_array_element
diff --git a/json-glib/json-array.c b/json-glib/json-array.c
index 13ac3b8..301e050 100644
--- a/json-glib/json-array.c
+++ b/json-glib/json-array.c
@@ -667,3 +667,38 @@ json_array_remove_element (JsonArray *array,
json_node_free (g_ptr_array_remove_index (array->elements, index_));
}
+
+/**
+ * json_array_foreach_element:
+ * @array: a #JsonArray
+ * @func: the function to be called on each element
+ * @data: data to be passed to the function
+ *
+ * Iterates over all elements of @array and calls @func on
+ * each one of them.
+ *
+ * It is safe to change the value of a #JsonNode of the @array
+ * from within the iterator @func, but it is not safe to add or
+ * remove elements from the @array.
+ *
+ * Since: 0.8
+ */
+void
+json_array_foreach_element (JsonArray *array,
+ JsonArrayForeach func,
+ gpointer data)
+{
+ gint i;
+
+ g_return_if_fail (array != NULL);
+ g_return_if_fail (func != NULL);
+
+ for (i = 0; i < array->elements->len; i++)
+ {
+ JsonNode *element_node;
+
+ element_node = g_ptr_array_index (array->elements, i);
+
+ (* func) (array, i, element_node, data);
+ }
+}
diff --git a/json-glib/json-types.h b/json-glib/json-types.h
index da5a268..f797c05 100644
--- a/json-glib/json-types.h
+++ b/json-glib/json-types.h
@@ -89,6 +89,24 @@ typedef void (* JsonObjectForeach) (JsonObject *object,
gpointer user_data);
/**
+ * JsonArrayForeach:
+ * @array: the iterated #JsonArray
+ * @index_: the index of the element
+ * @element_node: a #JsonNode containing the value at @index_
+ * @user_data: data passed to the function
+ *
+ * The function to be passed to json_array_foreach_element(). You
+ * should not add or remove elements to and from @array within
+ * this function. It is safe to change the value of @element_node.
+ *
+ * Since: 0.8
+ */
+typedef void (* JsonArrayForeach) (JsonArray *array,
+ guint index_,
+ JsonNode *element_node,
+ gpointer user_data);
+
+/**
* JsonNode:
* @type: the type of node
*
@@ -261,6 +279,9 @@ JsonNode * json_array_dup_element (JsonArray *array,
void json_array_remove_element (JsonArray *array,
guint index_);
guint json_array_get_length (JsonArray *array);
+void json_array_foreach_element (JsonArray *array,
+ JsonArrayForeach func,
+ gpointer data);
G_END_DECLS
diff --git a/json-glib/tests/array-test.c b/json-glib/tests/array-test.c
index f091ecd..3d3bf20 100644
--- a/json-glib/tests/array-test.c
+++ b/json-glib/tests/array-test.c
@@ -47,6 +47,53 @@ test_remove_element (void)
json_array_unref (array);
}
+typedef struct _TestForeachFixture
+{
+ gint n_elements;
+} TestForeachFixture;
+
+static const struct {
+ JsonNodeType element_type;
+ GType element_gtype;
+} type_verify[] = {
+ { JSON_NODE_VALUE, G_TYPE_INT },
+ { JSON_NODE_VALUE, G_TYPE_BOOLEAN },
+ { JSON_NODE_VALUE, G_TYPE_STRING },
+ { JSON_NODE_NULL, G_TYPE_INVALID }
+};
+
+static void
+verify_foreach (JsonArray *array,
+ guint index_,
+ JsonNode *element_node,
+ gpointer user_data)
+{
+ TestForeachFixture *fixture = user_data;
+
+ g_assert (json_node_get_node_type (element_node) == type_verify[index_].element_type);
+ g_assert (json_node_get_value_type (element_node) == type_verify[index_].element_gtype);
+
+ fixture->n_elements += 1;
+}
+
+static void
+test_foreach_element (void)
+{
+ JsonArray *array = json_array_new ();
+ TestForeachFixture fixture = { 0, };
+
+ json_array_add_int_element (array, 42);
+ json_array_add_boolean_element (array, TRUE);
+ json_array_add_string_element (array, "hello");
+ json_array_add_null_element (array);
+
+ json_array_foreach_element (array, verify_foreach, &fixture);
+
+ g_assert_cmpint (fixture.n_elements, ==, json_array_get_length (array));
+
+ json_array_unref (array);
+}
+
int
main (int argc,
char *argv[])
@@ -57,6 +104,7 @@ main (int argc,
g_test_add_func ("/array/empty-array", test_empty_array);
g_test_add_func ("/array/add-element", test_add_element);
g_test_add_func ("/array/remove-element", test_remove_element);
+ g_test_add_func ("/array/foreach-element", test_foreach_element);
return g_test_run ();
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]