@@ -2035,13 +2035,39 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable<T, D, %>
20352035 {
20362036 for (auto && [name, info] : interfaces)
20372037 {
2038- if (!info.overridable )
2038+ if (!info.overridable && !info. is_protected )
20392039 {
20402040 w.write (" , %" , name);
20412041 }
20422042 }
20432043 }
20442044
2045+ static void write_class_override_protected_requires (writer& w, get_interfaces_t const & interfaces)
2046+ {
2047+ bool first = true ;
2048+
2049+ for (auto && [name, info] : interfaces)
2050+ {
2051+ if (info.is_protected )
2052+ {
2053+ if (first)
2054+ {
2055+ first = false ;
2056+ w.write (" ,\n protected impl::require<D, %" , name);
2057+ }
2058+ else
2059+ {
2060+ w.write (" , %" , name);
2061+ }
2062+ }
2063+ }
2064+
2065+ if (!first)
2066+ {
2067+ w.write (' >' );
2068+ }
2069+ }
2070+
20452071 static void write_class_override_defaults (writer& w, get_interfaces_t const & interfaces)
20462072 {
20472073 bool first = true ;
@@ -2073,6 +2099,18 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable<T, D, %>
20732099 }
20742100 }
20752101
2102+ static void write_class_override_friends (writer& w, get_interfaces_t const & interfaces)
2103+ {
2104+ for (auto && [name, info] : interfaces)
2105+ {
2106+ if (info.is_protected )
2107+ {
2108+ w.write (" \n friend impl::consume_t<D, %>;" , name);
2109+ w.write (" \n friend impl::require_one<D, %>;" , name);
2110+ }
2111+ }
2112+ }
2113+
20762114 static void write_call_factory (writer& w, TypeDef const & type, TypeDef const & factory)
20772115 {
20782116 std::string factory_name;
@@ -2243,10 +2281,10 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable<T, D, %>
22432281 auto format = R"( template <typename D, typename... Interfaces>
22442282 struct %T :
22452283 implements<D%, composing, Interfaces...>,
2246- impl::require<D%>,
2284+ impl::require<D%>% ,
22472285 impl::base<D, %%>%
22482286 {
2249- using composable = %;
2287+ using composable = %;%
22502288 protected:
22512289%% };
22522290)" ;
@@ -2258,10 +2296,12 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable<T, D, %>
22582296 type_name,
22592297 bind<write_class_override_implements>(interfaces),
22602298 bind<write_class_override_requires>(interfaces),
2299+ bind<write_class_override_protected_requires>(interfaces),
22612300 type_name,
22622301 bind<write_class_override_bases>(type),
22632302 bind<write_class_override_defaults>(interfaces),
22642303 type_name,
2304+ bind<write_class_override_friends>(interfaces),
22652305 bind<write_class_override_constructors>(type, factories),
22662306 bind<write_class_override_usings>(interfaces));
22672307 }
@@ -2326,18 +2366,21 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable<T, D, %>
23262366
23272367 for (auto && [interface_name, info] : get_interfaces (w, type))
23282368 {
2329- if (info.defaulted && !info.base )
2369+ if (! info.is_protected && !info.overridable )
23302370 {
2331- for ( auto && method : info.type . MethodList () )
2371+ if (info. defaulted && ! info.base )
23322372 {
2333- method_usage[get_name (method)].insert (default_interface_name);
2373+ for (auto && method : info.type .MethodList ())
2374+ {
2375+ method_usage[get_name (method)].insert (default_interface_name);
2376+ }
23342377 }
2335- }
2336- else
2337- {
2338- for (auto && method : info.type .MethodList ())
2378+ else
23392379 {
2340- method_usage[get_name (method)].insert (interface_name);
2380+ for (auto && method : info.type .MethodList ())
2381+ {
2382+ method_usage[get_name (method)].insert (interface_name);
2383+ }
23412384 }
23422385 }
23432386 }
@@ -2804,7 +2847,7 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable<T, D, %>
28042847
28052848 for (auto && [interface_name, info] : get_interfaces (w, type))
28062849 {
2807- if (!info.defaulted || info.base )
2850+ if (( !info.defaulted || info.base ) && (!info. is_protected && !info. overridable ) )
28082851 {
28092852 if (first)
28102853 {
0 commit comments