18 #ifndef COM_UBUNTU_SIGNAL_H_
19 #define COM_UBUNTU_SIGNAL_H_
35 template<
typename ...Arguments>
42 typedef std::function<void(Arguments...)>
Slot;
49 dispatcher(std::bind(slot, args...));
61 inline Signal() noexcept(true) : d(new Private())
67 std::lock_guard<std::mutex> lg(d->guard);
68 for (
auto slot : d->slots)
69 slot.connection.reset();
89 static const Connection::Disconnector empty_disconnector{};
90 static const Connection::DispatcherInstaller empty_dispatcher_installer{};
95 = [](
const std::function<void()>& handler) { handler(); };
97 Connection conn{empty_disconnector, empty_dispatcher_installer};
99 std::lock_guard<std::mutex> lg(d->guard);
101 auto result = d->slots.insert(
103 SlotWrapper{slot, default_dispatcher, conn});
109 conn.d->disconnector = std::bind(
110 &Private::disconnect_slot_for_iterator,
113 conn.d->dispatcher_installer = std::bind(
114 &Private::install_dispatcher_for_iterator,
116 std::placeholders::_1,
134 std::lock_guard<std::mutex> lg(d->guard);
135 for(
auto slot : d->slots)
144 typedef std::list<SlotWrapper> SlotContainer;
146 inline void disconnect_slot_for_iterator(
typename SlotContainer::iterator it)
148 std::lock_guard<std::mutex> lg(guard);
153 typename SlotContainer::iterator it)
155 std::lock_guard<std::mutex> lg(guard);
156 it->dispatcher = dispatcher;
162 std::shared_ptr<Private> d;
176 typedef std::function<void()>
Slot;
195 inline Signal() noexcept(true) : d(new Private())
201 std::lock_guard<std::mutex> lg(d->guard);
202 for (
auto slot : d->slots)
203 slot.connection.reset();
223 static const Connection::Disconnector empty_disconnector{};
224 static const Connection::DispatcherInstaller empty_dispatcher_installer{};
229 = [](
const std::function<void()>& handler) { handler(); };
231 Connection conn{empty_disconnector, empty_dispatcher_installer};
233 std::lock_guard<std::mutex> lg(d->guard);
235 auto result = d->slots.insert(
237 SlotWrapper{slot, default_dispatcher, conn});
243 conn.d->disconnector = std::bind(
244 &Private::disconnect_slot_for_iterator,
247 conn.d->dispatcher_installer = std::bind(
248 &Private::install_dispatcher_for_iterator,
250 std::placeholders::_1,
265 std::lock_guard<std::mutex> lg(d->guard);
266 for(
auto slot : d->slots)
275 typedef std::list<SlotWrapper> SlotContainer;
277 inline void disconnect_slot_for_iterator(
typename SlotContainer::iterator it)
279 std::lock_guard<std::mutex> lg(guard);
284 typename SlotContainer::iterator it)
286 std::lock_guard<std::mutex> lg(guard);
287 it->dispatcher = dispatcher;
293 std::shared_ptr<Private> d;
297 #endif // COM_UBUNTU_SIGNAL_H_
void operator()()
operator () emits the signal.
The Connection class models a signal-slot connection.
Connection connect(const Slot &slot) const
Connects the provided slot to this signal instance.
Connection connect(const Slot &slot) const
Connects the provided slot to this signal instance.
Signal() noexcept(true)
Signal constructs a new instance. Never throws.
std::function< void(Arguments...)> Slot
Slot is the function type that observers have to provide to connect to this signal.
std::function< void(const std::function< void()> &)> Dispatcher
std::function< void()> Slot
Slot is the function type that observers have to provide to connect to this signal.
A signal class that observers can subscribe to.
Signal & operator=(const Signal &)=delete
Signal() noexcept(true)
Signal constructs a new instance. Never throws.
bool operator==(const Signal &) const =delete
void operator()(Arguments...args)
operator () emits the signal with the provided parameters.