diff options
| -rw-r--r-- | src/sdeventplus/internal/utils.hpp | 7 | ||||
| -rw-r--r-- | test/internal/utils.cpp | 17 |
2 files changed, 21 insertions, 3 deletions
diff --git a/src/sdeventplus/internal/utils.hpp b/src/sdeventplus/internal/utils.hpp index 193a52c..9d612e5 100644 --- a/src/sdeventplus/internal/utils.hpp +++ b/src/sdeventplus/internal/utils.hpp @@ -4,6 +4,7 @@ #include <chrono> #include <cstdio> #include <exception> +#include <functional> #include <sdeventplus/exception.hpp> #include <stdexcept> #include <stdplus/util/cexec.hpp> @@ -23,12 +24,12 @@ namespace internal * @details A generic wrapper that turns exceptions into * error messages and return codes. */ -template <typename Func, typename... Args> -inline int performCallback(const char* name, Func func, Args... args) +template <typename... Args> +inline int performCallback(const char* name, Args&&... args) { try { - func(args...); + std::invoke(std::forward<Args>(args)...); return 0; } catch (const std::system_error& e) diff --git a/test/internal/utils.cpp b/test/internal/utils.cpp index 403964c..8f5d75c 100644 --- a/test/internal/utils.cpp +++ b/test/internal/utils.cpp @@ -1,7 +1,10 @@ +#include <functional> #include <gtest/gtest.h> +#include <memory> #include <sdeventplus/internal/utils.hpp> #include <stdexcept> #include <system_error> +#include <utility> namespace sdeventplus { @@ -15,6 +18,20 @@ TEST(UtilsTest, PerformCallbackSuccess) EXPECT_EQ(0, performCallback(nullptr, []() {})); } +TEST(UtilsTest, PerformCallbackAcceptsReference) +{ + auto f = + std::bind([](const std::unique_ptr<int>&) {}, std::make_unique<int>(1)); + EXPECT_EQ(0, performCallback(nullptr, f)); +} + +TEST(UtilsTest, PerformCallbackAcceptsMove) +{ + auto f = + std::bind([](const std::unique_ptr<int>&) {}, std::make_unique<int>(1)); + EXPECT_EQ(0, performCallback(nullptr, std::move(f))); +} + TEST(UtilsTest, SetPrepareSystemError) { EXPECT_EQ(-EBUSY, performCallback("system_error", []() { |

