[glib/gvariant: 115/116] remove GVariantTypeClass from GVariantBuilder



commit 54033513e3f7247ffdac38d3075235005925313f
Author: Ryan Lortie <desrt desrt ca>
Date:   Thu Jan 21 11:53:20 2010 -0500

    remove GVariantTypeClass from GVariantBuilder

 glib/gvariant-markup.c        |   84 +++++++++++++++++++++++------------------
 glib/gvariant-parser.c        |   12 ++---
 glib/gvariant-util.c          |   35 ++++++++---------
 glib/gvariant-valist.c        |    8 +--
 glib/gvariant.h               |    5 +--
 glib/tests/gvariant-big.c     |    5 +-
 glib/tests/gvariant-varargs.c |   14 ++----
 7 files changed, 80 insertions(+), 83 deletions(-)
---
diff --git a/glib/gvariant-markup.c b/glib/gvariant-markup.c
index 25b2315..1c2ee79 100644
--- a/glib/gvariant-markup.c
+++ b/glib/gvariant-markup.c
@@ -352,7 +352,7 @@ g_variant_parse_data_new (const GVariantType *type)
   GVariantParseData *data;
 
   data = g_slice_new (GVariantParseData);
-  data->builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_VARIANT, type);
+  data->builder = g_variant_builder_new (G_VARIANT_TYPE_VARIANT);
   data->terminal_value = FALSE;
   data->string = NULL;
 
@@ -402,42 +402,42 @@ g_variant_parse_data_end (GVariantParseData  *data,
   return value;
 }
 
-static GVariantTypeClass
-type_class_from_keyword (const char *keyword)
+static const GVariantType *
+type_from_keyword (const char *keyword)
 {
   struct keyword_mapping
   {
-    GVariantTypeClass class;
+    const GVariantType *type;
     const char *keyword;
   } list[] = {
-    { G_VARIANT_TYPE_CLASS_BOOLEAN,          "boolean" },
-    { G_VARIANT_TYPE_CLASS_BYTE,             "byte" },
-    { G_VARIANT_TYPE_CLASS_INT16,            "int16" },
-    { G_VARIANT_TYPE_CLASS_UINT16,           "uint16" },
-    { G_VARIANT_TYPE_CLASS_INT32,            "int32" },
-    { G_VARIANT_TYPE_CLASS_HANDLE,           "handle" },
-    { G_VARIANT_TYPE_CLASS_UINT32,           "uint32" },
-    { G_VARIANT_TYPE_CLASS_INT64,            "int64" },
-    { G_VARIANT_TYPE_CLASS_UINT64,           "uint64" },
-    { G_VARIANT_TYPE_CLASS_DOUBLE,           "double" },
-    { G_VARIANT_TYPE_CLASS_STRING,           "escaped-string" },
-    { G_VARIANT_TYPE_CLASS_STRING,           "string" },
-    { G_VARIANT_TYPE_CLASS_OBJECT_PATH,      "object-path" },
-    { G_VARIANT_TYPE_CLASS_SIGNATURE,        "signature" },
-    { G_VARIANT_TYPE_CLASS_VARIANT,          "variant" },
-    { G_VARIANT_TYPE_CLASS_MAYBE,            "maybe" },
-    { G_VARIANT_TYPE_CLASS_MAYBE,            "nothing" },
-    { G_VARIANT_TYPE_CLASS_ARRAY,            "array" },
-    { G_VARIANT_TYPE_CLASS_TUPLE,            "tuple" },
-    { G_VARIANT_TYPE_CLASS_DICT_ENTRY,       "dictionary-entry" }
+    { G_VARIANT_TYPE_BOOLEAN,          "boolean" },
+    { G_VARIANT_TYPE_BYTE,             "byte" },
+    { G_VARIANT_TYPE_INT16,            "int16" },
+    { G_VARIANT_TYPE_UINT16,           "uint16" },
+    { G_VARIANT_TYPE_INT32,            "int32" },
+    { G_VARIANT_TYPE_HANDLE,           "handle" },
+    { G_VARIANT_TYPE_UINT32,           "uint32" },
+    { G_VARIANT_TYPE_INT64,            "int64" },
+    { G_VARIANT_TYPE_UINT64,           "uint64" },
+    { G_VARIANT_TYPE_DOUBLE,           "double" },
+    { G_VARIANT_TYPE_STRING,           "escaped-string" },
+    { G_VARIANT_TYPE_STRING,           "string" },
+    { G_VARIANT_TYPE_OBJECT_PATH,      "object-path" },
+    { G_VARIANT_TYPE_SIGNATURE,        "signature" },
+    { G_VARIANT_TYPE_VARIANT,          "variant" },
+    { G_VARIANT_TYPE_ANY_MAYBE,        "maybe" },
+    { G_VARIANT_TYPE_ANY_MAYBE,        "nothing" },
+    { G_VARIANT_TYPE_ANY_ARRAY,        "array" },
+    { G_VARIANT_TYPE_ANY_TUPLE,        "tuple" },
+    { G_VARIANT_TYPE_ANY_DICT_ENTRY,   "dictionary-entry" }
   };
   gint i;
 
   for (i = 0; i < G_N_ELEMENTS (list); i++)
     if (!strcmp (keyword, list[i].keyword))
-      return list[i].class;
+      return list[i].type;
 
-  return G_VARIANT_TYPE_CLASS_INVALID;
+  return NULL;
 }
 
 static GVariant *
@@ -465,9 +465,9 @@ g_variant_markup_parser_start_element (GMarkupParseContext  *context,
                                        GError              **error)
 {
   GVariantParseData *data = user_data;
+  const GVariantType *base_type;
   const gchar *type_string;
   const GVariantType *type;
-  GVariantTypeClass class;
   GVariant *value;
 
   if (data->string != NULL)
@@ -493,7 +493,6 @@ g_variant_markup_parser_start_element (GMarkupParseContext  *context,
   if ((value = value_from_keyword (element_name)))
     {
       if (!g_variant_builder_check_add (data->builder,
-                                        g_variant_get_type_class (value),
                                         g_variant_get_type (value), error))
         return;
 
@@ -503,9 +502,9 @@ g_variant_markup_parser_start_element (GMarkupParseContext  *context,
       return;
     }
 
-  class = type_class_from_keyword (element_name);
+  base_type = type_from_keyword (element_name);
 
-  if (class == G_VARIANT_TYPE_CLASS_INVALID)
+  if (base_type == NULL)
     {
       g_set_error (error, G_MARKUP_ERROR,
                    G_MARKUP_ERROR_UNKNOWN_ELEMENT,
@@ -530,15 +529,24 @@ g_variant_markup_parser_start_element (GMarkupParseContext  *context,
       return;
     }
 
-  type = type_string ? G_VARIANT_TYPE (type_string) : NULL;
+  type = type_string ? G_VARIANT_TYPE (type_string) : base_type;
+
+  if (!g_variant_type_is_subtype_of (type, base_type))
+    {
+      g_set_error (error, G_VARIANT_BUILDER_ERROR,
+                   G_VARIANT_BUILDER_ERROR_TYPE,
+                   "'%s' is not a valid type for '%s'",
+                   type_string, element_name);
+      return;
+    }
 
-  if (!g_variant_builder_check_add (data->builder, class, type, error))
+  if (!g_variant_builder_check_add (data->builder, type, error))
     return;
 
-  if (g_variant_type_class_is_basic (class))
-    data->string = g_string_new (NULL);
+  if (g_variant_type_is_container (base_type))
+    data->builder = g_variant_builder_open (data->builder, type);
   else
-    data->builder = g_variant_builder_open (data->builder, class, type);
+    data->string = g_string_new (NULL);
 
   /* special case: <nothing/> may contain no children */
   if (strcmp (element_name, "nothing") == 0)
@@ -575,6 +583,7 @@ g_variant_markup_parser_end_element (GMarkupParseContext  *context,
                                      GError              **error)
 {
   GVariantParseData *data = user_data;
+  const GVariantType *type;
   GVariantTypeClass class;
 
   if (data->terminal_value)
@@ -583,7 +592,8 @@ g_variant_markup_parser_end_element (GMarkupParseContext  *context,
       return;
     }
 
-  class = type_class_from_keyword (element_name);
+  type = type_from_keyword (element_name);
+  class = g_variant_type_get_class (type);
 
   if (g_variant_type_class_is_basic (class))
     {
@@ -923,7 +933,7 @@ g_variant_markup_parse (const gchar         *text,
   GVariant *child;
 
   data = g_slice_new (GVariantParseData);
-  data->builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_VARIANT, type);
+  data->builder = g_variant_builder_new (G_VARIANT_TYPE_VARIANT);
   data->terminal_value = FALSE;
   data->string = NULL;
 
diff --git a/glib/gvariant-parser.c b/glib/gvariant-parser.c
index 514dedc..eb1248f 100644
--- a/glib/gvariant-parser.c
+++ b/glib/gvariant-parser.c
@@ -612,7 +612,7 @@ array_get_value (AST                *ast,
   GVariantBuilder *builder;
   gint i;
 
-  builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY, type);
+  builder = g_variant_builder_new (type);
   childtype = g_variant_type_element (type);
 
   for (i = 0; i < array->n_children; i++)
@@ -769,7 +769,7 @@ tuple_get_value (AST                *ast,
   GVariantBuilder *builder;
   gint i;
 
-  builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_TUPLE, type);
+  builder = g_variant_builder_new (type);
   childtype = g_variant_type_first (type);
 
   for (i = 0; i < tuple->n_children; i++)
@@ -1070,7 +1070,7 @@ dictionary_get_value (AST                *ast,
       GVariantBuilder *builder;
       GVariant *subvalue;
 
-      builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_DICT_ENTRY, type);
+      builder = g_variant_builder_new (type);
 
       subtype = g_variant_type_key (type);
       if (!(subvalue = ast_get_value (dict->keys[0], subtype, error)))
@@ -1100,16 +1100,14 @@ dictionary_get_value (AST                *ast,
       key = g_variant_type_key (entry);
       value = g_variant_type_value (entry);
 
-      builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY, type);
+      builder = g_variant_builder_new (type);
 
       for (i = 0; i < dict->n_children; i++)
         {
           GVariantBuilder *item;
           GVariant *subvalue;
 
-          item = g_variant_builder_open (builder,
-                                         G_VARIANT_TYPE_CLASS_DICT_ENTRY,
-                                         entry);
+          item = g_variant_builder_open (builder, entry);
 
           if (!(subvalue = ast_get_value (dict->keys[i], key, error)))
             {
diff --git a/glib/gvariant-util.c b/glib/gvariant-util.c
index b44bdf9..8ca86d4 100644
--- a/glib/gvariant-util.c
+++ b/glib/gvariant-util.c
@@ -967,12 +967,10 @@ g_variant_builder_check_add_value (GVariantBuilder  *builder,
                                    GError          **error)
 {
   const GVariantType *type;
-  GVariantTypeClass class;
 
   type = g_variant_get_type (value);
-  class = g_variant_type_get_class (type);
 
-  return g_variant_builder_check_add (builder, class, type, error);
+  return g_variant_builder_check_add (builder, type, error);
 }
 
 /**
@@ -1023,7 +1021,6 @@ g_variant_builder_add_value (GVariantBuilder *builder,
 /**
  * g_variant_builder_open:
  * @parent: a #GVariantBuilder
- * @tclass: a #GVariantTypeClass
  * @type: a #GVariantType, or %NULL
  * @returns: a new (child) #GVariantBuilder
  *
@@ -1045,21 +1042,23 @@ g_variant_builder_add_value (GVariantBuilder *builder,
  **/
 GVariantBuilder *
 g_variant_builder_open (GVariantBuilder    *parent,
-                        GVariantTypeClass   tclass,
                         const GVariantType *type)
 {
+  GVariantTypeClass tclass;
   GVariantBuilder *child;
   GError *error = NULL;
 
   g_return_val_if_fail (parent != NULL, NULL);
 
-  if G_UNLIKELY (!g_variant_builder_check_add (parent, tclass, type, &error))
+  tclass = g_variant_type_get_class (type);
+
+  if G_UNLIKELY (!g_variant_builder_check_add (parent, type, &error))
     g_error ("g_variant_builder_open: %s", error->message);
 
   if G_UNLIKELY (parent->has_child)
     g_error ("GVariantBuilder already has open child");
 
-  child = g_variant_builder_new (tclass, type);
+  child = g_variant_builder_new (type);
 
   if (parent->expected2)
     {
@@ -1140,14 +1139,13 @@ g_variant_builder_close (GVariantBuilder *child)
  * the process. 
  **/
 GVariantBuilder *
-g_variant_builder_new (GVariantTypeClass   tclass,
-                       const GVariantType *type)
+g_variant_builder_new (const GVariantType *type)
 {
+  GVariantTypeClass tclass;
   GVariantBuilder *builder;
 
-  g_assert (g_variant_type_class_is_container (tclass));
-  g_assert (tclass == G_VARIANT_TYPE_CLASS_VARIANT ||
-            type == NULL || g_variant_type_get_class (type) == tclass);
+  g_assert (g_variant_type_is_container (type));
+  tclass = g_variant_type_get_class (type);
 
   builder = g_slice_new (GVariantBuilder);
   builder->parent = NULL;
@@ -1163,7 +1161,7 @@ g_variant_builder_new (GVariantTypeClass   tclass,
   {
     case G_VARIANT_TYPE_CLASS_VARIANT:
       builder->children_allocated = 1;
-      builder->expected = builder->type;
+      builder->expected = NULL;
       break;
 
     case G_VARIANT_TYPE_CLASS_ARRAY:
@@ -1455,10 +1453,13 @@ g_variant_builder_check_end (GVariantBuilder  *builder,
  **/
 gboolean
 g_variant_builder_check_add (GVariantBuilder     *builder,
-                             GVariantTypeClass    tclass,
                              const GVariantType  *type,
                              GError             **error)
 {
+  GVariantTypeClass tclass;
+
+  tclass = g_variant_type_get_class (type);
+
   g_return_val_if_fail (builder != NULL, FALSE);
   g_return_val_if_fail (builder->has_child == FALSE, FALSE);
   g_return_val_if_fail (tclass != G_VARIANT_TYPE_CLASS_INVALID &&
@@ -1848,8 +1849,7 @@ g_variant_deep_copy (GVariant *value)
         GVariantIter iter;
         GVariant *child;
 
-        builder = g_variant_builder_new (g_variant_get_type_class (value),
-                                         g_variant_get_type (value));
+        builder = g_variant_builder_new (g_variant_get_type (value));
         g_variant_iter_init (&iter, value);
 
         while ((child = g_variant_iter_next_value (&iter)))
@@ -1883,8 +1883,7 @@ g_variant_new_strv (const gchar * const *strv,
 
   g_return_val_if_fail (strv != NULL || length == 0, NULL);
 
-  builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY,
-                                   G_VARIANT_TYPE ("as"));
+  builder = g_variant_builder_new (G_VARIANT_TYPE ("as"));
   while (length-- && *strv)
     g_variant_builder_add (builder, "s", *strv++);
 
diff --git a/glib/gvariant-valist.c b/glib/gvariant-valist.c
index ec2a0e8..3e3b8d0 100644
--- a/glib/gvariant-valist.c
+++ b/glib/gvariant-valist.c
@@ -346,7 +346,7 @@ g_variant_valist_new (const gchar **format_string,
         string = (*format_string) + 1;
         type = g_variant_format_string_scan_type (*format_string,
                                                   NULL, format_string);
-        builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_MAYBE, type);
+        builder = g_variant_builder_new (type);
         g_variant_type_free (type);
 
         switch (*string)
@@ -443,11 +443,9 @@ g_variant_valist_new (const gchar **format_string,
         GVariantBuilder *builder;
 
         if (**format_string == '(')
-          builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_TUPLE,
-                                           NULL);
+          builder = g_variant_builder_new (G_VARIANT_TYPE_ANY_TUPLE);
         else
-          builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_DICT_ENTRY,
-                                           NULL);
+          builder = g_variant_builder_new (G_VARIANT_TYPE_ANY_DICT_ENTRY);
 
         (*format_string)++;                                          /* '(' */
         while (**format_string != ')' && **format_string != '}')
diff --git a/glib/gvariant.h b/glib/gvariant.h
index 531451e..d0fcb00 100644
--- a/glib/gvariant.h
+++ b/glib/gvariant.h
@@ -150,17 +150,14 @@ void                            g_variant_builder_add                   (GVarian
                                                                          const gchar          *format_string,
                                                                          ...);
 GVariantBuilder *               g_variant_builder_open                  (GVariantBuilder      *parent,
-                                                                         GVariantTypeClass     tclass,
                                                                          const GVariantType   *type);
 GVariantBuilder *               g_variant_builder_close                 (GVariantBuilder      *child);
 gboolean                        g_variant_builder_check_add             (GVariantBuilder      *builder,
-                                                                         GVariantTypeClass     tclass,
                                                                          const GVariantType   *type,
                                                                          GError              **error);
 gboolean                        g_variant_builder_check_end             (GVariantBuilder      *builder,
                                                                          GError              **error);
-GVariantBuilder *               g_variant_builder_new                   (GVariantTypeClass     tclass,
-                                                                         const GVariantType   *type);
+GVariantBuilder *               g_variant_builder_new                   (const GVariantType   *type);
 GVariant *                      g_variant_builder_end                   (GVariantBuilder      *builder);
 void                            g_variant_builder_cancel                (GVariantBuilder      *builder);
 
diff --git a/glib/tests/gvariant-big.c b/glib/tests/gvariant-big.c
index d186a7c..54ea802 100644
--- a/glib/tests/gvariant-big.c
+++ b/glib/tests/gvariant-big.c
@@ -118,7 +118,7 @@ generate2 (GRand *rand)
   type = (const GVariantType *) (possible + g_rand_int_range (rand, 0, 6));
   class = g_variant_type_get_class (type);
 
-  builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY, NULL);
+  builder = g_variant_builder_new (G_VARIANT_TYPE_ANY_ARRAY);
   for (i = 0; i < length; i++)
     {
       switch (class)
@@ -165,8 +165,7 @@ generate (GRand *rand)
   GVariantBuilder *builder;
   gsize i;
 
-  builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY,
-                                   G_VARIANT_TYPE ("av"));
+  builder = g_variant_builder_new (G_VARIANT_TYPE ("av"));
 
   /* length will fall into 0, 0..255, 256..65535, and >65536 ranges */
   for (i = 0; i < length; i++)
diff --git a/glib/tests/gvariant-varargs.c b/glib/tests/gvariant-varargs.c
index 134959e..3904b2b 100644
--- a/glib/tests/gvariant-varargs.c
+++ b/glib/tests/gvariant-varargs.c
@@ -31,16 +31,12 @@ make_value (void)
     { FALSE, 16161, 3232323232u, 6464646464646464ull, 42.0 }
   };
 
-  array = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY, NULL);
-
-  ebuilder1 = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY,
-                                     G_VARIANT_TYPE ("an"));
-  ebuilder2 = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY,
-                                     G_VARIANT_TYPE ("an"));
-  ebuilder3 = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY,
-                                     G_VARIANT_TYPE ("an"));
-  builder = g_variant_builder_new (G_VARIANT_TYPE_CLASS_ARRAY,
-                                   G_VARIANT_TYPE ("an"));
+  array = g_variant_builder_new (G_VARIANT_TYPE_ANY_ARRAY);
+
+  ebuilder1 = g_variant_builder_new (G_VARIANT_TYPE ("an"));
+  ebuilder2 = g_variant_builder_new (G_VARIANT_TYPE ("an"));
+  ebuilder3 = g_variant_builder_new (G_VARIANT_TYPE ("an"));
+  builder = g_variant_builder_new (G_VARIANT_TYPE ("an"));
   g_variant_builder_add (builder, "n", 234);
 
   g_variant_builder_add (array, "(bym(nquisv)xtd? s@?* *r@r&(bqutd)"



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]