From 7e344330cdeb07d187a0497858b83ead122bdc92 Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Mon, 8 Jul 2024 17:57:56 -0700 Subject: [PATCH 1/2] Bring in tests/pure_cpp/test_class_sh_shared_ptr_copy_move.cpp,py from smart_holder branch as-is (does not build). --- tests/CMakeLists.txt | 1 + tests/test_class_sh_shared_ptr_copy_move.cpp | 112 +++++++++++++++++++ tests/test_class_sh_shared_ptr_copy_move.py | 41 +++++++ 3 files changed, 154 insertions(+) create mode 100644 tests/test_class_sh_shared_ptr_copy_move.cpp create mode 100644 tests/test_class_sh_shared_ptr_copy_move.py diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt index f182e24992..2b4d926cc9 100644 --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -119,6 +119,7 @@ set(PYBIND11_TEST_FILES test_callbacks test_chrono test_class + test_class_sh_shared_ptr_copy_move test_const_name test_constants_and_functions test_copy_move diff --git a/tests/test_class_sh_shared_ptr_copy_move.cpp b/tests/test_class_sh_shared_ptr_copy_move.cpp new file mode 100644 index 0000000000..1d4ec3cdf7 --- /dev/null +++ b/tests/test_class_sh_shared_ptr_copy_move.cpp @@ -0,0 +1,112 @@ +#include + +#include "pybind11_tests.h" + +#include +#include +#include + +namespace pybind11_tests { +namespace { + +const std::string fooNames[] = {"ShPtr_", "SmHld_"}; + +template +struct Foo { + std::string history; + explicit Foo(const std::string &history_) : history(history_) {} + Foo(const Foo &other) : history(other.history + "_CpCtor") {} + Foo(Foo &&other) noexcept : history(other.history + "_MvCtor") {} + Foo &operator=(const Foo &other) { + history = other.history + "_OpEqLv"; + return *this; + } + Foo &operator=(Foo &&other) noexcept { + history = other.history + "_OpEqRv"; + return *this; + } + std::string get_history() const { return "Foo" + fooNames[SerNo] + history; } +}; + +using FooShPtr = Foo<0>; +using FooSmHld = Foo<1>; + +struct Outer { + std::shared_ptr ShPtr; + std::shared_ptr SmHld; + Outer() + : ShPtr(std::make_shared("Outer")), SmHld(std::make_shared("Outer")) {} + std::shared_ptr getShPtr() const { return ShPtr; } + std::shared_ptr getSmHld() const { return SmHld; } +}; + +} // namespace +} // namespace pybind11_tests + +PYBIND11_TYPE_CASTER_BASE_HOLDER(pybind11_tests::FooShPtr, + std::shared_ptr) +PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::FooSmHld) + +namespace pybind11_tests { + +TEST_SUBMODULE(class_sh_shared_ptr_copy_move, m) { + namespace py = pybind11; + + py::class_>(m, "FooShPtr") + .def("get_history", &FooShPtr::get_history); + py::classh(m, "FooSmHld").def("get_history", &FooSmHld::get_history); + + auto outer = py::class_(m, "Outer").def(py::init()); +#define MAKE_PROP(PropTyp) \ + MAKE_PROP_FOO(ShPtr, PropTyp) \ + MAKE_PROP_FOO(SmHld, PropTyp) + +#define MAKE_PROP_FOO(FooTyp, PropTyp) \ + .def_##PropTyp(#FooTyp "_" #PropTyp "_default", &Outer::FooTyp) \ + .def_##PropTyp( \ + #FooTyp "_" #PropTyp "_copy", &Outer::FooTyp, py::return_value_policy::copy) \ + .def_##PropTyp( \ + #FooTyp "_" #PropTyp "_move", &Outer::FooTyp, py::return_value_policy::move) + outer MAKE_PROP(readonly) MAKE_PROP(readwrite); +#undef MAKE_PROP_FOO + +#define MAKE_PROP_FOO(FooTyp, PropTyp) \ + .def_##PropTyp(#FooTyp "_property_" #PropTyp "_default", &Outer::FooTyp) \ + .def_property_##PropTyp(#FooTyp "_property_" #PropTyp "_copy", \ + &Outer::get##FooTyp, \ + py::return_value_policy::copy) \ + .def_property_##PropTyp(#FooTyp "_property_" #PropTyp "_move", \ + &Outer::get##FooTyp, \ + py::return_value_policy::move) + outer MAKE_PROP(readonly); +#undef MAKE_PROP_FOO +#undef MAKE_PROP + + m.def("test_ShPtr_copy", []() { + auto o = std::make_shared("copy"); + auto l = py::list(); + l.append(o); + return l; + }); + m.def("test_SmHld_copy", []() { + auto o = std::make_shared("copy"); + auto l = py::list(); + l.append(o); + return l; + }); + + m.def("test_ShPtr_move", []() { + auto o = std::make_shared("move"); + auto l = py::list(); + l.append(std::move(o)); + return l; + }); + m.def("test_SmHld_move", []() { + auto o = std::make_shared("move"); + auto l = py::list(); + l.append(std::move(o)); + return l; + }); +} + +} // namespace pybind11_tests diff --git a/tests/test_class_sh_shared_ptr_copy_move.py b/tests/test_class_sh_shared_ptr_copy_move.py new file mode 100644 index 0000000000..067bb47d2a --- /dev/null +++ b/tests/test_class_sh_shared_ptr_copy_move.py @@ -0,0 +1,41 @@ +from __future__ import annotations + +from pybind11_tests import class_sh_shared_ptr_copy_move as m + + +def test_shptr_copy(): + txt = m.test_ShPtr_copy()[0].get_history() + assert txt == "FooShPtr_copy" + + +def test_smhld_copy(): + txt = m.test_SmHld_copy()[0].get_history() + assert txt == "FooSmHld_copy" + + +def test_shptr_move(): + txt = m.test_ShPtr_move()[0].get_history() + assert txt == "FooShPtr_move" + + +def test_smhld_move(): + txt = m.test_SmHld_move()[0].get_history() + assert txt == "FooSmHld_move" + + +def _check_property(foo_typ, prop_typ, policy): + o = m.Outer() + name = f"{foo_typ}_{prop_typ}_{policy}" + history = f"Foo{foo_typ}_Outer" + f = getattr(o, name) + assert f.get_history() == history + # and try again to check that o did not get changed + f = getattr(o, name) + assert f.get_history() == history + + +def test_properties(): + for prop_typ in ("readonly", "readwrite", "property_readonly"): + for foo_typ in ("ShPtr", "SmHld"): + for policy in ("default", "copy", "move"): + _check_property(foo_typ, prop_typ, policy) From 75d3a8a432a6f4d838c799b3fc3e240f5b54ee5c Mon Sep 17 00:00:00 2001 From: "Ralf W. Grosse-Kunstleve" Date: Mon, 8 Jul 2024 18:08:04 -0700 Subject: [PATCH 2/2] Strip out smart_holder code and tests from test_class_sh_shared_ptr_copy_move. --- tests/test_class_sh_shared_ptr_copy_move.cpp | 31 ++------------------ tests/test_class_sh_shared_ptr_copy_move.py | 12 +------- 2 files changed, 4 insertions(+), 39 deletions(-) diff --git a/tests/test_class_sh_shared_ptr_copy_move.cpp b/tests/test_class_sh_shared_ptr_copy_move.cpp index 1d4ec3cdf7..75791e657f 100644 --- a/tests/test_class_sh_shared_ptr_copy_move.cpp +++ b/tests/test_class_sh_shared_ptr_copy_move.cpp @@ -1,5 +1,3 @@ -#include - #include "pybind11_tests.h" #include @@ -9,7 +7,7 @@ namespace pybind11_tests { namespace { -const std::string fooNames[] = {"ShPtr_", "SmHld_"}; +const std::string fooNames[] = {"ShPtr_"}; template struct Foo { @@ -29,24 +27,16 @@ struct Foo { }; using FooShPtr = Foo<0>; -using FooSmHld = Foo<1>; struct Outer { std::shared_ptr ShPtr; - std::shared_ptr SmHld; - Outer() - : ShPtr(std::make_shared("Outer")), SmHld(std::make_shared("Outer")) {} + Outer() : ShPtr(std::make_shared("Outer")) {} std::shared_ptr getShPtr() const { return ShPtr; } - std::shared_ptr getSmHld() const { return SmHld; } }; } // namespace } // namespace pybind11_tests -PYBIND11_TYPE_CASTER_BASE_HOLDER(pybind11_tests::FooShPtr, - std::shared_ptr) -PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::FooSmHld) - namespace pybind11_tests { TEST_SUBMODULE(class_sh_shared_ptr_copy_move, m) { @@ -54,12 +44,9 @@ TEST_SUBMODULE(class_sh_shared_ptr_copy_move, m) { py::class_>(m, "FooShPtr") .def("get_history", &FooShPtr::get_history); - py::classh(m, "FooSmHld").def("get_history", &FooSmHld::get_history); auto outer = py::class_(m, "Outer").def(py::init()); -#define MAKE_PROP(PropTyp) \ - MAKE_PROP_FOO(ShPtr, PropTyp) \ - MAKE_PROP_FOO(SmHld, PropTyp) +#define MAKE_PROP(PropTyp) MAKE_PROP_FOO(ShPtr, PropTyp) #define MAKE_PROP_FOO(FooTyp, PropTyp) \ .def_##PropTyp(#FooTyp "_" #PropTyp "_default", &Outer::FooTyp) \ @@ -88,12 +75,6 @@ TEST_SUBMODULE(class_sh_shared_ptr_copy_move, m) { l.append(o); return l; }); - m.def("test_SmHld_copy", []() { - auto o = std::make_shared("copy"); - auto l = py::list(); - l.append(o); - return l; - }); m.def("test_ShPtr_move", []() { auto o = std::make_shared("move"); @@ -101,12 +82,6 @@ TEST_SUBMODULE(class_sh_shared_ptr_copy_move, m) { l.append(std::move(o)); return l; }); - m.def("test_SmHld_move", []() { - auto o = std::make_shared("move"); - auto l = py::list(); - l.append(std::move(o)); - return l; - }); } } // namespace pybind11_tests diff --git a/tests/test_class_sh_shared_ptr_copy_move.py b/tests/test_class_sh_shared_ptr_copy_move.py index 067bb47d2a..ce896afa73 100644 --- a/tests/test_class_sh_shared_ptr_copy_move.py +++ b/tests/test_class_sh_shared_ptr_copy_move.py @@ -8,21 +8,11 @@ def test_shptr_copy(): assert txt == "FooShPtr_copy" -def test_smhld_copy(): - txt = m.test_SmHld_copy()[0].get_history() - assert txt == "FooSmHld_copy" - - def test_shptr_move(): txt = m.test_ShPtr_move()[0].get_history() assert txt == "FooShPtr_move" -def test_smhld_move(): - txt = m.test_SmHld_move()[0].get_history() - assert txt == "FooSmHld_move" - - def _check_property(foo_typ, prop_typ, policy): o = m.Outer() name = f"{foo_typ}_{prop_typ}_{policy}" @@ -36,6 +26,6 @@ def _check_property(foo_typ, prop_typ, policy): def test_properties(): for prop_typ in ("readonly", "readwrite", "property_readonly"): - for foo_typ in ("ShPtr", "SmHld"): + for foo_typ in ("ShPtr",): for policy in ("default", "copy", "move"): _check_property(foo_typ, prop_typ, policy)