diff --git a/include/sdbus-c++/TypeTraits.h b/include/sdbus-c++/TypeTraits.h index e501681..77376f9 100644 --- a/include/sdbus-c++/TypeTraits.h +++ b/include/sdbus-c++/TypeTraits.h @@ -115,6 +115,11 @@ namespace sdbus { : public signature_of<_T> {}; + template + struct signature_of<_T&> + : public signature_of<_T> + {}; + template <> struct signature_of { diff --git a/tests/unittests/Message_test.cpp b/tests/unittests/Message_test.cpp index 0aa2525..eb17152 100644 --- a/tests/unittests/Message_test.cpp +++ b/tests/unittests/Message_test.cpp @@ -29,6 +29,7 @@ #include #include #include +#include using ::testing::Eq; using ::testing::Gt; @@ -45,6 +46,82 @@ namespace } } +namespace sdbus { + + template + sdbus::Message& operator<<(sdbus::Message& msg, const std::list<_ElementType>& items) + { + msg.openContainer(sdbus::signature_of<_ElementType>::str()); + + for (const auto& item : items) + msg << item; + + msg.closeContainer(); + + return msg; + } + + template + sdbus::Message& operator>>(sdbus::Message& msg, std::list<_ElementType>& items) + { + if(!msg.enterContainer(sdbus::signature_of<_ElementType>::str())) + return msg; + + while (true) + { + _ElementType elem; + if (msg >> elem) + items.emplace_back(std::move(elem)); + else + break; + } + + msg.clearFlags(); + + msg.exitContainer(); + + return msg; + } + +} + +template +struct sdbus::signature_of> + : sdbus::signature_of> +{}; + +namespace my { + + struct Struct + { + int i; + std::string s; + std::list l; + }; + + bool operator==(const Struct& lhs, const Struct& rhs) + { + return lhs.i == rhs.i && lhs.s == rhs.s && lhs.l == rhs.l; + } + + sdbus::Message& operator<<(sdbus::Message& msg, const Struct& items) + { + return msg << sdbus::Struct{std::forward_as_tuple(items.i, items.s, items.l)}; + } + + sdbus::Message& operator>>(sdbus::Message& msg, Struct& items) + { + sdbus::Struct s{std::forward_as_tuple(items.i, items.s, items.l)}; + return msg >> s; + } + +} + +template <> +struct sdbus::signature_of + : sdbus::signature_of>> +{}; + /*-------------------------------------*/ /* -- TEST CASES -- */ /*-------------------------------------*/ @@ -161,7 +238,7 @@ TEST(AMessage, CanCarryACollectionOfEmbeddedVariants) { auto msg = sdbus::createPlainMessage(); - auto value = std::vector{"hello"s, (double)3.14}; + std::vector value{sdbus::Variant{"hello"s}, sdbus::Variant{(double)3.14}}; const auto dataWritten = sdbus::Variant{value}; msg << dataWritten; @@ -374,3 +451,35 @@ TEST(AMessage, CanPeekContainerContents) ASSERT_THAT(type, "a"); ASSERT_THAT(contents, "{is}"); } + +TEST(AMessage, CanCarryDBusArrayGivenAsCustomType) +{ + auto msg = sdbus::createPlainMessage(); + + const std::list dataWritten{3545342, 43643532, 324325}; + //custom::MyType t; + + msg << dataWritten; + // msg << t; + msg.seal(); + + std::list dataRead; + msg >> dataRead; + + ASSERT_THAT(dataRead, Eq(dataWritten)); +} + +TEST(AMessage, CanCarryDBusStructGivenAsCustomType) +{ + auto msg = sdbus::createPlainMessage(); + + const my::Struct dataWritten{3545342, "hello"s, {3.14, 2.4568546}}; + + msg << dataWritten; + msg.seal(); + + my::Struct dataRead; + msg >> dataRead; + + ASSERT_THAT(dataRead, Eq(dataWritten)); +}