| 41 | } // namespace |
| 42 | |
| 43 | TEST_SUBMODULE(class_sh_shared_ptr_copy_move, m) { |
| 44 | namespace py = pybind11; |
| 45 | |
| 46 | py::class_<FooShPtr, std::shared_ptr<FooShPtr>>(m, "FooShPtr") |
| 47 | .def("get_history", &FooShPtr::get_history); |
| 48 | py::classh<FooSmHld>(m, "FooSmHld").def("get_history", &FooSmHld::get_history); |
| 49 | |
| 50 | auto outer = py::class_<Outer>(m, "Outer").def(py::init()); |
| 51 | #define MAKE_PROP(PropTyp) \ |
| 52 | MAKE_PROP_FOO(ShPtr, PropTyp) \ |
| 53 | MAKE_PROP_FOO(SmHld, PropTyp) |
| 54 | |
| 55 | #define MAKE_PROP_FOO(FooTyp, PropTyp) \ |
| 56 | .def_##PropTyp(#FooTyp "_" #PropTyp "_default", &Outer::FooTyp) \ |
| 57 | .def_##PropTyp( \ |
| 58 | #FooTyp "_" #PropTyp "_copy", &Outer::FooTyp, py::return_value_policy::copy) \ |
| 59 | .def_##PropTyp( \ |
| 60 | #FooTyp "_" #PropTyp "_move", &Outer::FooTyp, py::return_value_policy::move) |
| 61 | outer MAKE_PROP(readonly) MAKE_PROP(readwrite); |
| 62 | #undef MAKE_PROP_FOO |
| 63 | |
| 64 | #define MAKE_PROP_FOO(FooTyp, PropTyp) \ |
| 65 | .def_##PropTyp(#FooTyp "_property_" #PropTyp "_default", &Outer::FooTyp) \ |
| 66 | .def_property_##PropTyp(#FooTyp "_property_" #PropTyp "_copy", \ |
| 67 | &Outer::get##FooTyp, \ |
| 68 | py::return_value_policy::copy) \ |
| 69 | .def_property_##PropTyp(#FooTyp "_property_" #PropTyp "_move", \ |
| 70 | &Outer::get##FooTyp, \ |
| 71 | py::return_value_policy::move) |
| 72 | outer MAKE_PROP(readonly); |
| 73 | #undef MAKE_PROP_FOO |
| 74 | #undef MAKE_PROP |
| 75 | |
| 76 | m.def("test_ShPtr_copy", []() { |
| 77 | auto o = std::make_shared<FooShPtr>("copy"); |
| 78 | auto l = py::list(); |
| 79 | l.append(o); |
| 80 | return l; |
| 81 | }); |
| 82 | m.def("test_SmHld_copy", []() { |
| 83 | auto o = std::make_shared<FooSmHld>("copy"); |
| 84 | auto l = py::list(); |
| 85 | l.append(o); |
| 86 | return l; |
| 87 | }); |
| 88 | |
| 89 | m.def("test_ShPtr_move", []() { |
| 90 | auto o = std::make_shared<FooShPtr>("move"); |
| 91 | auto l = py::list(); |
| 92 | l.append(std::move(o)); |
| 93 | return l; |
| 94 | }); |
| 95 | m.def("test_SmHld_move", []() { |
| 96 | auto o = std::make_shared<FooSmHld>("move"); |
| 97 | auto l = py::list(); |
| 98 | l.append(std::move(o)); |
| 99 | return l; |
| 100 | }); |