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.

From-SVN: r267234
This commit is contained in:
Jonathan Wakely 2018-12-18 15:34:43 +00:00 committed by Jonathan Wakely
parent 34a9bcaf8b
commit 49cefcf3f0
2 changed files with 12 additions and 6 deletions

View File

@ -1,3 +1,12 @@
2018-12-18 Jonathan Wakely <jwakely@redhat.com>
* 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.
2018-12-17 Jonathan Wakely <jwakely@redhat.com> 2018-12-17 Jonathan Wakely <jwakely@redhat.com>
PR libstdc++/71044 PR libstdc++/71044

View File

@ -389,14 +389,11 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#if __cplusplus > 201703L #if __cplusplus > 201703L
constexpr bool constexpr bool
starts_with(basic_string_view __x) const noexcept starts_with(basic_string_view __x) const noexcept
{ { return this->substr(0, __x.size()) == __x; }
return this->size() >= __x.size()
&& this->compare(0, __x.size(), __x) == 0;
}
constexpr bool constexpr bool
starts_with(_CharT __x) const noexcept 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 constexpr bool
starts_with(const _CharT* __x) const noexcept starts_with(const _CharT* __x) const noexcept
@ -411,7 +408,7 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
constexpr bool constexpr bool
ends_with(_CharT __x) const noexcept 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 constexpr bool
ends_with(const _CharT* __x) const noexcept ends_with(const _CharT* __x) const noexcept