[PATCH] LWG 3040: define starts_with/ends_with as proposed

Jonathan Wakely jwakely@redhat.com
Tue Dec 18 15:35:00 GMT 2018


	* include/std/string_view [__cplusplus > 201703L]
	(basic_string_view::starts_with(basic_string_view)): Implement
	proposed resolution of LWG 3040 to avoid redundant length check.
	(basic_string_view::starts_with(_CharT)): Implement proposed
	resolution of LWG 3040 to check at most one character.
	(basic_string_view::ends_with(_CharT)): Likewise.

Tested powerpc64le-linux, committed to trunk.

-------------- next part --------------
commit 6567fce9525ef70f9beaf03887213f594545c92e
Author: Jonathan Wakely <jwakely@redhat.com>
Date:   Tue Dec 18 13:53:26 2018 +0000

    LWG 3040 define starts_with/ends_with as proposed
    
            * include/std/string_view [__cplusplus > 201703L]
            (basic_string_view::starts_with(basic_string_view)): Implement
            proposed resolution of LWG 3040 to avoid redundant length check.
            (basic_string_view::starts_with(_CharT)): Implement proposed
            resolution of LWG 3040 to check at most one character.
            (basic_string_view::ends_with(_CharT)): Likewise.

diff --git a/libstdc++-v3/include/std/string_view b/libstdc++-v3/include/std/string_view
index 28d3fa46718..ac84b24314e 100644
--- a/libstdc++-v3/include/std/string_view
+++ b/libstdc++-v3/include/std/string_view
@@ -389,14 +389,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 #if __cplusplus > 201703L
       constexpr bool
       starts_with(basic_string_view __x) const noexcept
-      {
-	return this->size() >= __x.size()
-	    && this->compare(0, __x.size(), __x) == 0;
-      }
+      { return this->substr(0, __x.size()) == __x; }
 
       constexpr bool
       starts_with(_CharT __x) const noexcept
-      { return this->starts_with(basic_string_view(&__x, 1)); }
+      { return !this->empty() && traits_type::eq(this->front(), __x); }
 
       constexpr bool
       starts_with(const _CharT* __x) const noexcept
@@ -411,7 +408,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
 
       constexpr bool
       ends_with(_CharT __x) const noexcept
-      { return this->ends_with(basic_string_view(&__x, 1)); }
+      { return !this->empty() && traits_type::eq(this->back(), __x); }
 
       constexpr bool
       ends_with(const _CharT* __x) const noexcept


More information about the Gcc-patches mailing list