summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYannick Guesnet <yannick.guesnet@univ-rouen.fr>2011-03-16 10:56:28 +0100
committerMurray Cumming <murrayc@murrayc.com>2011-03-16 11:25:24 +0100
commit2f2de9f5802bb722c86951398ca3ff501c990282 (patch)
treeb46521e21837b5e7cb4f555f10420f8f2238a885
parent4af5c32ac1c325a63d89e5a35ca8647c4a4bb908 (diff)
downloadglibmm-2f2de9f5802bb722c86951398ca3ff501c990282.tar.gz
Variant: Added Variant<VariantBase>::get().
* glib/src/variant.[ccg|hg]: Added Variant<VariantBase>::get(). * tests/glibmm_variant/main.cc: Add some tests. This is useful because Variant<VariantBase> can be manipulate as other variants of type Variant<T>. This allow, for example, to define variants of type Variant<std::map<ustring, VariantBase> >.
-rw-r--r--ChangeLog11
-rw-r--r--glib/src/variant.ccg5
-rw-r--r--glib/src/variant.hg2
-rw-r--r--tests/glibmm_variant/main.cc37
4 files changed, 54 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 3467618c..a8352953 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2011-03-16 Yannick Guesnet <Yannick.Guesnet@univ-rouen.fr>
+
+ Variant: Added Variant<VariantBase>::get().
+
+ * glib/src/variant.[ccg|hg]: Added Variant<VariantBase>::get().
+ * tests/glibmm_variant/main.cc: Add some tests.
+
+ This is useful because Variant<VariantBase> can be manipulate as other
+ variants of type Variant<T>. This allow, for example, to define variants
+ of type Variant<std::map<ustring, VariantBase> >.
+
2011-03-14 Yannick Guesnet <Yannick.Guesnet@univ-rouen.fr>
Variant: Add a cast operator.
diff --git a/glib/src/variant.ccg b/glib/src/variant.ccg
index c8dc2420..f1c30ac1 100644
--- a/glib/src/variant.ccg
+++ b/glib/src/variant.ccg
@@ -152,6 +152,11 @@ Variant<VariantBase> Variant<VariantBase>::create(const VariantBase& data)
return result;
}
+VariantBase Variant<VariantBase>::get() const
+{
+ return VariantBase(g_variant_get_variant(gobject_));
+}
+
// static
const VariantType& Variant<Glib::ustring>::variant_type()
{
diff --git a/glib/src/variant.hg b/glib/src/variant.hg
index d1e7d6cb..f9606d3e 100644
--- a/glib/src/variant.hg
+++ b/glib/src/variant.hg
@@ -345,7 +345,7 @@ public:
static Variant<VariantBase> create(const Glib::VariantBase& data);
_IGNORE(g_variant_new_variant)
- // The parent's class get() method suffices to get the child variant.
+ VariantBase get() const;
_IGNORE(g_variant_get_variant)
};
diff --git a/tests/glibmm_variant/main.cc b/tests/glibmm_variant/main.cc
index 1f463e43..e84dd751 100644
--- a/tests/glibmm_variant/main.cc
+++ b/tests/glibmm_variant/main.cc
@@ -157,4 +157,41 @@ static void test_dynamic_cast()
catch (const std::bad_cast& e)
{
}
+
+ // A variant of type a{sv}
+ typedef std::map<Glib::ustring, Glib::VariantBase> type_map_sv;
+ typedef Glib::Variant<type_map_sv> type_dict_sv;
+ g_assert((type_dict_sv::variant_type().get_string()) == "a{sv}");
+
+ type_dict_sv var_map;
+ type_map_sv map;
+ Glib::Variant<Glib::ustring> var_string =
+ Glib::Variant<Glib::ustring>::create("test variant");
+ map["test key"] = var_string;
+ var_map = type_dict_sv::create(map);
+ g_assert(var_map.get_type_string() == "a{sv}");
+
+ Glib::VariantBase& ref_var_base = var_map;
+ type_dict_sv var_map_cast = Glib::VariantBase::cast_dynamic<type_dict_sv>(ref_var_base);
+
+ try
+ {
+ Glib::Variant<std::map<Glib::ustring, Glib::ustring> > var_wrong_map =
+ Glib::VariantBase::cast_dynamic<Glib::Variant<std::map<Glib::ustring, Glib::ustring> > >(ref_var_base);
+ g_assert_not_reached();
+ }
+ catch(const std::bad_cast& e)
+ {
+ }
+
+ type_map_sv get_map = var_map_cast.get();
+ var_string = Glib::VariantBase::cast_dynamic<Glib::Variant< Glib::ustring > >(get_map["test key"]);
+ g_assert(var_string.get() == "test variant");
+
+ // A variant of type v
+ Glib::Variant< Glib::VariantBase > var_v = Glib::Variant< Glib::VariantBase >::create(var_string);
+ g_assert(var_v.get_type_string() == "v");
+ Glib::Variant< Glib::ustring > var_s2 =
+ Glib::VariantBase::cast_dynamic<Glib::Variant< Glib::ustring > >(var_v.get());
+ g_assert(var_s2.get() == "test variant");
}