@@ -73,14 +73,74 @@ 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
+ 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
+
76
122
} // namespace test_class_sh_with_alias
77
123
} // namespace pybind11_tests
78
124
79
125
PYBIND11_SMART_HOLDER_TYPE_CASTERS (pybind11_tests::test_class_sh_with_alias::Abase<0 >)
80
126
PYBIND11_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)
81
129
82
130
TEST_SUBMODULE(class_sh_with_alias, m) {
83
131
using namespace pybind11_tests ::test_class_sh_with_alias;
84
132
wrap<0 >(m, " Abase0" );
85
133
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);
86
146
}
0 commit comments