@@ -73,14 +73,67 @@ void wrap(py::module_ m, const char *py_class_name) {
73
73
m.def (" AddInCppUniquePtr" , AddInCppUniquePtr<SerNo>, py::arg (" obj" ), py::arg (" other_val" ));
74
74
}
75
75
76
+
77
+ struct Passenger {
78
+ std::string mtxt;
79
+ Passenger (const std::string& txt = " DefaultCtor" ) : mtxt(txt) {}
80
+ Passenger (const Passenger &other) { mtxt = other.mtxt + " _CpCtor" ; }
81
+ Passenger (Passenger &&other) { mtxt = other.mtxt + " _MvCtor" ; }
82
+ };
83
+ struct ConsumerBase {
84
+ ConsumerBase () = default ;
85
+ ConsumerBase (const ConsumerBase&) = default ;
86
+ ConsumerBase (ConsumerBase&&) = default ;
87
+ virtual ~ConsumerBase () = default ;
88
+ virtual void pass_uq_cref (const std::unique_ptr<Passenger>& obj) = 0;
89
+ virtual void pass_lref (Passenger &obj) = 0;
90
+ virtual void pass_cref (const Passenger &obj) = 0;
91
+ };
92
+ struct ConsumerBaseAlias : ConsumerBase {
93
+ using ConsumerBase::ConsumerBase;
94
+ void pass_uq_cref (const std::unique_ptr<Passenger> &obj) override { PYBIND11_OVERRIDE_PURE (void , ConsumerBase, pass_uq_cref, obj); }
95
+ void pass_lref (Passenger &obj) override { PYBIND11_OVERRIDE_PURE (void , ConsumerBase, pass_lref, obj); }
96
+ void pass_cref (const Passenger &obj) override { PYBIND11_OVERRIDE_PURE (void , ConsumerBase, pass_cref, obj); }
97
+ };
98
+
99
+ // check roundtrip of Passenger send to ConsumerBaseAlias
100
+ // TODO: Find template magic to avoid code duplication
101
+ std::string check_roundtrip_uq_cref (ConsumerBase &consumer) {
102
+ std::unique_ptr<Passenger> obj (new Passenger (" " ));
103
+ consumer.pass_uq_cref (obj);
104
+ return obj->mtxt ;
105
+ }
106
+ std::string check_roundtrip_lref (ConsumerBase &consumer) {
107
+ Passenger obj (" " );
108
+ consumer.pass_lref (obj);
109
+ return obj.mtxt ;
110
+ }
111
+ std::string check_roundtrip_cref (ConsumerBase &consumer) {
112
+ Passenger obj (" " );
113
+ consumer.pass_cref (obj);
114
+ return obj.mtxt ;
115
+ }
116
+
76
117
} // namespace test_class_sh_with_alias
77
118
} // namespace pybind11_tests
78
119
79
120
PYBIND11_SMART_HOLDER_TYPE_CASTERS (pybind11_tests::test_class_sh_with_alias::Abase<0 >)
80
121
PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_with_alias::Abase<1 >)
122
+ PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_with_alias::Passenger)
123
+ PYBIND11_SMART_HOLDER_TYPE_CASTERS(pybind11_tests::test_class_sh_with_alias::ConsumerBase)
81
124
82
125
TEST_SUBMODULE(class_sh_with_alias, m) {
83
126
using namespace pybind11_tests ::test_class_sh_with_alias;
84
127
wrap<0 >(m, " Abase0" );
85
128
wrap<1 >(m, " Abase1" );
129
+
130
+ py::classh<Passenger>(m, " Passenger" )
131
+ .def_readwrite (" mtxt" , &Passenger::mtxt);
132
+
133
+ py::classh<ConsumerBase, ConsumerBaseAlias>(m, " ConsumerBase" )
134
+ .def (py::init<>());
135
+
136
+ m.def (" check_roundtrip_uq_cref" , check_roundtrip_uq_cref);
137
+ m.def (" check_roundtrip_lref" , check_roundtrip_lref);
138
+ m.def (" check_roundtrip_cref" , check_roundtrip_cref);
86
139
}
0 commit comments