|
2 | 2 |
|
3 | 3 | #include "pybind11_tests.h"
|
4 | 4 |
|
| 5 | +#include <vector> |
| 6 | + |
5 | 7 | namespace test_return_value_policy_override {
|
6 | 8 |
|
7 | 9 | struct some_type {};
|
8 | 10 |
|
| 11 | +struct data_field { |
| 12 | + int value = -99; |
| 13 | + |
| 14 | + explicit data_field(int v) : value(v) {} |
| 15 | +}; |
| 16 | + |
| 17 | +struct data_fields_holder { |
| 18 | + std::vector<data_field> vec; |
| 19 | + |
| 20 | + explicit data_fields_holder(std::size_t vec_size) { |
| 21 | + for (std::size_t i = 0; i < vec_size; i++) { |
| 22 | + vec.emplace_back(13 + static_cast<int>(i) * 11); |
| 23 | + } |
| 24 | + } |
| 25 | + |
| 26 | + data_field *vec_at(std::size_t index) { |
| 27 | + if (index >= vec.size()) { |
| 28 | + return nullptr; |
| 29 | + } |
| 30 | + return &vec[index]; |
| 31 | + } |
| 32 | + |
| 33 | + const data_field *vec_at_const_ptr(std::size_t index) { return vec_at(index); } |
| 34 | +}; |
| 35 | + |
9 | 36 | // cp = copyable, mv = movable, 1 = yes, 0 = no
|
10 | 37 | struct type_cp1_mv1 {
|
11 | 38 | std::string mtxt;
|
@@ -156,6 +183,8 @@ std::unique_ptr<type_cp0_mv0> return_unique_pointer_nocopy_nomove() {
|
156 | 183 |
|
157 | 184 | } // namespace test_return_value_policy_override
|
158 | 185 |
|
| 186 | +using test_return_value_policy_override::data_field; |
| 187 | +using test_return_value_policy_override::data_fields_holder; |
159 | 188 | using test_return_value_policy_override::some_type;
|
160 | 189 | using test_return_value_policy_override::type_cp0_mv0;
|
161 | 190 | using test_return_value_policy_override::type_cp0_mv1;
|
@@ -205,6 +234,8 @@ struct type_caster<some_type> : type_caster_base<some_type> {
|
205 | 234 | } // namespace detail
|
206 | 235 | } // namespace pybind11
|
207 | 236 |
|
| 237 | +PYBIND11_SMART_HOLDER_TYPE_CASTERS(data_field) |
| 238 | +PYBIND11_SMART_HOLDER_TYPE_CASTERS(data_fields_holder) |
208 | 239 | PYBIND11_SMART_HOLDER_TYPE_CASTERS(type_cp1_mv1)
|
209 | 240 | PYBIND11_SMART_HOLDER_TYPE_CASTERS(type_cp0_mv1)
|
210 | 241 | PYBIND11_SMART_HOLDER_TYPE_CASTERS(type_cp1_mv0)
|
@@ -239,6 +270,21 @@ TEST_SUBMODULE(return_value_policy_override, m) {
|
239 | 270 | },
|
240 | 271 | py::return_value_policy::_clif_automatic);
|
241 | 272 |
|
| 273 | + py::classh<data_field>(m, "data_field").def_readwrite("value", &data_field::value); |
| 274 | + py::classh<data_fields_holder>(m, "data_fields_holder") |
| 275 | + .def(py::init<std::size_t>()) |
| 276 | + .def("vec_at", |
| 277 | + [](const py::object &self_py, std::size_t index) { |
| 278 | + auto *self = py::cast<data_fields_holder *>(self_py); |
| 279 | + return py::cast( |
| 280 | + self->vec_at(index), py::return_value_policy::_clif_automatic, self_py); |
| 281 | + }) |
| 282 | + .def("vec_at_const_ptr", [](const py::object &self_py, std::size_t index) { |
| 283 | + auto *self = py::cast<data_fields_holder *>(self_py); |
| 284 | + return py::cast( |
| 285 | + self->vec_at_const_ptr(index), py::return_value_policy::_clif_automatic, self_py); |
| 286 | + }); |
| 287 | + |
242 | 288 | py::classh<type_cp1_mv1>(m, "type_cp1_mv1")
|
243 | 289 | .def(py::init<std::string>())
|
244 | 290 | .def_readonly("mtxt", &type_cp1_mv1::mtxt);
|
|
0 commit comments