[PATCH] Make std::match_results::_M_resize more useful
Jonathan Wakely
jwakely@redhat.com
Tue May 14 12:19:00 GMT 2019
On 04/12/18 14:30 +0000, Jonathan Wakely wrote:
>As both callers of match_results::_M_resize(unsigned) immediately follow
>it with a loop to update the value of each sub_match, that behaviour can
>be moved into _M_resize itself. The first caller fills the container
>with unmatched subs, which can be done with vector::assign, and the
>second caller clears the container to establish a specific state, which
>can be provided by a new member function specific to that purpose.
>
>Tangentially, I also noticed that match_results::max_size() doesn't
>account for the three special sub_match objects that are always present
>in a fully established result state. This patch also fixes that.
>
> * include/bits/regex.h (match_results::max_size()): Adjust return
> value to account for prefix/suffix/unmatched subs.
> (match_results::_M_resize(unsigned int)): Use _Base_type::assign to
> reset the contained sub matches.
> (match_results::_M_establish_failed_match(_Bi_iter)): Add new member
> function to set result state following a failed match.
> * include/bits/regex.tcc (__regex_algo_impl): Remove loop to set
> sub_match states after _M_resize. Use _M_establish_failed_match.
>
>Tested x86_64-linux.
>
>Any objections?
Now committed to trunk.
>commit 6a96a528102e1062dd2627b7eb8ddf26c43bc1e7
>Author: Jonathan Wakely <jwakely@redhat.com>
>Date: Tue Dec 4 13:21:26 2018 +0000
>
> Make std::match_results::_M_resize more useful
>
> As both callers of match_results::_M_resize(unsigned) immediately follow
> it with a loop to update the value of each sub_match, that behaviour can
> be moved into _M_resize itself. The first caller fills the container
> with unmatched subs, which can be done with vector::assign, and the
> second caller clears the container to establish a specific state, which
> can be provided by a new member function specific to that purpose.
>
> Tangentially, I also noticed that match_results::max_size() doesn't
> account for the three special sub_match objects that are always present
> in a fully established result state. This patch also fixes that.
>
> * include/bits/regex.h (match_results::max_size()): Adjust return
> value to account for prefix/suffix/unmatched subs.
> (match_results::_M_resize(unsigned int)): Use _Base_type::assign to
> reset the contained sub matches.
> (match_results::_M_establish_failed_match(_Bi_iter)): Add new member
> function to set result state following a failed match.
> * include/bits/regex.tcc (__regex_algo_impl): Remove loop to set
> sub_match states after _M_resize. Use _M_establish_failed_match.
>
>diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h
>index af6fe3f0d79..d36ee33033d 100644
>--- a/libstdc++-v3/include/bits/regex.h
>+++ b/libstdc++-v3/include/bits/regex.h
>@@ -1698,7 +1698,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
>
> size_type
> max_size() const noexcept
>- { return _Base_type::max_size(); }
>+ { return _Base_type::max_size() - 3; }
>
> /**
> * @brief Indicates if the %match_results contains no results.
>@@ -1942,9 +1942,20 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
> const basic_regex<_Cp, _Rp>&,
> regex_constants::match_flag_type);
>
>+ // Reset contents to __size unmatched sub_match objects
>+ // (plus additional objects for prefix, suffix and unmatched sub).
> void
> _M_resize(unsigned int __size)
>- { _Base_type::resize(__size + 3); }
>+ { _Base_type::assign(__size + 3, sub_match<_Bi_iter>{}); }
>+
>+ // Set state to a failed match for the given past-the-end iterator.
>+ void
>+ _M_establish_failed_match(_Bi_iter __end)
>+ {
>+ sub_match<_Bi_iter> __sm;
>+ __sm.first = __sm.second = __end;
>+ _Base_type::assign(3, __sm);
>+ }
>
> const_reference
> _M_unmatched_sub() const
>diff --git a/libstdc++-v3/include/bits/regex.tcc b/libstdc++-v3/include/bits/regex.tcc
>index dcf660902bc..de0ce795b84 100644
>--- a/libstdc++-v3/include/bits/regex.tcc
>+++ b/libstdc++-v3/include/bits/regex.tcc
>@@ -57,8 +57,6 @@ namespace __detail
> typename match_results<_BiIter, _Alloc>::_Base_type& __res = __m;
> __m._M_begin = __s;
> __m._M_resize(__re._M_automaton->_M_sub_count());
>- for (auto& __it : __res)
>- __it.matched = false;
>
> bool __ret;
> if ((__re.flags() & regex_constants::__polynomial)
>@@ -109,12 +107,7 @@ namespace __detail
> }
> else
> {
>- __m._M_resize(0);
>- for (auto& __it : __res)
>- {
>- __it.matched = false;
>- __it.first = __it.second = __e;
>- }
>+ __m._M_establish_failed_match(__e);
> }
> return __ret;
> }
More information about the Gcc-patches
mailing list