static void write_abi_args()

in cppwinrt/code_writers.h [624:710]


    static void write_abi_args(writer& w, method_signature const& method_signature)
    {
        separator s{ w };

        for (auto&& [param, param_signature] : method_signature.params())
        {
            s();
            auto param_name = param.Name();

            TypeDef signature_type;
            auto category = get_category(param_signature->Type(), &signature_type);

            if (param.Flags().In())
            {
                switch (category)
                {
                case param_category::object_type:
                case param_category::string_type:
                    w.write("*(void**)(&%)", param_name);
                    break;
                case param_category::generic_type:
                case param_category::struct_type:
                    w.write("impl::bind_in(%)", param_name);
                    break;
                case param_category::enum_type:
                    w.write("static_cast<%>(%)", signature_type.FieldList().first.Signature().Type(), param_name);
                    break;
                case param_category::fundamental_type:
                    w.write(param_name);
                    break;
                case param_category::array_type:
                    w.write("%.size(), get_abi(%)", param_name, param_name);
                    break;
                }
            }
            else
            {
                switch (category)
                {
                case param_category::fundamental_type:
                    w.write("&%", param_name);
                    break;
                case param_category::enum_type:
                    w.write("reinterpret_cast<%*>(&%)", signature_type.FieldList().first.Signature().Type(), param_name);
                    break;
                case param_category::array_type:
                    if (param_signature->ByRef())
                    {
                        w.write("impl::put_size_abi(%), put_abi(%)", param_name, param_name);
                    }
                    else
                    {
                        w.write("%.size(), put_abi(%)", param_name, param_name);
                    }
                    break;
                default:
                    w.write("impl::bind_out(%)", param_name);
                    break;
                }
            }
        }

        if (method_signature.return_signature())
        {
            s();
            auto param_name = method_signature.return_param_name();
            TypeDef signature_type;
            auto category = get_category(method_signature.return_signature().Type(), &signature_type);

            if (category == param_category::array_type)
            {
                w.write("&%_impl_size, &%", param_name, param_name);
            }
            else if (category == param_category::struct_type || category == param_category::generic_type)
            {
                w.write("put_abi(%)", param_name);
            }
            else if (category == param_category::enum_type)
            {
                w.write("reinterpret_cast<%*>(&%)", signature_type.FieldList().first.Signature().Type(), param_name);
            }
            else
            {
                w.write("&%", param_name);
            }
        }
    }