[core] Convert remaining callback registration methods to templates

Convert rotary_encoder register_listener, canbus add_callback,
sdl add_key_listener, and udp add_listener from std::function to
templates to avoid the heap-allocation fallback path.

MQTT backend set_on_* methods are virtual and cannot be templatized.
This commit is contained in:
J. Nick Koston
2026-03-15 23:04:47 -10:00
parent 073dd3995e
commit 610258b683
4 changed files with 5 additions and 10 deletions
+1 -4
View File
@@ -91,10 +91,7 @@ class Canbus : public Component {
* - rtr If this is a remote transmission request
* - data The message data
*/
void add_callback(
std::function<void(uint32_t can_id, bool extended_id, bool rtr, const std::vector<uint8_t> &data)> callback) {
this->callback_manager_.add(std::move(callback));
}
template<typename F> void add_callback(F &&callback) { this->callback_manager_.add(std::forward<F>(callback)); }
protected:
template<typename... Ts> friend class CanbusSendAction;
@@ -90,7 +90,7 @@ class RotaryEncoderSensor : public sensor::Sensor, public Component {
this->on_anticlockwise_callback_.add(std::forward<F>(callback));
}
void register_listener(std::function<void(uint32_t)> listener) { this->listeners_.add(std::move(listener)); }
template<typename F> void register_listener(F &&listener) { this->listeners_.add(std::forward<F>(listener)); }
protected:
InternalGPIOPin *pin_a_;
+2 -2
View File
@@ -37,11 +37,11 @@ class Sdl : public display::Display {
int get_height() override { return this->height_; }
float get_setup_priority() const override { return setup_priority::HARDWARE; }
void dump_config() override { LOG_DISPLAY("", "SDL", this); }
void add_key_listener(int32_t keycode, std::function<void(bool)> &&callback) {
template<typename F> void add_key_listener(int32_t keycode, F &&callback) {
if (!this->key_callbacks_.count(keycode)) {
this->key_callbacks_[keycode] = CallbackManager<void(bool)>();
}
this->key_callbacks_[keycode].add(std::move(callback));
this->key_callbacks_[keycode].add(std::forward<F>(callback));
}
int mouse_x{};
+1 -3
View File
@@ -28,9 +28,7 @@ class UDPComponent : public Component {
void set_broadcast_port(uint16_t port) { this->broadcast_port_ = port; }
void set_should_broadcast() { this->should_broadcast_ = true; }
void set_should_listen() { this->should_listen_ = true; }
void add_listener(std::function<void(std::span<const uint8_t>)> &&listener) {
this->packet_listeners_.add(std::move(listener));
}
template<typename F> void add_listener(F &&listener) { this->packet_listeners_.add(std::forward<F>(listener)); }
void setup() override;
void loop() override;
void dump_config() override;