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