From patchwork Sun Nov 21 11:24:59 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Fran=C3=A7ois_Dumont?= X-Patchwork-Id: 47974 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D840D3858426 for ; Sun, 21 Nov 2021 11:25:31 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D840D3858426 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1637493931; bh=hUvWGG/TDFf5KheiM1eVSkBtORo+kv1ffv4mKSy8occ=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=efVvjC2uqu+JVOn/URgKLobi6QuQYdjRXbtF0UbwGtm2/ttJYjibOJgk09dx3+nbQ UxSTIZxDZ2G7lTUZHE5MZRMd4M9GUIhO6EC3mJE4PWNycCHm5atC6t0ck/PWCCd13r x11AM1WFMAmJ1g1vlle60wH87CCU6VvycQxMIIfU= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mail-wm1-x32d.google.com (mail-wm1-x32d.google.com [IPv6:2a00:1450:4864:20::32d]) by sourceware.org (Postfix) with ESMTPS id 71FA3385840D; Sun, 21 Nov 2021 11:25:02 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 71FA3385840D Received: by mail-wm1-x32d.google.com with SMTP id k37-20020a05600c1ca500b00330cb84834fso14245159wms.2; Sun, 21 Nov 2021 03:25:02 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:to:cc:from:subject:message-id:date:user-agent :mime-version:content-language; bh=hUvWGG/TDFf5KheiM1eVSkBtORo+kv1ffv4mKSy8occ=; b=lIshuhoe3nyt4WFS2UNp18wxMhhH8ljkovESoN72mM3jyCNGDSLyvikv2jO3I69neq 57oFXJ5i8SBn0wsb+6cvrcOoCEdMXKXQS+VHfBCBT085MSGhKLEr+Cmg1fal7MsnCNs0 XvdPQfxrJyklq5gGqHl9y5B5DbH8AlNUDgZdiUfJ6YvtH+IkZYBJsO3DJKs1lyMF2uzO 3KBj5YUnKRHHBYuOxjF/yT1QS/lenLi/KSJJ2ywG/vuEMb6TA3kvXXdWw/ejHXmvDNrJ VK8CheFVsZ3K/4RNfnIZXmcQ3Cf7YxGmFCuZfGVxq8oSXXr2U2PCLYOppOCzbFKHMZnE AlgQ== X-Gm-Message-State: AOAM5326Z5z0rL21TUJjyIVhFDGKECIlmE7oRVRNSTfgom/iS3jV2G1e 0mJBvftF0xJa3c4kbzQ7vSz/n25knMg= X-Google-Smtp-Source: ABdhPJwqho9XcWn5zm9AcTAEKWkcJAXs4WlPivU1ylCKdqpYbZMG3mMuWbmeCiWysqZlWLz4VKGZzQ== X-Received: by 2002:a05:600c:3b83:: with SMTP id n3mr18574313wms.116.1637493901197; Sun, 21 Nov 2021 03:25:01 -0800 (PST) Received: from [192.168.1.75] (38.200.13.93.rev.sfr.net. [93.13.200.38]) by smtp.googlemail.com with ESMTPSA id y7sm5540701wrw.55.2021.11.21.03.25.00 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Sun, 21 Nov 2021 03:25:00 -0800 (PST) To: "libstdc++@gcc.gnu.org" Subject: [PATCH][_GLIBCXX_DEBUG] Enhance std::erase_if for vector/deque Message-ID: <260f7bad-9d35-44ea-a354-ad88dd04b685@gmail.com> Date: Sun, 21 Nov 2021 12:24:59 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.13.0 MIME-Version: 1.0 Content-Language: fr X-Spam-Status: No, score=-9.8 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: =?utf-8?q?Fran=C3=A7ois_Dumont_via_Gcc-patches?= From: =?utf-8?q?Fran=C3=A7ois_Dumont?= Reply-To: =?utf-8?q?Fran=C3=A7ois_Dumont?= Cc: gcc-patches Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" I tried to use the same approach I used for node based containers but got ambiguity on erase calls. I think this simple version will do the work.     libstdc++: [_GLIBCXX_DEBUG] Enhance std::erase_if for vector/deque     libstdc++-v3/ChangeLog:             * include/std/deque (erase_if): Use _GLIBCXX_STD_C container reference and             __niter_wrap to limit _GLIBCXX_DEBUG mode impact.             * include/std/vector (erase_if): Likewise. Tested under Linux x86_64 normal and _GLIBCXX_DEBUG modes. Ok to commit ? François diff --git a/libstdc++-v3/include/std/deque b/libstdc++-v3/include/std/deque index 473479c44ac..0a3541af554 100644 --- a/libstdc++-v3/include/std/deque +++ b/libstdc++-v3/include/std/deque @@ -96,12 +96,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION erase_if(deque<_Tp, _Alloc>& __cont, _Predicate __pred) { using namespace __gnu_cxx; + _GLIBCXX_STD_C::deque<_Tp, _Alloc>& __ucont = __cont; const auto __osz = __cont.size(); - const auto __end = __cont.end(); - auto __removed = std::__remove_if(__cont.begin(), __end, + const auto __end = __ucont.end(); + auto __removed = std::__remove_if(__ucont.begin(), __end, __ops::__pred_iter(std::ref(__pred))); - __cont.erase(__removed, __end); - return __osz - __cont.size(); + if (__removed != __end) + { + __cont.erase(__niter_wrap(__cont.begin(), __removed), + __cont.end()); + return __osz - __cont.size(); + } + + return 0; } template @@ -109,12 +116,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION erase(deque<_Tp, _Alloc>& __cont, const _Up& __value) { using namespace __gnu_cxx; + _GLIBCXX_STD_C::deque<_Tp, _Alloc>& __ucont = __cont; const auto __osz = __cont.size(); - const auto __end = __cont.end(); - auto __removed = std::__remove_if(__cont.begin(), __end, + const auto __end = __ucont.end(); + auto __removed = std::__remove_if(__ucont.begin(), __end, __ops::__iter_equals_val(__value)); - __cont.erase(__removed, __end); - return __osz - __cont.size(); + if (__removed != __end) + { + __cont.erase(__niter_wrap(__cont.begin(), __removed), + __cont.end()); + return __osz - __cont.size(); + } + + return 0; } _GLIBCXX_END_NAMESPACE_VERSION } // namespace std diff --git a/libstdc++-v3/include/std/vector b/libstdc++-v3/include/std/vector index 890b0ddb3eb..b648b3d7309 100644 --- a/libstdc++-v3/include/std/vector +++ b/libstdc++-v3/include/std/vector @@ -107,12 +107,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION erase_if(vector<_Tp, _Alloc>& __cont, _Predicate __pred) { using namespace __gnu_cxx; + _GLIBCXX_STD_C::vector<_Tp, _Alloc>& __ucont = __cont; const auto __osz = __cont.size(); - const auto __end = __cont.end(); - auto __removed = std::__remove_if(__cont.begin(), __end, + const auto __end = __ucont.end(); + auto __removed = std::__remove_if(__ucont.begin(), __end, __ops::__pred_iter(std::ref(__pred))); - __cont.erase(__removed, __end); - return __osz - __cont.size(); + if (__removed != __end) + { + __cont.erase(__niter_wrap(__cont.begin(), __removed), + __cont.end()); + return __osz - __cont.size(); + } + + return 0; } template @@ -121,12 +128,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION erase(vector<_Tp, _Alloc>& __cont, const _Up& __value) { using namespace __gnu_cxx; + _GLIBCXX_STD_C::vector<_Tp, _Alloc>& __ucont = __cont; const auto __osz = __cont.size(); - const auto __end = __cont.end(); - auto __removed = std::__remove_if(__cont.begin(), __end, + const auto __end = __ucont.end(); + auto __removed = std::__remove_if(__ucont.begin(), __end, __ops::__iter_equals_val(__value)); - __cont.erase(__removed, __end); - return __osz - __cont.size(); + if (__removed != __end) + { + __cont.erase(__niter_wrap(__cont.begin(), __removed), + __cont.end()); + return __osz - __cont.size(); + } + + return 0; } _GLIBCXX_END_NAMESPACE_VERSION } // namespace std