[PATCH] PR77990 refactor unique_ptr to encapsulate tuple
Jonathan Wakely
jwakely@redhat.com
Wed Oct 19 09:35:00 GMT 2016
On 17/10/16 14:37 +0100, Jonathan Wakely wrote:
>We are incorrectly requiring unique_ptr deleters to be copyable here:
>
> explicit
> unique_ptr(pointer __p) noexcept
> : _M_t(__p, deleter_type())
> { }
>
>We could just do:
>
> explicit
> unique_ptr(pointer __p) noexcept
> : _M_t()
> { std::get<0>(_M_t) = __p; }
>
>But having to deal directly with the std::tuple inside unique_ptr has
>been bothering me for some time. The tuple is used so we get the empty
>base-class optimisation for the deleter, but that implementation
>detail
>
>This patch refactors unique_ptr to put the std::tuple member into a
>new type which provides named accessors for the tuple elements, so we
>can stop using get<0> and get<1>. That new type can also provide a
>single-argument constructor to fix the copyable requirement for
>deleters. This also removes the code for deducing the pointer type
>which is duplciated in unique_ptr and unique_ptr<T[], D>, and while in
>the neighbourhood I changed it from old-school SFINAE using overloaded
>functions to the new hotness with __void_t<>.
>
>I intend to commit this to trunk, but on the branches I'll just fix
>the constructor as shown above, as it's a smaller change.
>
>
> PR libstdc++/77990
> * include/bits/unique_ptr.h (__uniq_ptr_impl): New type to
> encapsulate implementation details.
> (unique_ptr::unique_ptr(_Up)): Don't copy deleter object.
> (unique_ptr::get, unique_ptr::get_deleter, unique_ptr::release):
> Call member functions of implementation object.
> (unique_ptr<T[], D>): Likewise.
> * python/libstdcxx/v6/printers.py (UniquePointerPrinter): Adjust for
> new implementation.
> * python/libstdcxx/v6/xmethods.py (UniquePtrGetWorker): Likewise.
> * testsuite/20_util/unique_ptr/assign/48635_neg.cc: Adjust dg-error
> lines.
> * testsuite/20_util/unique_ptr/assign/cv_qual.cc: Likewise.
> * testsuite/20_util/unique_ptr/cons/cv_qual.cc: Likewise.
> * testsuite/20_util/unique_ptr/cons/77990.cc: New test.
>
>Tested powerpc64le-linux.
Committed to trunk. Here's the smaller patch I'm committing to the
branches.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: patch.txt
Type: text/x-patch
Size: 4049 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/libstdc++/attachments/20161019/00dcd431/attachment.bin>
More information about the Libstdc++
mailing list