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