in src/tool/cppxlang/component_writers.h [340:508]
static void write_component_g_cpp(writer& w, TypeDef const& type)
{
auto type_name = type.TypeName();
auto type_namespace = type.TypeNamespace();
auto impl_name = get_impl_name(type_namespace, type_name);
if (has_factory_members(w, type))
{
auto format = R"(void* xlang_make_%()
{
return xlang::detach_abi(xlang::make<xlang::@::factory_implementation::%>());
}
)";
w.write(format,
impl_name,
type_namespace,
type_name);
}
if (!settings.component_opt)
{
return;
}
write_type_namespace(w, type_namespace);
for (auto&&[factory_name, factory] : get_factories(w, type))
{
if (factory.activatable)
{
if (!factory.type)
{
auto format = R"( %::%() :
%(make<@::implementation::%>())
{
}
)";
w.write(format,
type_name,
type_name,
type_name,
type_namespace,
type_name);
}
else
{
for (auto&& method : factory.type.MethodList())
{
method_signature signature{ method };
auto format = R"( %::%(%) :
%(make<@::implementation::%>(%))
{
}
)";
w.write(format,
type_name,
type_name,
bind<write_consume_params>(signature),
type_name,
type_namespace,
type_name,
bind<write_consume_args>(signature));
}
}
}
else if (factory.composable && factory.visible)
{
for (auto&& method : factory.type.MethodList())
{
method_signature signature{ method };
auto& params = signature.params();
params.resize(params.size() - 2);
auto format = R"( %::%(%) :
%(make<@::implementation::%>(%))
{
}
)";
w.write(format,
type_name,
type_name,
bind<write_consume_params>(signature),
type_name,
type_namespace,
type_name,
bind<write_consume_args>(signature));
}
}
else if (factory.statics)
{
for (auto&& method : factory.type.MethodList())
{
method_signature signature{ method };
auto method_name = get_name(method);
w.async_types = is_async(method, signature);
if (is_add_overload(method) || is_remove_overload(method))
{
auto format = R"( % %::%(%)
{
auto f = make<xlang::@::factory_implementation::%>().as<%>();
return f.%(%);
}
)";
w.write(format,
signature.return_signature(),
type_name,
method_name,
bind<write_consume_params>(signature),
type_namespace,
type_name,
factory_name,
method_name,
bind<write_consume_args>(signature));
}
else
{
auto format = R"( % %::%(%)
{
return @::implementation::%::%(%);
}
)";
w.write(format,
signature.return_signature(),
type_name,
method_name,
bind<write_consume_params>(signature),
type_namespace,
type_name,
method_name,
bind<write_consume_args>(signature));
}
if (is_add_overload(method))
{
auto format = R"( %::%_revoker %::%(auto_revoke_t, %)
{
auto f = make<xlang::@::factory_implementation::%>().as<%>();
return { f, f.%(%) };
}
)";
w.write(format,
type_name,
method_name,
type_name,
method_name,
bind<write_consume_params>(signature),
type_namespace,
type_name,
factory_name,
method_name,
bind<write_consume_args>(signature));
}
}
}
}
write_close_namespace(w);
}