aboutsummaryrefslogtreecommitdiff
path: root/tests/test_vector_unique_ptr_member.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_vector_unique_ptr_member.cpp')
-rw-r--r--tests/test_vector_unique_ptr_member.cpp54
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);
+}