From patchwork Wed Oct 9 04:42:20 2019 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: 1173580 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=gcc.gnu.org (client-ip=209.132.180.131; helo=sourceware.org; envelope-from=gcc-patches-return-510506-incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="vGGyKe8w"; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b="QvizbZi9"; dkim-atps=neutral Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 46p1mM6Z2Bz9sDQ for ; Wed, 9 Oct 2019 15:42:41 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to :from:subject:message-id:date:mime-version:content-type; q=dns; s=default; b=XwvvoZ0ZWPTCzmjBKPeQc7tu6mDZmKI8ARksD0U9117JJLkre5 MxWCCObHmyer8wBWsFhTmhBXnapbOvad1xJWw0eK6fMTbjPZTZVrx49SgoF1Xguh V7x9CvxKcPyLuLrilI/KgYon7X1EP0X9wEKHRuiP8kLGrFsvFMjXLp0qs= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:to :from:subject:message-id:date:mime-version:content-type; s= default; bh=+AAzC7rlc1uwP6o7NKFyHLxpIM4=; b=vGGyKe8w6GyO1pJK82O6 KAFLyFNyaTW8Mk/lRrQ7zjoJdiwIh0QsDDuK0XWDttc70crQ/R8DUtIaM7aQ3Uq/ vYNqR0Mxr64z+oWGM+aAiESv+cOpFe5dUquwjqhypRHiJHL63uSBTCRWxu0aQeHk 4pM3bEOq6070EjRNkfD3TnU= Received: (qmail 65471 invoked by alias); 9 Oct 2019 04:42:27 -0000 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 Received: (qmail 65452 invoked by uid 89); 9 Oct 2019 04:42:27 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-23.1 required=5.0 tests=AWL, BAYES_00, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.1 spammy=sk:streamb, friend X-HELO: mail-wm1-f44.google.com Received: from mail-wm1-f44.google.com (HELO mail-wm1-f44.google.com) (209.85.128.44) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 09 Oct 2019 04:42:25 +0000 Received: by mail-wm1-f44.google.com with SMTP id y135so3822363wmc.1; Tue, 08 Oct 2019 21:42:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=to:from:subject:message-id:date:user-agent:mime-version :content-language; bh=6PvOJpjmcprymwaLKq7Op6fTD4x0KqOnIFqcFzimomo=; b=QvizbZi9TqWvq1fnFup0tbFT3iuAhUzFtK0l43L5FeZESZg6hK7aF0Wejw5YkLsc9B Mmi38OpFfyuPJNt5KtyPcRL7avNnV2Mv2q6LbUIzxrKFOGgMnCjZQtkHbvJiFVnJPCxY EJtTrxFq0E3WzFYv/tvq1FkA5TCLYXpnQgUU3TZZmO6GBZMBHWstHQOY3XIFewYWWpqg M68f+WIaH4J1f3CNI7+GbyZUVQLC8yVKWgiyJQZlkwfr9K5h2nIFS9qj6oQN1qEGKxB3 9UsX4Ih6aTBJzzHKzrnHyxrj1OwCH9B6K1t+gCn3hSjkZ7TnGpBwUuwQuQpec6yknbD7 iZgg== Received: from [10.10.7.214] ([109.190.253.14]) by smtp.googlemail.com with ESMTPSA id b144sm1248503wmb.3.2019.10.08.21.42.21 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 08 Oct 2019 21:42:22 -0700 (PDT) To: "libstdc++@gcc.gnu.org" , gcc-patches From: =?utf-8?q?Fran=C3=A7ois_Dumont?= Subject: [PATCH] Review std::copy istreambuf_iterator specialization Message-ID: Date: Wed, 9 Oct 2019 06:42:20 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.8.0 MIME-Version: 1.0 Hi     Following what has been done for std::copy_n I think we could simplify the __copy_move_a2 overload to also use sgetn. Code is simpler and we avoid a friend declaration.     Tested under Linux x86_64.     * include/std/streambuf (__copy_move_a2): Remove friend declaration.     * include/bits/streambuf_iterator.h (__copy_move_a2): Re-implement using     streambuf in_avail and sgetn.     Ok to commit ? François diff --git a/libstdc++-v3/include/bits/streambuf_iterator.h b/libstdc++-v3/include/bits/streambuf_iterator.h index e3e8736e768..134b3486b9a 100644 --- a/libstdc++-v3/include/bits/streambuf_iterator.h +++ b/libstdc++-v3/include/bits/streambuf_iterator.h @@ -345,31 +345,19 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION istreambuf_iterator<_CharT> __last, _CharT* __result) { typedef istreambuf_iterator<_CharT> __is_iterator_type; - typedef typename __is_iterator_type::traits_type traits_type; typedef typename __is_iterator_type::streambuf_type streambuf_type; - typedef typename traits_type::int_type int_type; if (__first._M_sbuf && !__last._M_sbuf) { streambuf_type* __sb = __first._M_sbuf; - int_type __c = __sb->sgetc(); - while (!traits_type::eq_int_type(__c, traits_type::eof())) + std::streamsize __avail = __sb->in_avail(); + while (__avail > 0) { - const streamsize __n = __sb->egptr() - __sb->gptr(); - if (__n > 1) - { - traits_type::copy(__result, __sb->gptr(), __n); - __sb->__safe_gbump(__n); - __result += __n; - __c = __sb->underflow(); - } - else - { - *__result++ = traits_type::to_char_type(__c); - __c = __sb->snextc(); - } + __result += __sb->sgetn(__result, __avail); + __avail = __sb->in_avail(); } } + return __result; } diff --git a/libstdc++-v3/include/std/streambuf b/libstdc++-v3/include/std/streambuf index d9ca981d704..3442f19bd78 100644 --- a/libstdc++-v3/include/std/streambuf +++ b/libstdc++-v3/include/std/streambuf @@ -149,12 +149,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION friend streamsize __copy_streambufs_eof<>(basic_streambuf*, basic_streambuf*, bool&); - template - friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, - _CharT2*>::__type - __copy_move_a2(istreambuf_iterator<_CharT2>, - istreambuf_iterator<_CharT2>, _CharT2*); - template friend typename __gnu_cxx::__enable_if<__is_char<_CharT2>::__value, istreambuf_iterator<_CharT2> >::__type