@@ -31,6 +31,15 @@ struct Foo {
31
31
using FooShPtr = Foo<0 >;
32
32
using FooSmHld = Foo<1 >;
33
33
34
+ struct Outer {
35
+ std::shared_ptr<FooShPtr> ShPtr;
36
+ std::shared_ptr<FooSmHld> SmHld;
37
+ Outer ()
38
+ : ShPtr(std::make_shared<FooShPtr>(" Outer" )), SmHld(std::make_shared<FooSmHld>(" Outer" )) {}
39
+ std::shared_ptr<FooShPtr> getShPtr () const { return ShPtr; }
40
+ std::shared_ptr<FooSmHld> getSmHld () const { return SmHld; }
41
+ };
42
+
34
43
} // namespace
35
44
} // namespace pybind11_tests
36
45
@@ -48,6 +57,32 @@ TEST_SUBMODULE(class_sh_shared_ptr_copy_move, m) {
48
57
.def (" get_history" , &FooShPtr::get_history);
49
58
py::classh<FooSmHld>(m, " FooSmHld" ).def (" get_history" , &FooSmHld::get_history);
50
59
60
+ auto outer = py::class_<Outer>(m, " Outer" ).def (py::init ());
61
+ #define MAKE_PROP (PropTyp ) \
62
+ MAKE_PROP_FOO (ShPtr, PropTyp) \
63
+ MAKE_PROP_FOO (SmHld, PropTyp)
64
+
65
+ #define MAKE_PROP_FOO (FooTyp, PropTyp ) \
66
+ .def_ ##PropTyp (#FooTyp " _" #PropTyp " _default" , &Outer::FooTyp) \
67
+ .def_ ##PropTyp ( \
68
+ #FooTyp " _" #PropTyp " _copy" , &Outer::FooTyp, py::return_value_policy::copy) \
69
+ .def_ ##PropTyp ( \
70
+ #FooTyp " _" #PropTyp " _move" , &Outer::FooTyp, py::return_value_policy::move)
71
+ outer MAKE_PROP (readonly) MAKE_PROP (readwrite);
72
+ #undef MAKE_PROP_FOO
73
+
74
+ #define MAKE_PROP_FOO (FooTyp, PropTyp ) \
75
+ .def_ ##PropTyp (#FooTyp " _property_" #PropTyp " _default" , &Outer::FooTyp) \
76
+ .def_property_ ##PropTyp (#FooTyp " _property_" #PropTyp " _copy" , \
77
+ &Outer::get##FooTyp, \
78
+ py::return_value_policy::copy) \
79
+ .def_property_ ##PropTyp (#FooTyp " _property_" #PropTyp " _move" , \
80
+ &Outer::get##FooTyp, \
81
+ py::return_value_policy::move)
82
+ outer MAKE_PROP (readonly);
83
+ #undef MAKE_PROP_FOO
84
+ #undef MAKE_PROP
85
+
51
86
m.def (" test_ShPtr_copy" , []() {
52
87
auto o = std::make_shared<FooShPtr>(" copy" );
53
88
auto l = py::list ();
0 commit comments