module.h 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #pragma once
  2. #include "function.h"
  3. namespace pkbind {
  4. class module : public object {
  5. PKBIND_TYPE_IMPL(object, module, tp_module)
  6. static module __main__() { return module(py_getmodule("__main__"), object::ref_t{}); }
  7. static module import(const char* name) {
  8. raise_call<py_import>(name);
  9. return module(py_retval(), object::realloc_t{});
  10. }
  11. module def_submodule(const char* name, const char* doc = nullptr) {
  12. // auto package = (attr("__package__").cast<std::string>() += ".") += attr("__name__").cast<std::string_view>();
  13. auto fname = (attr("__name__").cast<std::string>() += ".") += name;
  14. auto m = py_newmodule(fname.c_str());
  15. setattr(*this, name, m);
  16. return module(m, object::ref_t{});
  17. }
  18. template <typename Fn, typename... Extras>
  19. module& def(const char* name, Fn&& fn, const Extras... extras) {
  20. impl::bind_function<false, false>(*this, name, std::forward<Fn>(fn), extras...);
  21. return *this;
  22. }
  23. };
  24. using module_ = module;
  25. #define PYBIND11_EMBEDDED_MODULE(name, variable) \
  26. static void _pkbind_register_##name(::pkbind::module& variable); \
  27. namespace pkbind::impl { \
  28. auto _module_##name = [] { \
  29. ::pkbind::action::register_start([] { \
  30. auto m = ::pkbind::module(py_newmodule(#name), ::pkbind::object::ref_t{}); \
  31. _pkbind_register_##name(m); \
  32. }); \
  33. return 1; \
  34. }(); \
  35. } \
  36. static void _pkbind_register_##name(::pkbind::module& variable)
  37. } // namespace pkbind