From patchwork Mon Oct 3 15:32:36 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paolo Carlini X-Patchwork-Id: 117474 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 78473B6F18 for ; Tue, 4 Oct 2011 02:34:49 +1100 (EST) Received: (qmail 21176 invoked by alias); 3 Oct 2011 15:34:39 -0000 Received: (qmail 21055 invoked by uid 22791); 3 Oct 2011 15:34:36 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from acsinet15.oracle.com (HELO acsinet15.oracle.com) (141.146.126.227) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Mon, 03 Oct 2011 15:34:12 +0000 Received: from ucsinet24.oracle.com (ucsinet24.oracle.com [156.151.31.67]) by acsinet15.oracle.com (Switch-3.4.4/Switch-3.4.4) with ESMTP id p93FY9sQ032512 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=FAIL); Mon, 3 Oct 2011 15:34:11 GMT Received: from acsmt356.oracle.com (acsmt356.oracle.com [141.146.40.156]) by ucsinet24.oracle.com (8.14.4+Sun/8.14.4) with ESMTP id p93FSNui021122 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Mon, 3 Oct 2011 15:28:24 GMT Received: from abhmt112.oracle.com (abhmt112.oracle.com [141.146.116.64]) by acsmt356.oracle.com (8.12.11.20060308/8.12.11) with ESMTP id p93FY4QE004864; Mon, 3 Oct 2011 10:34:04 -0500 Received: from [192.168.1.4] (/79.52.211.27) by default (Oracle Beehive Gateway v4.0) with ESMTP ; Mon, 03 Oct 2011 08:34:03 -0700 Message-ID: <4E89D594.8070508@oracle.com> Date: Mon, 03 Oct 2011 17:32:36 +0200 From: Paolo Carlini User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:7.0) Gecko/20110922 Thunderbird/7.0 MIME-Version: 1.0 To: "gcc-patches@gcc.gnu.org" CC: libstdc++ Subject: [v3] Don't declare insert(&&) members in _Hashtable 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, noticed while working on finally defaulting pair' move constructor (the way to go, proposed by Daniel, seems to be using std::is_constructible instead of std::is_convertible for constraining. Testing that uncovered a number of interesting latent issues at various levels ;) Tested x86_64-linux, committed. Paolo. ///////////////////////// 2011-10-03 Paolo Carlini * include/bits/hashtable.h (_Hashtable<>::insert(value_type&&), insert(const_iterator, value_type&&)): Don't define here... * include/bits/unordered_set.h (__unordered_set<>, __unordered_multiset<>): ... define here instead. Index: include/bits/hashtable.h =================================================================== --- include/bits/hashtable.h (revision 179456) +++ include/bits/hashtable.h (working copy) @@ -374,14 +374,6 @@ _M_insert_bucket(_Arg&&, size_type, typename _Hashtable::_Hash_code_type); - template - std::pair - _M_insert(_Arg&&, std::true_type); - - template - iterator - _M_insert(_Arg&&, std::false_type); - typedef typename std::conditional<__unique_keys, std::pair, iterator>::type @@ -393,38 +385,38 @@ >::type _Insert_Conv_Type; + protected: + template + std::pair + _M_insert(_Arg&&, std::true_type); + + template + iterator + _M_insert(_Arg&&, std::false_type); + public: // Insert and erase _Insert_Return_Type insert(const value_type& __v) - { return _M_insert(__v, std::integral_constant()); } + { return _M_insert(__v, integral_constant()); } iterator insert(const_iterator, const value_type& __v) { return _Insert_Conv_Type()(insert(__v)); } - _Insert_Return_Type - insert(value_type&& __v) - { return _M_insert(std::move(__v), - std::integral_constant()); } - - iterator - insert(const_iterator, value_type&& __v) - { return _Insert_Conv_Type()(insert(std::move(__v))); } - template::value>::type> + std::enable_if<__and_, + std::is_convertible<_Pair, + value_type>>::value>::type> _Insert_Return_Type insert(_Pair&& __v) { return _M_insert(std::forward<_Pair>(__v), - std::integral_constant()); } + integral_constant()); } template::value>::type> + std::enable_if<__and_, + std::is_convertible<_Pair, + value_type>>::value>::type> iterator insert(const_iterator, _Pair&& __v) { return _Insert_Conv_Type()(insert(std::forward<_Pair>(__v))); } Index: include/bits/unordered_set.h =================================================================== --- include/bits/unordered_set.h (revision 179456) +++ include/bits/unordered_set.h (working copy) @@ -63,7 +63,9 @@ typedef typename _Base::hasher hasher; typedef typename _Base::key_equal key_equal; typedef typename _Base::allocator_type allocator_type; - + typedef typename _Base::iterator iterator; + typedef typename _Base::const_iterator const_iterator; + explicit __unordered_set(size_type __n = 10, const hasher& __hf = hasher(), @@ -103,6 +105,16 @@ this->insert(__l.begin(), __l.end()); return *this; } + + using _Base::insert; + + std::pair + insert(value_type&& __v) + { return this->_M_insert(std::move(__v), std::true_type()); } + + iterator + insert(const_iterator, value_type&& __v) + { return insert(std::move(__v)).first; } }; templateinsert(__l.begin(), __l.end()); return *this; } + + using _Base::insert; + + iterator + insert(value_type&& __v) + { return this->_M_insert(std::move(__v), std::false_type()); } + + iterator + insert(const_iterator, value_type&& __v) + { return insert(std::move(__v)); } }; template