[next] telepathy-glib: add tp_intset_from_variant()

Guillaume Desmottes gdesmott at kemper.freedesktop.org
Fri May 16 06:04:55 PDT 2014


Module: telepathy-glib
Branch: next
Commit: 65ac8338cd45e46a495912acd9a99b25893381c4
URL:    http://cgit.freedesktop.org/telepathy/telepathy-glib/commit/?id=65ac8338cd45e46a495912acd9a99b25893381c4

Author: Guillaume Desmottes <guillaume.desmottes at collabora.co.uk>
Date:   Thu May 15 09:54:07 2014 +0200

add tp_intset_from_variant()

https://bugs.freedesktop.org/show_bug.cgi?id=77773

---

 .../telepathy-glib/telepathy-glib-sections.txt     |    1 +
 telepathy-glib/intset.c                            |   33 ++++++++++++++++++++
 telepathy-glib/intset.h                            |    1 +
 tests/intset.c                                     |    7 +++++
 4 files changed, 42 insertions(+)

diff --git a/docs/reference/telepathy-glib/telepathy-glib-sections.txt b/docs/reference/telepathy-glib/telepathy-glib-sections.txt
index 3ffca48..93f6f3f 100644
--- a/docs/reference/telepathy-glib/telepathy-glib-sections.txt
+++ b/docs/reference/telepathy-glib/telepathy-glib-sections.txt
@@ -1784,6 +1784,7 @@ tp_intset_foreach
 tp_intset_to_array
 tp_intset_from_array
 tp_intset_to_variant
+tp_intset_from_variant
 tp_intset_is_empty
 tp_intset_size
 tp_intset_is_equal
diff --git a/telepathy-glib/intset.c b/telepathy-glib/intset.c
index 7b3c58b..30d27cb 100644
--- a/telepathy-glib/intset.c
+++ b/telepathy-glib/intset.c
@@ -412,6 +412,39 @@ tp_intset_to_variant (const TpIntset *set)
   return g_variant_builder_end (&builder);
 }
 
+/**
+ * tp_intset_from_variant:
+ * @variant: a #GVariant of type 'au', consumed if floating
+ *
+ * <!--Returns: says it all-->
+ *
+ * Returns: (transfer full): A set containing the same integers as @variant.
+ */
+TpIntset *
+tp_intset_from_variant (GVariant *variant)
+{
+  TpIntset *set;
+  GVariantIter iter;
+  guint32 value;
+
+  g_return_val_if_fail (variant != NULL, NULL);
+  g_return_val_if_fail (g_variant_is_of_type (variant, G_VARIANT_TYPE ("au")),
+      NULL);
+
+  g_variant_ref_sink (variant);
+
+  set = tp_intset_new ();
+
+  g_variant_iter_init (&iter, variant);
+  while (g_variant_iter_loop (&iter, "u", &value))
+    {
+      tp_intset_add (set, value);
+    }
+
+  g_variant_unref (variant);
+  return set;
+}
+
 /* these magic numbers would need adjusting for 64-bit storage */
 G_STATIC_ASSERT (BITFIELD_BITS == 32);
 
diff --git a/telepathy-glib/intset.h b/telepathy-glib/intset.h
index 496bcfb..c66aade 100644
--- a/telepathy-glib/intset.h
+++ b/telepathy-glib/intset.h
@@ -57,6 +57,7 @@ GArray *tp_intset_to_array (const TpIntset *set) G_GNUC_WARN_UNUSED_RESULT;
 TpIntset *tp_intset_from_array (const GArray *array) G_GNUC_WARN_UNUSED_RESULT;
 
 GVariant *tp_intset_to_variant (const TpIntset *set) G_GNUC_WARN_UNUSED_RESULT;
+TpIntset *tp_intset_from_variant (GVariant *variant) G_GNUC_WARN_UNUSED_RESULT;
 
 gboolean tp_intset_is_empty (const TpIntset *set) G_GNUC_WARN_UNUSED_RESULT;
 guint tp_intset_size (const TpIntset *set) G_GNUC_WARN_UNUSED_RESULT;
diff --git a/tests/intset.c b/tests/intset.c
index 3695f1e..83580ff 100644
--- a/tests/intset.c
+++ b/tests/intset.c
@@ -202,16 +202,23 @@ test (Fixture *f,
 
   {
     GVariant *v;
+    TpIntset *tmp;
 
     v = tp_intset_to_variant (a);
     g_variant_ref_sink (v);
     g_assert (g_variant_is_of_type (v, G_VARIANT_TYPE ("au")));
+    tmp = tp_intset_from_variant (v);
+    g_assert (tp_intset_is_equal (a, tmp));
     g_variant_unref (v);
+    tp_intset_destroy (tmp);
 
     v = tp_intset_to_variant (b);
     g_variant_ref_sink (v);
     g_assert (g_variant_is_of_type (v, G_VARIANT_TYPE ("au")));
+    tmp = tp_intset_from_variant (v);
+    g_assert (tp_intset_is_equal (b, tmp));
     g_variant_unref (v);
+    tp_intset_destroy (tmp);
   }
 
   value = tp_g_value_slice_new_take_boxed (TP_TYPE_INTSET, a);



More information about the telepathy-commits mailing list