pybind11.h 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #pragma once
  2. #include "internal/class.h"
  3. namespace pkbind {
  4. namespace literals {
  5. inline arg operator""_a (const char* c, size_t) { return arg(c); }
  6. } // namespace literals
  7. inline bool initialized = false;
  8. /// initialize the vm.
  9. inline void initialize(int object_pool_size = 1024) {
  10. if(!initialized) { py_initialize(); }
  11. // initialize all registers.
  12. reg<0>.value = py_getreg(0);
  13. reg<1>.value = py_getreg(1);
  14. reg<2>.value = py_getreg(2);
  15. reg<3>.value = py_getreg(3);
  16. reg<4>.value = py_getreg(4);
  17. reg<5>.value = py_getreg(5);
  18. reg<6>.value = py_getreg(6);
  19. // initialize ret.
  20. retv.value = py_retval();
  21. // initialize object pool.
  22. object_pool::initialize(object_pool_size);
  23. m_type_map = new std::unordered_map<std::type_index, py_Type>();
  24. // register types.
  25. capsule::register_();
  26. cpp_function::register_();
  27. action::initialize();
  28. initialized = true;
  29. }
  30. /// finalize the vm.
  31. inline void finalize(bool test = false) {
  32. if(!initialized) { return; }
  33. delete m_type_map;
  34. m_type_map = nullptr;
  35. object_pool::finalize();
  36. if(test) {
  37. py_resetvm();
  38. } else {
  39. py_finalize();
  40. }
  41. }
  42. /// a RAII class to initialize and finalize python interpreter
  43. class scoped_interpreter {
  44. public:
  45. scoped_interpreter(int object_pool_size = 1024) { initialize(object_pool_size); }
  46. ~scoped_interpreter() { finalize(); }
  47. };
  48. } // namespace pkbind
  49. namespace pybind11 = pkbind;