diff options
| author | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2017-07-12 17:32:23 +0200 |
|---|---|---|
| committer | Marco Trevisan (Treviño) <mail@3v1n0.net> | 2017-07-12 17:32:23 +0200 |
| commit | d88c22ef39bba3670c12b0396da00d79a8e959e2 (patch) | |
| tree | e700b04b57eb38d380bc0cb2f280cb8e83e09ead | |
| parent | e9c15e146396e2c9b6ba923fc4710685a759dfff (diff) | |
GLibSignal: change the methods signatures to return values
(bzr r4245.2.1)
| -rw-r--r-- | UnityCore/GLibSignal-inl.h | 12 | ||||
| -rw-r--r-- | UnityCore/GLibSignal.cpp | 13 | ||||
| -rw-r--r-- | UnityCore/GLibSignal.h | 15 | ||||
| -rw-r--r-- | tests/test_glib_signals.cpp | 117 |
4 files changed, 84 insertions, 73 deletions
diff --git a/UnityCore/GLibSignal-inl.h b/UnityCore/GLibSignal-inl.h index e1cab8dd4..e7d786ea6 100644 --- a/UnityCore/GLibSignal-inl.h +++ b/UnityCore/GLibSignal-inl.h @@ -34,11 +34,11 @@ Signal<R, G, Ts...>::Signal(G object, std::string const& signal_name, } template <typename R, typename G, typename... Ts> -void Signal<R, G, Ts...>::Connect(G object, std::string const& signal_name, +bool Signal<R, G, Ts...>::Connect(G object, std::string const& signal_name, SignalCallback const& callback) { if (!callback || !G_IS_OBJECT(object) || signal_name.empty()) - return; + return false; Disconnect(); @@ -47,6 +47,8 @@ void Signal<R, G, Ts...>::Connect(G object, std::string const& signal_name, callback_ = callback; connection_id_ = g_signal_connect(object_, signal_name.c_str(), G_CALLBACK(Callback), this); g_object_add_weak_pointer(object_, reinterpret_cast<gpointer*>(&object_)); + + return true; } template <typename R, typename G, typename... Ts> @@ -59,6 +61,12 @@ R Signal<R, G, Ts...>::Callback(G object, Ts... vs, Signal* self) return R(); } +template <typename R, typename G, typename... Ts> +SignalBase::Ptr SignalManager::Add(G object, std::string const& signal_name, typename Signal<R, G, Ts...>::SignalCallback const& callback) +{ + return Add(std::make_shared<Signal<R, G, Ts...>>(object, signal_name, callback)); +} + } } diff --git a/UnityCore/GLibSignal.cpp b/UnityCore/GLibSignal.cpp index 6173a09b4..f0949e84a 100644 --- a/UnityCore/GLibSignal.cpp +++ b/UnityCore/GLibSignal.cpp @@ -35,16 +35,20 @@ SignalBase::~SignalBase() Disconnect(); } -void SignalBase::Disconnect() +bool SignalBase::Disconnect() { + bool disconnected = false; + if (connection_id_ && G_IS_OBJECT(object_)) { g_signal_handler_disconnect(object_, connection_id_); g_object_remove_weak_pointer(object_, reinterpret_cast<gpointer*>(&object_)); + disconnected = true; } object_ = nullptr; connection_id_ = 0; + return disconnected; } GObject* SignalBase::object() const @@ -75,15 +79,16 @@ SignalManager::~SignalManager() // was too messy to try and write a copy constructor/operator that would steal // from "other" and make the new one the owner. Not only did it create // opportunity for random bugs, it also made the API bad. -void SignalManager::Add(SignalBase* signal) +SignalBase::Ptr SignalManager::Add(SignalBase* signal) { - Add(SignalBase::Ptr(signal)); + return Add(SignalBase::Ptr(signal)); } -void SignalManager::Add(SignalBase::Ptr const& signal) +SignalBase::Ptr SignalManager::Add(SignalBase::Ptr const& signal) { connections_.push_back(signal); g_object_weak_ref(signal->object(), (GWeakNotify)&OnObjectDestroyed, this); + return signal; } void SignalManager::OnObjectDestroyed(SignalManager* self, GObject* old_obj) diff --git a/UnityCore/GLibSignal.h b/UnityCore/GLibSignal.h index 392ff3382..46914bd00 100644 --- a/UnityCore/GLibSignal.h +++ b/UnityCore/GLibSignal.h @@ -39,7 +39,7 @@ public: virtual ~SignalBase(); - void Disconnect(); + bool Disconnect(); GObject* object() const; std::string const& name() const; @@ -71,9 +71,9 @@ public: #endif inline Signal() {}; - inline Signal(G object, std::string const& signal_name, SignalCallback const& callback); + inline Signal(G object, std::string const& signal_name, SignalCallback const&); - inline void Connect(G Object, std::string const& signal_name, SignalCallback const& callback); + inline bool Connect(G Object, std::string const& signal_name, SignalCallback const&); private: static R Callback(G Object, Ts... vs, Signal* self); @@ -86,13 +86,10 @@ class SignalManager : boost::noncopyable public: SignalManager(); ~SignalManager(); - void Add(SignalBase* signal); - void Add(SignalBase::Ptr const& signal); + SignalBase::Ptr Add(SignalBase* signal); + SignalBase::Ptr Add(SignalBase::Ptr const& signal); template <typename R, typename G, typename... Ts> - void Add(G object, std::string const& signal_name, typename Signal<R, G, Ts...>::SignalCallback const& callback) - { - Add(std::make_shared<Signal<R, G, Ts...>>(object, signal_name, callback)); - } + SignalBase::Ptr Add(G object, std::string const& signal_name, typename Signal<R, G, Ts...>::SignalCallback const&); void Disconnect(void* object, std::string const& signal_name = ""); diff --git a/tests/test_glib_signals.cpp b/tests/test_glib_signals.cpp index 1c0b20bf7..82855d99f 100644 --- a/tests/test_glib_signals.cpp +++ b/tests/test_glib_signals.cpp @@ -136,8 +136,8 @@ TEST_F(TestGLibSignals, TestConstructions) TEST_F(TestGLibSignals, TestSignal0) { Signal<void, TestSignals*> signal; - signal.Connect(test_signals_, "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); g_signal_emit_by_name(test_signals_, "signal0"); @@ -148,8 +148,8 @@ TEST_F(TestGLibSignals, TestSignal0) TEST_F(TestGLibSignals, TestSignal1) { Signal<void, TestSignals*, const char*> signal; - signal.Connect(test_signals_, "signal1", - sigc::mem_fun(this, &TestGLibSignals::Signal1Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal1", + sigc::mem_fun(this, &TestGLibSignals::Signal1Callback))); g_signal_emit_by_name(test_signals_, "signal1", "test"); @@ -161,8 +161,8 @@ TEST_F(TestGLibSignals, TestSignal1) TEST_F(TestGLibSignals, TestSignal2) { Signal<void, TestSignals*, const char*, int> signal; - signal.Connect(test_signals_, "signal2", - sigc::mem_fun(this, &TestGLibSignals::Signal2Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal2", + sigc::mem_fun(this, &TestGLibSignals::Signal2Callback))); g_signal_emit_by_name(test_signals_, "signal2", "test", 100); @@ -175,8 +175,8 @@ TEST_F(TestGLibSignals, TestSignal2) TEST_F(TestGLibSignals, TestSignal3) { Signal<void, TestSignals*, const char*, int, float> signal; - signal.Connect(test_signals_, "signal3", - sigc::mem_fun(this, &TestGLibSignals::Signal3Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal3", + sigc::mem_fun(this, &TestGLibSignals::Signal3Callback))); g_signal_emit_by_name(test_signals_, "signal3", "test", 100, 200.0f); @@ -191,8 +191,8 @@ TEST_F(TestGLibSignals, TestSignal3) TEST_F(TestGLibSignals, TestSignal4) { Signal<void, TestSignals*, const char*, int, float, double> signal; - signal.Connect(test_signals_, "signal4", - sigc::mem_fun(this, &TestGLibSignals::Signal4Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal4", + sigc::mem_fun(this, &TestGLibSignals::Signal4Callback))); g_signal_emit_by_name(test_signals_, "signal4", "test", 100, 200.0f, 300.00); @@ -207,8 +207,8 @@ TEST_F(TestGLibSignals, TestSignal4) TEST_F(TestGLibSignals, TestSignal5) { Signal<void, TestSignals*, const char*, int, float, double, gboolean> signal; - signal.Connect(test_signals_, "signal5", - sigc::mem_fun(this, &TestGLibSignals::Signal5Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal5", + sigc::mem_fun(this, &TestGLibSignals::Signal5Callback))); g_signal_emit_by_name(test_signals_, "signal5", "test", 100, 200.0f, 300.00, TRUE); @@ -226,8 +226,8 @@ TEST_F(TestGLibSignals, TestSignal5) TEST_F(TestGLibSignals, TestSignal6) { Signal<gboolean, TestSignals*, const char*, int, float, double, gboolean, char> signal; - signal.Connect(test_signals_, "signal6", - sigc::mem_fun(this, &TestGLibSignals::Signal6Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal6", + sigc::mem_fun(this, &TestGLibSignals::Signal6Callback))); gboolean ret = FALSE; g_signal_emit_by_name(test_signals_, "signal6", "test", 100, 200.0f, 300.00, @@ -246,9 +246,9 @@ TEST_F(TestGLibSignals, TestSignal6) TEST_F(TestGLibSignals, TestDisconnection) { Signal<void, TestSignals*> signal; - signal.Connect(test_signals_, "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); - signal.Disconnect(); + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); + EXPECT_TRUE(signal.Disconnect()); g_signal_emit_by_name(test_signals_, "signal0"); @@ -259,8 +259,8 @@ TEST_F(TestGLibSignals, TestAutoDisconnection) { { Signal<void, TestSignals*> signal; - signal.Connect(test_signals_, "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); } g_signal_emit_by_name(test_signals_, "signal0"); @@ -271,8 +271,8 @@ TEST_F(TestGLibSignals, TestAutoDisconnection) TEST_F(TestGLibSignals, TestCleanDestruction) { Signal<void, TestSignals*> signal; - signal.Connect(test_signals_, "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); g_clear_object(&test_signals_); EXPECT_EQ(signal.object(), nullptr); } @@ -280,11 +280,11 @@ TEST_F(TestGLibSignals, TestCleanDestruction) TEST_F(TestGLibSignals, TestConnectReplacePreviousConnection) { Signal<void, TestSignals*> signal; - signal.Connect(test_signals_, "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); unsigned signal0_num_cb = 0; - signal.Connect(test_signals_, "signal0", [&] (TestSignals*) {++signal0_num_cb;}); + ASSERT_TRUE(signal.Connect(test_signals_, "signal0", [&] (TestSignals*) {++signal0_num_cb;})); g_signal_emit_by_name(test_signals_, "signal0"); @@ -302,27 +302,27 @@ TEST_F(TestGLibSignals, TestManagerAddition) { MockSignalManager manager; - manager.Add(new Signal<void, TestSignals*>(test_signals_, - "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback))); - manager.Add(new Signal<void, TestSignals*, const char*>(test_signals_, - "signal1", - sigc::mem_fun(this, &TestGLibSignals::Signal1Callback))); - manager.Add(new Signal<void, TestSignals*, const char*, int>(test_signals_, - "signal2", - sigc::mem_fun(this, &TestGLibSignals::Signal2Callback))); - manager.Add(new Signal<void, TestSignals*, const char*, int, float>(test_signals_, - "signal3", - sigc::mem_fun(this, &TestGLibSignals::Signal3Callback))); - manager.Add(new Signal<void, TestSignals*, const char*, int, float, double>(test_signals_, - "signal4", - sigc::mem_fun(this, &TestGLibSignals::Signal4Callback))); - manager.Add(new Signal<void, TestSignals*, const char*, int, float, double, gboolean>(test_signals_, - "signal5", - sigc::mem_fun(this, &TestGLibSignals::Signal5Callback))); - manager.Add(new Signal<gboolean, TestSignals*, const char*, int, float, double, gboolean, char>(test_signals_, - "signal6", - sigc::mem_fun(this, &TestGLibSignals::Signal6Callback))); + EXPECT_NE(nullptr, manager.Add(new Signal<void, TestSignals*>(test_signals_, + "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)))); + EXPECT_NE(nullptr, manager.Add(new Signal<void, TestSignals*, const char*>(test_signals_, + "signal1", + sigc::mem_fun(this, &TestGLibSignals::Signal1Callback)))); + EXPECT_NE(nullptr, manager.Add(new Signal<void, TestSignals*, const char*, int>(test_signals_, + "signal2", + sigc::mem_fun(this, &TestGLibSignals::Signal2Callback)))); + EXPECT_NE(nullptr, manager.Add(new Signal<void, TestSignals*, const char*, int, float>(test_signals_, + "signal3", + sigc::mem_fun(this, &TestGLibSignals::Signal3Callback)))); + EXPECT_NE(nullptr, manager.Add(new Signal<void, TestSignals*, const char*, int, float, double>(test_signals_, + "signal4", + sigc::mem_fun(this, &TestGLibSignals::Signal4Callback)))); + EXPECT_NE(nullptr, manager.Add(new Signal<void, TestSignals*, const char*, int, float, double, gboolean>(test_signals_, + "signal5", + sigc::mem_fun(this, &TestGLibSignals::Signal5Callback)))); + EXPECT_NE(nullptr, manager.Add(new Signal<gboolean, TestSignals*, const char*, int, float, double, gboolean, char>(test_signals_, + "signal6", + sigc::mem_fun(this, &TestGLibSignals::Signal6Callback)))); EXPECT_EQ(manager.GetConnections().size(), 7u); } @@ -331,19 +331,20 @@ TEST_F(TestGLibSignals, TestManagerAdditionTemplate) { MockSignalManager manager; - manager.Add<void, TestSignals*>(test_signals_, "signal0", - sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)); - manager.Add<void, TestSignals*, const char*>(test_signals_, "signal1", - sigc::mem_fun(this, &TestGLibSignals::Signal1Callback)); - manager.Add<void, TestSignals*, const char*, int>(test_signals_, "signal2", - sigc::mem_fun(this, &TestGLibSignals::Signal2Callback)); - manager.Add<void, TestSignals*, const char*, int, float>(test_signals_, "signal3", - sigc::mem_fun(this, &TestGLibSignals::Signal3Callback)); - manager.Add<void, TestSignals*, const char*, int, float, double>(test_signals_, "signal4", - sigc::mem_fun(this, &TestGLibSignals::Signal4Callback)); - manager.Add<void, TestSignals*, const char*, int, float, double, gboolean>(test_signals_, "signal5", - sigc::mem_fun(this, &TestGLibSignals::Signal5Callback)); - manager.Add<gboolean, TestSignals*, const char*, int, float, double, gboolean, char>(test_signals_, "signal6", sigc::mem_fun(this, &TestGLibSignals::Signal6Callback)); + EXPECT_NE(nullptr, (manager.Add<void, TestSignals*>(test_signals_, "signal0", + sigc::mem_fun(this, &TestGLibSignals::Signal0Callback)))); + EXPECT_NE(nullptr, (manager.Add<void, TestSignals*, const char*>(test_signals_, "signal1", + sigc::mem_fun(this, &TestGLibSignals::Signal1Callback)))); + EXPECT_NE(nullptr, (manager.Add<void, TestSignals*, const char*, int>(test_signals_, "signal2", + sigc::mem_fun(this, &TestGLibSignals::Signal2Callback)))); + EXPECT_NE(nullptr, (manager.Add<void, TestSignals*, const char*, int, float>(test_signals_, "signal3", + sigc::mem_fun(this, &TestGLibSignals::Signal3Callback)))); + EXPECT_NE(nullptr, (manager.Add<void, TestSignals*, const char*, int, float, double>(test_signals_, "signal4", + sigc::mem_fun(this, &TestGLibSignals::Signal4Callback)))); + EXPECT_NE(nullptr, (manager.Add<void, TestSignals*, const char*, int, float, double, gboolean>(test_signals_, "signal5", + sigc::mem_fun(this, &TestGLibSignals::Signal5Callback)))); + EXPECT_NE(nullptr, (manager.Add<gboolean, TestSignals*, const char*, int, float, double, gboolean, char>(test_signals_, "signal6", + sigc::mem_fun(this, &TestGLibSignals::Signal6Callback)))); EXPECT_EQ(manager.GetConnections().size(), 7u); } |
