in src/tool/python/code_writers.h [1432:1596]
void write_pinterface_impl(writer& w, TypeDef const& type)
{
if (!is_ptype(type))
return;
auto guard{ w.push_generic_params(type.GenericParam()) };
w.write("\ntemplate<%>\nstruct @ : public py::proj::%::@\n{\n",
bind_list<write_template_arg>(", ", type.GenericParam()),
type.TypeName(),
bind<write_type_namespace>(type),
type.TypeName());
{
writer::indent_guard g{ w };
w.write("@(%<%> o) : _obj(o) {}\n", type.TypeName(), type, bind_list<write_template_arg_name>(", ", type.GenericParam()));
w.write("winrt::Windows::Foundation::IUnknown const& get_unknown() noexcept override { return _obj; }\n");
w.write("std::size_t hash() noexcept override { return py::get_instance_hash(_obj); }\n");
std::set<std::string_view> method_names{};
enumerate_methods(w, type, [&](auto const& method)
{
method_names.insert(method.Name());
});
for (auto&& method_name : method_names)
{
w.write("PyObject* %(PyObject* args) noexcept override\n{\n", method_name);
{
writer::indent_guard gg{ w };
write_method_overloads(w, type, method_name);
}
w.write("}\n");
}
enumerate_properties(w, type, [&](auto const& prop)
{
auto methods = get_property_methods(prop);
auto get_method = std::get<0>(methods);
auto put_method = std::get<1>(methods);
w.write("PyObject* %() noexcept override\n{\n", get_method.Name());
{
writer::indent_guard gg{ w };
write_try_catch(w, [&](writer& w) { write_method_body_contents(w, type, get_method); });
}
w.write("}\n");
if (put_method)
{
w.write("int %(PyObject* arg) noexcept override\n{\n", put_method.Name());
{
writer::indent_guard gg{ w };
write_setter_try_catch(w, [&](writer& w) { write_method_body_contents(w, type, put_method, true); });
}
w.write("}\n");
}
});
enumerate_events(w, type, [&](auto const& evt)
{
auto methods = get_event_methods(evt);
auto add_method = std::get<0>(methods);
auto remove_method = std::get<1>(methods);
w.write("PyObject* %(PyObject* arg) noexcept override\n{\n", add_method.Name());
{
writer::indent_guard gg{ w };
write_try_catch(w, [&](writer& w) { write_method_body_contents(w, type, add_method); });
}
w.write("}\n");
w.write("PyObject* %(PyObject* arg) noexcept override\n{\n", remove_method.Name());
{
writer::indent_guard gg{ w };
write_try_catch(w, [&](writer& w) { write_method_body_contents(w, type, remove_method); });
}
w.write("}\n");
});
if (implements_iasync(type))
{
w.write("PyObject* dunder_await() noexcept override { return py::dunder_await(_obj); }\n");
}
if (implements_iiterable(type) || implements_iiterator(type))
{
w.write("PyObject* dunder_iter() noexcept override\n{\n");
{
writer::indent_guard gg{ w };
write_dunder_iter_body(w, type);
}
w.write("}\n");
}
if (implements_iiterator(type))
{
w.write("PyObject* dunder_iternext() noexcept override\n{\n");
{
writer::indent_guard gg{ w };
write_dunder_iter_next_body(w, type);
}
w.write("}\n");
}
if (implements_sequence(type))
{
w.write("Py_ssize_t seq_length() noexcept override\n{\n");
{
writer::indent_guard gg{ w };
write_seq_length_body(w, type);
}
w.write("}\n");
w.write("PyObject* seq_item(Py_ssize_t i) noexcept override\n{\n");
{
writer::indent_guard gg{ w };
write_seq_item_body(w, type);
}
w.write("}\n");
if (implements_ivector(type))
{
w.write("int seq_assign(Py_ssize_t i, PyObject* value) noexcept override\n{\n");
{
writer::indent_guard gg{ w };
write_seq_assign_body(w, type);
}
w.write("}\n");
}
}
if (implements_mapping(type))
{
w.write("Py_ssize_t map_length() noexcept override\n{\n");
{
writer::indent_guard gg{ w };
write_map_length_body(w, type);
}
w.write("}\n");
w.write("PyObject* map_subscript(PyObject* key) noexcept override\n{\n");
{
writer::indent_guard gg{ w };
write_map_subscript_body(w, type);
}
w.write("}\n");
if (implements_imap(type))
{
w.write("int map_assign(PyObject* key, PyObject* value) noexcept override\n{\n");
{
writer::indent_guard gg{ w };
write_map_assign_body(w, type);
}
w.write("}\n");
}
}
w.write("\n%<%> _obj{ nullptr };\n", type, bind_list<write_template_arg_name>(", ", type.GenericParam()));
}
w.write("};\n");
}