in cppwinrt/component_writers.h [371:543]
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* winrt_make_%()
{
return winrt::detach_abi(winrt::make<winrt::@::factory_implementation::%>());
}
)";
w.write(format,
impl_name,
type_namespace,
type_name);
}
if (!settings.component_opt)
{
return;
}
auto wrap_type = wrap_type_namespace(w, type_namespace);
for (auto&&[factory_name, factory] : get_factories(w, type))
{
if (factory.type && is_always_disabled(factory.type))
{
continue;
}
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 = signature.is_async();
if (is_add_overload(method) || is_remove_overload(method))
{
auto format = R"( % %::%(%)
{
auto f = make<winrt::@::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"( % %::%(%)
{
%@::implementation::%::%(%);
}
)";
bool ignore_return = is_put_overload(method) || !signature.return_signature();
w.write(format,
signature.return_signature(),
type_name,
method_name,
bind<write_consume_params>(signature),
ignore_return ? "" : "return ",
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<winrt::@::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));
}
}
}
}
}