| 139 | } // namespace test_class_sh_mi_thunks |
| 140 | |
| 141 | TEST_SUBMODULE(class_sh_mi_thunks, m) { |
| 142 | using namespace test_class_sh_mi_thunks; |
| 143 | |
| 144 | m.def("ptrdiff_drvd_base0", []() { |
| 145 | auto drvd = std::unique_ptr<Derived>(new Derived); |
| 146 | auto *base0 = dynamic_cast<Base0 *>(drvd.get()); |
| 147 | return std::ptrdiff_t(reinterpret_cast<char *>(drvd.get()) |
| 148 | - reinterpret_cast<char *>(base0)); |
| 149 | }); |
| 150 | |
| 151 | py::classh<Base0>(m, "Base0"); |
| 152 | py::classh<Base1>(m, "Base1"); |
| 153 | py::classh<Derived, Base1, Base0>(m, "Derived"); |
| 154 | |
| 155 | m.def( |
| 156 | "get_drvd_as_base0_raw_ptr", |
| 157 | []() { |
| 158 | auto *drvd = new Derived; |
| 159 | auto *base0 = dynamic_cast<Base0 *>(drvd); |
| 160 | return base0; |
| 161 | }, |
| 162 | py::return_value_policy::take_ownership); |
| 163 | |
| 164 | m.def("get_drvd_as_base0_shared_ptr", []() { |
| 165 | auto drvd = std::make_shared<Derived>(); |
| 166 | auto base0 = std::dynamic_pointer_cast<Base0>(drvd); |
| 167 | return base0; |
| 168 | }); |
| 169 | |
| 170 | m.def("get_drvd_as_base0_unique_ptr", []() { |
| 171 | auto drvd = std::unique_ptr<Derived>(new Derived); |
| 172 | auto base0 = std::unique_ptr<Base0>(std::move(drvd)); |
| 173 | return base0; |
| 174 | }); |
| 175 | |
| 176 | m.def("vec_size_base0_raw_ptr", [](const Base0 *obj) { |
| 177 | const auto *obj_der = dynamic_cast<const Derived *>(obj); |
| 178 | if (obj_der == nullptr) { |
| 179 | return std::size_t(0); |
| 180 | } |
| 181 | return obj_der->vec.size(); |
| 182 | }); |
| 183 | |
| 184 | m.def("vec_size_base0_shared_ptr", [](const std::shared_ptr<Base0> &obj) -> std::size_t { |
| 185 | const auto obj_der = std::dynamic_pointer_cast<Derived>(obj); |
| 186 | if (!obj_der) { |
| 187 | return std::size_t(0); |
| 188 | } |
| 189 | return obj_der->vec.size(); |
| 190 | }); |
| 191 | |
| 192 | m.def("vec_size_base0_unique_ptr", [](std::unique_ptr<Base0> obj) -> std::size_t { |
| 193 | const auto *obj_der = dynamic_cast<const Derived *>(obj.get()); |
| 194 | if (obj_der == nullptr) { |
| 195 | return std::size_t(0); |
| 196 | } |
| 197 | return obj_der->vec.size(); |
| 198 | }); |
nothing calls this directly
no test coverage detected