[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