7 #ifdef NAP_ENABLE_PYTHON
11 #include <utility/dllexport.h>
13 #include <pybind11/pybind11.h>
14 #include <pybind11/embed.h>
15 #include <pybind11/stl.h>
18 #include <rttr/detail/misc/misc_type_traits.h>
40 inline void GetTypeNamesImpl(std::vector<std::string>& result)
42 result.push_back(rttr::type::get<T>().get_name().data());
45 template<
typename... Targs>
46 inline void GetTypeNames(std::vector<std::string>& result);
48 template<
typename T,
typename... V>
49 inline void GetTypeNamesHelper(std::vector<std::string>& result)
51 GetTypeNamesImpl<T>(result);
52 GetTypeNames<V...>(result);
55 template<
typename... Targs>
56 inline void GetTypeNames(std::vector<std::string>& result)
58 GetTypeNamesHelper<Targs...>(result);
62 inline void GetTypeNames<>(std::vector<std::string>& result)
67 template<
class T,
class BaseClasses>
101 template<
class T,
typename... BaseClasses>
102 class PythonClass<T, rttr::detail::type_list<BaseClasses...>>
105 using PybindClass = pybind11::class_<T, BaseClasses...>;
106 using RegistrationFunction = std::function<void(pybind11::module&, PybindClass&)>;
112 PythonClass(
const std::string& name)
115 int namespace_separator_pos = name.find_last_of(
':');
116 if (namespace_separator_pos != std::string::npos)
117 mName = name.substr(namespace_separator_pos+1);
125 void registerFunction(
const RegistrationFunction&
function)
127 mRegistrationFunctions.push_back(
function);
133 void invoke(pybind11::module& module)
const
135 auto cls = PybindClass(module, mName.c_str());
136 for (
auto& func : mRegistrationFunctions)
145 static void GetBaseTypes(std::vector<std::string>& baseClasses)
147 detail::GetTypeNames<BaseClasses...>(baseClasses);
152 std::vector<std::string> mBaseTypes;
153 std::vector<RegistrationFunction> mRegistrationFunctions;
177 class NAPAPI PythonModule
180 using RegistrationFunction = std::function<void(pybind11::module&)>;
181 using GetBaseTypesFunction = std::function<void(std::vector<std::string>&)>;
188 static PythonModule& get(
const char* moduleName);
193 void registerImportCallback(RegistrationFunction
function);
201 void registerTypeImportCallback(
const std::string& name, GetBaseTypesFunction getBaseTypesFunction, RegistrationFunction registrationFunction);
206 void invoke(pybind11::module& module);
212 struct RegistrationItem
214 GetBaseTypesFunction mGetBaseTypesFunction;
215 RegistrationFunction mRegistrationFunction;
217 using RegistrationMap = std::unordered_map<std::string, RegistrationItem>;
224 void registerTypeRecursive(pybind11::module& module, RegistrationMap::iterator itemToRegister);
226 RegistrationMap mRegistrationMap;
227 std::vector<RegistrationFunction> mImportCallbacks;