diff --git a/include/sdbus-c++/Types.h b/include/sdbus-c++/Types.h index aae5cfa..a91cbff 100644 --- a/include/sdbus-c++/Types.h +++ b/include/sdbus-c++/Types.h @@ -65,6 +65,14 @@ namespace sdbus { msg_.seal(); } + template + Variant(const std::variant<_Elements...>& value) + : Variant() + { + msg_ << value; + msg_.seal(); + } + template _ValueType get() const { @@ -83,6 +91,15 @@ namespace sdbus { return get<_ValueType>(); } + template + operator std::variant<_Elements...>() const + { + std::variant<_Elements...> result; + msg_.rewind(false); + msg_ >> result; + return result; + } + template bool containsValueOfType() const { diff --git a/tests/unittests/Types_test.cpp b/tests/unittests/Types_test.cpp index 2142d46..dc9c4d7 100644 --- a/tests/unittests/Types_test.cpp +++ b/tests/unittests/Types_test.cpp @@ -72,6 +72,19 @@ TEST(AVariant, CanBeConstructedFromAComplexValue) ASSERT_NO_THROW(sdbus::Variant{value}); } +TEST(AVariant, CanBeConstructedFromAnStdVariant) +{ + using ComplexType = std::vector>; + using StdVariantType = std::variant; + ComplexType value{{"hello"s, ANY_DOUBLE}, {"world"s, ANY_DOUBLE}}; + StdVariantType stdVariant{value}; + + sdbus::Variant sdbusVariant{stdVariant}; + + ASSERT_TRUE(sdbusVariant.containsValueOfType()); + ASSERT_THAT(sdbusVariant.get(), Eq(value)); +} + TEST(AVariant, CanBeCopied) { auto value = "hello"s; @@ -130,6 +143,30 @@ TEST(AVariant, ReturnsTrueWhenAskedIfItContainsTheTypeItReallyContains) ASSERT_TRUE(variant.containsValueOfType()); } +TEST(AVariant, CanBeConvertedIntoAnStdVariant) +{ + using ComplexType = std::vector>; + using StdVariantType = std::variant; + ComplexType value{{"hello"s, ANY_DOUBLE}, {"world"s, ANY_DOUBLE}}; + sdbus::Variant sdbusVariant{value}; + StdVariantType stdVariant{sdbusVariant}; + + ASSERT_TRUE(std::holds_alternative(stdVariant)); + ASSERT_THAT(std::get(stdVariant), Eq(value)); +} + +TEST(AVariant, IsImplicitlyInterchangeableWithStdVariant) +{ + using ComplexType = std::vector>; + using StdVariantType = std::variant; + ComplexType value{{"hello"s, ANY_DOUBLE}, {"world"s, ANY_DOUBLE}}; + StdVariantType stdVariant{value}; + + auto stdVariantCopy = [](const sdbus::Variant &v) -> StdVariantType { return v; }(stdVariant); + + ASSERT_THAT(stdVariantCopy, Eq(stdVariant)); +} + TEST(ASimpleVariant, ReturnsFalseWhenAskedIfItContainsTypeItDoesntReallyContain) { int value = 5;