aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2016-09-23 18:25:23 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2016-09-23 18:25:23 +0100
commita922c5ff6f3872fc9ce1e484a0e92f288ff6c68d (patch)
tree62231e54ad2ab9735e402dda27e441a3c84f50bb
parentb862552dff04fbd4c7debf07a7c82d361869a552 (diff)
downloadgcc-a922c5ff6f3872fc9ce1e484a0e92f288ff6c68d.zip
gcc-a922c5ff6f3872fc9ce1e484a0e92f288ff6c68d.tar.gz
gcc-a922c5ff6f3872fc9ce1e484a0e92f288ff6c68d.tar.bz2
Optimize truncating a basic_string
* include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI] (basic_string::erase(size_type, size_type)): Add fast path for truncating the string, by calling _M_set_length directly. (basic_string::erase(__const_iterator, __const_iterator)): Likewise. * include/bits/basic_string.tcc [_GLIBCXX_USE_CXX11_ABI] (basic_string::resize(size_type, _CharT)): Likewise. From-SVN: r240446
-rw-r--r--libstdc++-v3/ChangeLog9
-rw-r--r--libstdc++-v3/include/bits/basic_string.h12
-rw-r--r--libstdc++-v3/include/bits/basic_string.tcc2
3 files changed, 19 insertions, 4 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index 69338c1..80bc018 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,3 +1,12 @@
+2016-09-23 Jonathan Wakely <jwakely@redhat.com>
+
+ * include/bits/basic_string.h [_GLIBCXX_USE_CXX11_ABI]
+ (basic_string::erase(size_type, size_type)): Add fast path for
+ truncating the string, by calling _M_set_length directly.
+ (basic_string::erase(__const_iterator, __const_iterator)): Likewise.
+ * include/bits/basic_string.tcc [_GLIBCXX_USE_CXX11_ABI]
+ (basic_string::resize(size_type, _CharT)): Likewise.
+
2016-09-22 Jason Merrill <jason@redhat.com>
* configure.ac: Define HAVE_MEMALIGN for newlib.
diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h
index e823f13..2708cbc 100644
--- a/libstdc++-v3/include/bits/basic_string.h
+++ b/libstdc++-v3/include/bits/basic_string.h
@@ -1709,8 +1709,11 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
basic_string&
erase(size_type __pos = 0, size_type __n = npos)
{
- this->_M_erase(_M_check(__pos, "basic_string::erase"),
- _M_limit(__pos, __n));
+ _M_check(__pos, "basic_string::erase");
+ if (__n == npos)
+ this->_M_set_length(__pos);
+ else if (__n != 0)
+ this->_M_erase(__pos, _M_limit(__pos, __n));
return *this;
}
@@ -1747,7 +1750,10 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
_GLIBCXX_DEBUG_PEDASSERT(__first >= begin() && __first <= __last
&& __last <= end());
const size_type __pos = __first - begin();
- this->_M_erase(__pos, __last - __first);
+ if (__last == end())
+ this->_M_set_length(__pos);
+ else
+ this->_M_erase(__pos, __last - __first);
return iterator(this->_M_data() + __pos);
}
diff --git a/libstdc++-v3/include/bits/basic_string.tcc b/libstdc++-v3/include/bits/basic_string.tcc
index 0080d2b..df1e8dd 100644
--- a/libstdc++-v3/include/bits/basic_string.tcc
+++ b/libstdc++-v3/include/bits/basic_string.tcc
@@ -351,7 +351,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
if (__size < __n)
this->append(__n - __size, __c);
else if (__n < __size)
- this->_M_erase(__n, __size - __n);
+ this->_M_set_length(__n);
}
template<typename _CharT, typename _Traits, typename _Alloc>