mirror of
https://github.com/esphome/esphome.git
synced 2025-09-28 16:12:24 +01:00
Merge branch 'integration' into memory_api
This commit is contained in:
@@ -16,17 +16,17 @@ static constexpr EventEmitterListenerID INVALID_LISTENER_ID = 0;
|
|||||||
template<typename EvtType, typename... Args> class EventEmitter {
|
template<typename EvtType, typename... Args> class EventEmitter {
|
||||||
public:
|
public:
|
||||||
EventEmitterListenerID on(EvtType event, std::function<void(Args...)> listener) {
|
EventEmitterListenerID on(EvtType event, std::function<void(Args...)> listener) {
|
||||||
EventEmitterListenerID listener_id = get_next_id_();
|
EventEmitterListenerID listener_id = this->get_next_id_();
|
||||||
|
|
||||||
// Find or create event entry
|
// Find or create event entry
|
||||||
EventEntry *entry = find_or_create_event_(event);
|
EventEntry *entry = this->find_or_create_event_(event);
|
||||||
entry->listeners.push_back({listener_id, listener});
|
entry->listeners.push_back({listener_id, listener});
|
||||||
|
|
||||||
return listener_id;
|
return listener_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
void off(EvtType event, EventEmitterListenerID id) {
|
void off(EvtType event, EventEmitterListenerID id) {
|
||||||
EventEntry *entry = find_event_(event);
|
EventEntry *entry = this->find_event_(event);
|
||||||
if (entry == nullptr)
|
if (entry == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -39,7 +39,7 @@ template<typename EvtType, typename... Args> class EventEmitter {
|
|||||||
|
|
||||||
// Remove event entry if no more listeners
|
// Remove event entry if no more listeners
|
||||||
if (entry->listeners.empty()) {
|
if (entry->listeners.empty()) {
|
||||||
remove_event_(event);
|
this->remove_event_(event);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -48,7 +48,7 @@ template<typename EvtType, typename... Args> class EventEmitter {
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
void emit_(EvtType event, Args... args) {
|
void emit_(EvtType event, Args... args) {
|
||||||
EventEntry *entry = find_event_(event);
|
EventEntry *entry = this->find_event_(event);
|
||||||
if (entry == nullptr)
|
if (entry == nullptr)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
@@ -70,7 +70,7 @@ template<typename EvtType, typename... Args> class EventEmitter {
|
|||||||
};
|
};
|
||||||
|
|
||||||
EventEntry *find_event_(EvtType event) {
|
EventEntry *find_event_(EvtType event) {
|
||||||
for (auto &entry : events_) {
|
for (auto &entry : this->events_) {
|
||||||
if (entry.event == event) {
|
if (entry.event == event) {
|
||||||
return &entry;
|
return &entry;
|
||||||
}
|
}
|
||||||
@@ -79,21 +79,21 @@ template<typename EvtType, typename... Args> class EventEmitter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
EventEntry *find_or_create_event_(EvtType event) {
|
EventEntry *find_or_create_event_(EvtType event) {
|
||||||
EventEntry *entry = find_event_(event);
|
EventEntry *entry = this->find_event_(event);
|
||||||
if (entry != nullptr)
|
if (entry != nullptr)
|
||||||
return entry;
|
return entry;
|
||||||
|
|
||||||
// Create new event entry
|
// Create new event entry
|
||||||
events_.push_back({event, {}});
|
this->events_.push_back({event, {}});
|
||||||
return &events_.back();
|
return &this->events_.back();
|
||||||
}
|
}
|
||||||
|
|
||||||
void remove_event_(EvtType event) {
|
void remove_event_(EvtType event) {
|
||||||
for (auto it = events_.begin(); it != events_.end(); ++it) {
|
for (auto it = this->events_.begin(); it != this->events_.end(); ++it) {
|
||||||
if (it->event == event) {
|
if (it->event == event) {
|
||||||
// Swap with last and pop
|
// Swap with last and pop
|
||||||
*it = events_.back();
|
*it = this->events_.back();
|
||||||
events_.pop_back();
|
this->events_.pop_back();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -101,12 +101,12 @@ template<typename EvtType, typename... Args> class EventEmitter {
|
|||||||
|
|
||||||
EventEmitterListenerID get_next_id_() {
|
EventEmitterListenerID get_next_id_() {
|
||||||
// Simple incrementing ID, wrapping around at max
|
// Simple incrementing ID, wrapping around at max
|
||||||
EventEmitterListenerID next_id = (current_id_ + 1);
|
EventEmitterListenerID next_id = (this->current_id_ + 1);
|
||||||
if (next_id == 0) { // Skip 0 as it's often used as "invalid"
|
if (next_id == 0) { // Skip 0 as it's often used as "invalid"
|
||||||
next_id = 1;
|
next_id = 1;
|
||||||
}
|
}
|
||||||
current_id_ = next_id;
|
this->current_id_ = next_id;
|
||||||
return current_id_;
|
return this->current_id_;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<EventEntry> events_;
|
std::vector<EventEntry> events_;
|
||||||
|
Reference in New Issue
Block a user