Mark user-configurable classes as final (part 13/21)

Add the C++ `final` specifier to leaf, user-configurable component classes and
automation action/trigger/condition primitives so that classes meant to be
terminal cannot be subclassed by external components. Only classes never used as
a base anywhere in the tree are marked. Part 13 of 21, split alphabetically by
component (pmsa003i .. rc522).
This commit is contained in:
Jesse Hills
2026-06-15 13:21:17 +12:00
parent a25ac28ae5
commit b9338ea791
35 changed files with 68 additions and 68 deletions

View File

@@ -26,7 +26,7 @@ struct PM25AQIData {
uint16_t checksum; ///< Packet checksum
};
class PMSA003IComponent : public PollingComponent, public i2c::I2CDevice {
class PMSA003IComponent final : public PollingComponent, public i2c::I2CDevice {
public:
void setup() override;
void dump_config() override;

View File

@@ -29,7 +29,7 @@ enum class State : uint8_t {
WAITING,
};
class PMSX003Component : public uart::UARTDevice, public Component {
class PMSX003Component final : public uart::UARTDevice, public Component {
public:
PMSX003Component() = default;
void setup() override;

View File

@@ -9,7 +9,7 @@
namespace esphome::pmwcs3 {
class PMWCS3Component : public PollingComponent, public i2c::I2CDevice {
class PMWCS3Component final : public PollingComponent, public i2c::I2CDevice {
public:
void update() override;
void dump_config() override;
@@ -32,7 +32,7 @@ class PMWCS3Component : public PollingComponent, public i2c::I2CDevice {
sensor::Sensor *vwc_sensor_{nullptr};
};
template<typename... Ts> class PMWCS3AirCalibrationAction : public Action<Ts...> {
template<typename... Ts> class PMWCS3AirCalibrationAction final : public Action<Ts...> {
public:
PMWCS3AirCalibrationAction(PMWCS3Component *parent) : parent_(parent) {}
@@ -42,7 +42,7 @@ template<typename... Ts> class PMWCS3AirCalibrationAction : public Action<Ts...>
PMWCS3Component *parent_;
};
template<typename... Ts> class PMWCS3WaterCalibrationAction : public Action<Ts...> {
template<typename... Ts> class PMWCS3WaterCalibrationAction final : public Action<Ts...> {
public:
PMWCS3WaterCalibrationAction(PMWCS3Component *parent) : parent_(parent) {}
@@ -52,7 +52,7 @@ template<typename... Ts> class PMWCS3WaterCalibrationAction : public Action<Ts..
PMWCS3Component *parent_;
};
template<typename... Ts> class PMWCS3NewI2cAddressAction : public Action<Ts...> {
template<typename... Ts> class PMWCS3NewI2cAddressAction final : public Action<Ts...> {
public:
PMWCS3NewI2cAddressAction(PMWCS3Component *parent) : parent_(parent) {}
TEMPLATABLE_VALUE(int, new_address)

View File

@@ -114,7 +114,7 @@ class PN532 : public PollingComponent {
CallbackManager<void()> on_finished_write_callback_;
};
class PN532BinarySensor : public binary_sensor::BinarySensor {
class PN532BinarySensor final : public binary_sensor::BinarySensor {
public:
void set_uid(const nfc::NfcTagUid &uid) { uid_ = uid; }
@@ -132,7 +132,7 @@ class PN532BinarySensor : public binary_sensor::BinarySensor {
bool found_{false};
};
template<typename... Ts> class PN532IsWritingCondition : public Condition<Ts...>, public Parented<PN532> {
template<typename... Ts> class PN532IsWritingCondition final : public Condition<Ts...>, public Parented<PN532> {
public:
bool check(const Ts &...x) override { return this->parent_->is_writing(); }
};

View File

@@ -8,7 +8,7 @@
namespace esphome::pn532_i2c {
class PN532I2C : public pn532::PN532, public i2c::I2CDevice {
class PN532I2C final : public pn532::PN532, public i2c::I2CDevice {
public:
void dump_config() override;

View File

@@ -8,9 +8,9 @@
namespace esphome::pn532_spi {
class PN532Spi : public pn532::PN532,
public spi::SPIDevice<spi::BIT_ORDER_LSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING,
spi::DATA_RATE_1MHZ> {
class PN532Spi final : public pn532::PN532,
public spi::SPIDevice<spi::BIT_ORDER_LSB_FIRST, spi::CLOCK_POLARITY_LOW,
spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_1MHZ> {
public:
void setup() override;

View File

@@ -6,40 +6,40 @@
namespace esphome::pn7150 {
template<typename... Ts> class PN7150IsWritingCondition : public Condition<Ts...>, public Parented<PN7150> {
template<typename... Ts> class PN7150IsWritingCondition final : public Condition<Ts...>, public Parented<PN7150> {
public:
bool check(const Ts &...x) override { return this->parent_->is_writing(); }
};
template<typename... Ts> class EmulationOffAction : public Action<Ts...>, public Parented<PN7150> {
template<typename... Ts> class EmulationOffAction final : public Action<Ts...>, public Parented<PN7150> {
void play(const Ts &...x) override { this->parent_->set_tag_emulation_off(); }
};
template<typename... Ts> class EmulationOnAction : public Action<Ts...>, public Parented<PN7150> {
template<typename... Ts> class EmulationOnAction final : public Action<Ts...>, public Parented<PN7150> {
void play(const Ts &...x) override { this->parent_->set_tag_emulation_on(); }
};
template<typename... Ts> class PollingOffAction : public Action<Ts...>, public Parented<PN7150> {
template<typename... Ts> class PollingOffAction final : public Action<Ts...>, public Parented<PN7150> {
void play(const Ts &...x) override { this->parent_->set_polling_off(); }
};
template<typename... Ts> class PollingOnAction : public Action<Ts...>, public Parented<PN7150> {
template<typename... Ts> class PollingOnAction final : public Action<Ts...>, public Parented<PN7150> {
void play(const Ts &...x) override { this->parent_->set_polling_on(); }
};
template<typename... Ts> class SetCleanModeAction : public Action<Ts...>, public Parented<PN7150> {
template<typename... Ts> class SetCleanModeAction final : public Action<Ts...>, public Parented<PN7150> {
void play(const Ts &...x) override { this->parent_->clean_mode(); }
};
template<typename... Ts> class SetFormatModeAction : public Action<Ts...>, public Parented<PN7150> {
template<typename... Ts> class SetFormatModeAction final : public Action<Ts...>, public Parented<PN7150> {
void play(const Ts &...x) override { this->parent_->format_mode(); }
};
template<typename... Ts> class SetReadModeAction : public Action<Ts...>, public Parented<PN7150> {
template<typename... Ts> class SetReadModeAction final : public Action<Ts...>, public Parented<PN7150> {
void play(const Ts &...x) override { this->parent_->read_mode(); }
};
template<typename... Ts> class SetEmulationMessageAction : public Action<Ts...>, public Parented<PN7150> {
template<typename... Ts> class SetEmulationMessageAction final : public Action<Ts...>, public Parented<PN7150> {
TEMPLATABLE_VALUE(std::string, message)
TEMPLATABLE_VALUE(bool, include_android_app_record)
@@ -49,7 +49,7 @@ template<typename... Ts> class SetEmulationMessageAction : public Action<Ts...>,
}
};
template<typename... Ts> class SetWriteMessageAction : public Action<Ts...>, public Parented<PN7150> {
template<typename... Ts> class SetWriteMessageAction final : public Action<Ts...>, public Parented<PN7150> {
TEMPLATABLE_VALUE(std::string, message)
TEMPLATABLE_VALUE(bool, include_android_app_record)
@@ -59,7 +59,7 @@ template<typename... Ts> class SetWriteMessageAction : public Action<Ts...>, pub
}
};
template<typename... Ts> class SetWriteModeAction : public Action<Ts...>, public Parented<PN7150> {
template<typename... Ts> class SetWriteModeAction final : public Action<Ts...>, public Parented<PN7150> {
void play(const Ts &...x) override { this->parent_->write_mode(); }
};

View File

@@ -8,7 +8,7 @@
namespace esphome::pn7150_i2c {
class PN7150I2C : public pn7150::PN7150, public i2c::I2CDevice {
class PN7150I2C final : public pn7150::PN7150, public i2c::I2CDevice {
public:
void dump_config() override;

View File

@@ -6,40 +6,40 @@
namespace esphome::pn7160 {
template<typename... Ts> class PN7160IsWritingCondition : public Condition<Ts...>, public Parented<PN7160> {
template<typename... Ts> class PN7160IsWritingCondition final : public Condition<Ts...>, public Parented<PN7160> {
public:
bool check(const Ts &...x) override { return this->parent_->is_writing(); }
};
template<typename... Ts> class EmulationOffAction : public Action<Ts...>, public Parented<PN7160> {
template<typename... Ts> class EmulationOffAction final : public Action<Ts...>, public Parented<PN7160> {
void play(const Ts &...x) override { this->parent_->set_tag_emulation_off(); }
};
template<typename... Ts> class EmulationOnAction : public Action<Ts...>, public Parented<PN7160> {
template<typename... Ts> class EmulationOnAction final : public Action<Ts...>, public Parented<PN7160> {
void play(const Ts &...x) override { this->parent_->set_tag_emulation_on(); }
};
template<typename... Ts> class PollingOffAction : public Action<Ts...>, public Parented<PN7160> {
template<typename... Ts> class PollingOffAction final : public Action<Ts...>, public Parented<PN7160> {
void play(const Ts &...x) override { this->parent_->set_polling_off(); }
};
template<typename... Ts> class PollingOnAction : public Action<Ts...>, public Parented<PN7160> {
template<typename... Ts> class PollingOnAction final : public Action<Ts...>, public Parented<PN7160> {
void play(const Ts &...x) override { this->parent_->set_polling_on(); }
};
template<typename... Ts> class SetCleanModeAction : public Action<Ts...>, public Parented<PN7160> {
template<typename... Ts> class SetCleanModeAction final : public Action<Ts...>, public Parented<PN7160> {
void play(const Ts &...x) override { this->parent_->clean_mode(); }
};
template<typename... Ts> class SetFormatModeAction : public Action<Ts...>, public Parented<PN7160> {
template<typename... Ts> class SetFormatModeAction final : public Action<Ts...>, public Parented<PN7160> {
void play(const Ts &...x) override { this->parent_->format_mode(); }
};
template<typename... Ts> class SetReadModeAction : public Action<Ts...>, public Parented<PN7160> {
template<typename... Ts> class SetReadModeAction final : public Action<Ts...>, public Parented<PN7160> {
void play(const Ts &...x) override { this->parent_->read_mode(); }
};
template<typename... Ts> class SetEmulationMessageAction : public Action<Ts...>, public Parented<PN7160> {
template<typename... Ts> class SetEmulationMessageAction final : public Action<Ts...>, public Parented<PN7160> {
TEMPLATABLE_VALUE(std::string, message)
TEMPLATABLE_VALUE(bool, include_android_app_record)
@@ -49,7 +49,7 @@ template<typename... Ts> class SetEmulationMessageAction : public Action<Ts...>,
}
};
template<typename... Ts> class SetWriteMessageAction : public Action<Ts...>, public Parented<PN7160> {
template<typename... Ts> class SetWriteMessageAction final : public Action<Ts...>, public Parented<PN7160> {
TEMPLATABLE_VALUE(std::string, message)
TEMPLATABLE_VALUE(bool, include_android_app_record)
@@ -59,7 +59,7 @@ template<typename... Ts> class SetWriteMessageAction : public Action<Ts...>, pub
}
};
template<typename... Ts> class SetWriteModeAction : public Action<Ts...>, public Parented<PN7160> {
template<typename... Ts> class SetWriteModeAction final : public Action<Ts...>, public Parented<PN7160> {
void play(const Ts &...x) override { this->parent_->write_mode(); }
};

View File

@@ -8,7 +8,7 @@
namespace esphome::pn7160_i2c {
class PN7160I2C : public pn7160::PN7160, public i2c::I2CDevice {
class PN7160I2C final : public pn7160::PN7160, public i2c::I2CDevice {
public:
void dump_config() override;

View File

@@ -12,9 +12,9 @@ namespace esphome::pn7160_spi {
static constexpr uint8_t TDD_SPI_READ = 0xFF;
static constexpr uint8_t TDD_SPI_WRITE = 0x0A;
class PN7160Spi : public pn7160::PN7160,
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING,
spi::DATA_RATE_4MHZ> {
class PN7160Spi final : public pn7160::PN7160,
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW,
spi::CLOCK_PHASE_LEADING, spi::DATA_RATE_4MHZ> {
public:
void setup() override;

View File

@@ -7,7 +7,7 @@
namespace esphome::power_supply {
class PowerSupply : public Component {
class PowerSupply final : public Component {
public:
void set_pin(GPIOPin *pin) { pin_ = pin; }
void set_enable_time(uint32_t enable_time) { enable_time_ = enable_time; }

View File

@@ -14,7 +14,7 @@
namespace esphome::prometheus {
class PrometheusHandler : public AsyncWebHandler, public Component {
class PrometheusHandler final : public AsyncWebHandler, public Component {
public:
PrometheusHandler(web_server_base::WebServerBase *base) : base_(base) {}

View File

@@ -6,7 +6,7 @@
namespace esphome::psram {
class PsramComponent : public Component {
class PsramComponent final : public Component {
void dump_config() override;
};

View File

@@ -6,7 +6,7 @@
namespace esphome::pulse_counter {
template<typename... Ts> class SetTotalPulsesAction : public Action<Ts...> {
template<typename... Ts> class SetTotalPulsesAction final : public Action<Ts...> {
public:
SetTotalPulsesAction(PulseCounterSensor *pulse_counter) : pulse_counter_(pulse_counter) {}

View File

@@ -59,7 +59,7 @@ struct HwPulseCounterStorage : public PulseCounterStorageBase {
PulseCounterStorageBase *get_storage(bool hw_pcnt = false);
class PulseCounterSensor : public sensor::Sensor, public PollingComponent {
class PulseCounterSensor final : public sensor::Sensor, public PollingComponent {
public:
explicit PulseCounterSensor(bool hw_pcnt = false) : storage_(*get_storage(hw_pcnt)) {}

View File

@@ -6,7 +6,7 @@
namespace esphome::pulse_meter {
template<typename... Ts> class SetTotalPulsesAction : public Action<Ts...> {
template<typename... Ts> class SetTotalPulsesAction final : public Action<Ts...> {
public:
SetTotalPulsesAction(PulseMeterSensor *pulse_meter) : pulse_meter_(pulse_meter) {}

View File

@@ -9,7 +9,7 @@
namespace esphome::pulse_meter {
class PulseMeterSensor : public sensor::Sensor, public Component {
class PulseMeterSensor final : public sensor::Sensor, public Component {
public:
enum InternalFilterMode {
FILTER_EDGE = 0,

View File

@@ -26,7 +26,7 @@ class PulseWidthSensorStore {
volatile uint32_t last_rise_{0};
};
class PulseWidthSensor : public sensor::Sensor, public PollingComponent {
class PulseWidthSensor final : public sensor::Sensor, public PollingComponent {
public:
void set_pin(InternalGPIOPin *pin) { pin_ = pin; }
void setup() override { this->store_.setup(this->pin_); }

View File

@@ -31,7 +31,7 @@ enum UNIT {
using pvvx_writer_t = display::DisplayWriter<PVVXDisplay>;
class PVVXDisplay : public ble_client::BLEClientNode, public PollingComponent {
class PVVXDisplay final : public ble_client::BLEClientNode, public PollingComponent {
public:
void set_writer(pvvx_writer_t &&writer) { this->writer_ = writer; }
void set_auto_clear(bool auto_clear_enabled) { this->auto_clear_enabled_ = auto_clear_enabled; }

View File

@@ -18,7 +18,7 @@ struct ParseResult {
int raw_offset;
};
class PVVXMiThermometer : public Component, public esp32_ble_tracker::ESPBTDeviceListener {
class PVVXMiThermometer final : public Component, public esp32_ble_tracker::ESPBTDeviceListener {
public:
void set_address(uint64_t address) { address_ = address; };

View File

@@ -21,7 +21,7 @@ class PylontechListener {
virtual void dump_config();
};
class PylontechComponent : public PollingComponent, public uart::UARTDevice {
class PylontechComponent final : public PollingComponent, public uart::UARTDevice {
public:
PylontechComponent();

View File

@@ -5,7 +5,7 @@
namespace esphome::pylontech {
class PylontechSensor : public PylontechListener {
class PylontechSensor final : public PylontechListener {
public:
PylontechSensor(int8_t bat_num);
void dump_config() override;

View File

@@ -5,7 +5,7 @@
namespace esphome::pylontech {
class PylontechTextSensor : public PylontechListener {
class PylontechTextSensor final : public PylontechListener {
public:
PylontechTextSensor(int8_t bat_num);
void dump_config() override;

View File

@@ -6,7 +6,7 @@
namespace esphome::pzem004t {
class PZEM004T : public PollingComponent, public uart::UARTDevice {
class PZEM004T final : public PollingComponent, public uart::UARTDevice {
public:
void set_voltage_sensor(sensor::Sensor *voltage_sensor) { voltage_sensor_ = voltage_sensor; }
void set_current_sensor(sensor::Sensor *current_sensor) { current_sensor_ = current_sensor; }

View File

@@ -11,7 +11,7 @@ namespace esphome::pzemac {
template<typename... Ts> class ResetEnergyAction;
class PZEMAC : public PollingComponent, public modbus::ModbusDevice {
class PZEMAC final : public PollingComponent, public modbus::ModbusDevice {
public:
void set_voltage_sensor(sensor::Sensor *voltage_sensor) { voltage_sensor_ = voltage_sensor; }
void set_current_sensor(sensor::Sensor *current_sensor) { current_sensor_ = current_sensor; }
@@ -38,7 +38,7 @@ class PZEMAC : public PollingComponent, public modbus::ModbusDevice {
void reset_energy_();
};
template<typename... Ts> class ResetEnergyAction : public Action<Ts...> {
template<typename... Ts> class ResetEnergyAction final : public Action<Ts...> {
public:
ResetEnergyAction(PZEMAC *pzemac) : pzemac_(pzemac) {}

View File

@@ -9,7 +9,7 @@
namespace esphome::pzemdc {
class PZEMDC : public PollingComponent, public modbus::ModbusDevice {
class PZEMDC final : public PollingComponent, public modbus::ModbusDevice {
public:
void set_voltage_sensor(sensor::Sensor *voltage_sensor) { voltage_sensor_ = voltage_sensor; }
void set_current_sensor(sensor::Sensor *current_sensor) { current_sensor_ = current_sensor; }
@@ -31,7 +31,7 @@ class PZEMDC : public PollingComponent, public modbus::ModbusDevice {
sensor::Sensor *energy_sensor_{nullptr};
};
template<typename... Ts> class ResetEnergyAction : public Action<Ts...> {
template<typename... Ts> class ResetEnergyAction final : public Action<Ts...> {
public:
ResetEnergyAction(PZEMDC *pzemdc) : pzemdc_(pzemdc) {}

View File

@@ -26,7 +26,7 @@ enum QMC5883LOversampling {
QMC5883L_SAMPLING_64 = 0b11,
};
class QMC5883LComponent : public PollingComponent, public i2c::I2CDevice {
class QMC5883LComponent final : public PollingComponent, public i2c::I2CDevice {
public:
void setup() override;
void dump_config() override;

View File

@@ -67,7 +67,7 @@ using qmp6988_data_t = struct Qmp6988Data {
qmp6988_ik_data_t ik;
};
class QMP6988Component : public PollingComponent, public i2c::I2CDevice {
class QMP6988Component final : public PollingComponent, public i2c::I2CDevice {
public:
void set_temperature_sensor(sensor::Sensor *temperature_sensor) { this->temperature_sensor_ = temperature_sensor; }
void set_pressure_sensor(sensor::Sensor *pressure_sensor) { this->pressure_sensor_ = pressure_sensor; }

View File

@@ -13,7 +13,7 @@ class Display;
} // namespace display
namespace qr_code {
class QrCode : public Component {
class QrCode final : public Component {
public:
void draw(display::Display *buff, uint16_t x_offset, uint16_t y_offset, Color color, int scale);

View File

@@ -53,7 +53,7 @@ enum Model {
RM67162,
};
class QspiDbi : public display::DisplayBuffer,
class QspiDbi final : public display::DisplayBuffer,
public spi::SPIDevice<spi::BIT_ORDER_MSB_FIRST, spi::CLOCK_POLARITY_LOW, spi::CLOCK_PHASE_LEADING,
spi::DATA_RATE_1MHZ> {
public:

View File

@@ -29,7 +29,7 @@ enum DebounceMode {
static const uint8_t QWIIC_PIR_DEVICE_ID = 0x72;
class QwiicPIRComponent : public Component, public i2c::I2CDevice, public binary_sensor::BinarySensor {
class QwiicPIRComponent final : public Component, public i2c::I2CDevice, public binary_sensor::BinarySensor {
public:
void setup() override;
void loop() override;

View File

@@ -7,7 +7,7 @@
namespace esphome::radon_eye_ble {
class RadonEyeListener : public esp32_ble_tracker::ESPBTDeviceListener {
class RadonEyeListener final : public esp32_ble_tracker::ESPBTDeviceListener {
public:
bool parse_device(const esp32_ble_tracker::ESPBTDevice &device) override;
};

View File

@@ -13,7 +13,7 @@
namespace esphome::radon_eye_rd200 {
class RadonEyeRD200 : public PollingComponent, public ble_client::BLEClientNode {
class RadonEyeRD200 final : public PollingComponent, public ble_client::BLEClientNode {
public:
RadonEyeRD200();

View File

@@ -251,7 +251,7 @@ class RC522 : public PollingComponent {
} error_code_{NONE};
};
class RC522BinarySensor : public binary_sensor::BinarySensor {
class RC522BinarySensor final : public binary_sensor::BinarySensor {
public:
void set_uid(const std::vector<uint8_t> &uid) { uid_ = uid; }
@@ -269,7 +269,7 @@ class RC522BinarySensor : public binary_sensor::BinarySensor {
bool found_{false};
};
class RC522Trigger : public Trigger<std::string> {
class RC522Trigger final : public Trigger<std::string> {
public:
void process(std::vector<uint8_t> &data);
};