17#ifndef CYBER_BASE_SIGNAL_H_
18#define CYBER_BASE_SIGNAL_H_
30template <
typename... Args>
33template <
typename... Args>
36template <
typename... Args>
50 std::lock_guard<std::mutex> lock(mutex_);
51 for (
auto& slot : slots_) {
52 local.emplace_back(slot);
57 for (
auto& slot : local) {
62 ClearDisconnectedSlots();
66 auto slot = std::make_shared<
Slot<Args...>>(cb);
68 std::lock_guard<std::mutex> lock(mutex_);
69 slots_.emplace_back(slot);
78 std::lock_guard<std::mutex> lock(mutex_);
79 for (
auto& slot : slots_) {
80 if (conn.HasSlot(slot)) {
88 ClearDisconnectedSlots();
94 std::lock_guard<std::mutex> lock(mutex_);
95 for (
auto& slot : slots_) {
105 void ClearDisconnectedSlots() {
106 std::lock_guard<std::mutex> lock(mutex_);
108 std::remove_if(slots_.begin(), slots_.end(),
109 [](
const SlotPtr& slot) { return !slot->connected(); }),
117template <
typename... Args>
125 : slot_(slot), signal_(signal) {}
132 if (
this != &another) {
133 this->slot_ = another.slot_;
134 this->signal_ = another.signal_;
140 if (slot !=
nullptr && slot_ !=
nullptr) {
141 return slot_.get() == slot.get();
148 return slot_->connected();
154 if (signal_ && slot_) {
165template <
typename... Args>
170 : cb_(another.cb_), connected_(another.connected_) {}
176 if (connected_ && cb_) {
186 bool connected_ =
true;
Signal< Args... > * SignalPtr
bool HasSlot(const SlotPtr &slot) const
Connection & operator=(const Connection &another)
Connection(const SlotPtr &slot, const SignalPtr &signal)
std::shared_ptr< Slot< Args... > > SlotPtr
Connection< Args... > ConnectionType
std::function< void(Args...)> Callback
std::list< SlotPtr > SlotList
void DisconnectAllSlots()
bool Disconnect(const ConnectionType &conn)
std::shared_ptr< Slot< Args... > > SlotPtr
void operator()(Args... args)
ConnectionType Connect(const Callback &cb)
Slot(const Callback &cb, bool connected=true)
std::function< void(Args...)> Callback
Slot(const Slot &another)
void operator()(Args... args)