-
Notifications
You must be signed in to change notification settings - Fork 2.2k
[smart_holder] .def_readonly, .def_readwrite adaptors #3581
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
c936890
f1625dc
94c13ca
6082ec4
9b9e1bb
c146120
4a9228f
526c8d6
5cfd529
b3329aa
bf05ce8
6ec3be4
fefb242
776816e
97e7d8d
bcda516
2cb0e31
a2e2488
5c760be
f06d6fa
ae1c898
036fa04
35f2878
c73604a
3bcfa8a
93a4389
43052f0
0c36cfd
9b8dca0
cca7dbb
160acc8
50fe88d
4ad7135
ef81de9
b0ef8ac
2d1f958
5737c43
1eb3bc3
64c5c4b
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,90 @@ | ||
| #include "pybind11_tests.h" | ||
|
|
||
| #include "pybind11/smart_holder.h" | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I've seen |
||
|
|
||
| #include <memory> | ||
|
|
||
| namespace test_class_sh_property { | ||
|
|
||
| struct ClassicField { | ||
| int num = -88; | ||
| }; | ||
|
|
||
| struct ClassicOuter { | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Is the |
||
| ClassicField *m_mptr = nullptr; | ||
| const ClassicField *m_cptr = nullptr; | ||
| }; | ||
|
|
||
| struct Field { | ||
| int num = -99; | ||
| }; | ||
|
|
||
| struct Outer { | ||
| // The compact 4-character naming matches that in test_class_sh_basic.cpp | ||
| // (c = const, m = mutable). | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Maybe comment sh = shared_ptr and uq = unique_ptr as well. |
||
| 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>) {} | ||
|
|
||
| } // namespace test_class_sh_property | ||
|
|
||
| PYBIND11_TYPE_CASTER_BASE_HOLDER(test_class_sh_property::ClassicField, | ||
| std::unique_ptr<test_class_sh_property::ClassicField>) | ||
| PYBIND11_TYPE_CASTER_BASE_HOLDER(test_class_sh_property::ClassicOuter, | ||
| std::unique_ptr<test_class_sh_property::ClassicOuter>) | ||
|
|
||
| PYBIND11_SMART_HOLDER_TYPE_CASTERS(test_class_sh_property::Field) | ||
| PYBIND11_SMART_HOLDER_TYPE_CASTERS(test_class_sh_property::Outer) | ||
|
|
||
| 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); | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
and capture by reference in the lambda. At the very least, the PM should be forwarded otherwise.
I think original pybind11 it's a pointer. being passed around.
This could invoke copy or moves depending on the type PMs.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I couldn't get this to work. I tried a few variations of sprinkling in
&,&&,std::forward<PM>, but either it didn't build or I got segfaults. Then I decided it's better to just make it obvious that we're only dealing with pointers anyway, and the perfect forwarding doesn't buy us anything. See the long added comment for the newmust_be_member_function_pointerSFINAE helper.