| // The compact 4-character naming matches that in test_class_sh_basic.cpp | |
| // Variable names are intentionally terse, to not distract from the more important C++ type names: | |
| // valu(e), ref(erence), ptr or p (pointer), r = rvalue, m = mutable, c = const, | |
| // sh = shared_ptr, uq = unique_ptr. | |
| #include "pybind11_tests.h" | |
| #include <memory> | |
| namespace test_class_sh_property { | |
| struct ClassicField { | |
| int num = -88; | |
| }; | |
| struct ClassicOuter { | |
| ClassicField *m_mptr = nullptr; | |
| const ClassicField *m_cptr = nullptr; | |
| }; | |
| struct Field { | |
| int num = -99; | |
| }; | |
| struct Outer { | |
| Field m_valu; | |
| Field *m_mptr = nullptr; | |
| const Field *m_cptr = nullptr; | |
| std::unique_ptr<Field> m_uqmp; | |
| std::unique_ptr<const Field> m_uqcp; | |
| std::shared_ptr<Field> m_shmp; | |
| std::shared_ptr<const Field> m_shcp; | |
| }; | |
| inline void DisownOuter(std::unique_ptr<Outer>) {} | |
| struct WithCharArrayMember { | |
| WithCharArrayMember() { std::memcpy(char6_member, "Char6", 6); } | |
| char char6_member[6]; | |
| }; | |
| struct WithConstCharPtrMember { | |
| const char *const_char_ptr_member = "ConstChar*"; | |
| }; | |
| // See PR #6008 | |
| enum class EnumAB { | |
| A = 0, | |
| B = 1, | |
| }; | |
| struct ShWithEnumABMember { | |
| EnumAB level = EnumAB::A; | |
| }; | |
| struct SimpleStruct { | |
| int value = 7; | |
| }; | |
| struct ShWithSimpleStructMember { | |
| SimpleStruct legacy; | |
| }; | |
| } // namespace test_class_sh_property | |
| TEST_SUBMODULE(class_sh_property, m) { | |
| using namespace test_class_sh_property; | |
| py::class_<ClassicField, std::unique_ptr<ClassicField>>(m, "ClassicField") | |
| .def(py::init<>()) | |
| .def_readwrite("num", &ClassicField::num); | |
| py::class_<ClassicOuter, std::unique_ptr<ClassicOuter>>(m, "ClassicOuter") | |
| .def(py::init<>()) | |
| .def_readonly("m_mptr_readonly", &ClassicOuter::m_mptr) | |
| .def_readwrite("m_mptr_readwrite", &ClassicOuter::m_mptr) | |
| .def_readwrite("m_cptr_readonly", &ClassicOuter::m_cptr) | |
| .def_readwrite("m_cptr_readwrite", &ClassicOuter::m_cptr); | |
| py::classh<Field>(m, "Field").def(py::init<>()).def_readwrite("num", &Field::num); | |
| py::classh<Outer>(m, "Outer") | |
| .def(py::init<>()) | |
| .def_readonly("m_valu_readonly", &Outer::m_valu) | |
| .def_readwrite("m_valu_readwrite", &Outer::m_valu) | |
| .def_readonly("m_mptr_readonly", &Outer::m_mptr) | |
| .def_readwrite("m_mptr_readwrite", &Outer::m_mptr) | |
| .def_readonly("m_cptr_readonly", &Outer::m_cptr) | |
| .def_readwrite("m_cptr_readwrite", &Outer::m_cptr) | |
| // .def_readonly("m_uqmp_readonly", &Outer::m_uqmp) // Custom compilation Error. | |
| .def_readwrite("m_uqmp_readwrite", &Outer::m_uqmp) | |
| // .def_readonly("m_uqcp_readonly", &Outer::m_uqcp) // Custom compilation Error. | |
| .def_readwrite("m_uqcp_readwrite", &Outer::m_uqcp) | |
| .def_readwrite("m_shmp_readonly", &Outer::m_shmp) | |
| .def_readwrite("m_shmp_readwrite", &Outer::m_shmp) | |
| .def_readwrite("m_shcp_readonly", &Outer::m_shcp) | |
| .def_readwrite("m_shcp_readwrite", &Outer::m_shcp); | |
| m.def("DisownOuter", DisownOuter); | |
| py::classh<WithCharArrayMember>(m, "WithCharArrayMember") | |
| .def(py::init<>()) | |
| .def_readonly("char6_member", &WithCharArrayMember::char6_member); | |
| py::classh<WithConstCharPtrMember>(m, "WithConstCharPtrMember") | |
| .def(py::init<>()) | |
| .def_readonly("const_char_ptr_member", &WithConstCharPtrMember::const_char_ptr_member); | |
| // See PR #6008 | |
| py::enum_<EnumAB>(m, "EnumAB").value("A", EnumAB::A).value("B", EnumAB::B); | |
| py::classh<ShWithEnumABMember>(m, "ShWithEnumABMember") | |
| .def(py::init<>()) | |
| .def_readwrite("level", &ShWithEnumABMember::level); | |
| py::class_<SimpleStruct>(m, "SimpleStruct") | |
| .def(py::init<>()) | |
| .def_readwrite("value", &SimpleStruct::value); | |
| py::classh<ShWithSimpleStructMember>(m, "ShWithSimpleStructMember") | |
| .def(py::init<>()) | |
| .def_readwrite("legacy", &ShWithSimpleStructMember::legacy); | |
| m.def("getSimpleStructAsShared", []() { return std::make_shared<SimpleStruct>(); }); | |
| } |