diff options
author | Yannick Guesnet <yannick.guesnet@univ-rouen.fr> | 2011-03-16 10:56:28 +0100 |
---|---|---|
committer | Murray Cumming <murrayc@murrayc.com> | 2011-03-16 11:25:24 +0100 |
commit | 2f2de9f5802bb722c86951398ca3ff501c990282 (patch) | |
tree | b46521e21837b5e7cb4f555f10420f8f2238a885 | |
parent | 4af5c32ac1c325a63d89e5a35ca8647c4a4bb908 (diff) | |
download | glibmm-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-- | ChangeLog | 11 | ||||
-rw-r--r-- | glib/src/variant.ccg | 5 | ||||
-rw-r--r-- | glib/src/variant.hg | 2 | ||||
-rw-r--r-- | tests/glibmm_variant/main.cc | 37 |
4 files changed, 54 insertions, 1 deletions
@@ -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"); } |