From patchwork Sat May 21 21:51:43 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 96711 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) by ozlabs.org (Postfix) with SMTP id 20D55B71B4 for ; Sun, 22 May 2011 07:52:07 +1000 (EST) Received: (qmail 10247 invoked by alias); 21 May 2011 21:52:05 -0000 Received: (qmail 10232 invoked by uid 22791); 21 May 2011 21:52:03 -0000 X-SWARE-Spam-Status: No, hits=-1.8 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_NONE X-Spam-Check-By: sourceware.org Received: from smtp208.alice.it (HELO smtp208.alice.it) (82.57.200.104) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Sat, 21 May 2011 21:51:48 +0000 Received: from [192.168.1.4] (79.51.26.98) by smtp208.alice.it (8.5.124.08) id 4C1A27161A6383FB; Sat, 21 May 2011 23:51:45 +0200 Message-ID: <4DD833EF.9050708@oracle.com> Date: Sat, 21 May 2011 23:51:43 +0200 From: Paolo Carlini User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.2.17) Gecko/20110414 SUSE/3.1.10 Thunderbird/3.1.10 MIME-Version: 1.0 To: "gcc-patches@gcc.gnu.org" CC: libstdc++ Subject: [v3] Update std::unique_ptr for noexcept X-IsSubscribed: yes Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Hi, tested x86_64-linux, committed. Paolo. //////////////////////// 2011-05-21 Paolo Carlini * include/bits/unique_ptr.h: Use noexcept per the FDIS. Index: include/bits/unique_ptr.h =================================================================== --- include/bits/unique_ptr.h (revision 174002) +++ include/bits/unique_ptr.h (working copy) @@ -49,11 +49,11 @@ template struct default_delete { - constexpr default_delete() = default; + constexpr default_delete() noexcept = default; template::value>::type> - default_delete(const default_delete<_Up>&) { } + default_delete(const default_delete<_Up>&) noexcept { } void operator()(_Tp* __ptr) const @@ -70,7 +70,7 @@ template struct default_delete<_Tp[]> { - constexpr default_delete() = default; + constexpr default_delete() noexcept = default; void operator()(_Tp* __ptr) const @@ -111,35 +111,35 @@ typedef _Dp deleter_type; // Constructors. - constexpr unique_ptr() + constexpr unique_ptr() noexcept : _M_t() { static_assert(!std::is_pointer::value, "constructed with null function pointer deleter"); } explicit - unique_ptr(pointer __p) + unique_ptr(pointer __p) noexcept : _M_t(__p, deleter_type()) { static_assert(!std::is_pointer::value, "constructed with null function pointer deleter"); } unique_ptr(pointer __p, typename std::conditional::value, - deleter_type, const deleter_type&>::type __d) + deleter_type, const deleter_type&>::type __d) noexcept : _M_t(__p, __d) { } unique_ptr(pointer __p, - typename std::remove_reference::type&& __d) + typename std::remove_reference::type&& __d) noexcept : _M_t(std::move(__p), std::move(__d)) { static_assert(!std::is_reference::value, "rvalue deleter bound to reference"); } - constexpr unique_ptr(nullptr_t) + constexpr unique_ptr(nullptr_t) noexcept : _M_t() { static_assert(!std::is_pointer::value, "constructed with null function pointer deleter"); } // Move constructors. - unique_ptr(unique_ptr&& __u) + unique_ptr(unique_ptr&& __u) noexcept : _M_t(__u.release(), std::forward(__u.get_deleter())) { } template::value && std::is_convertible<_Ep, _Dp>::value))> ::type> - unique_ptr(unique_ptr<_Up, _Ep>&& __u) + unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept : _M_t(__u.release(), std::forward<_Ep>(__u.get_deleter())) { } @@ -161,7 +161,7 @@ std::enable_if::value && std::is_same<_Dp, default_delete<_Tp>>::value>::type> - unique_ptr(auto_ptr<_Up>&& __u) + unique_ptr(auto_ptr<_Up>&& __u) noexcept : _M_t(__u.release(), deleter_type()) { } #endif @@ -170,7 +170,7 @@ // Assignment. unique_ptr& - operator=(unique_ptr&& __u) + operator=(unique_ptr&& __u) noexcept { reset(__u.release()); get_deleter() = std::forward(__u.get_deleter()); @@ -183,7 +183,7 @@ pointer>::value && !std::is_array<_Up>::value>::type> unique_ptr& - operator=(unique_ptr<_Up, _Ep>&& __u) + operator=(unique_ptr<_Up, _Ep>&& __u) noexcept { reset(__u.release()); get_deleter() = std::forward<_Ep>(__u.get_deleter()); @@ -191,7 +191,7 @@ } unique_ptr& - operator=(nullptr_t) + operator=(nullptr_t) noexcept { reset(); return *this; @@ -206,30 +206,30 @@ } pointer - operator->() const + operator->() const noexcept { _GLIBCXX_DEBUG_ASSERT(get() != pointer()); return get(); } pointer - get() const + get() const noexcept { return std::get<0>(_M_t); } deleter_type& - get_deleter() + get_deleter() noexcept { return std::get<1>(_M_t); } const deleter_type& - get_deleter() const + get_deleter() const noexcept { return std::get<1>(_M_t); } - explicit operator bool() const + explicit operator bool() const noexcept { return get() == pointer() ? false : true; } // Modifiers. pointer - release() + release() noexcept { pointer __p = get(); std::get<0>(_M_t) = pointer(); @@ -237,7 +237,7 @@ } void - reset(pointer __p = pointer()) + reset(pointer __p = pointer()) noexcept { using std::swap; swap(std::get<0>(_M_t), __p); @@ -246,7 +246,7 @@ } void - swap(unique_ptr& __u) + swap(unique_ptr& __u) noexcept { using std::swap; swap(_M_t, __u._M_t); @@ -273,39 +273,39 @@ typedef _Dp deleter_type; // Constructors. - constexpr unique_ptr() + constexpr unique_ptr() noexcept : _M_t() { static_assert(!std::is_pointer::value, "constructed with null function pointer deleter"); } explicit - unique_ptr(pointer __p) + unique_ptr(pointer __p) noexcept : _M_t(__p, deleter_type()) { static_assert(!std::is_pointer::value, "constructed with null function pointer deleter"); } unique_ptr(pointer __p, typename std::conditional::value, - deleter_type, const deleter_type&>::type __d) + deleter_type, const deleter_type&>::type __d) noexcept : _M_t(__p, __d) { } - unique_ptr(pointer __p, - typename std::remove_reference::type && __d) + unique_ptr(pointer __p, typename + std::remove_reference::type && __d) noexcept : _M_t(std::move(__p), std::move(__d)) { static_assert(!std::is_reference::value, "rvalue deleter bound to reference"); } - constexpr unique_ptr(nullptr_t) + constexpr unique_ptr(nullptr_t) noexcept : _M_t() { static_assert(!std::is_pointer::value, "constructed with null function pointer deleter"); } // Move constructors. - unique_ptr(unique_ptr&& __u) + unique_ptr(unique_ptr&& __u) noexcept : _M_t(__u.release(), std::forward(__u.get_deleter())) { } template - unique_ptr(unique_ptr<_Up, _Ep>&& __u) + unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept : _M_t(__u.release(), std::forward<_Ep>(__u.get_deleter())) { } @@ -314,7 +314,7 @@ // Assignment. unique_ptr& - operator=(unique_ptr&& __u) + operator=(unique_ptr&& __u) noexcept { reset(__u.release()); get_deleter() = std::forward(__u.get_deleter()); @@ -323,7 +323,7 @@ template unique_ptr& - operator=(unique_ptr<_Up, _Ep>&& __u) + operator=(unique_ptr<_Up, _Ep>&& __u) noexcept { reset(__u.release()); get_deleter() = std::forward<_Ep>(__u.get_deleter()); @@ -331,7 +331,7 @@ } unique_ptr& - operator=(nullptr_t) + operator=(nullptr_t) noexcept { reset(); return *this; @@ -346,23 +346,23 @@ } pointer - get() const + get() const noexcept { return std::get<0>(_M_t); } deleter_type& - get_deleter() + get_deleter() noexcept { return std::get<1>(_M_t); } const deleter_type& - get_deleter() const + get_deleter() const noexcept { return std::get<1>(_M_t); } - explicit operator bool() const + explicit operator bool() const noexcept { return get() == pointer() ? false : true; } // Modifiers. pointer - release() + release() noexcept { pointer __p = get(); std::get<0>(_M_t) = pointer(); @@ -370,7 +370,7 @@ } void - reset(pointer __p = pointer()) + reset(pointer __p = pointer()) noexcept { using std::swap; swap(std::get<0>(_M_t), __p); @@ -379,7 +379,7 @@ } void - reset(nullptr_t) + reset(nullptr_t) noexcept { pointer __p = get(); std::get<0>(_M_t) = pointer(); @@ -392,7 +392,7 @@ void reset(_Up) = delete; void - swap(unique_ptr& __u) + swap(unique_ptr& __u) noexcept { using std::swap; swap(_M_t, __u._M_t); @@ -420,12 +420,12 @@ explicit unique_ptr(_Up*, typename std::enable_if::value>::type* = 0) = delete; - }; + }; template inline void swap(unique_ptr<_Tp, _Dp>& __x, - unique_ptr<_Tp, _Dp>& __y) + unique_ptr<_Tp, _Dp>& __y) noexcept { __x.swap(__y); } template