Skip to content

Commit

Permalink
feat: add std::variant constructor and conversion operator to sdbus::…
Browse files Browse the repository at this point in the history
…Variant (#429)

Signed-off-by: Anthony Brandon <[email protected]>
  • Loading branch information
anthonybrandon authored Apr 4, 2024
1 parent b9088cc commit 334fcb8
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 0 deletions.
17 changes: 17 additions & 0 deletions include/sdbus-c++/Types.h
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,14 @@ namespace sdbus {
msg_.seal();
}

template <typename... _Elements>
Variant(const std::variant<_Elements...>& value)
: Variant()
{
msg_ << value;
msg_.seal();
}

template <typename _ValueType>
_ValueType get() const
{
Expand All @@ -83,6 +91,15 @@ namespace sdbus {
return get<_ValueType>();
}

template <typename... _Elements>
operator std::variant<_Elements...>() const
{
std::variant<_Elements...> result;
msg_.rewind(false);
msg_ >> result;
return result;
}

template <typename _Type>
bool containsValueOfType() const
{
Expand Down
37 changes: 37 additions & 0 deletions tests/unittests/Types_test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,19 @@ TEST(AVariant, CanBeConstructedFromAComplexValue)
ASSERT_NO_THROW(sdbus::Variant{value});
}

TEST(AVariant, CanBeConstructedFromAnStdVariant)
{
using ComplexType = std::vector<sdbus::Struct<std::string, double>>;
using StdVariantType = std::variant<std::string, uint64_t, ComplexType>;
ComplexType value{{"hello"s, ANY_DOUBLE}, {"world"s, ANY_DOUBLE}};
StdVariantType stdVariant{value};

sdbus::Variant sdbusVariant{stdVariant};

ASSERT_TRUE(sdbusVariant.containsValueOfType<ComplexType>());
ASSERT_THAT(sdbusVariant.get<ComplexType>(), Eq(value));
}

TEST(AVariant, CanBeCopied)
{
auto value = "hello"s;
Expand Down Expand Up @@ -130,6 +143,30 @@ TEST(AVariant, ReturnsTrueWhenAskedIfItContainsTheTypeItReallyContains)
ASSERT_TRUE(variant.containsValueOfType<ComplexType>());
}

TEST(AVariant, CanBeConvertedIntoAnStdVariant)
{
using ComplexType = std::vector<sdbus::Struct<std::string, double>>;
using StdVariantType = std::variant<std::string, uint64_t, ComplexType>;
ComplexType value{{"hello"s, ANY_DOUBLE}, {"world"s, ANY_DOUBLE}};
sdbus::Variant sdbusVariant{value};
StdVariantType stdVariant{sdbusVariant};

ASSERT_TRUE(std::holds_alternative<ComplexType>(stdVariant));
ASSERT_THAT(std::get<ComplexType>(stdVariant), Eq(value));
}

TEST(AVariant, IsImplicitlyInterchangeableWithStdVariant)
{
using ComplexType = std::vector<sdbus::Struct<std::string, double>>;
using StdVariantType = std::variant<std::string, uint64_t, ComplexType>;
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;
Expand Down

0 comments on commit 334fcb8

Please sign in to comment.