1
0
mirror of https://github.com/esphome/esphome.git synced 2025-10-18 17:53:47 +01:00

backmerge

This commit is contained in:
J. Nick Koston
2025-10-13 14:10:56 -10:00
parent c9a1664398
commit 453ab0adb8

View File

@@ -180,6 +180,13 @@ template<typename T> class FixedVector {
} }
} }
// Helper to reset pointers after cleanup
void reset_() {
data_ = nullptr;
capacity_ = 0;
size_ = 0;
}
public: public:
FixedVector() = default; FixedVector() = default;
@@ -187,25 +194,19 @@ template<typename T> class FixedVector {
// Enable move semantics for use in containers // Enable move semantics for use in containers
FixedVector(FixedVector &&other) noexcept : data_(other.data_), size_(other.size_), capacity_(other.capacity_) { FixedVector(FixedVector &&other) noexcept : data_(other.data_), size_(other.size_), capacity_(other.capacity_) {
other.data_ = nullptr; other.reset_();
other.size_ = 0;
other.capacity_ = 0;
} }
FixedVector &operator=(FixedVector &&other) noexcept { FixedVector &operator=(FixedVector &&other) noexcept {
if (this != &other) { if (this != &other) {
// Delete our current data // Delete our current data
if (data_ != nullptr) { cleanup_();
delete[] data_;
}
// Take ownership of other's data // Take ownership of other's data
data_ = other.data_; data_ = other.data_;
size_ = other.size_; size_ = other.size_;
capacity_ = other.capacity_; capacity_ = other.capacity_;
// Leave other in valid empty state // Leave other in valid empty state
other.data_ = nullptr; other.reset_();
other.size_ = 0;
other.capacity_ = 0;
} }
return *this; return *this;
} }
@@ -213,9 +214,7 @@ template<typename T> class FixedVector {
// Allocate capacity - can be called multiple times to reinit // Allocate capacity - can be called multiple times to reinit
void init(size_t n) { void init(size_t n) {
cleanup_(); cleanup_();
data_ = nullptr; reset_();
capacity_ = 0;
size_ = 0;
if (n > 0) { if (n > 0) {
// Allocate raw memory without calling constructors // Allocate raw memory without calling constructors
data_ = static_cast<T *>(::operator new(n * sizeof(T))); data_ = static_cast<T *>(::operator new(n * sizeof(T)));
@@ -226,6 +225,12 @@ template<typename T> class FixedVector {
// Clear the vector (reset size to 0, keep capacity) // Clear the vector (reset size to 0, keep capacity)
void clear() { size_ = 0; } void clear() { size_ = 0; }
// Shrink capacity to fit current size (frees all memory)
void shrink_to_fit() {
cleanup_();
reset_();
}
/// Add element without bounds checking /// Add element without bounds checking
/// Caller must ensure sufficient capacity was allocated via init() /// Caller must ensure sufficient capacity was allocated via init()
/// Silently ignores pushes beyond capacity (no exception or assertion) /// Silently ignores pushes beyond capacity (no exception or assertion)