static void write_delegate_definition()

in cppwinrt/code_writers.h [2520:2647]


    static void write_delegate_definition(writer& w, TypeDef const& type)
    {
        auto generics = type.GenericParam();
        auto guard{ w.push_generic_params(generics) };
        auto type_name = type.TypeName();
        method_signature signature{ get_delegate_method(type) };

        if (!empty(generics))
        {
            auto format = R"(    template <%> template <typename L> %<%>::%(L handler) :
        %(impl::make_delegate<%<%>>(std::forward<L>(handler)))
    {
    }
    template <%> template <typename F> %<%>::%(F* handler) :
        %([=](auto&&... args) { return handler(args...); })
    {
    }
    template <%> template <typename O, typename M> %<%>::%(O* object, M method) :
        %([=](auto&&... args) { return ((*object).*(method))(args...); })
    {
    }
    template <%> template <typename O, typename M> %<%>::%(com_ptr<O>&& object, M method) :
        %([o = std::move(object), method](auto&&... args) { return ((*o).*(method))(args...); })
    {
    }
    template <%> template <typename O, typename M> %<%>::%(weak_ref<O>&& object, M method) :
        %([o = std::move(object), method](auto&&... args) { if (auto s = o.get()) { ((*s).*(method))(args...); } })
    {
    }
    template <%> auto %<%>::operator()(%) const
    {%
        check_hresult((*(impl::abi_t<%<%>>**)this)->Invoke(%));%
    }
)";

            type_name = remove_tick(type_name);

            w.write(format,
                bind<write_generic_typenames>(generics),
                type_name,
                bind_list(", ", generics),
                type_name,
                type_name,
                type_name,
                bind_list(", ", generics),
                bind<write_generic_typenames>(generics),
                type_name,
                bind_list(", ", generics),
                type_name,
                type_name,
                bind<write_generic_typenames>(generics),
                type_name,
                bind_list(", ", generics),
                type_name,
                type_name,
                bind<write_generic_typenames>(generics),
                type_name,
                bind_list(", ", generics),
                type_name,
                type_name,
                bind<write_generic_typenames>(generics),
                type_name,
                bind_list(", ", generics),
                type_name,
                type_name,
                bind<write_generic_typenames>(generics),
                type_name,
                bind_list(", ", generics),
                bind<write_consume_params>(signature),
                bind<write_consume_return_type>(signature, true),
                type_name,
                bind_list(", ", generics),
                bind<write_abi_args>(signature),
                bind<write_consume_return_statement>(signature));
        }
        else
        {
            auto format = R"(    template <typename L> %::%(L handler) :
        %(impl::make_delegate<%>(std::forward<L>(handler)))
    {
    }
    template <typename F> %::%(F* handler) :
        %([=](auto&&... args) { return handler(args...); })
    {
    }
    template <typename O, typename M> %::%(O* object, M method) :
        %([=](auto&&... args) { return ((*object).*(method))(args...); })
    {
    }
    template <typename O, typename M> %::%(com_ptr<O>&& object, M method) :
        %([o = std::move(object), method](auto&&... args) { return ((*o).*(method))(args...); })
    {
    }
    template <typename O, typename M> %::%(weak_ref<O>&& object, M method) :
        %([o = std::move(object), method](auto&&... args) { if (auto s = o.get()) { ((*s).*(method))(args...); } })
    {
    }
    inline auto %::operator()(%) const
    {%
        check_hresult((*(impl::abi_t<%>**)this)->Invoke(%));%
    }
)";

            w.write(format,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                type_name,
                bind<write_consume_params>(signature),
                bind<write_consume_return_type>(signature, true),
                type_name,
                bind<write_abi_args>(signature),
                bind<write_consume_return_statement>(signature));
        }
    }