Skip to content

Commit

Permalink
perf: provide also const char* overloads for convenience functions
Browse files Browse the repository at this point in the history
  • Loading branch information
sangelovic committed Apr 16, 2024
1 parent 423f8f8 commit de6a209
Show file tree
Hide file tree
Showing 31 changed files with 401 additions and 183 deletions.
4 changes: 2 additions & 2 deletions docs/using-sdbus-c++.md
Original file line number Diff line number Diff line change
Expand Up @@ -714,7 +714,7 @@ namespace sdbuscpp {
class Concatenator_adaptor
{
public:
static inline const sdbus::InterfaceName INTERFACE_NAME{"org.sdbuscpp.Concatenator"};
static constexpr const char* INTERFACE_NAME = "org.sdbuscpp.Concatenator";
protected:
Concatenator_adaptor(sdbus::IObject& object)
Expand Down Expand Up @@ -773,7 +773,7 @@ namespace sdbuscpp {
class Concatenator_proxy
{
public:
static inline const sdbus::InterfaceName INTERFACE_NAME{"org.sdbuscpp.Concatenator"};
static constexpr const char* INTERFACE_NAME = "org.sdbuscpp.Concatenator";
protected:
Concatenator_proxy(sdbus::IProxy& proxy)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ namespace ExampleManager {
class Planet1_proxy
{
public:
static inline const sdbus::InterfaceName INTERFACE_NAME{"org.sdbuscpp.ExampleManager.Planet1"};
static constexpr const char* INTERFACE_NAME = "org.sdbuscpp.ExampleManager.Planet1";

protected:
Planet1_proxy(sdbus::IProxy& proxy)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ namespace ExampleManager {
class Planet1_adaptor
{
public:
static inline const sdbus::InterfaceName INTERFACE_NAME{"org.sdbuscpp.ExampleManager.Planet1"};
static constexpr const char* INTERFACE_NAME = "org.sdbuscpp.ExampleManager.Planet1";

protected:
Planet1_adaptor(sdbus::IObject& object)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class ManagerProxy final : public sdbus::ProxyInterfaces<sdbus::ObjectManager_pr
std::cout << std::endl;

// Parse and print some more info
auto planetInterface = interfacesAndProperties.find(org::sdbuscpp::ExampleManager::Planet1_proxy::INTERFACE_NAME);
auto planetInterface = interfacesAndProperties.find(sdbus::InterfaceName{org::sdbuscpp::ExampleManager::Planet1_proxy::INTERFACE_NAME});
if (planetInterface == interfacesAndProperties.end()) {
return;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,12 +47,12 @@ class PlanetAdaptor final : public sdbus::AdaptorInterfaces< org::sdbuscpp::Exam
, m_population(population)
{
registerAdaptor();
emitInterfacesAddedSignal({org::sdbuscpp::ExampleManager::Planet1_adaptor::INTERFACE_NAME});
emitInterfacesAddedSignal({sdbus::InterfaceName{org::sdbuscpp::ExampleManager::Planet1_adaptor::INTERFACE_NAME}});
}

~PlanetAdaptor()
{
emitInterfacesRemovedSignal({org::sdbuscpp::ExampleManager::Planet1_adaptor::INTERFACE_NAME});
emitInterfacesRemovedSignal({sdbus::InterfaceName{org::sdbuscpp::ExampleManager::Planet1_adaptor::INTERFACE_NAME}});
unregisterAdaptor();
}

Expand Down
93 changes: 63 additions & 30 deletions include/sdbus-c++/ConvenienceApiClasses.h
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,15 @@ namespace sdbus {
class VTableAdder
{
public:
VTableAdder(IObject& object, std::vector<VTableItem> vtable);
void forInterface(InterfaceName interfaceName);
void forInterface(std::string interfaceName);
[[nodiscard]] Slot forInterface(InterfaceName interfaceName, return_slot_t);
[[nodiscard]] Slot forInterface(std::string interfaceName, return_slot_t);

private:
friend IObject;
VTableAdder(IObject& object, std::vector<VTableItem> vtable);

private:
IObject& object_;
std::vector<VTableItem> vtable_;
Expand All @@ -67,40 +70,50 @@ namespace sdbus {
class SignalEmitter
{
public:
SignalEmitter(IObject& object, const SignalName& signalName);
SignalEmitter(SignalEmitter&& other) = default;
~SignalEmitter() noexcept(false);
SignalEmitter& onInterface(const InterfaceName& interfaceName);
SignalEmitter& onInterface(const std::string& interfaceName);
SignalEmitter& onInterface(const char* interfaceName);
template <typename... _Args> void withArguments(_Args&&... args);

SignalEmitter(SignalEmitter&& other) = default;
~SignalEmitter() noexcept(false);

private:
friend IObject;
SignalEmitter(IObject& object, const SignalName& signalName);
SignalEmitter(IObject& object, const char* signalName);

private:
IObject& object_;
const SignalName& signalName_;
const char* signalName_;
Signal signal_;
int exceptions_{}; // Number of active exceptions when SignalEmitter is constructed
};

class MethodInvoker
{
public:
MethodInvoker(IProxy& proxy, const MethodName& methodName);
MethodInvoker(MethodInvoker&& other) = default;
~MethodInvoker() noexcept(false);

MethodInvoker& onInterface(const InterfaceName& interfaceName);
MethodInvoker& onInterface(const std::string& interfaceName);
MethodInvoker& onInterface(const char* interfaceName);
MethodInvoker& withTimeout(uint64_t usec);
template <typename _Rep, typename _Period>
MethodInvoker& withTimeout(const std::chrono::duration<_Rep, _Period>& timeout);
template <typename... _Args> MethodInvoker& withArguments(_Args&&... args);
template <typename... _Args> void storeResultsTo(_Args&... args);

void dontExpectReply();

MethodInvoker(MethodInvoker&& other) = default;
~MethodInvoker() noexcept(false);

private:
friend IProxy;
MethodInvoker(IProxy& proxy, const MethodName& methodName);
MethodInvoker(IProxy& proxy, const char* methodName);

private:
IProxy& proxy_;
const MethodName& methodName_;
const char* methodName_;
uint64_t timeout_{};
MethodCall method_;
int exceptions_{}; // Number of active exceptions when MethodInvoker is constructed
Expand All @@ -110,9 +123,9 @@ namespace sdbus {
class AsyncMethodInvoker
{
public:
AsyncMethodInvoker(IProxy& proxy, const MethodName& methodName);
AsyncMethodInvoker& onInterface(const InterfaceName& interfaceName);
AsyncMethodInvoker& onInterface(const std::string& interfaceName);
AsyncMethodInvoker& onInterface(const char* interfaceName);
AsyncMethodInvoker& withTimeout(uint64_t usec);
template <typename _Rep, typename _Period>
AsyncMethodInvoker& withTimeout(const std::chrono::duration<_Rep, _Period>& timeout);
Expand All @@ -123,39 +136,49 @@ namespace sdbus {
// or std::future<std::tuple<...>> for multiple method return values
template <typename... _Args> std::future<future_return_t<_Args...>> getResultAsFuture();

private:
friend IProxy;
AsyncMethodInvoker(IProxy& proxy, const MethodName& methodName);
AsyncMethodInvoker(IProxy& proxy, const char* methodName);

private:
IProxy& proxy_;
const MethodName& methodName_;
const char* methodName_;
uint64_t timeout_{};
MethodCall method_;
};

class SignalSubscriber
{
public:
SignalSubscriber(IProxy& proxy, const SignalName& signalName);
SignalSubscriber& onInterface(InterfaceName interfaceName); // TODO: This could be const char*
SignalSubscriber& onInterface(std::string interfaceName); // TODO: This could be const char*
SignalSubscriber& onInterface(const InterfaceName& interfaceName);
SignalSubscriber& onInterface(const std::string& interfaceName);
SignalSubscriber& onInterface(const char* interfaceName);
template <typename _Function> void call(_Function&& callback);
template <typename _Function> [[nodiscard]] Slot call(_Function&& callback, return_slot_t);

private:
friend IProxy;
SignalSubscriber(IProxy& proxy, const SignalName& signalName);
SignalSubscriber(IProxy& proxy, const char* signalName);
template <typename _Function> signal_handler makeSignalHandler(_Function&& callback);

private:
IProxy& proxy_;
const SignalName& signalName_;
InterfaceName interfaceName_;
const char* signalName_;
const char* interfaceName_{};
};

class PropertyGetter
{
public:
PropertyGetter(IProxy& proxy, std::string_view propertyName);
Variant onInterface(std::string_view interfaceName);

private:
static inline const InterfaceName DBUS_PROPERTIES_INTERFACE_NAME{"org.freedesktop.DBus.Properties"};
friend IProxy;
PropertyGetter(IProxy& proxy, std::string_view propertyName);

static constexpr const char* DBUS_PROPERTIES_INTERFACE_NAME = "org.freedesktop.DBus.Properties";

private:
IProxy& proxy_;
Expand All @@ -165,13 +188,15 @@ namespace sdbus {
class AsyncPropertyGetter
{
public:
AsyncPropertyGetter(IProxy& proxy, std::string_view propertyName);
AsyncPropertyGetter& onInterface(std::string_view interfaceName);
template <typename _Function> PendingAsyncCall uponReplyInvoke(_Function&& callback);
std::future<Variant> getResultAsFuture();

private:
static inline const InterfaceName DBUS_PROPERTIES_INTERFACE_NAME{"org.freedesktop.DBus.Properties"};
friend IProxy;
AsyncPropertyGetter(IProxy& proxy, std::string_view propertyName);

static constexpr const char* DBUS_PROPERTIES_INTERFACE_NAME = "org.freedesktop.DBus.Properties";

private:
IProxy& proxy_;
Expand All @@ -182,15 +207,17 @@ namespace sdbus {
class PropertySetter
{
public:
PropertySetter(IProxy& proxy, std::string_view propertyName);
PropertySetter& onInterface(std::string_view interfaceName);
template <typename _Value> void toValue(const _Value& value);
template <typename _Value> void toValue(const _Value& value, dont_expect_reply_t);
void toValue(const Variant& value);
void toValue(const Variant& value, dont_expect_reply_t);

private:
static inline const InterfaceName DBUS_PROPERTIES_INTERFACE_NAME{"org.freedesktop.DBus.Properties"};
friend IProxy;
PropertySetter(IProxy& proxy, std::string_view propertyName);

static constexpr const char* DBUS_PROPERTIES_INTERFACE_NAME = "org.freedesktop.DBus.Properties";

private:
IProxy& proxy_;
Expand All @@ -201,15 +228,17 @@ namespace sdbus {
class AsyncPropertySetter
{
public:
AsyncPropertySetter(IProxy& proxy, std::string_view propertyName);
AsyncPropertySetter& onInterface(std::string_view interfaceName);
template <typename _Value> AsyncPropertySetter& toValue(_Value&& value);
AsyncPropertySetter& toValue(Variant value);
template <typename _Function> PendingAsyncCall uponReplyInvoke(_Function&& callback);
std::future<void> getResultAsFuture();

private:
static inline const InterfaceName DBUS_PROPERTIES_INTERFACE_NAME{"org.freedesktop.DBus.Properties"};
friend IProxy;
AsyncPropertySetter(IProxy& proxy, std::string_view propertyName);

static constexpr const char* DBUS_PROPERTIES_INTERFACE_NAME = "org.freedesktop.DBus.Properties";

private:
IProxy& proxy_;
Expand All @@ -221,11 +250,13 @@ namespace sdbus {
class AllPropertiesGetter
{
public:
AllPropertiesGetter(IProxy& proxy);
std::map<PropertyName, Variant> onInterface(std::string_view interfaceName);

private:
static inline const InterfaceName DBUS_PROPERTIES_INTERFACE_NAME{"org.freedesktop.DBus.Properties"};
friend IProxy;
AllPropertiesGetter(IProxy& proxy);

static constexpr const char* DBUS_PROPERTIES_INTERFACE_NAME = "org.freedesktop.DBus.Properties";

private:
IProxy& proxy_;
Expand All @@ -234,13 +265,15 @@ namespace sdbus {
class AsyncAllPropertiesGetter
{
public:
AsyncAllPropertiesGetter(IProxy& proxy);
AsyncAllPropertiesGetter& onInterface(std::string_view interfaceName);
template <typename _Function> PendingAsyncCall uponReplyInvoke(_Function&& callback);
std::future<std::map<PropertyName, Variant>> getResultAsFuture();

private:
static inline const InterfaceName DBUS_PROPERTIES_INTERFACE_NAME{"org.freedesktop.DBus.Properties"}; // TODO: Couldn't this be const char*?
friend IProxy;
AsyncAllPropertiesGetter(IProxy& proxy);

static constexpr const char* DBUS_PROPERTIES_INTERFACE_NAME = "org.freedesktop.DBus.Properties";

private:
IProxy& proxy_;
Expand Down
Loading

0 comments on commit de6a209

Please sign in to comment.