From d36a7488aeb0c885b32e1cd01f832481f7061dc4 Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Sun, 10 Jan 2021 13:09:30 -0800 Subject: [PATCH] Adding shared_ptr, shared_ptr casters. --- .../test_type_caster_bare_interface_demo.cpp | 82 +++++++++++++++---- tests/test_type_caster_bare_interface_demo.py | 10 +++ 2 files changed, 77 insertions(+), 15 deletions(-) diff --git a/tests/test_type_caster_bare_interface_demo.cpp b/tests/test_type_caster_bare_interface_demo.cpp index 35ebaf88b..78f6fb5dd 100644 --- a/tests/test_type_caster_bare_interface_demo.cpp +++ b/tests/test_type_caster_bare_interface_demo.cpp @@ -1,5 +1,7 @@ #include "pybind11_tests.h" +#include + namespace pybind11_tests { namespace type_caster_bare_interface_demo { @@ -19,6 +21,12 @@ const char* pass_mpty_mref(mpty&) { return "load_mref"; } const char* pass_mpty_cptr(mpty const*) { return "load_cptr"; } const char* pass_mpty_mptr(mpty*) { return "load_mptr"; } +std::shared_ptr rtrn_mpty_shmp() { return std::shared_ptr(new mpty); } +std::shared_ptr rtrn_mpty_shcp() { return std::shared_ptr(new mpty); } + +const char* pass_mpty_shmp(std::shared_ptr) { return "load_shmp"; } +const char* pass_mpty_shcp(std::shared_ptr) { return "load_shcp"; } + } // namespace type_caster_bare_interface_demo } // namespace pybind11_tests @@ -66,11 +74,11 @@ struct type_caster { template using cast_op_type = conditional_t< - std::is_same, const mpty*>::value, const mpty*, + std::is_same, mpty const*>::value, mpty const*, conditional_t< std::is_same, mpty*>::value, mpty*, conditional_t< - std::is_same::value, const mpty&, + std::is_same::value, mpty const&, conditional_t< std::is_same::value, mpty&, conditional_t< @@ -85,7 +93,45 @@ struct type_caster { operator mpty*() { return rtrn_mpty_mptr(); } bool load(handle /*src*/, bool /*convert*/) { - return true; + return true; + } +}; + +template <> +struct type_caster> { + static constexpr auto name = _>(); + + static handle cast(const std::shared_ptr& /*src*/, + return_value_policy /*policy*/, + handle /*parent*/) { + return str("cast_shmp").release(); + } + + template using cast_op_type = std::shared_ptr; + + operator std::shared_ptr() { return rtrn_mpty_shmp(); } + + bool load(handle /*src*/, bool /*convert*/) { + return true; + } +}; + +template <> +struct type_caster> { + static constexpr auto name = _>(); + + static handle cast(const std::shared_ptr& /*src*/, + return_value_policy /*policy*/, + handle /*parent*/) { + return str("cast_shcp").release(); + } + + template using cast_op_type = std::shared_ptr; + + operator std::shared_ptr() { return rtrn_mpty_shcp(); } + + bool load(handle /*src*/, bool /*convert*/) { + return true; } }; @@ -96,19 +142,25 @@ namespace pybind11_tests { namespace type_caster_bare_interface_demo { TEST_SUBMODULE(type_caster_bare_interface_demo, m) { - m.def("rtrn_mpty_valu", rtrn_mpty_valu); - m.def("rtrn_mpty_rref", rtrn_mpty_rref); - m.def("rtrn_mpty_cref", rtrn_mpty_cref); - m.def("rtrn_mpty_mref", rtrn_mpty_mref); - m.def("rtrn_mpty_cptr", rtrn_mpty_cptr); - m.def("rtrn_mpty_mptr", rtrn_mpty_mptr); + m.def("rtrn_mpty_valu", rtrn_mpty_valu); + m.def("rtrn_mpty_rref", rtrn_mpty_rref); + m.def("rtrn_mpty_cref", rtrn_mpty_cref); + m.def("rtrn_mpty_mref", rtrn_mpty_mref); + m.def("rtrn_mpty_cptr", rtrn_mpty_cptr); + m.def("rtrn_mpty_mptr", rtrn_mpty_mptr); - m.def("pass_mpty_valu", pass_mpty_valu); - m.def("pass_mpty_rref", pass_mpty_rref); - m.def("pass_mpty_cref", pass_mpty_cref); - m.def("pass_mpty_mref", pass_mpty_mref); - m.def("pass_mpty_cptr", pass_mpty_cptr); - m.def("pass_mpty_mptr", pass_mpty_mptr); + m.def("pass_mpty_valu", pass_mpty_valu); + m.def("pass_mpty_rref", pass_mpty_rref); + m.def("pass_mpty_cref", pass_mpty_cref); + m.def("pass_mpty_mref", pass_mpty_mref); + m.def("pass_mpty_cptr", pass_mpty_cptr); + m.def("pass_mpty_mptr", pass_mpty_mptr); + + m.def("rtrn_mpty_shmp", rtrn_mpty_shmp); + m.def("rtrn_mpty_shcp", rtrn_mpty_shcp); + + m.def("pass_mpty_shmp", pass_mpty_shmp); + m.def("pass_mpty_shcp", pass_mpty_shcp); } } // namespace type_caster_bare_interface_demo diff --git a/tests/test_type_caster_bare_interface_demo.py b/tests/test_type_caster_bare_interface_demo.py index a166b2684..97e34c8df 100644 --- a/tests/test_type_caster_bare_interface_demo.py +++ b/tests/test_type_caster_bare_interface_demo.py @@ -20,3 +20,13 @@ def test_load(): assert m.pass_mpty_mref(None) == "load_mref" assert m.pass_mpty_cptr(None) == "load_cptr" assert m.pass_mpty_mptr(None) == "load_mptr" + + +def test_cast_shared_ptr(): + assert m.rtrn_mpty_shmp() == "cast_shmp" + assert m.rtrn_mpty_shcp() == "cast_shcp" + + +def test_load_shared_ptr(): + assert m.pass_mpty_shmp(None) == "load_shmp" + assert m.pass_mpty_shcp(None) == "load_shcp"