| #include "pybind11_tests.h" |
| |
| #include <memory> |
| |
| namespace pybind11_tests { |
| namespace class_sh_trampoline_basic { |
| |
| struct Abase { |
| int val = 0; |
| virtual ~Abase() = default; |
| explicit Abase(int val_) : val{val_} {} |
| int Get() const { return val * 10 + 3; } |
| virtual int Add(int other_val) const = 0; |
| |
| // Some compilers complain about implicitly defined versions of some of the following: |
| Abase(const Abase &) = default; |
| Abase(Abase &&) noexcept = default; |
| Abase &operator=(const Abase &) = default; |
| Abase &operator=(Abase &&) noexcept = default; |
| }; |
| |
| struct AbaseAlias : Abase, py::trampoline_self_life_support { |
| using Abase::Abase; |
| |
| int Add(int other_val) const override { |
| PYBIND11_OVERRIDE_PURE(int, /* Return type */ |
| Abase, /* Parent class */ |
| Add, /* Name of function in C++ (must match Python name) */ |
| other_val); |
| } |
| }; |
| |
| int AddInCppRawPtr(const Abase *obj, int other_val) { return obj->Add(other_val) * 10 + 7; } |
| |
| int AddInCppSharedPtr(const std::shared_ptr<Abase> &obj, int other_val) { |
| return obj->Add(other_val) * 100 + 11; |
| } |
| |
| int AddInCppUniquePtr(std::unique_ptr<Abase> obj, int other_val) { |
| return obj->Add(other_val) * 100 + 13; |
| } |
| |
| } // namespace class_sh_trampoline_basic |
| } // namespace pybind11_tests |
| |
| using namespace pybind11_tests::class_sh_trampoline_basic; |
| |
| TEST_SUBMODULE(class_sh_trampoline_basic, m) { |
| py::classh<Abase, AbaseAlias>(m, "Abase") |
| .def(py::init<int>(), py::arg("val")) |
| .def("Get", &Abase::Get) |
| .def("Add", &Abase::Add, py::arg("other_val")); |
| |
| m.def("AddInCppRawPtr", AddInCppRawPtr, py::arg("obj"), py::arg("other_val")); |
| m.def("AddInCppSharedPtr", AddInCppSharedPtr, py::arg("obj"), py::arg("other_val")); |
| m.def("AddInCppUniquePtr", AddInCppUniquePtr, py::arg("obj"), py::arg("other_val")); |
| } |