[libsigcplusplus] slot: use pointer for functor_ member
- From: Marcin Kolny <mkolny src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libsigcplusplus] slot: use pointer for functor_ member
- Date: Fri, 22 Apr 2016 19:08:41 +0000 (UTC)
commit 3527ebb4d52a58a491571d9c0bdfccd0a0c0ef2c
Author: Marcin Kolny <marcin kolny gmail com>
Date: Fri Apr 22 18:53:46 2016 +0200
slot: use pointer for functor_ member
Using pointer instead of value allows us to avoid calling
destructor of functor_ directly in destroy()
sigc++/functors/slot.h | 20 +++++++++++---------
1 files changed, 11 insertions(+), 9 deletions(-)
---
diff --git a/sigc++/functors/slot.h b/sigc++/functors/slot.h
index 98934fe..a40f9bc 100644
--- a/sigc++/functors/slot.h
+++ b/sigc++/functors/slot.h
@@ -24,6 +24,8 @@
#include <sigc++/adaptors/adaptor_trait.h>
#include <sigc++/functors/slot_base.h>
+#include <memory>
+
namespace sigc
{
@@ -49,22 +51,22 @@ private:
public:
/** The functor contained by this slot_rep object. */
- adaptor_type functor_;
+ std::unique_ptr<adaptor_type> functor_;
/** Constructs an invalid typed slot_rep object.
* The notification callback is registered using visit_each().
* @param functor The functor contained by the new slot_rep object.
*/
inline explicit typed_slot_rep(const T_functor& functor)
- : slot_rep(nullptr, &destroy, &dup), functor_(functor)
+ : slot_rep(nullptr, &destroy, &dup), functor_(std::make_unique<adaptor_type>(functor))
{
- sigc::visit_each_trackable(slot_do_bind(this), functor_);
+ sigc::visit_each_trackable(slot_do_bind(this), *functor_);
}
inline typed_slot_rep(const typed_slot_rep& cl)
- : slot_rep(cl.call_, &destroy, &dup), functor_(cl.functor_)
+ : slot_rep(cl.call_, &destroy, &dup), functor_(std::make_unique<adaptor_type>(*cl.functor_))
{
- sigc::visit_each_trackable(slot_do_bind(this), functor_);
+ sigc::visit_each_trackable(slot_do_bind(this), *functor_);
}
typed_slot_rep& operator=(const typed_slot_rep& src) = delete;
@@ -76,7 +78,7 @@ public:
{
call_ = nullptr;
destroy_ = nullptr;
- sigc::visit_each_trackable(slot_do_unbind(this), functor_);
+ sigc::visit_each_trackable(slot_do_unbind(this), *functor_);
}
private:
@@ -88,8 +90,8 @@ private:
auto self_ = static_cast<self*>(data);
self_->call_ = nullptr;
self_->destroy_ = nullptr;
- sigc::visit_each_trackable(slot_do_unbind(self_), self_->functor_);
- self_->functor_.~adaptor_type();
+ sigc::visit_each_trackable(slot_do_unbind(self_), *self_->functor_);
+ self_->functor_.reset(nullptr);
/* don't call disconnect() here: destroy() is either called
* a) from the parent itself (in which case disconnect() leads to a segfault) or
* b) from a parentless slot (in which case disconnect() does nothing)
@@ -126,7 +128,7 @@ struct slot_call
static T_return call_it(slot_rep* rep, type_trait_take_t<T_arg>... a_)
{
auto typed_rep = static_cast<typed_slot_rep<T_functor>*>(rep);
- return (typed_rep->functor_).template operator()<type_trait_take_t<T_arg>...>(a_...);
+ return (*typed_rep->functor_).template operator()<type_trait_take_t<T_arg>...>(a_...);
}
/** Forms a function pointer from call_it().
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]