diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 670d009..b3ec6c5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -25,6 +25,7 @@ set_directory_properties(PROPERTIES CORRADE_USE_PEDANTIC_FLAGS ON) +add_subdirectory(Corrade) add_subdirectory(Magnum) if(WITH_PYTHON) diff --git a/src/Corrade/CMakeLists.txt b/src/Corrade/CMakeLists.txt new file mode 100644 index 0000000..70dc5da --- /dev/null +++ b/src/Corrade/CMakeLists.txt @@ -0,0 +1,30 @@ +# +# This file is part of Magnum. +# +# Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 +# Vladimír Vondruš +# +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included +# in all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL +# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. +# + +if(WITH_PYTHON) + add_custom_target(CorradePython SOURCES Python.h) + set_target_properties(CorradePython PROPERTIES FOLDER "Corrade/Python") + install(FILES Python.h DESTINATION ${CORRADE_INCLUDE_INSTALL_DIR}) +endif() diff --git a/src/Corrade/Python.h b/src/Corrade/Python.h new file mode 100644 index 0000000..d29a048 --- /dev/null +++ b/src/Corrade/Python.h @@ -0,0 +1,56 @@ +#ifndef Corrade_Python_h +#define Corrade_Python_h +/* + This file is part of Magnum. + + Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019 + Vladimír Vondruš + + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the "Software"), + to deal in the Software without restriction, including without limitation + the rights to use, copy, modify, merge, publish, distribute, sublicense, + and/or sell copies of the Software, and to permit persons to whom the + Software is furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL + THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. +*/ + +#include +#include + +namespace Corrade { + +template inline pybind11::handle pyHandleFromInstance(T& obj) { + /** @todo don't tell me there's no API for this either, ugh */ + return pybind11::detail::get_object_handle(&obj, pybind11::detail::get_type_info(typeid(T))); +} + +template inline pybind11::object pyObjectFromInstance(T& obj) { + /* reinterpret_borrow?! seriously?! */ + return pybind11::reinterpret_borrow(pyHandleFromInstance(obj)); +} + +template inline T& pyInstanceFromHandle(pybind11::handle handle) { + /** @todo and this?! ugh! there's handle.cast() but that calls + caster.load(handle, true) which we DO NOT WANT */ + /* Stolen from pybind11::class_::def_buffer(). Not sure what exactly it + does, but I assume caster is implicitly convertible to Class& and thus + can magically access the actual Class from the PyObject. */ + pybind11::detail::make_caster caster; + CORRADE_INTERNAL_ASSERT(caster.load(handle, /*convert=*/false)); + return caster; +} + +} + +#endif