mirror of
https://github.com/esphome/esphome.git
synced 2026-09-17 10:08:40 +00:00
Replace std::function with a lightweight type-erased Callback struct (8 bytes on 32-bit vs 16 for std::function) in CallbackManager and LazyCallbackManager. Using C++20 if constexpr, small trivially-copyable callables like [this] lambdas (81% of all callback registrations) are stored inline in the function pointer context without heap allocation. This eliminates std::function null checks (and __throw_bad_function_call) from all entity callback paths, and templatizes add_on_*_callback methods across all entity types so lambdas flow through without being wrapped in std::function first. Also converts EntityStateBase from hand-rolled nullable CallbackManager pointers to LazyCallbackManager for consistency. Measured flash savings: - ESP8266 simple: -160 B - ESP8266 ratgdo: -592 B - ESP32 IDF (large): -456 B - ESP32 IDF (minimal): -212 B
25 lines
605 B
C++
25 lines
605 B
C++
#include "button.h"
|
|
#include "esphome/core/log.h"
|
|
|
|
namespace esphome::button {
|
|
|
|
static const char *const TAG = "button";
|
|
|
|
// Function implementation of LOG_BUTTON macro to reduce code size
|
|
void log_button(const char *tag, const char *prefix, const char *type, Button *obj) {
|
|
if (obj == nullptr) {
|
|
return;
|
|
}
|
|
|
|
ESP_LOGCONFIG(tag, "%s%s '%s'", prefix, type, obj->get_name().c_str());
|
|
LOG_ENTITY_ICON(tag, prefix, *obj);
|
|
}
|
|
|
|
void Button::press() {
|
|
ESP_LOGD(TAG, "'%s' Pressed.", this->get_name().c_str());
|
|
this->press_action();
|
|
this->press_callback_.call();
|
|
}
|
|
|
|
} // namespace esphome::button
|