diff --git a/esphome/components/dfplayer/dfplayer.h b/esphome/components/dfplayer/dfplayer.h index 03d2230ca6..2c4ee03470 100644 --- a/esphome/components/dfplayer/dfplayer.h +++ b/esphome/components/dfplayer/dfplayer.h @@ -51,8 +51,8 @@ class DFPlayer : public uart::UARTDevice, public Component { bool is_playing() { return is_playing_; } void dump_config() override; - void add_on_finished_playback_callback(std::function callback) { - this->on_finished_playback_callback_.add(std::move(callback)); + template void add_on_finished_playback_callback(F &&callback) { + this->on_finished_playback_callback_.add(std::forward(callback)); } protected: diff --git a/esphome/components/display_menu_base/menu_item.h b/esphome/components/display_menu_base/menu_item.h index 36de146031..57d7350b9e 100644 --- a/esphome/components/display_menu_base/menu_item.h +++ b/esphome/components/display_menu_base/menu_item.h @@ -44,9 +44,9 @@ class MenuItem { MenuItemMenu *get_parent() { return this->parent_; } MenuItemType get_type() const { return this->item_type_; } template void set_text(V val) { this->text_ = val; } - void add_on_enter_callback(std::function &&cb) { this->on_enter_callbacks_.add(std::move(cb)); } - void add_on_leave_callback(std::function &&cb) { this->on_leave_callbacks_.add(std::move(cb)); } - void add_on_value_callback(std::function &&cb) { this->on_value_callbacks_.add(std::move(cb)); } + template void add_on_enter_callback(F &&cb) { this->on_enter_callbacks_.add(std::forward(cb)); } + template void add_on_leave_callback(F &&cb) { this->on_leave_callbacks_.add(std::forward(cb)); } + template void add_on_value_callback(F &&cb) { this->on_value_callbacks_.add(std::forward(cb)); } std::string get_text() const { return const_cast(this)->text_.value(this); } virtual bool get_immediate_edit() const { return false; } @@ -170,8 +170,8 @@ class MenuItemCommand : public MenuItem { class MenuItemCustom : public MenuItemEditable { public: explicit MenuItemCustom() : MenuItemEditable(MENU_ITEM_CUSTOM) {} - void add_on_next_callback(std::function &&cb) { this->on_next_callbacks_.add(std::move(cb)); } - void add_on_prev_callback(std::function &&cb) { this->on_prev_callbacks_.add(std::move(cb)); } + template void add_on_next_callback(F &&cb) { this->on_next_callbacks_.add(std::forward(cb)); } + template void add_on_prev_callback(F &&cb) { this->on_prev_callbacks_.add(std::forward(cb)); } bool has_value() const override { return this->value_getter_.has_value(); } std::string get_value_text() const override; diff --git a/esphome/components/fingerprint_grow/fingerprint_grow.h b/esphome/components/fingerprint_grow/fingerprint_grow.h index db9d5ce564..63839534f6 100644 --- a/esphome/components/fingerprint_grow/fingerprint_grow.h +++ b/esphome/components/fingerprint_grow/fingerprint_grow.h @@ -127,30 +127,30 @@ class FingerprintGrowComponent : public PollingComponent, public uart::UARTDevic void set_enrolling_binary_sensor(binary_sensor::BinarySensor *enrolling_binary_sensor) { this->enrolling_binary_sensor_ = enrolling_binary_sensor; } - void add_on_finger_scan_start_callback(std::function callback) { - this->finger_scan_start_callback_.add(std::move(callback)); + template void add_on_finger_scan_start_callback(F &&callback) { + this->finger_scan_start_callback_.add(std::forward(callback)); } - void add_on_finger_scan_matched_callback(std::function callback) { - this->finger_scan_matched_callback_.add(std::move(callback)); + template void add_on_finger_scan_matched_callback(F &&callback) { + this->finger_scan_matched_callback_.add(std::forward(callback)); } - void add_on_finger_scan_unmatched_callback(std::function callback) { - this->finger_scan_unmatched_callback_.add(std::move(callback)); + template void add_on_finger_scan_unmatched_callback(F &&callback) { + this->finger_scan_unmatched_callback_.add(std::forward(callback)); } - void add_on_finger_scan_misplaced_callback(std::function callback) { - this->finger_scan_misplaced_callback_.add(std::move(callback)); + template void add_on_finger_scan_misplaced_callback(F &&callback) { + this->finger_scan_misplaced_callback_.add(std::forward(callback)); } - void add_on_finger_scan_invalid_callback(std::function callback) { - this->finger_scan_invalid_callback_.add(std::move(callback)); + template void add_on_finger_scan_invalid_callback(F &&callback) { + this->finger_scan_invalid_callback_.add(std::forward(callback)); } - void add_on_enrollment_scan_callback(std::function callback) { - this->enrollment_scan_callback_.add(std::move(callback)); + template void add_on_enrollment_scan_callback(F &&callback) { + this->enrollment_scan_callback_.add(std::forward(callback)); } - void add_on_enrollment_done_callback(std::function callback) { - this->enrollment_done_callback_.add(std::move(callback)); + template void add_on_enrollment_done_callback(F &&callback) { + this->enrollment_done_callback_.add(std::forward(callback)); } - void add_on_enrollment_failed_callback(std::function callback) { - this->enrollment_failed_callback_.add(std::move(callback)); + template void add_on_enrollment_failed_callback(F &&callback) { + this->enrollment_failed_callback_.add(std::forward(callback)); } void enroll_fingerprint(uint16_t finger_id, uint8_t num_buffers); diff --git a/esphome/components/graphical_display_menu/graphical_display_menu.h b/esphome/components/graphical_display_menu/graphical_display_menu.h index 96f2bd79fd..007889557d 100644 --- a/esphome/components/graphical_display_menu/graphical_display_menu.h +++ b/esphome/components/graphical_display_menu/graphical_display_menu.h @@ -44,7 +44,7 @@ class GraphicalDisplayMenu : public display_menu_base::DisplayMenuComponent { void set_foreground_color(Color foreground_color); void set_background_color(Color background_color); - void add_on_redraw_callback(std::function &&cb) { this->on_redraw_callbacks_.add(std::move(cb)); } + template void add_on_redraw_callback(F &&cb) { this->on_redraw_callbacks_.add(std::forward(cb)); } void draw(display::Display *display, const display::Rect *bounds); diff --git a/esphome/components/hlk_fm22x/hlk_fm22x.h b/esphome/components/hlk_fm22x/hlk_fm22x.h index 0ea4636281..adef49a2d8 100644 --- a/esphome/components/hlk_fm22x/hlk_fm22x.h +++ b/esphome/components/hlk_fm22x/hlk_fm22x.h @@ -91,24 +91,24 @@ class HlkFm22xComponent : public PollingComponent, public uart::UARTDevice { void set_version_text_sensor(text_sensor::TextSensor *version_text_sensor) { this->version_text_sensor_ = version_text_sensor; } - void add_on_face_scan_matched_callback(std::function callback) { - this->face_scan_matched_callback_.add(std::move(callback)); + template void add_on_face_scan_matched_callback(F &&callback) { + this->face_scan_matched_callback_.add(std::forward(callback)); } - void add_on_face_scan_unmatched_callback(std::function callback) { - this->face_scan_unmatched_callback_.add(std::move(callback)); + template void add_on_face_scan_unmatched_callback(F &&callback) { + this->face_scan_unmatched_callback_.add(std::forward(callback)); } - void add_on_face_scan_invalid_callback(std::function callback) { - this->face_scan_invalid_callback_.add(std::move(callback)); + template void add_on_face_scan_invalid_callback(F &&callback) { + this->face_scan_invalid_callback_.add(std::forward(callback)); } void add_on_face_info_callback( std::function callback) { this->face_info_callback_.add(std::move(callback)); } - void add_on_enrollment_done_callback(std::function callback) { - this->enrollment_done_callback_.add(std::move(callback)); + template void add_on_enrollment_done_callback(F &&callback) { + this->enrollment_done_callback_.add(std::forward(callback)); } - void add_on_enrollment_failed_callback(std::function callback) { - this->enrollment_failed_callback_.add(std::move(callback)); + template void add_on_enrollment_failed_callback(F &&callback) { + this->enrollment_failed_callback_.add(std::forward(callback)); } void enroll_face(const std::string &name, HlkFm22xFaceDirection direction); diff --git a/esphome/components/key_collector/key_collector.h b/esphome/components/key_collector/key_collector.h index 8e30c333df..014e2034bd 100644 --- a/esphome/components/key_collector/key_collector.h +++ b/esphome/components/key_collector/key_collector.h @@ -21,14 +21,14 @@ class KeyCollector : public Component { void set_back_keys(std::string back_keys) { this->back_keys_ = std::move(back_keys); }; void set_clear_keys(std::string clear_keys) { this->clear_keys_ = std::move(clear_keys); }; void set_allowed_keys(std::string allowed_keys) { this->allowed_keys_ = std::move(allowed_keys); }; - void add_on_progress_callback(std::function &&callback) { - this->progress_callbacks_.add(std::move(callback)); + template void add_on_progress_callback(F &&callback) { + this->progress_callbacks_.add(std::forward(callback)); } - void add_on_result_callback(std::function &&callback) { - this->result_callbacks_.add(std::move(callback)); + template void add_on_result_callback(F &&callback) { + this->result_callbacks_.add(std::forward(callback)); } - void add_on_timeout_callback(std::function &&callback) { - this->timeout_callbacks_.add(std::move(callback)); + template void add_on_timeout_callback(F &&callback) { + this->timeout_callbacks_.add(std::forward(callback)); } void set_timeout(int timeout) { this->timeout_ = timeout; }; void set_enabled(bool enabled); diff --git a/esphome/components/key_provider/key_provider.cpp b/esphome/components/key_provider/key_provider.cpp index 5a0e24b13f..64b0729d4d 100644 --- a/esphome/components/key_provider/key_provider.cpp +++ b/esphome/components/key_provider/key_provider.cpp @@ -3,10 +3,6 @@ namespace esphome { namespace key_provider { -void KeyProvider::add_on_key_callback(std::function &&callback) { - this->key_callback_.add(std::move(callback)); -} - void KeyProvider::send_key_(uint8_t key) { this->key_callback_.call(key); } } // namespace key_provider diff --git a/esphome/components/key_provider/key_provider.h b/esphome/components/key_provider/key_provider.h index 272d3eecad..9740342751 100644 --- a/esphome/components/key_provider/key_provider.h +++ b/esphome/components/key_provider/key_provider.h @@ -9,7 +9,7 @@ namespace key_provider { /// interface for components that provide keypresses class KeyProvider { public: - void add_on_key_callback(std::function &&callback); + template void add_on_key_callback(F &&callback) { this->key_callback_.add(std::forward(callback)); } protected: void send_key_(uint8_t key); diff --git a/esphome/components/ld2450/ld2450.cpp b/esphome/components/ld2450/ld2450.cpp index f9701cbdf6..0a1147c924 100644 --- a/esphome/components/ld2450/ld2450.cpp +++ b/esphome/components/ld2450/ld2450.cpp @@ -407,10 +407,6 @@ void LD2450Component::restart_and_read_all_info() { this->set_timeout(1500, [this]() { this->read_all_info(); }); } -void LD2450Component::add_on_data_callback(std::function &&callback) { - this->data_callback_.add(std::move(callback)); -} - // Send command with values to LD2450 void LD2450Component::send_command_(uint8_t command, const uint8_t *command_value, uint8_t command_value_len) { ESP_LOGV(TAG, "Sending COMMAND %02X", command); diff --git a/esphome/components/ld2450/ld2450.h b/esphome/components/ld2450/ld2450.h index 9409dfc21d..e774dd9c75 100644 --- a/esphome/components/ld2450/ld2450.h +++ b/esphome/components/ld2450/ld2450.h @@ -145,7 +145,7 @@ class LD2450Component : public Component, public uart::UARTDevice { int32_t zone3_y1, int32_t zone3_x2, int32_t zone3_y2); /// Add a callback that will be called after each successfully processed periodic data frame. - void add_on_data_callback(std::function &&callback); + template void add_on_data_callback(F &&callback) { this->data_callback_.add(std::forward(callback)); } protected: void send_command_(uint8_t command_str, const uint8_t *command_value, uint8_t command_value_len); diff --git a/esphome/components/ltr501/ltr501.h b/esphome/components/ltr501/ltr501.h index d9a53c9bd4..2bd838a0fe 100644 --- a/esphome/components/ltr501/ltr501.h +++ b/esphome/components/ltr501/ltr501.h @@ -160,12 +160,12 @@ class LTRAlsPs501Component : public PollingComponent, public i2c::I2CDevice { CallbackManager on_ps_high_trigger_callback_; CallbackManager on_ps_low_trigger_callback_; - void add_on_ps_high_trigger_callback_(std::function callback) { - this->on_ps_high_trigger_callback_.add(std::move(callback)); + template void add_on_ps_high_trigger_callback_(F &&callback) { + this->on_ps_high_trigger_callback_.add(std::forward(callback)); } - void add_on_ps_low_trigger_callback_(std::function callback) { - this->on_ps_low_trigger_callback_.add(std::move(callback)); + template void add_on_ps_low_trigger_callback_(F &&callback) { + this->on_ps_low_trigger_callback_.add(std::forward(callback)); } }; diff --git a/esphome/components/ltr_als_ps/ltr_als_ps.h b/esphome/components/ltr_als_ps/ltr_als_ps.h index 3ab2cea074..2e24a14283 100644 --- a/esphome/components/ltr_als_ps/ltr_als_ps.h +++ b/esphome/components/ltr_als_ps/ltr_als_ps.h @@ -160,12 +160,12 @@ class LTRAlsPsComponent : public PollingComponent, public i2c::I2CDevice { CallbackManager on_ps_high_trigger_callback_; CallbackManager on_ps_low_trigger_callback_; - void add_on_ps_high_trigger_callback_(std::function callback) { - this->on_ps_high_trigger_callback_.add(std::move(callback)); + template void add_on_ps_high_trigger_callback_(F &&callback) { + this->on_ps_high_trigger_callback_.add(std::forward(callback)); } - void add_on_ps_low_trigger_callback_(std::function callback) { - this->on_ps_low_trigger_callback_.add(std::move(callback)); + template void add_on_ps_low_trigger_callback_(F &&callback) { + this->on_ps_low_trigger_callback_.add(std::forward(callback)); } }; diff --git a/esphome/components/lvgl/lvgl_esphome.h b/esphome/components/lvgl/lvgl_esphome.h index 9c82f3646b..aa8dd2fba5 100644 --- a/esphome/components/lvgl/lvgl_esphome.h +++ b/esphome/components/lvgl/lvgl_esphome.h @@ -158,9 +158,7 @@ class LvglComponent : public PollingComponent { void setup() override; void update() override; void loop() override; - void add_on_idle_callback(std::function &&callback) { - this->idle_callbacks_.add(std::move(callback)); - } + template void add_on_idle_callback(F &&callback) { this->idle_callbacks_.add(std::forward(callback)); } static void monitor_cb(lv_disp_drv_t *disp_drv, uint32_t time, uint32_t px); static void render_start_cb(lv_disp_drv_t *disp_drv); diff --git a/esphome/components/modbus_controller/modbus_controller.cpp b/esphome/components/modbus_controller/modbus_controller.cpp index f77f51a20d..ea6ba9d085 100644 --- a/esphome/components/modbus_controller/modbus_controller.cpp +++ b/esphome/components/modbus_controller/modbus_controller.cpp @@ -837,17 +837,5 @@ int64_t payload_to_number(const std::vector &data, SensorValueType sens return value; } -void ModbusController::add_on_command_sent_callback(std::function &&callback) { - this->command_sent_callback_.add(std::move(callback)); -} - -void ModbusController::add_on_online_callback(std::function &&callback) { - this->online_callback_.add(std::move(callback)); -} - -void ModbusController::add_on_offline_callback(std::function &&callback) { - this->offline_callback_.add(std::move(callback)); -} - } // namespace modbus_controller } // namespace esphome diff --git a/esphome/components/modbus_controller/modbus_controller.h b/esphome/components/modbus_controller/modbus_controller.h index fca2926568..bdb626be16 100644 --- a/esphome/components/modbus_controller/modbus_controller.h +++ b/esphome/components/modbus_controller/modbus_controller.h @@ -508,11 +508,17 @@ class ModbusController : public PollingComponent, public modbus::ModbusDevice { /// get if the module is offline, didn't respond the last command bool get_module_offline() { return module_offline_; } /// Set callback for commands - void add_on_command_sent_callback(std::function &&callback); + template void add_on_command_sent_callback(F &&callback) { + this->command_sent_callback_.add(std::forward(callback)); + } /// Set callback for online changes - void add_on_online_callback(std::function &&callback); + template void add_on_online_callback(F &&callback) { + this->online_callback_.add(std::forward(callback)); + } /// Set callback for offline changes - void add_on_offline_callback(std::function &&callback); + template void add_on_offline_callback(F &&callback) { + this->offline_callback_.add(std::forward(callback)); + } /// called by esphome generated code to set the max_cmd_retries. void set_max_cmd_retries(uint8_t max_cmd_retries) { this->max_cmd_retries_ = max_cmd_retries; } /// get how many times a command will be (re)sent if no response is received diff --git a/esphome/components/online_image/online_image.cpp b/esphome/components/online_image/online_image.cpp index 22bf6a3056..24926aa4dc 100644 --- a/esphome/components/online_image/online_image.cpp +++ b/esphome/components/online_image/online_image.cpp @@ -228,14 +228,6 @@ void OnlineImage::end_connection_() { this->disable_loop(); } -void OnlineImage::add_on_finished_callback(std::function &&callback) { - this->download_finished_callback_.add(std::move(callback)); -} - -void OnlineImage::add_on_error_callback(std::function &&callback) { - this->download_error_callback_.add(std::move(callback)); -} - void OnlineImage::release() { // Clear cache headers this->etag_ = ""; diff --git a/esphome/components/online_image/online_image.h b/esphome/components/online_image/online_image.h index 12c2564526..3a348cbb07 100644 --- a/esphome/components/online_image/online_image.h +++ b/esphome/components/online_image/online_image.h @@ -65,8 +65,12 @@ class OnlineImage : public PollingComponent, */ void release(); - void add_on_finished_callback(std::function &&callback); - void add_on_error_callback(std::function &&callback); + template void add_on_finished_callback(F &&callback) { + this->download_finished_callback_.add(std::forward(callback)); + } + template void add_on_error_callback(F &&callback) { + this->download_error_callback_.add(std::forward(callback)); + } protected: bool validate_url_(const std::string &url); diff --git a/esphome/components/opentherm/hub.h b/esphome/components/opentherm/hub.h index ee0cfd104d..960e23d6dd 100644 --- a/esphome/components/opentherm/hub.h +++ b/esphome/components/opentherm/hub.h @@ -160,11 +160,11 @@ class OpenthermHub : public Component { void set_dhw_block(bool value) { this->dhw_block = value; } void set_sync_mode(bool sync_mode) { this->sync_mode_ = sync_mode; } - void add_on_before_send_callback(std::function &&callback) { - this->before_send_callback_.add(std::move(callback)); + template void add_on_before_send_callback(F &&callback) { + this->before_send_callback_.add(std::forward(callback)); } - void add_on_before_process_response_callback(std::function &&callback) { - this->before_process_response_callback_.add(std::move(callback)); + template void add_on_before_process_response_callback(F &&callback) { + this->before_process_response_callback_.add(std::forward(callback)); } float get_setup_priority() const override { return setup_priority::HARDWARE; } diff --git a/esphome/components/pid/pid_climate.h b/esphome/components/pid/pid_climate.h index 3708c29ff1..479a0e48ee 100644 --- a/esphome/components/pid/pid_climate.h +++ b/esphome/components/pid/pid_climate.h @@ -72,8 +72,8 @@ class PIDClimate : public climate::Climate, public Component { // float get_deadband() const { return controller_.deadband; } // float get_proportional_deadband_multiplier() const { return controller_.proportional_deadband_multiplier; } - void add_on_pid_computed_callback(std::function &&callback) { - pid_computed_callback_.add(std::move(callback)); + template void add_on_pid_computed_callback(F &&callback) { + this->pid_computed_callback_.add(std::forward(callback)); } void set_default_target_temperature(float default_target_temperature) { default_target_temperature_ = default_target_temperature; diff --git a/esphome/components/pn532/pn532.h b/esphome/components/pn532/pn532.h index e57ecd8104..1f6a6b3bc3 100644 --- a/esphome/components/pn532/pn532.h +++ b/esphome/components/pn532/pn532.h @@ -43,8 +43,8 @@ class PN532 : public PollingComponent { void register_ontag_trigger(nfc::NfcOnTagTrigger *trig) { this->triggers_ontag_.push_back(trig); } void register_ontagremoved_trigger(nfc::NfcOnTagTrigger *trig) { this->triggers_ontagremoved_.push_back(trig); } - void add_on_finished_write_callback(std::function callback) { - this->on_finished_write_callback_.add(std::move(callback)); + template void add_on_finished_write_callback(F &&callback) { + this->on_finished_write_callback_.add(std::forward(callback)); } bool is_writing() { return this->next_task_ != READ; }; diff --git a/esphome/components/pn7150/pn7150.h b/esphome/components/pn7150/pn7150.h index c5dd283832..a468d80943 100644 --- a/esphome/components/pn7150/pn7150.h +++ b/esphome/components/pn7150/pn7150.h @@ -167,12 +167,12 @@ class PN7150 : public nfc::Nfcc, public Component { void register_ontag_trigger(nfc::NfcOnTagTrigger *trig) { this->triggers_ontag_.push_back(trig); } void register_ontagremoved_trigger(nfc::NfcOnTagTrigger *trig) { this->triggers_ontagremoved_.push_back(trig); } - void add_on_emulated_tag_scan_callback(std::function callback) { - this->on_emulated_tag_scan_callback_.add(std::move(callback)); + template void add_on_emulated_tag_scan_callback(F &&callback) { + this->on_emulated_tag_scan_callback_.add(std::forward(callback)); } - void add_on_finished_write_callback(std::function callback) { - this->on_finished_write_callback_.add(std::move(callback)); + template void add_on_finished_write_callback(F &&callback) { + this->on_finished_write_callback_.add(std::forward(callback)); } bool is_writing() { return this->next_task_ != EP_READ; }; diff --git a/esphome/components/pn7160/pn7160.h b/esphome/components/pn7160/pn7160.h index 77ab49399c..44f7eb0796 100644 --- a/esphome/components/pn7160/pn7160.h +++ b/esphome/components/pn7160/pn7160.h @@ -184,12 +184,12 @@ class PN7160 : public nfc::Nfcc, public Component { void register_ontag_trigger(nfc::NfcOnTagTrigger *trig) { this->triggers_ontag_.push_back(trig); } void register_ontagremoved_trigger(nfc::NfcOnTagTrigger *trig) { this->triggers_ontagremoved_.push_back(trig); } - void add_on_emulated_tag_scan_callback(std::function callback) { - this->on_emulated_tag_scan_callback_.add(std::move(callback)); + template void add_on_emulated_tag_scan_callback(F &&callback) { + this->on_emulated_tag_scan_callback_.add(std::forward(callback)); } - void add_on_finished_write_callback(std::function callback) { - this->on_finished_write_callback_.add(std::move(callback)); + template void add_on_finished_write_callback(F &&callback) { + this->on_finished_write_callback_.add(std::forward(callback)); } bool is_writing() { return this->next_task_ != EP_READ; }; diff --git a/esphome/components/rf_bridge/rf_bridge.h b/esphome/components/rf_bridge/rf_bridge.h index c93b636c38..e5780c9ebe 100644 --- a/esphome/components/rf_bridge/rf_bridge.h +++ b/esphome/components/rf_bridge/rf_bridge.h @@ -49,11 +49,11 @@ class RFBridgeComponent : public uart::UARTDevice, public Component { public: void loop() override; void dump_config() override; - void add_on_code_received_callback(std::function callback) { - this->data_callback_.add(std::move(callback)); + template void add_on_code_received_callback(F &&callback) { + this->data_callback_.add(std::forward(callback)); } - void add_on_advanced_code_received_callback(std::function callback) { - this->advanced_data_callback_.add(std::move(callback)); + template void add_on_advanced_code_received_callback(F &&callback) { + this->advanced_data_callback_.add(std::forward(callback)); } void send_code(RFBridgeData data); void send_advanced_code(const RFBridgeAdvancedData &data); diff --git a/esphome/components/rotary_encoder/rotary_encoder.h b/esphome/components/rotary_encoder/rotary_encoder.h index 865554cd4d..9cba8680a0 100644 --- a/esphome/components/rotary_encoder/rotary_encoder.h +++ b/esphome/components/rotary_encoder/rotary_encoder.h @@ -82,12 +82,12 @@ class RotaryEncoderSensor : public sensor::Sensor, public Component { void dump_config() override; void loop() override; - void add_on_clockwise_callback(std::function callback) { - this->on_clockwise_callback_.add(std::move(callback)); + template void add_on_clockwise_callback(F &&callback) { + this->on_clockwise_callback_.add(std::forward(callback)); } - void add_on_anticlockwise_callback(std::function callback) { - this->on_anticlockwise_callback_.add(std::move(callback)); + template void add_on_anticlockwise_callback(F &&callback) { + this->on_anticlockwise_callback_.add(std::forward(callback)); } void register_listener(std::function listener) { this->listeners_.add(std::move(listener)); } diff --git a/esphome/components/rtttl/rtttl.h b/esphome/components/rtttl/rtttl.h index e37cccae9e..bff43d2edd 100644 --- a/esphome/components/rtttl/rtttl.h +++ b/esphome/components/rtttl/rtttl.h @@ -45,8 +45,8 @@ class Rtttl : public Component { bool is_playing() { return this->state_ != State::STOPPED; } - void add_on_finished_playback_callback(std::function callback) { - this->on_finished_playback_callback_.add(std::move(callback)); + template void add_on_finished_playback_callback(F &&callback) { + this->on_finished_playback_callback_.add(std::forward(callback)); } protected: diff --git a/esphome/components/sim800l/sim800l.h b/esphome/components/sim800l/sim800l.h index e9e2f66d78..d79279ea72 100644 --- a/esphome/components/sim800l/sim800l.h +++ b/esphome/components/sim800l/sim800l.h @@ -61,20 +61,20 @@ class Sim800LComponent : public uart::UARTDevice, public PollingComponent { #ifdef USE_SENSOR void set_rssi_sensor(sensor::Sensor *rssi_sensor) { rssi_sensor_ = rssi_sensor; } #endif - void add_on_sms_received_callback(std::function callback) { - this->sms_received_callback_.add(std::move(callback)); + template void add_on_sms_received_callback(F &&callback) { + this->sms_received_callback_.add(std::forward(callback)); } - void add_on_incoming_call_callback(std::function callback) { - this->incoming_call_callback_.add(std::move(callback)); + template void add_on_incoming_call_callback(F &&callback) { + this->incoming_call_callback_.add(std::forward(callback)); } - void add_on_call_connected_callback(std::function callback) { - this->call_connected_callback_.add(std::move(callback)); + template void add_on_call_connected_callback(F &&callback) { + this->call_connected_callback_.add(std::forward(callback)); } - void add_on_call_disconnected_callback(std::function callback) { - this->call_disconnected_callback_.add(std::move(callback)); + template void add_on_call_disconnected_callback(F &&callback) { + this->call_disconnected_callback_.add(std::forward(callback)); } - void add_on_ussd_received_callback(std::function callback) { - this->ussd_received_callback_.add(std::move(callback)); + template void add_on_ussd_received_callback(F &&callback) { + this->ussd_received_callback_.add(std::forward(callback)); } void send_sms(const std::string &recipient, const std::string &message); void send_ussd(const std::string &ussd_code); diff --git a/esphome/components/sml/sml.cpp b/esphome/components/sml/sml.cpp index c1ffdc0e68..c8d5fcc269 100644 --- a/esphome/components/sml/sml.cpp +++ b/esphome/components/sml/sml.cpp @@ -61,10 +61,6 @@ void Sml::loop() { } } -void Sml::add_on_data_callback(std::function, bool)> &&callback) { - this->data_callbacks_.add(std::move(callback)); -} - void Sml::process_sml_file_(const BytesView &sml_data) { SmlFile sml_file(sml_data); std::vector obis_info = sml_file.get_obis_info(); diff --git a/esphome/components/sml/sml.h b/esphome/components/sml/sml.h index 15ca43944c..29a2f48bbe 100644 --- a/esphome/components/sml/sml.h +++ b/esphome/components/sml/sml.h @@ -24,7 +24,7 @@ class Sml : public Component, public uart::UARTDevice { void loop() override; void dump_config() override; std::vector sml_listeners_{}; - void add_on_data_callback(std::function, bool)> &&callback); + template void add_on_data_callback(F &&callback) { this->data_callbacks_.add(std::forward(callback)); } protected: void process_sml_file_(const BytesView &sml_data); diff --git a/esphome/components/tuya/tuya.h b/esphome/components/tuya/tuya.h index 76431ddfe4..7e6b50f084 100644 --- a/esphome/components/tuya/tuya.h +++ b/esphome/components/tuya/tuya.h @@ -112,8 +112,8 @@ class Tuya : public Component, public uart::UARTDevice { void add_ignore_mcu_update_on_datapoints(uint8_t ignore_mcu_update_on_datapoints) { this->ignore_mcu_update_on_datapoints_.push_back(ignore_mcu_update_on_datapoints); } - void add_on_initialized_callback(std::function callback) { - this->initialized_callback_.add(std::move(callback)); + template void add_on_initialized_callback(F &&callback) { + this->initialized_callback_.add(std::forward(callback)); } protected: diff --git a/esphome/components/zephyr/cdc_acm.h b/esphome/components/zephyr/cdc_acm.h index 2e9da85a11..4dc14397d8 100644 --- a/esphome/components/zephyr/cdc_acm.h +++ b/esphome/components/zephyr/cdc_acm.h @@ -11,9 +11,7 @@ class CdcAcm : public Component { public: CdcAcm(); void setup() override; - void add_on_rate_callback(std::function &&callback) { - this->rate_callbacks_.add(std::move(callback)); - } + template void add_on_rate_callback(F &&callback) { this->rate_callbacks_.add(std::forward(callback)); } protected: static void cdc_dte_rate_callback_(const device *device, uint32_t rate); diff --git a/esphome/core/helpers.h b/esphome/core/helpers.h index 062a72e7a0..ae3f7e1e36 100644 --- a/esphome/core/helpers.h +++ b/esphome/core/helpers.h @@ -1747,22 +1747,20 @@ template struct Callback { template static Callback create(F &&callable) { using DecayF = std::decay_t; if constexpr (sizeof(DecayF) <= sizeof(void *) && std::is_trivially_copyable_v) { - // Small trivial callable (e.g. [this]() { this->method(); }) - store inline in ctx + // Small trivial callable (e.g. [this]() { this->method(); }) - store inline in ctx. + // Safe under C++20 (P0593R6): byte copy into aligned storage implicitly + // creates objects of implicit-lifetime types (trivially copyable qualifies). Callback cb; cb.ctx = nullptr; - // Store the callable in the ctx pointer itself (type-punning via char* is allowed) - char *dst = reinterpret_cast(&cb.ctx); - const char *src = reinterpret_cast(&callable); + char *dst = reinterpret_cast(&cb.ctx); // NOLINT(clang-analyzer-core.uninitialized.Assign) + const char *src = reinterpret_cast(&callable); // NOLINT(clang-analyzer-core.uninitialized.Assign) for (size_t i = 0; i < sizeof(DecayF); ++i) - dst[i] = src[i]; + dst[i] = src[i]; // NOLINT(clang-analyzer-core.uninitialized.Assign) cb.fn = [](void *c, Ts... args) { - // Recover the callable from the ctx pointer. - // Safe under C++20 (P0593R6): byte copy into aligned storage implicitly - // creates objects of implicit-lifetime types (trivially copyable qualifies). alignas(DecayF) char buf[sizeof(DecayF)]; - const char *csrc = reinterpret_cast(&c); + const char *csrc = reinterpret_cast(&c); // NOLINT(clang-analyzer-core.uninitialized.Assign) for (size_t i = 0; i < sizeof(DecayF); ++i) - buf[i] = csrc[i]; + buf[i] = csrc[i]; // NOLINT(clang-analyzer-core.uninitialized.Assign) reinterpret_cast(buf)->operator()(args...); }; return cb;