mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 15:12:06 +00:00 
			
		
		
		
	wip
This commit is contained in:
		
							
								
								
									
										51
									
								
								esphome/core/template_lambda.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								esphome/core/template_lambda.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,51 @@ | ||||
| #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 | ||||
		Reference in New Issue
	
	Block a user