@@ -2035,13 +2035,39 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable<T, D, %>
2035
2035
{
2036
2036
for (auto && [name, info] : interfaces)
2037
2037
{
2038
- if (!info.overridable )
2038
+ if (!info.overridable && !info. is_protected )
2039
2039
{
2040
2040
w.write (" , %" , name);
2041
2041
}
2042
2042
}
2043
2043
}
2044
2044
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
+
2045
2071
static void write_class_override_defaults (writer& w, get_interfaces_t const & interfaces)
2046
2072
{
2047
2073
bool first = true ;
@@ -2073,6 +2099,18 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable<T, D, %>
2073
2099
}
2074
2100
}
2075
2101
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
+
2076
2114
static void write_call_factory (writer& w, TypeDef const & type, TypeDef const & factory)
2077
2115
{
2078
2116
std::string factory_name;
@@ -2243,10 +2281,10 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable<T, D, %>
2243
2281
auto format = R"( template <typename D, typename... Interfaces>
2244
2282
struct %T :
2245
2283
implements<D%, composing, Interfaces...>,
2246
- impl::require<D%>,
2284
+ impl::require<D%>% ,
2247
2285
impl::base<D, %%>%
2248
2286
{
2249
- using composable = %;
2287
+ using composable = %;%
2250
2288
protected:
2251
2289
%% };
2252
2290
)" ;
@@ -2258,10 +2296,12 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable<T, D, %>
2258
2296
type_name,
2259
2297
bind<write_class_override_implements>(interfaces),
2260
2298
bind<write_class_override_requires>(interfaces),
2299
+ bind<write_class_override_protected_requires>(interfaces),
2261
2300
type_name,
2262
2301
bind<write_class_override_bases>(type),
2263
2302
bind<write_class_override_defaults>(interfaces),
2264
2303
type_name,
2304
+ bind<write_class_override_friends>(interfaces),
2265
2305
bind<write_class_override_constructors>(type, factories),
2266
2306
bind<write_class_override_usings>(interfaces));
2267
2307
}
@@ -2326,18 +2366,21 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable<T, D, %>
2326
2366
2327
2367
for (auto && [interface_name, info] : get_interfaces (w, type))
2328
2368
{
2329
- if (info.defaulted && !info.base )
2369
+ if (! info.is_protected && !info.overridable )
2330
2370
{
2331
- for ( auto && method : info.type . MethodList () )
2371
+ if (info. defaulted && ! info.base )
2332
2372
{
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
+ }
2334
2377
}
2335
- }
2336
- else
2337
- {
2338
- for (auto && method : info.type .MethodList ())
2378
+ else
2339
2379
{
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
+ }
2341
2384
}
2342
2385
}
2343
2386
}
@@ -2804,7 +2847,7 @@ struct WINRT_IMPL_EMPTY_BASES produce_dispatch_to_overridable<T, D, %>
2804
2847
2805
2848
for (auto && [interface_name, info] : get_interfaces (w, type))
2806
2849
{
2807
- if (!info.defaulted || info.base )
2850
+ if (( !info.defaulted || info.base ) && (!info. is_protected && !info. overridable ) )
2808
2851
{
2809
2852
if (first)
2810
2853
{
0 commit comments