6 changed files with 163 additions and 6 deletions
@ -0,0 +1,62 @@ |
|||||||
|
#ifndef Corrade_Containers_OptionalPythonBindings_h |
||||||
|
#define Corrade_Containers_OptionalPythonBindings_h |
||||||
|
/*
|
||||||
|
This file is part of Magnum. |
||||||
|
|
||||||
|
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, |
||||||
|
2020, 2021 Vladimír Vondruš <mosra@centrum.cz> |
||||||
|
|
||||||
|
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 <pybind11/pybind11.h> |
||||||
|
#include <Corrade/Containers/Optional.h> |
||||||
|
|
||||||
|
namespace pybind11 { namespace detail { |
||||||
|
|
||||||
|
/* pybind11/stl.h has optional_caster for this, but that relies on a value_type
|
||||||
|
typedef that Optional doesn't have, so adapting a copy of it, also without |
||||||
|
std::is_lvalue_reference<T>::value, which is not a thing here */ |
||||||
|
template<class T> struct type_caster<Corrade::Containers::Optional<T>> { |
||||||
|
using value_conv = make_caster<T>; |
||||||
|
|
||||||
|
template<class T_> static handle cast(T_&& src, const return_value_policy policy, const handle parent) { |
||||||
|
if(!src) return none{}.inc_ref(); |
||||||
|
return value_conv::cast(*std::forward<T_>(src), return_value_policy_override<T>::policy(policy), parent); |
||||||
|
} |
||||||
|
|
||||||
|
bool load(const handle src, bool convert) { |
||||||
|
if(!src) return false; |
||||||
|
|
||||||
|
/* default-constructed value is already empty */ |
||||||
|
if(src.is_none()) return true; |
||||||
|
|
||||||
|
value_conv inner_caster; |
||||||
|
if(!inner_caster.load(src, convert)) return false; |
||||||
|
|
||||||
|
value.emplace(cast_op<T&&>(std::move(inner_caster))); |
||||||
|
return true; |
||||||
|
} |
||||||
|
|
||||||
|
PYBIND11_TYPE_CASTER(Corrade::Containers::Optional<T>, _("Optional[") + value_conv::name + _("]")); |
||||||
|
}; |
||||||
|
|
||||||
|
}} |
||||||
|
|
||||||
|
#endif |
||||||
@ -0,0 +1,75 @@ |
|||||||
|
/*
|
||||||
|
This file is part of Magnum. |
||||||
|
|
||||||
|
Copyright © 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, |
||||||
|
2020, 2021 Vladimír Vondruš <mosra@centrum.cz> |
||||||
|
|
||||||
|
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 <pybind11/pybind11.h> |
||||||
|
|
||||||
|
#include "../bootstrap.h" /* for module / _module alias */ |
||||||
|
|
||||||
|
#include "Corrade/Containers/OptionalPythonBindings.h" |
||||||
|
|
||||||
|
using namespace Corrade; |
||||||
|
namespace py = pybind11; |
||||||
|
|
||||||
|
namespace { |
||||||
|
|
||||||
|
struct Foo { |
||||||
|
Foo(int a): a{a} {} |
||||||
|
int a; |
||||||
|
}; |
||||||
|
|
||||||
|
Containers::Optional<int> simpleType(bool set) { |
||||||
|
return set ? Containers::optional(5) : Containers::NullOpt; |
||||||
|
} |
||||||
|
|
||||||
|
Containers::Optional<Foo> nestedType(bool set) { |
||||||
|
return set ? Containers::optional(Foo{15}) : Containers::NullOpt; |
||||||
|
} |
||||||
|
|
||||||
|
int acquireSimpleType(Containers::Optional<int> value) { |
||||||
|
return value ? *value : -1; |
||||||
|
} |
||||||
|
|
||||||
|
int acquireNestedType(Containers::Optional<Foo> value) { |
||||||
|
return value ? value->a : -1; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
/* TODO: remove declaration when https://github.com/pybind/pybind11/pull/1863
|
||||||
|
is released */ |
||||||
|
extern "C" PYBIND11_EXPORT PyObject* PyInit_test_optional(); |
||||||
|
PYBIND11_MODULE(test_optional, m) { |
||||||
|
py::module_::import("corrade.containers"); |
||||||
|
|
||||||
|
py::class_<Foo>{m, "Foo"} |
||||||
|
.def(py::init<int>()) |
||||||
|
.def_readwrite("a", &Foo::a); |
||||||
|
|
||||||
|
m.def("simple_type", simpleType); |
||||||
|
m.def("nested_type", nestedType); |
||||||
|
|
||||||
|
m.def("acquire_simple_type", acquireSimpleType); |
||||||
|
m.def("acquire_nested_type", acquireNestedType); |
||||||
|
} |
||||||
Loading…
Reference in new issue