refactor: improve type extensibility and its safety (#348)

This commit is contained in:
Stanislav Angelovič
2023-08-09 12:39:16 +02:00
committed by GitHub
parent 8728653359
commit 3e84b254e9
8 changed files with 18 additions and 13 deletions

View File

@ -158,6 +158,9 @@ namespace sdbus {
Message& enterStruct(const std::string& signature); Message& enterStruct(const std::string& signature);
Message& exitStruct(); Message& exitStruct();
Message& appendArray(char type, const void *ptr, size_t size);
Message& readArray(char type, const void **ptr, size_t *size);
explicit operator bool() const; explicit operator bool() const;
void clearFlags(); void clearFlags();
@ -199,9 +202,6 @@ namespace sdbus {
template <typename _Element, typename _Allocator> template <typename _Element, typename _Allocator>
void deserializeArraySlow(std::vector<_Element, _Allocator>& items); void deserializeArraySlow(std::vector<_Element, _Allocator>& items);
void appendArray(char type, const void *ptr, size_t size);
void readArray(char type, const void **ptr, size_t *size);
template <typename _Dictionary> template <typename _Dictionary>
void serializeDictionary(const _Dictionary& items); void serializeDictionary(const _Dictionary& items);
template <typename _Dictionary> template <typename _Dictionary>
@ -529,7 +529,6 @@ namespace sdbus {
while (true) while (true)
{ {
_Element elem; _Element elem;
// TODO: Is there a way to find D-Bus message container size upfront? We could reserve space in vector upfront.
if (*this >> elem) if (*this >> elem)
items.emplace_back(std::move(elem)); items.emplace_back(std::move(elem));
else else

View File

@ -56,7 +56,7 @@ namespace sdbus {
Variant(); Variant();
template <typename _ValueType> template <typename _ValueType>
Variant(const _ValueType& value) explicit Variant(const _ValueType& value)
: Variant() : Variant()
{ {
msg_.openVariant(signature_of<_ValueType>::str()); msg_.openVariant(signature_of<_ValueType>::str());

View File

@ -226,10 +226,12 @@ Message& Message::operator<<(const UnixFd &item)
return *this; return *this;
} }
void Message::appendArray(char type, const void *ptr, size_t size) Message& Message::appendArray(char type, const void *ptr, size_t size)
{ {
auto r = sd_bus_message_append_array((sd_bus_message*)msg_, type, ptr, size); auto r = sd_bus_message_append_array((sd_bus_message*)msg_, type, ptr, size);
SDBUS_THROW_ERROR_IF(r < 0, "Failed to serialize an array", -r); SDBUS_THROW_ERROR_IF(r < 0, "Failed to serialize an array", -r);
return *this;
} }
Message& Message::operator>>(bool& item) Message& Message::operator>>(bool& item)
@ -323,13 +325,15 @@ Message& Message::operator>>(uint64_t& item)
return *this; return *this;
} }
void Message::readArray(char type, const void **ptr, size_t *size) Message& Message::readArray(char type, const void **ptr, size_t *size)
{ {
auto r = sd_bus_message_read_array((sd_bus_message*)msg_, type, ptr, size); auto r = sd_bus_message_read_array((sd_bus_message*)msg_, type, ptr, size);
if (r == 0) if (r == 0)
ok_ = false; ok_ = false;
SDBUS_THROW_ERROR_IF(r < 0, "Failed to deserialize an array", -r); SDBUS_THROW_ERROR_IF(r < 0, "Failed to deserialize an array", -r);
return *this;
} }
Message& Message::operator>>(double& item) Message& Message::operator>>(double& item)

View File

@ -103,7 +103,9 @@ TEST_F(SdbusTestObject, CallsMethodWithStructVariantsAndGetMapSuccesfully)
std::vector<int32_t> x{-2, 0, 2}; std::vector<int32_t> x{-2, 0, 2};
sdbus::Struct<sdbus::Variant, sdbus::Variant> y{false, true}; sdbus::Struct<sdbus::Variant, sdbus::Variant> y{false, true};
auto mapOfVariants = m_proxy->getMapOfVariants(x, y); auto mapOfVariants = m_proxy->getMapOfVariants(x, y);
decltype(mapOfVariants) res{{-2, false}, {0, false}, {2, true}}; decltype(mapOfVariants) res{ {sdbus::Variant{-2}, sdbus::Variant{false}}
, {sdbus::Variant{0}, sdbus::Variant{false}}
, {sdbus::Variant{2}, sdbus::Variant{true}}};
ASSERT_THAT(mapOfVariants[-2].get<bool>(), Eq(res[-2].get<bool>())); ASSERT_THAT(mapOfVariants[-2].get<bool>(), Eq(res[-2].get<bool>()));
ASSERT_THAT(mapOfVariants[0].get<bool>(), Eq(res[0].get<bool>())); ASSERT_THAT(mapOfVariants[0].get<bool>(), Eq(res[0].get<bool>()));

View File

@ -104,7 +104,7 @@ TEST_F(SdbusTestObject, EmitsSignalWithLargeMapSuccesfully)
TEST_F(SdbusTestObject, EmitsSignalWithVariantSuccesfully) TEST_F(SdbusTestObject, EmitsSignalWithVariantSuccesfully)
{ {
double d = 3.14; double d = 3.14;
m_adaptor->emitSignalWithVariant(d); m_adaptor->emitSignalWithVariant(sdbus::Variant{d});
ASSERT_TRUE(waitUntil(m_proxy->m_gotSignalWithVariant)); ASSERT_TRUE(waitUntil(m_proxy->m_gotSignalWithVariant));
ASSERT_THAT(m_proxy->m_variantFromSignal, DoubleEq(d)); ASSERT_THAT(m_proxy->m_variantFromSignal, DoubleEq(d));

View File

@ -86,7 +86,7 @@ TEST_F(SdbusTestObject, SetsPropertyViaPropertiesInterface)
{ {
uint32_t newActionValue = 2345; uint32_t newActionValue = 2345;
m_proxy->Set(INTERFACE_NAME, "action", newActionValue); m_proxy->Set(INTERFACE_NAME, "action", sdbus::Variant{newActionValue});
ASSERT_THAT(m_proxy->action(), Eq(newActionValue)); ASSERT_THAT(m_proxy->action(), Eq(newActionValue));
} }

View File

@ -77,7 +77,7 @@ std::vector<int16_t> TestAdaptor::getInts16FromStruct(const sdbus::Struct<uint8_
sdbus::Variant TestAdaptor::processVariant(const sdbus::Variant& v) sdbus::Variant TestAdaptor::processVariant(const sdbus::Variant& v)
{ {
sdbus::Variant res = static_cast<int32_t>(v.get<double>()); sdbus::Variant res{static_cast<int32_t>(v.get<double>())};
return res; return res;
} }

View File

@ -427,8 +427,8 @@ int main(int argc, char *argv[])
while (!stopClients) while (!stopClients)
{ {
std::map<std::string, sdbus::Variant> param; std::map<std::string, sdbus::Variant> param;
param["key1"] = "sdbus-c++-stress-tests"; param["key1"] = sdbus::Variant{"sdbus-c++-stress-tests"};
param["key2"] = ++localCounter; param["key2"] = sdbus::Variant{++localCounter};
concatenator.concatenate(param); concatenator.concatenate(param);