19 void *get_cpp_conduit_void_ptr(PyObject *py_obj,
const std::type_info *cpp_type_info) {
20 PyObject *cpp_type_info_capsule
21 = PyCapsule_New(
const_cast<void *
>(
static_cast<const void *
>(cpp_type_info)),
22 typeid(std::type_info).
name(),
24 if (cpp_type_info_capsule ==
nullptr) {
27 PyObject *cpp_conduit = PyObject_CallMethod(py_obj,
28 "_pybind11_conduit_v1_",
31 cpp_type_info_capsule,
32 "raw_pointer_ephemeral");
33 Py_DECREF(cpp_type_info_capsule);
34 if (cpp_conduit ==
nullptr) {
37 void *void_ptr = PyCapsule_GetPointer(cpp_conduit, cpp_type_info->name());
38 Py_DECREF(cpp_conduit);
39 if (PyErr_Occurred()) {
46 T *get_cpp_conduit_type_ptr(PyObject *py_obj) {
47 void *void_ptr = get_cpp_conduit_void_ptr(py_obj, &
typeid(
T));
48 if (void_ptr ==
nullptr) {
51 return static_cast<T *
>(void_ptr);
54 extern "C" PyObject *wrapGetLuggage(PyObject * , PyObject *traveler) {
55 const auto *cpp_traveler
56 = get_cpp_conduit_type_ptr<pybind11_tests::test_cpp_conduit::Traveler>(traveler);
57 if (cpp_traveler ==
nullptr) {
60 return PyUnicode_FromString(cpp_traveler->luggage.c_str());
63 extern "C" PyObject *wrapGetPoints(PyObject * , PyObject *premium_traveler) {
64 const auto *cpp_premium_traveler
65 = get_cpp_conduit_type_ptr<pybind11_tests::test_cpp_conduit::PremiumTraveler>(
67 if (cpp_premium_traveler ==
nullptr) {
70 return PyLong_FromLong(
static_cast<long>(cpp_premium_traveler->points));
73 PyMethodDef ThisMethodDef[] = {{
"GetLuggage", wrapGetLuggage, METH_O,
nullptr},
74 {
"GetPoints", wrapGetPoints, METH_O,
nullptr},
75 {
nullptr,
nullptr, 0,
nullptr}};
77 struct PyModuleDef ThisModuleDef = {
78 PyModuleDef_HEAD_INIT,
91 #if defined(WIN32) || defined(_WIN32)
92 # define EXO_PLANET_C_API_EXPORT __declspec(dllexport)
94 # define EXO_PLANET_C_API_EXPORT __attribute__((visibility("default")))
98 PyObject *
m = PyModule_Create(&ThisModuleDef);