summaryrefslogtreecommitdiff
diff options
authorMarco Trevisan (Treviño) <mail@3v1n0.net>2017-07-12 17:32:23 +0200
committerMarco Trevisan (Treviño) <mail@3v1n0.net>2017-07-12 17:32:23 +0200
commitd88c22ef39bba3670c12b0396da00d79a8e959e2 (patch)
treee700b04b57eb38d380bc0cb2f280cb8e83e09ead
parente9c15e146396e2c9b6ba923fc4710685a759dfff (diff)
GLibSignal: change the methods signatures to return values
(bzr r4245.2.1)
-rw-r--r--UnityCore/GLibSignal-inl.h12
-rw-r--r--UnityCore/GLibSignal.cpp13
-rw-r--r--UnityCore/GLibSignal.h15
-rw-r--r--tests/test_glib_signals.cpp117
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);
}