11#include <pybind11/stl.h>
16template <
typename derived>
46 std::swap(
value, m.value);
50 std::swap(
value, m.value);
65 std::swap(
value, m.value);
69 std::swap(
value, m.value);
114 return pybind11::cast(m.value, r, p);
126 return pybind11::cast(m.value, r, p);
142 return pybind11::cast(m.value, r, p);
148 return cast(*src, policy, parent);
152 template <
typename T>
160 py::class_<lacking_copy_ctor>(m,
"lacking_copy_ctor")
163 py::class_<lacking_move_ctor>(m,
"lacking_move_ctor")
168 m.def(
"move_and_copy_casts", [](
const py::object &o) {
170 r += py::cast<MoveOrCopyInt>(o).value;
171 r += py::cast<MoveOnlyInt>(o).value;
172 r += py::cast<CopyOnlyInt>(o).value;
173 auto m1(py::cast<MoveOrCopyInt>(o));
174 auto m2(py::cast<MoveOnlyInt>(o));
175 auto m3(py::cast<CopyOnlyInt>(o));
176 r += m1.value + m2.value + m3.value;
182 m.def(
"move_only", [](
MoveOnlyInt m) {
return m.value; });
185 m.def(
"move_or_copy", [](
MoveOrCopyInt m) {
return m.value; });
188 m.def(
"copy_only", [](
CopyOnlyInt m) {
return m.value; });
190 [](std::pair<MoveOnlyInt, MoveOrCopyInt> p) {
return p.first.value + p.second.value; });
191 m.def(
"move_tuple", [](std::tuple<MoveOnlyInt, MoveOrCopyInt, MoveOnlyInt> t) {
192 return std::get<0>(t).value + std::get<1>(t).value + std::get<2>(t).value;
194 m.def(
"copy_tuple", [](std::tuple<CopyOnlyInt, CopyOnlyInt> t) {
195 return std::get<0>(t).value + std::get<1>(t).value;
197 m.def(
"move_copy_nested",
201 return x.first.value + std::get<0>(x.second.first).value
202 + std::get<1>(x.second.first).value
203 + std::get<0>(std::get<2>(x.second.first)).value + x.second.second.value;
205 m.def(
"move_and_copy_cstats", []() {
208 auto &mc = ConstructorStats::get<MoveOrCopyInt>();
209 mc.move_assignments = mc.move_constructions = mc.copy_assignments = mc.copy_constructions
211 auto &mo = ConstructorStats::get<MoveOnlyInt>();
212 mo.move_assignments = mo.move_constructions = mo.copy_assignments = mo.copy_constructions
214 auto &co = ConstructorStats::get<CopyOnlyInt>();
215 co.move_assignments = co.move_constructions = co.copy_assignments = co.copy_constructions
218 d[
"MoveOrCopyInt"] = py::cast(mc, py::return_value_policy::reference);
219 d[
"MoveOnlyInt"] = py::cast(mo, py::return_value_policy::reference);
220 d[
"CopyOnlyInt"] = py::cast(co, py::return_value_policy::reference);
223#ifdef PYBIND11_HAS_OPTIONAL
225 m.attr(
"has_optional") =
true;
226 m.def(
"move_optional", [](std::optional<MoveOnlyInt> o) {
return o->value; });
227 m.def(
"move_or_copy_optional", [](std::optional<MoveOrCopyInt> o) {
return o->value; });
228 m.def(
"copy_optional", [](std::optional<CopyOnlyInt> o) {
return o->value; });
229 m.def(
"move_optional_tuple",
230 [](std::optional<std::tuple<MoveOrCopyInt, MoveOnlyInt, CopyOnlyInt>> x) {
231 return std::get<0>(*x).value + std::get<1>(*x).value + std::get<2>(*x).value;
234 m.attr(
"has_optional") =
false;
241 struct PrivateOpNew {
245 void *
operator new(
size_t bytes) {
246 void *ptr = std::malloc(
bytes);
250 throw std::bad_alloc{};
253 py::class_<PrivateOpNew>(m,
"PrivateOpNew").def_readonly(
"value", &PrivateOpNew::value);
254 m.def(
"private_op_new_value", []() {
return PrivateOpNew(); });
256 "private_op_new_reference",
257 []() ->
const PrivateOpNew & {
258 static PrivateOpNew x{};
261 py::return_value_policy::reference);
267 explicit MoveIssue1(
int v) : v{v} {}
268 MoveIssue1(
const MoveIssue1 &c) =
default;
269 MoveIssue1(MoveIssue1 &&) =
delete;
271 py::class_<MoveIssue1>(m,
"MoveIssue1")
272 .def(py::init<int>())
273 .def_readwrite(
"value", &MoveIssue1::v);
277 explicit MoveIssue2(
int v) : v{v} {}
278 MoveIssue2(MoveIssue2 &&) =
default;
280 py::class_<MoveIssue2>(m,
"MoveIssue2")
281 .def(py::init<int>())
282 .def_readwrite(
"value", &MoveIssue2::v);
288 [](
int i) {
return std::unique_ptr<MoveIssue1>(
new MoveIssue1(i)); },
289 py::return_value_policy::move);
291 "get_moveissue2", [](
int i) {
return MoveIssue2(i); }, py::return_value_policy::move);
294 m.def(
"get_pytype_rvalue_castissue", [](
double i) {
return py::float_(i).cast<py::int_>(); });
CopyOnlyInt(const CopyOnlyInt &c)
CopyOnlyInt & operator=(const CopyOnlyInt &c)
MoveOnlyInt & operator=(MoveOnlyInt &&m) noexcept
MoveOnlyInt & operator=(const MoveOnlyInt &)=delete
MoveOnlyInt(const MoveOnlyInt &)=delete
MoveOnlyInt(MoveOnlyInt &&m) noexcept
MoveOrCopyInt & operator=(const MoveOrCopyInt &c)
MoveOrCopyInt(MoveOrCopyInt &&m) noexcept
MoveOrCopyInt(const MoveOrCopyInt &c)
MoveOrCopyInt & operator=(MoveOrCopyInt &&m) noexcept
\rst Holds a reference to a Python object (no reference counting)
T cast() const
\rst Attempt to cast the Python object into the given C++ type.
handle release()
\rst Resets the internal pointer to nullptr without decreasing the object's reference count.
static handle cast(const itype &src, return_value_policy policy, handle parent)
#define PYBIND11_NAMESPACE_END(name)
#define PYBIND11_NAMESPACE_BEGIN(name)
return_value_policy
Approach used to cast a previously unknown C++ instance into a Python object.
constexpr descr< N - 1 > const_name(char const (&text)[N])
void print_default_created(T *inst, Values &&...values)
void print_copy_created(T *inst, Values &&...values)
void print_copy_assigned(T *inst, Values &&...values)
void print_created(T *inst, Values &&...values)
void print_destroyed(T *inst, Values &&...values)
void print_move_assigned(T *inst, Values &&...values)
void print_move_created(T *inst, Values &&...values)
#define TEST_SUBMODULE(name, variable)
static const derived & get_one()
lacking_copy_ctor(const lacking_copy_ctor &other)=delete
lacking_copy_ctor()=default
lacking_move_ctor(const lacking_move_ctor &other)=delete
lacking_move_ctor()=default
lacking_move_ctor(lacking_move_ctor &&other)=delete
Annotation for function names.
pybind11::detail::cast_op_type< T > cast_op_type
bool load(handle src, bool)
static handle cast(const CopyOnlyInt &m, return_value_policy r, handle p)
static handle cast(const CopyOnlyInt *src, return_value_policy policy, handle parent)
PYBIND11_TYPE_CASTER(MoveOnlyInt, const_name("MoveOnlyInt"))
static handle cast(const MoveOnlyInt &m, return_value_policy r, handle p)
bool load(handle src, bool)
bool load(handle src, bool)
PYBIND11_TYPE_CASTER(MoveOrCopyInt, const_name("MoveOrCopyInt"))
static handle cast(const MoveOrCopyInt &m, return_value_policy r, handle p)