mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +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/scheduler.h" | ||||
| #include "esphome/core/application.h" | ||||
| #include "esphome/core/helpers.h" | ||||
|  | ||||
| #include <vector> | ||||
|  | ||||
| @@ -14,7 +15,7 @@ namespace esphome { | ||||
|  | ||||
| template<typename... Ts> class AndCondition : public Condition<Ts...> { | ||||
|  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 { | ||||
|     for (auto *condition : this->conditions_) { | ||||
|       if (!condition->check(x...)) | ||||
| @@ -25,12 +26,12 @@ template<typename... Ts> class AndCondition : public Condition<Ts...> { | ||||
|   } | ||||
|  | ||||
|  protected: | ||||
|   std::vector<Condition<Ts...> *> conditions_; | ||||
|   FixedVector<Condition<Ts...> *> conditions_; | ||||
| }; | ||||
|  | ||||
| template<typename... Ts> class OrCondition : public Condition<Ts...> { | ||||
|  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 { | ||||
|     for (auto *condition : this->conditions_) { | ||||
|       if (condition->check(x...)) | ||||
| @@ -41,7 +42,7 @@ template<typename... Ts> class OrCondition : public Condition<Ts...> { | ||||
|   } | ||||
|  | ||||
|  protected: | ||||
|   std::vector<Condition<Ts...> *> conditions_; | ||||
|   FixedVector<Condition<Ts...> *> conditions_; | ||||
| }; | ||||
|  | ||||
| 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...> { | ||||
|  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 { | ||||
|     size_t result = 0; | ||||
|     for (auto *condition : this->conditions_) { | ||||
| @@ -66,7 +67,7 @@ template<typename... Ts> class XorCondition : public Condition<Ts...> { | ||||
|   } | ||||
|  | ||||
|  protected: | ||||
|   std::vector<Condition<Ts...> *> conditions_; | ||||
|   FixedVector<Condition<Ts...> *> conditions_; | ||||
| }; | ||||
|  | ||||
| template<typename... Ts> class LambdaCondition : public Condition<Ts...> { | ||||
|   | ||||
| @@ -197,6 +197,18 @@ template<typename T> class FixedVector { | ||||
|  public: | ||||
|   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_(); } | ||||
|  | ||||
|   // Disable copy operations (avoid accidental expensive copies) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user