diff --git a/cppwinrt/code_writers.h b/cppwinrt/code_writers.h index ab119ae89..3567a90c4 100644 --- a/cppwinrt/code_writers.h +++ b/cppwinrt/code_writers.h @@ -206,6 +206,17 @@ namespace cppwinrt return { w, write_close_namespace }; } + [[nodiscard]] static finish_with wrap_impl_namespace_without_export(writer& w) + { + auto format = R"(namespace winrt::impl +{ +)"; + + w.write(format); + + return { w, write_close_namespace }; + } + [[nodiscard]] static finish_with wrap_std_namespace(writer& w) { w.write(R"(namespace std @@ -873,14 +884,29 @@ namespace cppwinrt w.write(" % %;\n", get_field_abi(w, field), field.Name()); } - static void write_struct_abi(writer& w, TypeDef const& type) + static void write_struct_abi_type(writer& w, TypeDef const& type) { auto abi_guard = w.push_abi_types(true); auto format = R"( struct struct_% { % }; - template <> struct abi<@::%> +)"; + + type_name type_name(type); + auto impl_name = get_impl_name(type_name.name_space, type_name.name); + + w.write(format, + impl_name, + bind_each(type.FieldList())); + + } + + static void write_struct_abi_specialization(writer& w, TypeDef const& type) + { + auto abi_guard = w.push_abi_types(true); + + auto format = R"( template <> struct abi<@::%> { using type = struct_%; }; @@ -890,8 +916,6 @@ namespace cppwinrt auto impl_name = get_impl_name(type_name.name_space, type_name.name); w.write(format, - impl_name, - bind_each(type.FieldList()), type_name.name_space, type_name.name, impl_name); diff --git a/cppwinrt/file_writers.h b/cppwinrt/file_writers.h index fd9833cb1..690bb042b 100644 --- a/cppwinrt/file_writers.h +++ b/cppwinrt/file_writers.h @@ -95,7 +95,7 @@ namespace cppwinrt w.write_each(members.contracts); } { - auto wrap_impl = wrap_impl_namespace(w); + auto wrap_impl = wrap_impl_namespace_without_export(w); w.write_each(members.interfaces, "interface_category"); w.write_each(members.classes, "class_category"); w.write_each(members.enums, "enum_category"); @@ -119,7 +119,16 @@ namespace cppwinrt w.write_each(members.interfaces); w.write_each(members.delegates); w.write_each(members.interfaces); - w.write_each(members.structs); + } + + { + auto wrap_impl = wrap_impl_namespace(w); + w.write_each(members.structs); + } + + { + auto wrap_impl = wrap_impl_namespace_without_export(w); + w.write_each(members.structs); } write_close_file_guard(w);