mirror of
https://github.com/esphome/esphome.git
synced 2025-09-13 16:52:18 +01:00
Merge remote-tracking branch 'origin/message_creator_ram' into integration
This commit is contained in:
@@ -1902,13 +1902,13 @@ void APIConnection::process_batch_() {
|
|||||||
|
|
||||||
uint16_t APIConnection::MessageCreator::operator()(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
uint16_t APIConnection::MessageCreator::operator()(EntityBase *entity, APIConnection *conn, uint32_t remaining_size,
|
||||||
bool is_single, uint16_t message_type) const {
|
bool is_single, uint16_t message_type) const {
|
||||||
if (has_tagged_string_ptr()) {
|
if (has_tagged_string_ptr_()) {
|
||||||
// Handle string-based messages
|
// Handle string-based messages
|
||||||
switch (message_type) {
|
switch (message_type) {
|
||||||
#ifdef USE_EVENT
|
#ifdef USE_EVENT
|
||||||
case EventResponse::MESSAGE_TYPE: {
|
case EventResponse::MESSAGE_TYPE: {
|
||||||
auto *e = static_cast<event::Event *>(entity);
|
auto *e = static_cast<event::Event *>(entity);
|
||||||
return APIConnection::try_send_event_response(e, *get_string_ptr(), conn, remaining_size, is_single);
|
return APIConnection::try_send_event_response(e, *get_string_ptr_(), conn, remaining_size, is_single);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
default:
|
default:
|
||||||
|
@@ -505,15 +505,15 @@ class APIConnection : public APIServerConnection {
|
|||||||
|
|
||||||
// Destructor
|
// Destructor
|
||||||
~MessageCreator() {
|
~MessageCreator() {
|
||||||
if (has_tagged_string_ptr()) {
|
if (has_tagged_string_ptr_()) {
|
||||||
delete get_string_ptr();
|
delete get_string_ptr_();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy constructor
|
// Copy constructor
|
||||||
MessageCreator(const MessageCreator &other) {
|
MessageCreator(const MessageCreator &other) {
|
||||||
if (other.has_tagged_string_ptr()) {
|
if (other.has_tagged_string_ptr_()) {
|
||||||
auto *str = new std::string(*other.get_string_ptr());
|
auto *str = new std::string(*other.get_string_ptr_());
|
||||||
data_.tagged = reinterpret_cast<uintptr_t>(str) | 1;
|
data_.tagged = reinterpret_cast<uintptr_t>(str) | 1;
|
||||||
} else {
|
} else {
|
||||||
data_ = other.data_;
|
data_ = other.data_;
|
||||||
@@ -527,12 +527,12 @@ class APIConnection : public APIServerConnection {
|
|||||||
MessageCreator &operator=(const MessageCreator &other) {
|
MessageCreator &operator=(const MessageCreator &other) {
|
||||||
if (this != &other) {
|
if (this != &other) {
|
||||||
// Clean up current string data if needed
|
// Clean up current string data if needed
|
||||||
if (has_tagged_string_ptr()) {
|
if (has_tagged_string_ptr_()) {
|
||||||
delete get_string_ptr();
|
delete get_string_ptr_();
|
||||||
}
|
}
|
||||||
// Copy new data
|
// Copy new data
|
||||||
if (other.has_tagged_string_ptr()) {
|
if (other.has_tagged_string_ptr_()) {
|
||||||
auto *str = new std::string(*other.get_string_ptr());
|
auto *str = new std::string(*other.get_string_ptr_());
|
||||||
data_.tagged = reinterpret_cast<uintptr_t>(str) | 1;
|
data_.tagged = reinterpret_cast<uintptr_t>(str) | 1;
|
||||||
} else {
|
} else {
|
||||||
data_ = other.data_;
|
data_ = other.data_;
|
||||||
@@ -544,8 +544,8 @@ class APIConnection : public APIServerConnection {
|
|||||||
MessageCreator &operator=(MessageCreator &&other) noexcept {
|
MessageCreator &operator=(MessageCreator &&other) noexcept {
|
||||||
if (this != &other) {
|
if (this != &other) {
|
||||||
// Clean up current string data if needed
|
// Clean up current string data if needed
|
||||||
if (has_tagged_string_ptr()) {
|
if (has_tagged_string_ptr_()) {
|
||||||
delete get_string_ptr();
|
delete get_string_ptr_();
|
||||||
}
|
}
|
||||||
// Move data
|
// Move data
|
||||||
data_ = other.data_;
|
data_ = other.data_;
|
||||||
@@ -561,10 +561,10 @@ class APIConnection : public APIServerConnection {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
// Check if this contains a string pointer
|
// Check if this contains a string pointer
|
||||||
bool has_tagged_string_ptr() const { return (data_.tagged & 1) != 0; }
|
bool has_tagged_string_ptr_() const { return (data_.tagged & 1) != 0; }
|
||||||
|
|
||||||
// Get the actual string pointer (clears the tag bit)
|
// Get the actual string pointer (clears the tag bit)
|
||||||
std::string *get_string_ptr() const { return reinterpret_cast<std::string *>(data_.tagged & ~uintptr_t(1)); }
|
std::string *get_string_ptr_() const { return reinterpret_cast<std::string *>(data_.tagged & ~uintptr_t(1)); }
|
||||||
|
|
||||||
union {
|
union {
|
||||||
MessageCreatorPtr ptr;
|
MessageCreatorPtr ptr;
|
||||||
|
Reference in New Issue
Block a user