public inbox for libstdc++@gcc.gnu.org
 help / color / mirror / Atom feed
From: Jonathan Wakely <jwakely@redhat.com>
To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org
Subject: [committed] libstdc++: Simplify __format::_Sink::_M_reset
Date: Fri,  1 Sep 2023 11:55:00 +0100	[thread overview]
Message-ID: <20230901105513.226352-1-jwakely@redhat.com> (raw)

Tested x86_64-linux. Pushed to trunk.

-- >8 --

Using an offset as the second argument instead of an iterator makes it
easier for callers, as they don't need to create an lvalue span in order
to get an iterator from it for the _M_reset call.

libstdc++-v3/ChangeLog:

	* include/std/format (__format::_Sink::_M_reset): Change second
	argument from iterator to offset.
---
 libstdc++-v3/include/std/format | 22 +++++++++++++---------
 1 file changed, 13 insertions(+), 9 deletions(-)

diff --git a/libstdc++-v3/include/std/format b/libstdc++-v3/include/std/format
index fe2caa58688..128a5b79282 100644
--- a/libstdc++-v3/include/std/format
+++ b/libstdc++-v3/include/std/format
@@ -2537,11 +2537,10 @@ namespace __format
 
       // Replace the current output range.
       void
-      _M_reset(span<_CharT> __s,
-	       typename span<_CharT>::iterator __next) noexcept
+      _M_reset(span<_CharT> __s, size_t __pos = 0) noexcept
       {
 	_M_span = __s;
-	_M_next = __next;
+	_M_next = __s.begin() + __pos;
       }
 
       // Called by the iterator for *it++ = c
@@ -2599,7 +2598,7 @@ namespace __format
   // A sink that fills a sequence (e.g. std::string, std::vector, std::deque).
   // Writes to a buffer then appends that to the sequence when it fills up.
   template<typename _Seq>
-    class _Seq_sink : public _Buf_sink<typename _Seq::value_type>
+    class _Seq_sink final : public _Buf_sink<typename _Seq::value_type>
     {
       using _CharT = typename _Seq::value_type;
 
@@ -2610,6 +2609,8 @@ namespace __format
       _M_overflow() override
       {
 	auto __s = this->_M_used();
+	if (__s.empty())
+	  return;
 	if constexpr (__is_specialization_of<_Seq, basic_string>)
 	  _M_seq.append(__s.data(), __s.size());
 	else
@@ -2618,6 +2619,9 @@ namespace __format
       }
 
     public:
+      // TODO: for SSO string, use SSO buffer as initial span, then switch
+      // to _M_buf if it overflows? Or even do that for all unused capacity?
+
       [[__gnu__::__always_inline__]]
       _Seq_sink() noexcept(is_nothrow_default_constructible_v<_Seq>)
       { }
@@ -2722,21 +2726,20 @@ namespace __format
 	  return; // No need to switch to internal buffer yet.
 
 	auto __s = this->_M_used();
-	_M_count += __s.size();
 
 	if (_M_max >= 0)
 	  {
+	    _M_count += __s.size();
 	    // Span was already sized for the maximum character count,
 	    // if it overflows then any further output must go to the
 	    // internal buffer, to be discarded.
-	    span<_CharT> __buf{_M_buf};
-	    this->_M_reset(__buf, __buf.begin());
+	    this->_M_reset(this->_M_buf);
 	  }
 	else
 	  {
 	    // No maximum character count. Just extend the span to allow
 	    // writing more characters to it.
-	    this->_M_reset({__s.data(), __s.size() + 1024}, __s.end());
+	    this->_M_reset({__s.data(), __s.size() + 1024}, __s.size());
 	  }
       }
 
@@ -3473,6 +3476,7 @@ namespace __format
 
   template<typename _Context>
     template<typename... _Args>
+      inline
       basic_format_args<_Context>::
       basic_format_args(const _Store<_Args...>& __store) noexcept
       {
@@ -4063,7 +4067,7 @@ namespace __format
 {
 #if 1
   template<typename _CharT>
-    class _Counting_sink : public _Iter_sink<_CharT, _CharT*>
+    class _Counting_sink final : public _Iter_sink<_CharT, _CharT*>
     {
     public:
       _Counting_sink() : _Iter_sink<_CharT, _CharT*>(nullptr, 0) { }
-- 
2.41.0


                 reply	other threads:[~2023-09-01 10:55 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230901105513.226352-1-jwakely@redhat.com \
    --to=jwakely@redhat.com \
    --cc=gcc-patches@gcc.gnu.org \
    --cc=libstdc++@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).