// Copyright (c) 2024 The pybind Community. // In production situations it is totally fine to build with // C++ Exception Handling enabled. However, here we want to ensure that // C++ Exception Handling is not required. #if defined(_MSC_VER) || defined(__EMSCRIPTEN__) // Too much trouble making the required cmake changes (see PR #5375). #else # ifdef __cpp_exceptions // https://isocpp.org/std/standing-documents/sd-6-sg10-feature-test-recommendations#__cpp_exceptions # error This test is meant to be built with C++ Exception Handling disabled, but __cpp_exceptions is defined. # endif # ifdef __EXCEPTIONS // https://gcc.gnu.org/onlinedocs/cpp/Common-Predefined-Macros.html # error This test is meant to be built with C++ Exception Handling disabled, but __EXCEPTIONS is defined. # endif #endif // THIS MUST STAY AT THE TOP! #include // VERY light-weight dependency. #include "test_cpp_conduit_traveler_types.h" #include namespace { extern "C" PyObject *wrapGetLuggage(PyObject * /*self*/, PyObject *traveler) { const auto *cpp_traveler = pybind11_conduit_v1::get_type_pointer_ephemeral< pybind11_tests::test_cpp_conduit::Traveler>(traveler); if (cpp_traveler == nullptr) { return nullptr; } return PyUnicode_FromString(cpp_traveler->luggage.c_str()); } extern "C" PyObject *wrapGetPoints(PyObject * /*self*/, PyObject *premium_traveler) { const auto *cpp_premium_traveler = pybind11_conduit_v1::get_type_pointer_ephemeral< pybind11_tests::test_cpp_conduit::PremiumTraveler>(premium_traveler); if (cpp_premium_traveler == nullptr) { return nullptr; } return PyLong_FromLong(static_cast(cpp_premium_traveler->points)); } PyMethodDef ThisMethodDef[] = {{"GetLuggage", wrapGetLuggage, METH_O, nullptr}, {"GetPoints", wrapGetPoints, METH_O, nullptr}, {nullptr, nullptr, 0, nullptr}}; struct PyModuleDef ThisModuleDef = { PyModuleDef_HEAD_INIT, // m_base "exo_planet_c_api", // m_name nullptr, // m_doc -1, // m_size ThisMethodDef, // m_methods nullptr, // m_slots nullptr, // m_traverse nullptr, // m_clear nullptr // m_free }; } // namespace #if defined(WIN32) || defined(_WIN32) # define EXO_PLANET_C_API_EXPORT __declspec(dllexport) #else # define EXO_PLANET_C_API_EXPORT __attribute__((visibility("default"))) #endif extern "C" EXO_PLANET_C_API_EXPORT PyObject *PyInit_exo_planet_c_api() { PyObject *m = PyModule_Create(&ThisModuleDef); if (m == nullptr) { return nullptr; } return m; }