#include "config.h" #include "json-types.h" #include "json-private.h" /** * SECTION:json-array * @short_description: a JSON array representation * */ struct _JsonArray { GPtrArray *elements; volatile gint ref_count; }; JsonArray * json_array_new (void) { JsonArray *array; array = g_slice_new (JsonArray); array->ref_count = 1; array->elements = g_ptr_array_new (); return array; } JsonArray * json_array_sized_new (guint n_elements) { JsonArray *array; array = g_slice_new (JsonArray); array->ref_count = 1; array->elements = g_ptr_array_sized_new (n_elements); return array; } /** * json_array_ref: * @array: a #JsonArray * * Increase by one the reference count of a #JsonArray. * * Return value: the passed #JsonArray, with the reference count * increased by one. */ JsonArray * json_array_ref (JsonArray *array) { g_return_val_if_fail (array != NULL, NULL); g_return_val_if_fail (array->ref_count > 0, NULL); g_atomic_int_exchange_and_add (&array->ref_count, 1); return array; } /** * json_array_unref: * @array: a #JsonArray * * Decreases by one the reference count of a #JsonArray. If the * reference count reaches zero, the array is destroyed and all * its allocated resources are freed. */ void json_array_unref (JsonArray *array) { gint old_ref; g_return_if_fail (array != NULL); g_return_if_fail (array->ref_count > 0); old_ref = g_atomic_int_get (&array->ref_count); if (old_ref > 1) g_atomic_int_compare_and_exchange (&array->ref_count, old_ref, old_ref - 1); else { gint i; for (i = 0; i < array->elements->len; i++) json_node_free (g_ptr_array_index (array->elements, i)); g_ptr_array_free (array->elements, TRUE); array->elements = NULL; g_slice_free (JsonArray, array); } } /** * json_array_get_elements: * @array: a #JsonArray * * Gets the elements of a #JsonArray as a list of #JsonNodes. * * Return value: a #GList containing the elements of the array. The * contents of the list are owned by the array and should never be * modified or freed. Use g_list_free() on the returned list when * done using it */ GList * json_array_get_elements (JsonArray *array) { GList *retval; guint i; g_return_val_if_fail (array != NULL, NULL); retval = NULL; for (i = 0; i < array->elements->len; i++) retval = g_list_prepend (retval, g_ptr_array_index (array->elements, i)); return g_list_reverse (retval); } /** * json_array_get_element: * @array: a #JsonArray * @index_: the index of the element to retrieve * * Retrieves the element at @index_ inside a #JsonArray. * * Return value: a pointer to the #JsonNode at the requested index */ JsonNode * json_array_get_element (JsonArray *array, guint index_) { g_return_val_if_fail (array != NULL, NULL); g_return_val_if_fail (index_ < array->elements->len, NULL); return g_ptr_array_index (array->elements, index_); } /** * json_array_get_length: * @array: a #JsonArray * * Retrieves the length of a #JsonArray * * Return value: the length of the array */ guint json_array_get_length (JsonArray *array) { g_return_val_if_fail (array != NULL, 0); return array->elements->len; } void json_array_add_element (JsonArray *array, JsonNode *node) { g_return_if_fail (array != NULL); g_return_if_fail (node != NULL); g_ptr_array_add (array->elements, node); }