Make basic_streambuf::xsputn write characters in chunks whenever possible, instead of one at a time. References PR#10193
git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@229866 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/include/streambuf b/include/streambuf
index 6adfc92..603c680 100644
--- a/include/streambuf
+++ b/include/streambuf
@@ -536,12 +536,23 @@
{
streamsize __i = 0;
int_type __eof = traits_type::eof();
- for (; __i < __n; ++__s, ++__i)
+ while( __i < __n)
{
- if (__nout_ < __eout_)
- *__nout_++ = *__s;
- else if (overflow(traits_type::to_int_type(*__s)) == __eof)
- break;
+ if (__nout_ >= __eout_)
+ {
+ if (overflow(traits_type::to_int_type(*__s)) == __eof)
+ break;
+ ++__s;
+ ++__i;
+ }
+ else
+ {
+ streamsize __chunk_size = _VSTD::min(__eout_ - __nout_, __n - __i);
+ traits_type::copy(__nout_, __s, __chunk_size);
+ __nout_ += __chunk_size;
+ __s += __chunk_size;
+ __i += __chunk_size;
+ }
}
return __i;
}