[core] Combine set_component_source_ + register_component_ into one call

Add an optional `source_index` parameter to `App.register_component_()`
so codegen can emit a single registration line per component instead of
two. On a typical large config (~120 components) this saves ~120 lines
in generated main.cpp and one virtual-method dispatch per component
during setup().
This commit is contained in:
J. Nick Koston
2026-04-26 14:15:06 -05:00
parent e87e78c544
commit 7aaef02eed
2 changed files with 8 additions and 4 deletions
+5 -1
View File
@@ -382,7 +382,11 @@ class Application {
/// Register a component, detecting loop() override at compile time.
/// Uses HasLoopOverride<T> which handles ambiguous &T::loop from multiple inheritance.
template<typename T> void register_component_(T *comp) {
/// Optionally sets the component source index in the same call to avoid emitting
/// a separate set_component_source_() line in generated code.
template<typename T> void register_component_(T *comp, uint8_t source_index = 0) {
if (source_index != 0)
comp->set_component_source_(source_index);
this->register_component_impl_(comp, HasLoopOverride<T>::value);
}
+3 -3
View File
@@ -197,9 +197,9 @@ async def register_component(var, config):
)
if name is not None:
idx = register_component_source(name)
add(var.set_component_source_(idx))
add(App.register_component_(var))
add(App.register_component_(var, idx))
else:
add(App.register_component_(var))
# Collect C++ type for compile-time looping component count
comp_entries = CORE.data.setdefault("looping_component_entries", [])