in cppwinrt/helpers.h [430:499]
static auto get_interfaces(writer& w, TypeDef const& type)
{
w.abi_types = false;
get_interfaces_t result;
get_interfaces_impl(w, result, false, false, false, {}, type.InterfaceImpl());
for (auto&& base : get_bases(type))
{
get_interfaces_impl(w, result, false, false, true, {}, base.InterfaceImpl());
}
if (!has_fastabi(type))
{
return result;
}
auto count = std::count_if(result.begin(), result.end(), [](auto&& pair)
{
return pair.second.exclusive && !pair.second.base && !pair.second.overridable;
});
std::partial_sort(result.begin(), result.begin() + count, result.end(), [](auto&& left_pair, auto&& right_pair)
{
auto& left = left_pair.second;
auto& right = right_pair.second;
// Sort by base before is_default because each base will have a default.
if (left.base != right.base)
{
return !left.base;
}
if (left.is_default != right.is_default)
{
return left.is_default;
}
if (left.overridable != right.overridable)
{
return !left.overridable;
}
if (left.exclusive != right.exclusive)
{
return left.exclusive;
}
auto left_enabled = is_always_enabled(left.type);
auto right_enabled = is_always_enabled(right.type);
if (left_enabled != right_enabled)
{
return left_enabled;
}
if (left.version != right.version)
{
return left.version < right.version;
}
return left_pair.first < right_pair.first;
});
std::for_each_n(result.begin(), count, [](auto && pair)
{
pair.second.fastabi = true;
});
return result;
}