11 #if defined(_MSC_VER) && _MSC_VER < 1910 12 # pragma warning(disable: 4702) // unreachable code in system header 25 namespace pybind11 {
namespace detail {
39 std::unique_ptr<T>
ptr;
43 T *
get() {
return ptr.get(); }
53 T*
get()
const {
return impl.get(); }
67 T*
get()
const {
return impl.get(); }
68 T**
operator&() {
throw std::logic_error(
"Call of overloaded operator& is not expected"); }
81 T*
get()
const {
return impl.get(); }
83 T**
operator&() {
throw std::logic_error(
"Call of overloaded operator& is not expected"); }
97 class MyObject1 :
public Object {
100 std::string toString()
const {
return "MyObject1[" +
std::to_string(value) +
"]"; }
107 .def(py::init<int>());
108 py::implicitly_convertible<py::int_, MyObject1>();
110 m.
def(
"make_object_1", []() ->
Object * {
return new MyObject1(1); });
111 m.
def(
"make_object_2", []() ->
ref<Object> {
return new MyObject1(2); });
112 m.
def(
"make_myobject1_1", []() -> MyObject1 * {
return new MyObject1(4); });
118 m.
def(
"print_myobject1_1", [](
const MyObject1 *obj) {
py::print(obj->toString()); });
124 m.
def(
"cstats_ref", &ConstructorStats::get<ref_tag>);
130 MyObject2(
const MyObject2 &) =
default;
132 std::string toString()
const {
return "MyObject2[" +
std::to_string(value) +
"]"; }
138 .def(py::init<int>());
139 m.
def(
"make_myobject2_1", []() {
return new MyObject2(6); });
140 m.
def(
"make_myobject2_2", []() {
return std::make_shared<MyObject2>(7); });
141 m.
def(
"print_myobject2_1", [](
const MyObject2 *obj) {
py::print(obj->toString()); });
142 m.
def(
"print_myobject2_2", [](std::shared_ptr<MyObject2> obj) {
py::print(obj->toString()); });
143 m.
def(
"print_myobject2_3", [](
const std::shared_ptr<MyObject2> &obj) {
py::print(obj->toString()); });
144 m.
def(
"print_myobject2_4", [](
const std::shared_ptr<MyObject2> *obj) {
py::print((*obj)->toString()); });
147 class MyObject3 :
public std::enable_shared_from_this<MyObject3> {
149 MyObject3(
const MyObject3 &) =
default;
151 std::string toString()
const {
return "MyObject3[" +
std::to_string(value) +
"]"; }
157 .def(py::init<int>());
158 m.
def(
"make_myobject3_1", []() {
return new MyObject3(8); });
159 m.
def(
"make_myobject3_2", []() {
return std::make_shared<MyObject3>(9); });
160 m.
def(
"print_myobject3_1", [](
const MyObject3 *obj) {
py::print(obj->toString()); });
161 m.
def(
"print_myobject3_2", [](std::shared_ptr<MyObject3> obj) {
py::print(obj->toString()); });
162 m.
def(
"print_myobject3_3", [](
const std::shared_ptr<MyObject3> &obj) {
py::print(obj->toString()); });
163 m.
def(
"print_myobject3_4", [](
const std::shared_ptr<MyObject3> *obj) {
py::print((*obj)->toString()); });
166 m.
def(
"test_object1_refcounting", []() {
168 bool good = o->getRefCount() == 1;
172 good &= o->getRefCount() == 2;
186 .def(py::init<int>())
203 .def(py::init<int>())
207 class MyObject4b :
public MyObject4a {
213 .def(py::init<int>());
223 .def(py::init<int>())
227 struct SharedPtrRef {
236 std::shared_ptr<A> shared = std::make_shared<A>();
238 using A = SharedPtrRef::A;
244 py::return_value_policy::copy)
245 .def_readonly(
"holder_ref", &SharedPtrRef::shared)
247 py::return_value_policy::copy)
248 .def(
"set_ref", [](SharedPtrRef &,
const A &) {
return true; })
249 .def(
"set_holder", [](SharedPtrRef &, std::shared_ptr<A>) {
return true; });
252 struct SharedFromThisRef {
253 struct B : std::enable_shared_from_this<B> {
261 std::shared_ptr<B> shared = std::make_shared<B>();
263 using B = SharedFromThisRef::B;
269 .def_property_readonly(
"copy", [](
const SharedFromThisRef &s) {
return s.value; },
270 py::return_value_policy::copy)
271 .def_readonly(
"holder_ref", &SharedFromThisRef::shared)
273 py::return_value_policy::copy)
274 .def(
"set_ref", [](SharedFromThisRef &,
const B &) {
return true; })
275 .def(
"set_holder", [](SharedFromThisRef &, std::shared_ptr<B>) {
return true; });
278 struct SharedFromThisVBase : std::enable_shared_from_this<SharedFromThisVBase> {
279 SharedFromThisVBase() =
default;
280 SharedFromThisVBase(
const SharedFromThisVBase &) =
default;
281 virtual ~SharedFromThisVBase() =
default;
283 struct SharedFromThisVirt :
virtual SharedFromThisVBase {};
284 static std::shared_ptr<SharedFromThisVirt> sft(
new SharedFromThisVirt());
286 .def_static(
"get", []() {
return sft.get(); });
297 struct TypeForHolderWithAddressOf {
299 TypeForHolderWithAddressOf(
const TypeForHolderWithAddressOf &) {
print_copy_created(
this); }
300 TypeForHolderWithAddressOf(TypeForHolderWithAddressOf &&) {
print_move_created(
this); }
302 std::string toString()
const {
309 .def_static(
"make", []() {
return HolderWithAddressOf(
new TypeForHolderWithAddressOf); })
310 .def(
"get", [](
const HolderWithAddressOf &
self) {
return self.get(); })
311 .def(
"print_object_1", [](
const TypeForHolderWithAddressOf *obj) {
py::print(obj->toString()); })
312 .def(
"print_object_2", [](HolderWithAddressOf obj) {
py::print(obj.get()->toString()); })
313 .def(
"print_object_3", [](
const HolderWithAddressOf &obj) {
py::print(obj.get()->toString()); })
314 .def(
"print_object_4", [](
const HolderWithAddressOf *obj) {
py::print((*obj).get()->toString()); });
317 struct TypeForMoveOnlyHolderWithAddressOf {
320 std::string toString()
const {
321 return "MoveOnlyHolderWithAddressOf[" +
std::to_string(value) +
"]";
327 .def_static(
"make", []() {
return MoveOnlyHolderWithAddressOf(
new TypeForMoveOnlyHolderWithAddressOf(0)); })
329 .
def(
"print_object", [](
const TypeForMoveOnlyHolderWithAddressOf *obj) {
py::print(obj->toString()); });
332 struct HeldByDefaultHolder { };
335 .def_static(
"load_shared_ptr", [](std::shared_ptr<HeldByDefaultHolder>) {});
340 virtual ~ElementBase() { }
344 struct ElementA : ElementBase {
345 ElementA(
int v) : v(v) { }
346 int value() {
return v; }
350 .def(py::init<int>())
354 void add(std::shared_ptr<ElementBase> e) { l.push_back(e); }
355 std::vector<std::shared_ptr<ElementBase>> l;
359 .def(
"add", &ElementList::add)
360 .
def(
"get", [](ElementList &el) {
int getRefCount() const
Return the current reference count.
test_initializer smart_ptr("smart_ptr", test_submodule_smart_ptr)
glibc defines I as a macro which breaks things, e.g., boost template names
virtual std::string toString() const =0
void print_destroyed(T *inst, Values &&...values)
class_ & def_property_readonly(const char *name, const Getter &fget, const Extra &...extra)
Uses return_value_policy::reference_internal by default.
shared_ptr_with_addressof_operator(T *p)
void print_copy_created(T *inst, Values &&...values)
std::shared_ptr< T > impl
unique_ptr_with_addressof_operator(T *p)
Reference counting helper.
op_< op_and, op_l, self_t, self_t > operator &(const self_t &, const self_t &)
void print_created(T *inst, Values &&...values)
std::unique_ptr< T > impl
Reference counted object base class.
T cast(const handle &handle)
void print(Args &&...args)
void print_move_created(T *inst, Values &&...values)
#define TEST_SUBMODULE(name, variable)
PYBIND11_DECLARE_HOLDER_TYPE(T, ref< T >, true)
bool typename Extra class_ & def(const char *name_, Func &&f, const Extra &... extra)
auto to_string(T &&value) -> decltype(std::forward< T >(value))
Convert an object to a string (directly forward if this can become a string)
std::unique_ptr< T > impl
T * get_ptr()
Return a const pointer to the referenced object.