#ifndef MRUBYPP_H #define MRUBYPP_H #include "arena_guard.h" #include "bind_class.h" #include "converters.h" #include #include #include #include namespace mrubypp { class engine { public: engine() { mrb_ = mrb_open(); } ~engine() { mrb_close(mrb_); } void load(const std::string &str) { if (!mrb_) return; mrb_load_string(mrb_, str.c_str()); } template T call(const std::string &funcName) { arena_guard guard(mrb_); mrb_value result = mrb_funcall(mrb_, mrb_top_self(mrb_), funcName.data(), 0); return converter::from_mrb(mrb_, result); } template T call(const std::string &funcName, Args... args) { arena_guard guard(mrb_); mrb_value argv[] = {converter::to_mrb(mrb_, args)...}; mrb_sym sym = mrb_intern_cstr(mrb_, funcName.data()); mrb_value result = mrb_funcall_argv(mrb_, mrb_top_self(mrb_), sym, sizeof...(Args), argv); return converter::from_mrb(mrb_, result); } template class_builder class_builder(const std::string &class_name) { return class_builder(mrb_, class_name); } [[nodiscard]] mrb_state *get_mrb() const { return mrb_; } private: mrb_state *mrb_; }; } // namespace mrubypp #endif // MRUBYPP_H