/* json-types-private.h - JSON data types private header * * This file is part of JSON-GLib * Copyright (C) 2007 OpenedHand Ltd * Copyright (C) 2009 Intel Corp. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see . * * Author: * Emmanuele Bassi */ #ifndef __JSON_TYPES_PRIVATE_H__ #define __JSON_TYPES_PRIVATE_H__ #include "json-types.h" G_BEGIN_DECLS #define JSON_NODE_IS_VALID(n) \ ((n) != NULL && \ (n)->type >= JSON_NODE_OBJECT && \ (n)->type <= JSON_NODE_NULL && \ (n)->ref_count >= 1) typedef struct _JsonValue JsonValue; typedef enum { JSON_VALUE_INVALID = 0, JSON_VALUE_INT, JSON_VALUE_DOUBLE, JSON_VALUE_BOOLEAN, JSON_VALUE_STRING, JSON_VALUE_NULL } JsonValueType; struct _JsonNode { /*< private >*/ JsonNodeType type; volatile gint ref_count; gboolean immutable : 1; gboolean allocated : 1; union { JsonObject *object; JsonArray *array; JsonValue *value; } data; JsonNode *parent; }; #define JSON_VALUE_INIT { JSON_VALUE_INVALID, 1, FALSE, { 0 }, NULL } #define JSON_VALUE_INIT_TYPE(t) { (t), 1, FALSE, { 0 }, NULL } #define JSON_VALUE_IS_VALID(v) ((v) != NULL && (v)->type != JSON_VALUE_INVALID) #define JSON_VALUE_HOLDS(v,t) ((v) != NULL && (v)->type == (t)) #define JSON_VALUE_HOLDS_INT(v) (JSON_VALUE_HOLDS((v), JSON_VALUE_INT)) #define JSON_VALUE_HOLDS_DOUBLE(v) (JSON_VALUE_HOLDS((v), JSON_VALUE_DOUBLE)) #define JSON_VALUE_HOLDS_BOOLEAN(v) (JSON_VALUE_HOLDS((v), JSON_VALUE_BOOLEAN)) #define JSON_VALUE_HOLDS_STRING(v) (JSON_VALUE_HOLDS((v), JSON_VALUE_STRING)) #define JSON_VALUE_HOLDS_NULL(v) (JSON_VALUE_HOLDS((v), JSON_VALUE_NULL)) #define JSON_VALUE_TYPE(v) (json_value_type((v))) struct _JsonValue { JsonValueType type; volatile gint ref_count; gboolean immutable : 1; union { gint64 v_int; gdouble v_double; gboolean v_bool; gchar *v_str; } data; }; struct _JsonArray { GPtrArray *elements; guint immutable_hash; /* valid iff immutable */ volatile gint ref_count; gboolean immutable : 1; }; struct _JsonObject { GHashTable *members; GQueue members_ordered; int age; guint immutable_hash; /* valid iff immutable */ volatile gint ref_count; gboolean immutable : 1; }; typedef struct { JsonObject *object; /* unowned */ GHashTableIter members_iter; /* iterator over @members */ gpointer padding[2]; /* for future expansion */ } JsonObjectIterReal; G_STATIC_ASSERT (sizeof (JsonObjectIterReal) == sizeof (JsonObjectIter)); typedef struct { JsonObject *object; /* unowned */ GList *cur_member; GList *next_member; gpointer priv_pointer[3]; int age; int priv_int[1]; gboolean priv_boolean; } JsonObjectOrderedIterReal; G_STATIC_ASSERT (sizeof (JsonObjectOrderedIterReal) == sizeof (JsonObjectIter)); G_GNUC_INTERNAL const gchar * json_node_type_get_name (JsonNodeType node_type); G_GNUC_INTERNAL const gchar * json_value_type_get_name (JsonValueType value_type); G_GNUC_INTERNAL GQueue * json_object_get_members_internal (JsonObject *object); G_GNUC_INTERNAL GType json_value_type (const JsonValue *value); G_GNUC_INTERNAL JsonValue * json_value_alloc (void); G_GNUC_INTERNAL JsonValue * json_value_init (JsonValue *value, JsonValueType value_type); G_GNUC_INTERNAL JsonValue * json_value_ref (JsonValue *value); G_GNUC_INTERNAL void json_value_unref (JsonValue *value); G_GNUC_INTERNAL void json_value_unset (JsonValue *value); G_GNUC_INTERNAL void json_value_free (JsonValue *value); G_GNUC_INTERNAL void json_value_set_int (JsonValue *value, gint64 v_int); G_GNUC_INTERNAL gint64 json_value_get_int (const JsonValue *value); G_GNUC_INTERNAL void json_value_set_double (JsonValue *value, gdouble v_double); G_GNUC_INTERNAL gdouble json_value_get_double (const JsonValue *value); G_GNUC_INTERNAL void json_value_set_boolean (JsonValue *value, gboolean v_bool); G_GNUC_INTERNAL gboolean json_value_get_boolean (const JsonValue *value); G_GNUC_INTERNAL void json_value_set_string (JsonValue *value, const gchar *v_str); G_GNUC_INTERNAL const gchar * json_value_get_string (const JsonValue *value); G_GNUC_INTERNAL void json_value_seal (JsonValue *value); G_GNUC_INTERNAL guint json_value_hash (gconstpointer key); G_END_DECLS #endif /* __JSON_TYPES_PRIVATE_H__ */