11 #if defined(_MSC_VER) && _MSC_VER < 1910 // VS 2015's MSVC
12 # pragma warning(disable: 4702) // unreachable code in system header (xatomic.h(382))
25 namespace pybind11 {
namespace detail {
40 std::unique_ptr<T> ptr;
44 T *
get() {
return ptr.get(); }
51 std::unique_ptr<T> impl;
54 T*
get()
const {
return impl.get(); }
64 std::shared_ptr<T> impl;
68 T*
get()
const {
return impl.get(); }
69 T**
operator&() {
throw std::logic_error(
"Call of overloaded operator& is not expected"); }
78 std::unique_ptr<T> impl;
82 T*
get()
const {
return impl.get(); }
84 T**
operator&() {
throw std::logic_error(
"Call of overloaded operator& is not expected"); }
94 py::class_<Object, ref<Object>> obj(
m,
"Object");
98 class MyObject1 :
public Object {
101 std::string
toString()
const override {
return "MyObject1[" + std::to_string(
value) +
"]"; }
107 py::class_<MyObject1, ref<MyObject1>>(
m,
"MyObject1", obj)
108 .
def(py::init<int>());
109 py::implicitly_convertible<py::int_, MyObject1>();
111 m.def(
"make_object_1", []() ->
Object * {
return new MyObject1(1); });
112 m.def(
"make_object_2", []() ->
ref<Object> {
return new MyObject1(2); });
113 m.def(
"make_myobject1_1", []() -> MyObject1 * {
return new MyObject1(4); });
114 m.def(
"make_myobject1_2", []() ->
ref<MyObject1> {
return new MyObject1(5); });
119 m.def(
"print_myobject1_1", [](
const MyObject1 *obj) {
py::print(obj->toString()); });
125 m.def(
"cstats_ref", &ConstructorStats::get<ref_tag>);
131 MyObject2(
const MyObject2 &) =
default;
133 std::string toString()
const {
return "MyObject2[" + std::to_string(
value) +
"]"; }
138 py::class_<MyObject2, std::shared_ptr<MyObject2>>(
m,
"MyObject2")
139 .
def(py::init<int>());
140 m.def(
"make_myobject2_1", []() {
return new MyObject2(6); });
141 m.def(
"make_myobject2_2", []() {
return std::make_shared<MyObject2>(7); });
142 m.def(
"print_myobject2_1", [](
const MyObject2 *obj) {
py::print(obj->toString()); });
143 m.def(
"print_myobject2_2", [](std::shared_ptr<MyObject2> obj) {
py::print(obj->toString()); });
144 m.def(
"print_myobject2_3", [](
const std::shared_ptr<MyObject2> &obj) {
py::print(obj->toString()); });
145 m.def(
"print_myobject2_4", [](
const std::shared_ptr<MyObject2> *obj) {
py::print((*obj)->toString()); });
148 class MyObject3 :
public std::enable_shared_from_this<MyObject3> {
150 MyObject3(
const MyObject3 &) =
default;
152 std::string toString()
const {
return "MyObject3[" + std::to_string(
value) +
"]"; }
157 py::class_<MyObject3, std::shared_ptr<MyObject3>>(
m,
"MyObject3")
158 .
def(py::init<int>());
159 m.def(
"make_myobject3_1", []() {
return new MyObject3(8); });
160 m.def(
"make_myobject3_2", []() {
return std::make_shared<MyObject3>(9); });
161 m.def(
"print_myobject3_1", [](
const MyObject3 *obj) {
py::print(obj->toString()); });
162 m.def(
"print_myobject3_2", [](std::shared_ptr<MyObject3> obj) {
py::print(obj->toString()); });
163 m.def(
"print_myobject3_3", [](
const std::shared_ptr<MyObject3> &obj) {
py::print(obj->toString()); });
164 m.def(
"print_myobject3_4", [](
const std::shared_ptr<MyObject3> *obj) {
py::print((*obj)->toString()); });
167 m.def(
"test_object1_refcounting", []() {
169 bool good = o->getRefCount() == 1;
170 py::object o2 =
py::cast(o, py::return_value_policy::reference);
173 good &= o->getRefCount() == 2;
180 static std::unordered_set<MyObject4 *> myobject4_instances;
185 myobject4_instances.insert(
this);
189 static void cleanupAllInstances() {
190 auto tmp =
std::move(myobject4_instances);
191 myobject4_instances.clear();
197 myobject4_instances.erase(
this);
201 py::class_<MyObject4, std::unique_ptr<MyObject4, py::nodelete>>(
m,
"MyObject4")
202 .
def(py::init<int>())
204 .def_static(
"cleanup_all_instances", &MyObject4::cleanupAllInstances);
210 static std::unordered_set<MyObject4a *> myobject4a_instances;
216 myobject4a_instances.insert(
this);
220 static void cleanupAllInstances() {
221 auto tmp =
std::move(myobject4a_instances);
222 myobject4a_instances.clear();
227 virtual ~MyObject4a() {
228 myobject4a_instances.erase(
this);
232 py::class_<MyObject4a, std::unique_ptr<MyObject4a, py::nodelete>>(
m,
"MyObject4a")
233 .
def(py::init<int>())
235 .def_static(
"cleanup_all_instances", &MyObject4a::cleanupAllInstances);
238 class MyObject4b :
public MyObject4a {
243 py::class_<MyObject4b, MyObject4a>(
m,
"MyObject4b")
244 .def(py::init<int>());
253 py::class_<MyObject5, huge_unique_ptr<MyObject5>>(
m,
"MyObject5")
254 .
def(py::init<int>())
258 struct SharedPtrRef {
267 std::shared_ptr<A> shared = std::make_shared<A>();
269 using A = SharedPtrRef::A;
270 py::class_<A, std::shared_ptr<A>>(
m,
"A");
271 py::class_<SharedPtrRef>(
m,
"SharedPtrRef")
274 .def_property_readonly(
"copy", [](
const SharedPtrRef &s) {
return s.value; },
275 py::return_value_policy::copy)
276 .def_readonly(
"holder_ref", &SharedPtrRef::shared)
277 .def_property_readonly(
"holder_copy", [](
const SharedPtrRef &s) {
return s.shared; },
278 py::return_value_policy::copy)
279 .
def(
"set_ref", [](SharedPtrRef &,
const A &) {
return true; })
280 .
def(
"set_holder", [](SharedPtrRef &, std::shared_ptr<A>) {
return true; });
283 struct SharedFromThisRef {
284 struct B : std::enable_shared_from_this<B> {
292 std::shared_ptr<B> shared = std::make_shared<B>();
294 using B = SharedFromThisRef::B;
295 py::class_<B, std::shared_ptr<B>>(
m,
"B");
296 py::class_<SharedFromThisRef>(
m,
"SharedFromThisRef")
299 .def_property_readonly(
"ref", [](
const SharedFromThisRef &s) ->
const B & {
return *s.shared; })
300 .def_property_readonly(
"copy", [](
const SharedFromThisRef &s) {
return s.value; },
301 py::return_value_policy::copy)
302 .def_readonly(
"holder_ref", &SharedFromThisRef::shared)
303 .def_property_readonly(
"holder_copy", [](
const SharedFromThisRef &s) {
return s.shared; },
304 py::return_value_policy::copy)
305 .
def(
"set_ref", [](SharedFromThisRef &,
const B &) {
return true; })
306 .
def(
"set_holder", [](SharedFromThisRef &, std::shared_ptr<B>) {
return true; });
309 struct SharedFromThisVBase : std::enable_shared_from_this<SharedFromThisVBase> {
310 SharedFromThisVBase() =
default;
311 SharedFromThisVBase(
const SharedFromThisVBase &) =
default;
312 virtual ~SharedFromThisVBase() =
default;
314 struct SharedFromThisVirt :
virtual SharedFromThisVBase {};
315 static std::shared_ptr<SharedFromThisVirt> sft(
new SharedFromThisVirt());
316 py::class_<SharedFromThisVirt, std::shared_ptr<SharedFromThisVirt>>(
m,
"SharedFromThisVirt")
317 .def_static(
"get", []() {
return sft.get(); });
324 py::class_<C, custom_unique_ptr<C>>(
m,
"TypeWithMoveOnlyHolder")
329 struct TypeForHolderWithAddressOf {
331 TypeForHolderWithAddressOf(
const TypeForHolderWithAddressOf &) {
print_copy_created(
this); }
332 TypeForHolderWithAddressOf(TypeForHolderWithAddressOf &&) {
print_move_created(
this); }
334 std::string toString()
const {
335 return "TypeForHolderWithAddressOf[" + std::to_string(
value) +
"]";
340 py::class_<TypeForHolderWithAddressOf, HolderWithAddressOf>(
m,
"TypeForHolderWithAddressOf")
341 .def_static(
"make", []() {
return HolderWithAddressOf(
new TypeForHolderWithAddressOf); })
342 .
def(
"get", [](
const HolderWithAddressOf &
self) {
return self.get(); })
343 .
def(
"print_object_1", [](
const TypeForHolderWithAddressOf *obj) {
py::print(obj->toString()); })
344 .
def(
"print_object_2", [](HolderWithAddressOf obj) {
py::print(obj.get()->toString()); })
345 .
def(
"print_object_3", [](
const HolderWithAddressOf &obj) {
py::print(obj.get()->toString()); })
346 .
def(
"print_object_4", [](
const HolderWithAddressOf *obj) {
py::print((*obj).get()->toString()); });
349 struct TypeForMoveOnlyHolderWithAddressOf {
352 std::string toString()
const {
353 return "MoveOnlyHolderWithAddressOf[" + std::to_string(
value) +
"]";
358 py::class_<TypeForMoveOnlyHolderWithAddressOf, MoveOnlyHolderWithAddressOf>(
m,
"TypeForMoveOnlyHolderWithAddressOf")
359 .def_static(
"make", []() {
return MoveOnlyHolderWithAddressOf(
new TypeForMoveOnlyHolderWithAddressOf(0)); })
361 .def(
"print_object", [](
const TypeForMoveOnlyHolderWithAddressOf *obj) {
py::print(obj->toString()); });
364 struct HeldByDefaultHolder { };
365 py::class_<HeldByDefaultHolder>(
m,
"HeldByDefaultHolder")
367 .def_static(
"load_shared_ptr", [](std::shared_ptr<HeldByDefaultHolder>) {});
372 virtual ~ElementBase() =
default;
373 ElementBase() =
default;
374 ElementBase(
const ElementBase&) =
delete;
376 py::class_<ElementBase, std::shared_ptr<ElementBase>>(
m,
"ElementBase");
378 struct ElementA : ElementBase {
379 ElementA(
int v) : v(v) { }
380 int value() {
return v; }
383 py::class_<ElementA, ElementBase, std::shared_ptr<ElementA>>(
m,
"ElementA")
384 .
def(py::init<int>())
388 void add(std::shared_ptr<ElementBase> e) { l.push_back(e); }
389 std::vector<std::shared_ptr<ElementBase>> l;
391 py::class_<ElementList, std::shared_ptr<ElementList>>(
m,
"ElementList")
393 .
def(
"add", &ElementList::add)
394 .def(
"get", [](ElementList &el) {