less templates

This commit is contained in:
J. Nick Koston 2025-07-11 16:16:57 -10:00
parent 2c290e3bee
commit dc53473e7e
No known key found for this signature in database
3 changed files with 68 additions and 24 deletions

View File

@ -257,15 +257,17 @@ bool DeviceInfoResponse::decode_length(uint32_t field_id, ProtoLengthDelimited v
return true;
}
case 20: {
this->devices.push_back(value.as_message<DeviceInfo>());
this->devices.emplace_back();
value.decode_to_message(this->devices.back());
return true;
}
case 21: {
this->areas.push_back(value.as_message<AreaInfo>());
this->areas.emplace_back();
value.decode_to_message(this->areas.back());
return true;
}
case 22: {
this->area = value.as_message<AreaInfo>();
value.decode_to_message(this->area);
return true;
}
default:
@ -1935,15 +1937,18 @@ bool HomeassistantServiceResponse::decode_length(uint32_t field_id, ProtoLengthD
return true;
}
case 2: {
this->data.push_back(value.as_message<HomeassistantServiceMap>());
this->data.emplace_back();
value.decode_to_message(this->data.back());
return true;
}
case 3: {
this->data_template.push_back(value.as_message<HomeassistantServiceMap>());
this->data_template.emplace_back();
value.decode_to_message(this->data_template.back());
return true;
}
case 4: {
this->variables.push_back(value.as_message<HomeassistantServiceMap>());
this->variables.emplace_back();
value.decode_to_message(this->variables.back());
return true;
}
default:
@ -2081,7 +2086,8 @@ bool ListEntitiesServicesResponse::decode_length(uint32_t field_id, ProtoLengthD
return true;
}
case 3: {
this->args.push_back(value.as_message<ListEntitiesServicesArgument>());
this->args.emplace_back();
value.decode_to_message(this->args.back());
return true;
}
default:
@ -2213,7 +2219,8 @@ void ExecuteServiceArgument::calculate_size(uint32_t &total_size) const {
bool ExecuteServiceRequest::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
switch (field_id) {
case 2: {
this->args.push_back(value.as_message<ExecuteServiceArgument>());
this->args.emplace_back();
value.decode_to_message(this->args.back());
return true;
}
default:
@ -3820,7 +3827,8 @@ bool ListEntitiesMediaPlayerResponse::decode_length(uint32_t field_id, ProtoLeng
return true;
}
case 9: {
this->supported_formats.push_back(value.as_message<MediaPlayerSupportedFormat>());
this->supported_formats.emplace_back();
value.decode_to_message(this->supported_formats.back());
return true;
}
default:
@ -4078,11 +4086,13 @@ bool BluetoothLEAdvertisementResponse::decode_length(uint32_t field_id, ProtoLen
return true;
}
case 5: {
this->service_data.push_back(value.as_message<BluetoothServiceData>());
this->service_data.emplace_back();
value.decode_to_message(this->service_data.back());
return true;
}
case 6: {
this->manufacturer_data.push_back(value.as_message<BluetoothServiceData>());
this->manufacturer_data.emplace_back();
value.decode_to_message(this->manufacturer_data.back());
return true;
}
default:
@ -4160,7 +4170,8 @@ void BluetoothLERawAdvertisement::calculate_size(uint32_t &total_size) const {
bool BluetoothLERawAdvertisementsResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
switch (field_id) {
case 1: {
this->advertisements.push_back(value.as_message<BluetoothLERawAdvertisement>());
this->advertisements.emplace_back();
value.decode_to_message(this->advertisements.back());
return true;
}
default:
@ -4306,7 +4317,8 @@ bool BluetoothGATTCharacteristic::decode_varint(uint32_t field_id, ProtoVarInt v
bool BluetoothGATTCharacteristic::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
switch (field_id) {
case 4: {
this->descriptors.push_back(value.as_message<BluetoothGATTDescriptor>());
this->descriptors.emplace_back();
value.decode_to_message(this->descriptors.back());
return true;
}
default:
@ -4350,7 +4362,8 @@ bool BluetoothGATTService::decode_varint(uint32_t field_id, ProtoVarInt value) {
bool BluetoothGATTService::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
switch (field_id) {
case 3: {
this->characteristics.push_back(value.as_message<BluetoothGATTCharacteristic>());
this->characteristics.emplace_back();
value.decode_to_message(this->characteristics.back());
return true;
}
default:
@ -4388,7 +4401,8 @@ bool BluetoothGATTGetServicesResponse::decode_varint(uint32_t field_id, ProtoVar
bool BluetoothGATTGetServicesResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
switch (field_id) {
case 2: {
this->services.push_back(value.as_message<BluetoothGATTService>());
this->services.emplace_back();
value.decode_to_message(this->services.back());
return true;
}
default:
@ -4942,7 +4956,7 @@ bool VoiceAssistantRequest::decode_length(uint32_t field_id, ProtoLengthDelimite
return true;
}
case 4: {
this->audio_settings = value.as_message<VoiceAssistantAudioSettings>();
value.decode_to_message(this->audio_settings);
return true;
}
case 5: {
@ -5024,7 +5038,8 @@ bool VoiceAssistantEventResponse::decode_varint(uint32_t field_id, ProtoVarInt v
bool VoiceAssistantEventResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
switch (field_id) {
case 2: {
this->data.push_back(value.as_message<VoiceAssistantEventData>());
this->data.emplace_back();
value.decode_to_message(this->data.back());
return true;
}
default:
@ -5222,7 +5237,8 @@ bool VoiceAssistantConfigurationResponse::decode_varint(uint32_t field_id, Proto
bool VoiceAssistantConfigurationResponse::decode_length(uint32_t field_id, ProtoLengthDelimited value) {
switch (field_id) {
case 1: {
this->available_wake_words.push_back(value.as_message<VoiceAssistantWakeWord>());
this->available_wake_words.emplace_back();
value.decode_to_message(this->available_wake_words.back());
return true;
}
case 2: {

View File

@ -133,15 +133,16 @@ class ProtoVarInt {
uint64_t value_;
};
// Forward declaration for decode_to_message
class ProtoMessage;
class ProtoLengthDelimited {
public:
explicit ProtoLengthDelimited(const uint8_t *value, size_t length) : value_(value), length_(length) {}
std::string as_string() const { return std::string(reinterpret_cast<const char *>(this->value_), this->length_); }
template<class C> C as_message() const {
auto msg = C();
msg.decode(this->value_, this->length_);
return msg;
}
// Non-template method to decode into an existing message instance
void decode_to_message(ProtoMessage &msg) const;
protected:
const uint8_t *const value_;
@ -352,6 +353,11 @@ inline void ProtoWriteBuffer::encode_message(uint32_t field_id, const ProtoMessa
this->buffer_->insert(this->buffer_->begin() + begin, var.begin(), var.end());
}
// Implementation of decode_to_message - must be after ProtoMessage is defined
inline void ProtoLengthDelimited::decode_to_message(ProtoMessage &msg) const {
msg.decode(this->value_, this->length_);
}
template<typename T> const char *proto_enum_to_string(T value);
class ProtoService {

View File

@ -502,7 +502,19 @@ class MessageType(TypeInfo):
@property
def decode_length(self) -> str:
return f"value.as_message<{self.cpp_type}>()"
# For non-template decoding, we need to handle this differently
return None
@property
def decode_length_content(self) -> str:
# Custom decode that doesn't use templates
return dedent(
f"""\
case {self.number}: {{
value.decode_to_message(this->{self.field_name});
return true;
}}"""
)
def dump(self, name: str) -> str:
o = f"{name}.dump_to(out);"
@ -731,6 +743,16 @@ class RepeatedTypeInfo(TypeInfo):
@property
def decode_length_content(self) -> str:
content = self._ti.decode_length
if content is None and isinstance(self._ti, MessageType):
# Special handling for non-template message decoding
return dedent(
f"""\
case {self.number}: {{
this->{self.field_name}.emplace_back();
value.decode_to_message(this->{self.field_name}.back());
return true;
}}"""
)
if content is None:
return None
return dedent(