mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 23:21:54 +00:00 
			
		
		
		
	[core] Use FixedVector for automation condition vectors to save 384 bytes flash (#11237)
This commit is contained in:
		| @@ -7,6 +7,7 @@ | |||||||
| #include "esphome/core/preferences.h" | #include "esphome/core/preferences.h" | ||||||
| #include "esphome/core/scheduler.h" | #include "esphome/core/scheduler.h" | ||||||
| #include "esphome/core/application.h" | #include "esphome/core/application.h" | ||||||
|  | #include "esphome/core/helpers.h" | ||||||
|  |  | ||||||
| #include <vector> | #include <vector> | ||||||
|  |  | ||||||
| @@ -14,7 +15,7 @@ namespace esphome { | |||||||
|  |  | ||||||
| template<typename... Ts> class AndCondition : public Condition<Ts...> { | template<typename... Ts> class AndCondition : public Condition<Ts...> { | ||||||
|  public: |  public: | ||||||
|   explicit AndCondition(const std::vector<Condition<Ts...> *> &conditions) : conditions_(conditions) {} |   explicit AndCondition(std::initializer_list<Condition<Ts...> *> conditions) : conditions_(conditions) {} | ||||||
|   bool check(Ts... x) override { |   bool check(Ts... x) override { | ||||||
|     for (auto *condition : this->conditions_) { |     for (auto *condition : this->conditions_) { | ||||||
|       if (!condition->check(x...)) |       if (!condition->check(x...)) | ||||||
| @@ -25,12 +26,12 @@ template<typename... Ts> class AndCondition : public Condition<Ts...> { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   std::vector<Condition<Ts...> *> conditions_; |   FixedVector<Condition<Ts...> *> conditions_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template<typename... Ts> class OrCondition : public Condition<Ts...> { | template<typename... Ts> class OrCondition : public Condition<Ts...> { | ||||||
|  public: |  public: | ||||||
|   explicit OrCondition(const std::vector<Condition<Ts...> *> &conditions) : conditions_(conditions) {} |   explicit OrCondition(std::initializer_list<Condition<Ts...> *> conditions) : conditions_(conditions) {} | ||||||
|   bool check(Ts... x) override { |   bool check(Ts... x) override { | ||||||
|     for (auto *condition : this->conditions_) { |     for (auto *condition : this->conditions_) { | ||||||
|       if (condition->check(x...)) |       if (condition->check(x...)) | ||||||
| @@ -41,7 +42,7 @@ template<typename... Ts> class OrCondition : public Condition<Ts...> { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   std::vector<Condition<Ts...> *> conditions_; |   FixedVector<Condition<Ts...> *> conditions_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template<typename... Ts> class NotCondition : public Condition<Ts...> { | template<typename... Ts> class NotCondition : public Condition<Ts...> { | ||||||
| @@ -55,7 +56,7 @@ template<typename... Ts> class NotCondition : public Condition<Ts...> { | |||||||
|  |  | ||||||
| template<typename... Ts> class XorCondition : public Condition<Ts...> { | template<typename... Ts> class XorCondition : public Condition<Ts...> { | ||||||
|  public: |  public: | ||||||
|   explicit XorCondition(const std::vector<Condition<Ts...> *> &conditions) : conditions_(conditions) {} |   explicit XorCondition(std::initializer_list<Condition<Ts...> *> conditions) : conditions_(conditions) {} | ||||||
|   bool check(Ts... x) override { |   bool check(Ts... x) override { | ||||||
|     size_t result = 0; |     size_t result = 0; | ||||||
|     for (auto *condition : this->conditions_) { |     for (auto *condition : this->conditions_) { | ||||||
| @@ -66,7 +67,7 @@ template<typename... Ts> class XorCondition : public Condition<Ts...> { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|  protected: |  protected: | ||||||
|   std::vector<Condition<Ts...> *> conditions_; |   FixedVector<Condition<Ts...> *> conditions_; | ||||||
| }; | }; | ||||||
|  |  | ||||||
| template<typename... Ts> class LambdaCondition : public Condition<Ts...> { | template<typename... Ts> class LambdaCondition : public Condition<Ts...> { | ||||||
|   | |||||||
| @@ -197,6 +197,18 @@ template<typename T> class FixedVector { | |||||||
|  public: |  public: | ||||||
|   FixedVector() = default; |   FixedVector() = default; | ||||||
|  |  | ||||||
|  |   /// Constructor from initializer list - allocates exact size needed | ||||||
|  |   /// This enables brace initialization: FixedVector<int> v = {1, 2, 3}; | ||||||
|  |   FixedVector(std::initializer_list<T> init_list) { | ||||||
|  |     init(init_list.size()); | ||||||
|  |     size_t idx = 0; | ||||||
|  |     for (const auto &item : init_list) { | ||||||
|  |       new (data_ + idx) T(item); | ||||||
|  |       ++idx; | ||||||
|  |     } | ||||||
|  |     size_ = init_list.size(); | ||||||
|  |   } | ||||||
|  |  | ||||||
|   ~FixedVector() { cleanup_(); } |   ~FixedVector() { cleanup_(); } | ||||||
|  |  | ||||||
|   // Disable copy operations (avoid accidental expensive copies) |   // Disable copy operations (avoid accidental expensive copies) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user