|
8 | 8 | BSD-style license that can be found in the LICENSE file.
|
9 | 9 | */
|
10 | 10 |
|
| 11 | +#define PYBIND11_USE_SMART_HOLDER_AS_DEFAULT |
| 12 | + |
11 | 13 | #if defined(_MSC_VER) && _MSC_VER < 1910 // VS 2015's MSVC
|
12 | 14 | # pragma warning(disable: 4702) // unreachable code in system header (xatomic.h(382))
|
13 | 15 | #endif
|
@@ -98,6 +100,16 @@ class MyObject3 : public std::enable_shared_from_this<MyObject3> {
|
98 | 100 | int value;
|
99 | 101 | };
|
100 | 102 |
|
| 103 | +// an uncopyable object managed by a std::shared_ptr<> |
| 104 | +class MyObject3a { |
| 105 | +public: |
| 106 | + MyObject3a(int value) : value(value) { print_created(this, toString()); } |
| 107 | + std::string toString() const { return "MyObject3a[" + std::to_string(value) + "]"; } |
| 108 | + virtual ~MyObject3a() { print_destroyed(this); } |
| 109 | +private: |
| 110 | + int value; |
| 111 | +}; |
| 112 | + |
101 | 113 | // test_unique_nodelete
|
102 | 114 | // Object with a private destructor
|
103 | 115 | class MyObject4;
|
@@ -353,6 +365,15 @@ TEST_SUBMODULE(smart_ptr, m) {
|
353 | 365 | m.def("print_myobject3_3", [](const std::shared_ptr<MyObject3> &obj) { py::print(obj->toString()); });
|
354 | 366 | m.def("print_myobject3_4", [](const std::shared_ptr<MyObject3> *obj) { py::print((*obj)->toString()); });
|
355 | 367 |
|
| 368 | + py::class_<MyObject3a>(m, "MyObject3a"); |
| 369 | + m.def("make_myobject3_1", []() { return new MyObject3a(8); }); |
| 370 | + m.def("make_myobject3_2", []() { return std::make_shared<MyObject3a>(9); }); |
| 371 | + m.def("print_myobject3a_1", [](const MyObject3a *obj) { py::print(obj->toString()); }); |
| 372 | + m.def("print_myobject3a_2", [](std::shared_ptr<MyObject3a> obj) { py::print(obj->toString()); }); |
| 373 | + m.def("print_myobject3a_3", [](const std::shared_ptr<MyObject3a> &obj) { py::print(obj->toString()); }); |
| 374 | + // this doesn't compile, should it? |
| 375 | + //m.def("print_myobject3a_4", [](const std::shared_ptr<MyObject3a> *obj) { py::print((*obj)->toString()); }); |
| 376 | + |
356 | 377 | // test_smart_ptr_refcounting
|
357 | 378 | m.def("test_object1_refcounting", []() {
|
358 | 379 | ref<MyObject1> o = new MyObject1(0);
|
@@ -462,4 +483,10 @@ TEST_SUBMODULE(smart_ptr, m) {
|
462 | 483 | list.append(py::cast(e));
|
463 | 484 | return list;
|
464 | 485 | });
|
| 486 | + |
| 487 | + m.def("test_3011_shared_ptr", []() { |
| 488 | + auto o = std::make_shared<MyObject3a>(42); |
| 489 | + auto l = py::list(); |
| 490 | + l.append(o); |
| 491 | + }); |
465 | 492 | }
|
0 commit comments