diff options
Diffstat (limited to 'tests/test_vector_unique_ptr_member.cpp')
-rw-r--r-- | tests/test_vector_unique_ptr_member.cpp | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/tests/test_vector_unique_ptr_member.cpp b/tests/test_vector_unique_ptr_member.cpp new file mode 100644 index 00000000..680cf9a6 --- /dev/null +++ b/tests/test_vector_unique_ptr_member.cpp @@ -0,0 +1,54 @@ +#include "pybind11_tests.h" + +#include <cstddef> +#include <memory> +#include <vector> + +namespace pybind11_tests { +namespace vector_unique_ptr_member { + +struct DataType {}; + +// Reduced from a use case in the wild. +struct VectorOwner { + static std::unique_ptr<VectorOwner> Create(std::size_t num_elems) { + return std::unique_ptr<VectorOwner>( + new VectorOwner(std::vector<std::unique_ptr<DataType>>(num_elems))); + } + + std::size_t data_size() const { return data_.size(); } + +private: + explicit VectorOwner(std::vector<std::unique_ptr<DataType>> data) : data_(std::move(data)) {} + + const std::vector<std::unique_ptr<DataType>> data_; +}; + +} // namespace vector_unique_ptr_member +} // namespace pybind11_tests + +namespace pybind11 { +namespace detail { + +template <> +struct is_copy_constructible<pybind11_tests::vector_unique_ptr_member::VectorOwner> + : std::false_type {}; + +template <> +struct is_move_constructible<pybind11_tests::vector_unique_ptr_member::VectorOwner> + : std::false_type {}; + +} // namespace detail +} // namespace pybind11 + +using namespace pybind11_tests::vector_unique_ptr_member; + +py::object py_cast_VectorOwner_ptr(VectorOwner *ptr) { return py::cast(ptr); } + +TEST_SUBMODULE(vector_unique_ptr_member, m) { + py::class_<VectorOwner>(m, "VectorOwner") + .def_static("Create", &VectorOwner::Create) + .def("data_size", &VectorOwner::data_size); + + m.def("py_cast_VectorOwner_ptr", py_cast_VectorOwner_ptr); +} |