mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	wip
This commit is contained in:
		| @@ -1,7 +1,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
| #include "esphome/components/binary_sensor/binary_sensor.h" | #include "esphome/components/binary_sensor/binary_sensor.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "esphome/core/automation.h" | #include "esphome/core/automation.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
| #include "esphome/components/cover/cover.h" | #include "esphome/components/cover/cover.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "esphome/core/preferences.h" | #include "esphome/core/preferences.h" | ||||||
| #include "esphome/core/time.h" | #include "esphome/core/time.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace template_ { | namespace template_ { | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "esphome/core/preferences.h" | #include "esphome/core/preferences.h" | ||||||
| #include "esphome/core/time.h" | #include "esphome/core/time.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace template_ { | namespace template_ { | ||||||
|   | |||||||
| @@ -9,7 +9,7 @@ | |||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "esphome/core/preferences.h" | #include "esphome/core/preferences.h" | ||||||
| #include "esphome/core/time.h" | #include "esphome/core/time.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace template_ { | namespace template_ { | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "esphome/core/automation.h" | #include "esphome/core/automation.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
| #include "esphome/components/lock/lock.h" | #include "esphome/components/lock/lock.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
| #include "esphome/core/automation.h" | #include "esphome/core/automation.h" | ||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "esphome/core/preferences.h" | #include "esphome/core/preferences.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace template_ { | namespace template_ { | ||||||
|   | |||||||
| @@ -4,7 +4,7 @@ | |||||||
| #include "esphome/core/automation.h" | #include "esphome/core/automation.h" | ||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "esphome/core/preferences.h" | #include "esphome/core/preferences.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace template_ { | namespace template_ { | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| #pragma once | #pragma once | ||||||
|  |  | ||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
| #include "esphome/components/sensor/sensor.h" | #include "esphome/components/sensor/sensor.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "esphome/core/automation.h" | #include "esphome/core/automation.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
| #include "esphome/components/switch/switch.h" | #include "esphome/components/switch/switch.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
|   | |||||||
| @@ -1,51 +0,0 @@ | |||||||
| #pragma once |  | ||||||
|  |  | ||||||
| #include "esphome/core/optional.h" |  | ||||||
|  |  | ||||||
| namespace esphome { |  | ||||||
|  |  | ||||||
| /** Lightweight wrapper for template platform lambdas (stateless function pointers only). |  | ||||||
|  * |  | ||||||
|  * This optimizes template platforms by storing only a function pointer (4 bytes on ESP32) |  | ||||||
|  * instead of std::function (16-32 bytes). |  | ||||||
|  * |  | ||||||
|  * IMPORTANT: This only supports stateless lambdas (no captures). The set_template() method |  | ||||||
|  * is an internal API used by YAML codegen, not intended for external use. |  | ||||||
|  * |  | ||||||
|  * Lambdas must return optional<T> to support the pattern: |  | ||||||
|  *   return {};    // Don't publish a value |  | ||||||
|  *   return 42.0;  // Publish this value |  | ||||||
|  * |  | ||||||
|  * operator() returns optional<T>, returning nullopt when no lambda is set (nullptr check). |  | ||||||
|  * |  | ||||||
|  * @tparam T The return type (e.g., float for sensor values) |  | ||||||
|  * @tparam Args Optional arguments for the lambda |  | ||||||
|  */ |  | ||||||
| template<typename T, typename... Args> class TemplateLambda { |  | ||||||
|  public: |  | ||||||
|   TemplateLambda() : f_(nullptr) {} |  | ||||||
|  |  | ||||||
|   /** Set the lambda function pointer. |  | ||||||
|    * INTERNAL API: Only for use by YAML codegen. |  | ||||||
|    * Only stateless lambdas (no captures) are supported. |  | ||||||
|    */ |  | ||||||
|   void set(optional<T> (*f)(Args...)) { this->f_ = f; } |  | ||||||
|  |  | ||||||
|   /** Check if a lambda is set */ |  | ||||||
|   bool has_value() const { return this->f_ != nullptr; } |  | ||||||
|  |  | ||||||
|   /** Call the lambda, returning nullopt if no lambda is set */ |  | ||||||
|   optional<T> operator()(Args... args) { |  | ||||||
|     if (this->f_ == nullptr) |  | ||||||
|       return nullopt; |  | ||||||
|     return this->f_(args...); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   /** Alias for operator() for compatibility */ |  | ||||||
|   optional<T> call(Args... args) { return (*this)(args...); } |  | ||||||
|  |  | ||||||
|  protected: |  | ||||||
|   optional<T> (*f_)(Args...);  // Function pointer (4 bytes on ESP32) |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| }  // namespace esphome |  | ||||||
| @@ -4,7 +4,7 @@ | |||||||
| #include "esphome/core/automation.h" | #include "esphome/core/automation.h" | ||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "esphome/core/preferences.h" | #include "esphome/core/preferences.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
| namespace template_ { | namespace template_ { | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "esphome/core/automation.h" | #include "esphome/core/automation.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
| #include "esphome/components/text_sensor/text_sensor.h" | #include "esphome/components/text_sensor/text_sensor.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
|   | |||||||
| @@ -2,7 +2,7 @@ | |||||||
|  |  | ||||||
| #include "esphome/core/component.h" | #include "esphome/core/component.h" | ||||||
| #include "esphome/core/automation.h" | #include "esphome/core/automation.h" | ||||||
| #include "../template_lambda.h" | #include "esphome/core/template_lambda.h" | ||||||
| #include "esphome/components/valve/valve.h" | #include "esphome/components/valve/valve.h" | ||||||
|  |  | ||||||
| namespace esphome { | namespace esphome { | ||||||
|   | |||||||
| @@ -10,7 +10,7 @@ esphome: | |||||||
|         state: !lambda "return 42.0;" |         state: !lambda "return 42.0;" | ||||||
|  |  | ||||||
|     # Test C++ API: set_template() with stateless lambda (no captures) |     # Test C++ API: set_template() with stateless lambda (no captures) | ||||||
|     # IMPORTANT: set_template() is an internal API. Only stateless lambdas are supported. |     # NOTE: set_template() is not intended to be a public API, but we test it to ensure it doesn't break. | ||||||
|     - lambda: |- |     - lambda: |- | ||||||
|         id(template_sens).set_template([]() -> esphome::optional<float> { |         id(template_sens).set_template([]() -> esphome::optional<float> { | ||||||
|           return 123.0f; |           return 123.0f; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user