mirror of
https://github.com/esphome/esphome.git
synced 2025-10-31 23:21:54 +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