1
0
mirror of https://github.com/esphome/esphome.git synced 2025-09-08 06:12:20 +01:00

Reduce API proto vtable overhead by splitting decode functionality (#9541)

This commit is contained in:
J. Nick Koston
2025-07-15 22:46:04 -10:00
committed by GitHub
parent 2c478efcba
commit 15768ec00d
5 changed files with 115 additions and 392 deletions

View File

@@ -308,7 +308,7 @@ class StateResponseProtoMessage : public ProtoMessage {
protected:
};
class CommandProtoMessage : public ProtoMessage {
class CommandProtoMessage : public ProtoDecodableMessage {
public:
~CommandProtoMessage() override = default;
uint32_t key{0};
@@ -316,7 +316,7 @@ class CommandProtoMessage : public ProtoMessage {
protected:
};
class HelloRequest : public ProtoMessage {
class HelloRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 1;
static constexpr uint8_t ESTIMATED_SIZE = 17;
@@ -353,7 +353,7 @@ class HelloResponse : public ProtoMessage {
protected:
};
class ConnectRequest : public ProtoMessage {
class ConnectRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 3;
static constexpr uint8_t ESTIMATED_SIZE = 9;
@@ -384,7 +384,7 @@ class ConnectResponse : public ProtoMessage {
protected:
};
class DisconnectRequest : public ProtoMessage {
class DisconnectRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 5;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -397,7 +397,7 @@ class DisconnectRequest : public ProtoMessage {
protected:
};
class DisconnectResponse : public ProtoMessage {
class DisconnectResponse : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 6;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -410,7 +410,7 @@ class DisconnectResponse : public ProtoMessage {
protected:
};
class PingRequest : public ProtoMessage {
class PingRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 7;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -423,7 +423,7 @@ class PingRequest : public ProtoMessage {
protected:
};
class PingResponse : public ProtoMessage {
class PingResponse : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 8;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -436,7 +436,7 @@ class PingResponse : public ProtoMessage {
protected:
};
class DeviceInfoRequest : public ProtoMessage {
class DeviceInfoRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 9;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -460,8 +460,6 @@ class AreaInfo : public ProtoMessage {
#endif
protected:
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class DeviceInfo : public ProtoMessage {
public:
@@ -475,8 +473,6 @@ class DeviceInfo : public ProtoMessage {
#endif
protected:
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class DeviceInfoResponse : public ProtoMessage {
public:
@@ -543,7 +539,7 @@ class DeviceInfoResponse : public ProtoMessage {
protected:
};
class ListEntitiesRequest : public ProtoMessage {
class ListEntitiesRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 11;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -569,7 +565,7 @@ class ListEntitiesDoneResponse : public ProtoMessage {
protected:
};
class SubscribeStatesRequest : public ProtoMessage {
class SubscribeStatesRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 20;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -972,7 +968,7 @@ class TextSensorStateResponse : public StateResponseProtoMessage {
protected:
};
#endif
class SubscribeLogsRequest : public ProtoMessage {
class SubscribeLogsRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 28;
static constexpr uint8_t ESTIMATED_SIZE = 4;
@@ -1007,7 +1003,7 @@ class SubscribeLogsResponse : public ProtoMessage {
protected:
};
#ifdef USE_API_NOISE
class NoiseEncryptionSetKeyRequest : public ProtoMessage {
class NoiseEncryptionSetKeyRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 124;
static constexpr uint8_t ESTIMATED_SIZE = 9;
@@ -1039,7 +1035,7 @@ class NoiseEncryptionSetKeyResponse : public ProtoMessage {
protected:
};
#endif
class SubscribeHomeassistantServicesRequest : public ProtoMessage {
class SubscribeHomeassistantServicesRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 34;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -1063,7 +1059,6 @@ class HomeassistantServiceMap : public ProtoMessage {
#endif
protected:
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
};
class HomeassistantServiceResponse : public ProtoMessage {
public:
@@ -1085,7 +1080,7 @@ class HomeassistantServiceResponse : public ProtoMessage {
protected:
};
class SubscribeHomeAssistantStatesRequest : public ProtoMessage {
class SubscribeHomeAssistantStatesRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 38;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -1116,7 +1111,7 @@ class SubscribeHomeAssistantStateResponse : public ProtoMessage {
protected:
};
class HomeAssistantStateResponse : public ProtoMessage {
class HomeAssistantStateResponse : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 40;
static constexpr uint8_t ESTIMATED_SIZE = 27;
@@ -1133,7 +1128,7 @@ class HomeAssistantStateResponse : public ProtoMessage {
protected:
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
};
class GetTimeRequest : public ProtoMessage {
class GetTimeRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 36;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -1146,7 +1141,7 @@ class GetTimeRequest : public ProtoMessage {
protected:
};
class GetTimeResponse : public ProtoMessage {
class GetTimeResponse : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 37;
static constexpr uint8_t ESTIMATED_SIZE = 5;
@@ -1175,8 +1170,6 @@ class ListEntitiesServicesArgument : public ProtoMessage {
#endif
protected:
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class ListEntitiesServicesResponse : public ProtoMessage {
public:
@@ -1196,7 +1189,7 @@ class ListEntitiesServicesResponse : public ProtoMessage {
protected:
};
class ExecuteServiceArgument : public ProtoMessage {
class ExecuteServiceArgument : public ProtoDecodableMessage {
public:
bool bool_{false};
int32_t legacy_int{0};
@@ -1207,8 +1200,6 @@ class ExecuteServiceArgument : public ProtoMessage {
std::vector<int32_t> int_array{};
std::vector<float> float_array{};
std::vector<std::string> string_array{};
void encode(ProtoWriteBuffer buffer) const override;
void calculate_size(uint32_t &total_size) const override;
#ifdef HAS_PROTO_MESSAGE_DUMP
void dump_to(std::string &out) const override;
#endif
@@ -1218,7 +1209,7 @@ class ExecuteServiceArgument : public ProtoMessage {
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class ExecuteServiceRequest : public ProtoMessage {
class ExecuteServiceRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 42;
static constexpr uint8_t ESTIMATED_SIZE = 39;
@@ -1269,7 +1260,7 @@ class CameraImageResponse : public StateResponseProtoMessage {
protected:
};
class CameraImageRequest : public ProtoMessage {
class CameraImageRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 45;
static constexpr uint8_t ESTIMATED_SIZE = 4;
@@ -1660,8 +1651,6 @@ class MediaPlayerSupportedFormat : public ProtoMessage {
#endif
protected:
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class ListEntitiesMediaPlayerResponse : public InfoResponseProtoMessage {
public:
@@ -1724,7 +1713,7 @@ class MediaPlayerCommandRequest : public CommandProtoMessage {
};
#endif
#ifdef USE_BLUETOOTH_PROXY
class SubscribeBluetoothLEAdvertisementsRequest : public ProtoMessage {
class SubscribeBluetoothLEAdvertisementsRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 66;
static constexpr uint8_t ESTIMATED_SIZE = 4;
@@ -1751,8 +1740,6 @@ class BluetoothServiceData : public ProtoMessage {
#endif
protected:
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class BluetoothLEAdvertisementResponse : public ProtoMessage {
public:
@@ -1789,8 +1776,6 @@ class BluetoothLERawAdvertisement : public ProtoMessage {
#endif
protected:
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class BluetoothLERawAdvertisementsResponse : public ProtoMessage {
public:
@@ -1808,7 +1793,7 @@ class BluetoothLERawAdvertisementsResponse : public ProtoMessage {
protected:
};
class BluetoothDeviceRequest : public ProtoMessage {
class BluetoothDeviceRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 68;
static constexpr uint8_t ESTIMATED_SIZE = 12;
@@ -1845,7 +1830,7 @@ class BluetoothDeviceConnectionResponse : public ProtoMessage {
protected:
};
class BluetoothGATTGetServicesRequest : public ProtoMessage {
class BluetoothGATTGetServicesRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 70;
static constexpr uint8_t ESTIMATED_SIZE = 4;
@@ -1871,7 +1856,6 @@ class BluetoothGATTDescriptor : public ProtoMessage {
#endif
protected:
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class BluetoothGATTCharacteristic : public ProtoMessage {
public:
@@ -1886,8 +1870,6 @@ class BluetoothGATTCharacteristic : public ProtoMessage {
#endif
protected:
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class BluetoothGATTService : public ProtoMessage {
public:
@@ -1901,8 +1883,6 @@ class BluetoothGATTService : public ProtoMessage {
#endif
protected:
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class BluetoothGATTGetServicesResponse : public ProtoMessage {
public:
@@ -1937,7 +1917,7 @@ class BluetoothGATTGetServicesDoneResponse : public ProtoMessage {
protected:
};
class BluetoothGATTReadRequest : public ProtoMessage {
class BluetoothGATTReadRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 73;
static constexpr uint8_t ESTIMATED_SIZE = 8;
@@ -1971,7 +1951,7 @@ class BluetoothGATTReadResponse : public ProtoMessage {
protected:
};
class BluetoothGATTWriteRequest : public ProtoMessage {
class BluetoothGATTWriteRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 75;
static constexpr uint8_t ESTIMATED_SIZE = 19;
@@ -1990,7 +1970,7 @@ class BluetoothGATTWriteRequest : public ProtoMessage {
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class BluetoothGATTReadDescriptorRequest : public ProtoMessage {
class BluetoothGATTReadDescriptorRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 76;
static constexpr uint8_t ESTIMATED_SIZE = 8;
@@ -2006,7 +1986,7 @@ class BluetoothGATTReadDescriptorRequest : public ProtoMessage {
protected:
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class BluetoothGATTWriteDescriptorRequest : public ProtoMessage {
class BluetoothGATTWriteDescriptorRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 77;
static constexpr uint8_t ESTIMATED_SIZE = 17;
@@ -2024,7 +2004,7 @@ class BluetoothGATTWriteDescriptorRequest : public ProtoMessage {
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class BluetoothGATTNotifyRequest : public ProtoMessage {
class BluetoothGATTNotifyRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 78;
static constexpr uint8_t ESTIMATED_SIZE = 10;
@@ -2059,7 +2039,7 @@ class BluetoothGATTNotifyDataResponse : public ProtoMessage {
protected:
};
class SubscribeBluetoothConnectionsFreeRequest : public ProtoMessage {
class SubscribeBluetoothConnectionsFreeRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 80;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -2178,7 +2158,7 @@ class BluetoothDeviceUnpairingResponse : public ProtoMessage {
protected:
};
class UnsubscribeBluetoothLEAdvertisementsRequest : public ProtoMessage {
class UnsubscribeBluetoothLEAdvertisementsRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 87;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -2226,7 +2206,7 @@ class BluetoothScannerStateResponse : public ProtoMessage {
protected:
};
class BluetoothScannerSetModeRequest : public ProtoMessage {
class BluetoothScannerSetModeRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 127;
static constexpr uint8_t ESTIMATED_SIZE = 2;
@@ -2243,7 +2223,7 @@ class BluetoothScannerSetModeRequest : public ProtoMessage {
};
#endif
#ifdef USE_VOICE_ASSISTANT
class SubscribeVoiceAssistantRequest : public ProtoMessage {
class SubscribeVoiceAssistantRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 89;
static constexpr uint8_t ESTIMATED_SIZE = 6;
@@ -2271,8 +2251,6 @@ class VoiceAssistantAudioSettings : public ProtoMessage {
#endif
protected:
bool decode_32bit(uint32_t field_id, Proto32Bit value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class VoiceAssistantRequest : public ProtoMessage {
public:
@@ -2294,7 +2272,7 @@ class VoiceAssistantRequest : public ProtoMessage {
protected:
};
class VoiceAssistantResponse : public ProtoMessage {
class VoiceAssistantResponse : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 91;
static constexpr uint8_t ESTIMATED_SIZE = 6;
@@ -2310,12 +2288,10 @@ class VoiceAssistantResponse : public ProtoMessage {
protected:
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class VoiceAssistantEventData : public ProtoMessage {
class VoiceAssistantEventData : public ProtoDecodableMessage {
public:
std::string name{};
std::string value{};
void encode(ProtoWriteBuffer buffer) const override;
void calculate_size(uint32_t &total_size) const override;
#ifdef HAS_PROTO_MESSAGE_DUMP
void dump_to(std::string &out) const override;
#endif
@@ -2323,7 +2299,7 @@ class VoiceAssistantEventData : public ProtoMessage {
protected:
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
};
class VoiceAssistantEventResponse : public ProtoMessage {
class VoiceAssistantEventResponse : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 92;
static constexpr uint8_t ESTIMATED_SIZE = 36;
@@ -2340,7 +2316,7 @@ class VoiceAssistantEventResponse : public ProtoMessage {
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class VoiceAssistantAudio : public ProtoMessage {
class VoiceAssistantAudio : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 106;
static constexpr uint8_t ESTIMATED_SIZE = 11;
@@ -2359,7 +2335,7 @@ class VoiceAssistantAudio : public ProtoMessage {
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class VoiceAssistantTimerEventResponse : public ProtoMessage {
class VoiceAssistantTimerEventResponse : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 115;
static constexpr uint8_t ESTIMATED_SIZE = 30;
@@ -2380,7 +2356,7 @@ class VoiceAssistantTimerEventResponse : public ProtoMessage {
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
bool decode_varint(uint32_t field_id, ProtoVarInt value) override;
};
class VoiceAssistantAnnounceRequest : public ProtoMessage {
class VoiceAssistantAnnounceRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 119;
static constexpr uint8_t ESTIMATED_SIZE = 29;
@@ -2427,9 +2403,8 @@ class VoiceAssistantWakeWord : public ProtoMessage {
#endif
protected:
bool decode_length(uint32_t field_id, ProtoLengthDelimited value) override;
};
class VoiceAssistantConfigurationRequest : public ProtoMessage {
class VoiceAssistantConfigurationRequest : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 121;
static constexpr uint8_t ESTIMATED_SIZE = 0;
@@ -2460,7 +2435,7 @@ class VoiceAssistantConfigurationResponse : public ProtoMessage {
protected:
};
class VoiceAssistantSetConfiguration : public ProtoMessage {
class VoiceAssistantSetConfiguration : public ProtoDecodableMessage {
public:
static constexpr uint8_t MESSAGE_TYPE = 123;
static constexpr uint8_t ESTIMATED_SIZE = 18;