mirror of
https://github.com/pybind/pybind11.git
synced 2026-05-12 01:10:34 +00:00
[smart_holder] Fix handling of const unique_ptr<T, D> & (do not disown). (#5332)
* Replace `unique_ptr_cref_roundtrip()` with `pass_unique_ptr_cref()`, `rtrn_unique_ptr_cref()` to make the current behavior obvious.
* add in unique_ptr_storage, unique_ptr_storage_deleter
* Add shared_ptr_storage (with that disowning fails as expected).
* Add load_as_const_unique_ptr()
* Restore original struct_smart_holder.h
* factor out `smart_holder::extract_deleter()`
* Better error message.
* Misc cleanup/tidying.
* Use `re.match("ctor_arg(_MvCtor)*_MvCtor", ...)` for compatibility with MSVC, NVHPC, ICC
* Add small comments.
* Fix small, inconsequential oversight in test code.
* Apply suggestion by @iwanders under PR #5334
* Remove `std::move()` in `smart_holder::extract_deleter()`
* Add `static_assert()` following a suggestion by @iwanders under PR #5334
This commit is contained in:
committed by
GitHub
parent
0e49463169
commit
04d9f84f26
@@ -120,6 +120,17 @@ std::string get_mtxt(atyp const &obj) { return obj.mtxt; }
|
||||
std::ptrdiff_t get_ptr(atyp const &obj) { return reinterpret_cast<std::ptrdiff_t>(&obj); }
|
||||
|
||||
std::unique_ptr<atyp> unique_ptr_roundtrip(std::unique_ptr<atyp> obj) { return obj; }
|
||||
|
||||
std::string pass_unique_ptr_cref(const std::unique_ptr<atyp> &obj) { return obj->mtxt; }
|
||||
|
||||
const std::unique_ptr<atyp> &rtrn_unique_ptr_cref(const std::string &mtxt) {
|
||||
static std::unique_ptr<atyp> obj{new atyp{"static_ctor_arg"}};
|
||||
if (!mtxt.empty()) {
|
||||
obj->mtxt = mtxt;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
const std::unique_ptr<atyp> &unique_ptr_cref_roundtrip(const std::unique_ptr<atyp> &obj) {
|
||||
return obj;
|
||||
}
|
||||
@@ -217,6 +228,9 @@ TEST_SUBMODULE(class_sh_basic, m) {
|
||||
m.def("get_ptr", get_ptr); // pass_cref
|
||||
|
||||
m.def("unique_ptr_roundtrip", unique_ptr_roundtrip); // pass_uqmp, rtrn_uqmp
|
||||
|
||||
m.def("pass_unique_ptr_cref", pass_unique_ptr_cref);
|
||||
m.def("rtrn_unique_ptr_cref", rtrn_unique_ptr_cref);
|
||||
m.def("unique_ptr_cref_roundtrip", unique_ptr_cref_roundtrip);
|
||||
|
||||
py::classh<SharedPtrStash>(m, "SharedPtrStash")
|
||||
|
||||
Reference in New Issue
Block a user