]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
libstdc++: Reduce template instantiations in <regex>
authorJonathan Wakely <jwakely@redhat.com>
Fri, 17 Dec 2021 18:04:28 +0000 (18:04 +0000)
committerJonathan Wakely <jwakely@redhat.com>
Wed, 5 Jan 2022 13:47:01 +0000 (13:47 +0000)
This moves the last two template parameters of __regex_algo_impl to be
runtime function parameters instead, so that we don't need four
different instantiations for the possible ways to call it. Most of the
function (and what it instantiates) is the same in all cases, so making
them compile-time choices doesn't really have much benefit.

Use  'if constexpr' for conditions that check template parameters, so
that when we do depend on a compile-time condition we only instantiate
what we need to.

libstdc++-v3/ChangeLog:

* include/bits/regex.h (__regex_algo_impl): Change __policy and
__match_mode template parameters to be function parameters.
(regex_match, regex_search): Pass policy and match mode as
function arguments.
* include/bits/regex.tcc (__regex_algo_impl): Change template
parameters to function parameters.
* include/bits/regex_compiler.h (_RegexTranslatorBase): Use
'if constexpr' for conditions using template parameters.
(_RegexTranslator): Likewise.
* include/bits/regex_executor.tcc (_Executor::_M_handle_accept):
Likewise.
* testsuite/util/testsuite_regex.h (regex_match_debug)
(regex_search_debug): Move template arguments to function
arguments.

libstdc++-v3/include/bits/regex.h
libstdc++-v3/include/bits/regex.tcc
libstdc++-v3/include/bits/regex_compiler.h
libstdc++-v3/include/bits/regex_executor.tcc
libstdc++-v3/testsuite/util/testsuite_regex.h

index ff09f49f9e853fcb948489fd4beea0e496f00d3a..7480b0a5f974c9da7d9a19915bb88b226344df76 100644 (file)
@@ -45,15 +45,14 @@ namespace __detail
   enum class _RegexExecutorPolicy : int { _S_auto, _S_alternate };
 
   template<typename _BiIter, typename _Alloc,
-          typename _CharT, typename _TraitsT,
-          _RegexExecutorPolicy __policy,
-          bool __match_mode>
+          typename _CharT, typename _TraitsT>
     bool
-    __regex_algo_impl(_BiIter                        __s,
-                     _BiIter                         __e,
+    __regex_algo_impl(_BiIter __s, _BiIter __e,
                      match_results<_BiIter, _Alloc>&      __m,
                      const basic_regex<_CharT, _TraitsT>& __re,
-                     regex_constants::match_flag_type     __flags);
+                     regex_constants::match_flag_type     __flags,
+                     _RegexExecutorPolicy                 __policy,
+                     bool                                 __match_mode);
 
   template<typename, typename, typename, bool>
     class _Executor;
@@ -792,12 +791,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
        _M_flags = __f;
       }
 
-      template<typename _Bp, typename _Ap, typename _Cp, typename _Rp,
-       __detail::_RegexExecutorPolicy, bool>
+      template<typename _Bp, typename _Ap, typename _Cp, typename _Rp>
        friend bool
        __detail::__regex_algo_impl(_Bp, _Bp, match_results<_Bp, _Ap>&,
                                    const basic_regex<_Cp, _Rp>&,
-                                   regex_constants::match_flag_type);
+                                   regex_constants::match_flag_type,
+                                   _RegexExecutorPolicy, bool);
 
       template<typename, typename, typename, bool>
        friend class __detail::_Executor;
@@ -2063,12 +2062,12 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
       template<typename, typename, typename, bool>
        friend class __detail::_Executor;
 
-      template<typename _Bp, typename _Ap, typename _Cp, typename _Rp,
-       __detail::_RegexExecutorPolicy, bool>
+      template<typename _Bp, typename _Ap, typename _Cp, typename _Rp>
        friend bool
        __detail::__regex_algo_impl(_Bp, _Bp, match_results<_Bp, _Ap>&,
                                    const basic_regex<_Cp, _Rp>&,
-                                   regex_constants::match_flag_type);
+                                   regex_constants::match_flag_type,
+                                   _RegexExecutorPolicy, bool);
 
       // Reset contents to __size unmatched sub_match objects
       // (plus additional objects for prefix, suffix and unmatched sub).
@@ -2206,9 +2205,8 @@ _GLIBCXX_END_NAMESPACE_CXX11
                regex_constants::match_flag_type         __flags
                               = regex_constants::match_default)
     {
-      return __detail::__regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits,
-       __detail::_RegexExecutorPolicy::_S_auto, true>
-         (__s, __e, __m, __re, __flags);
+      return __detail::__regex_algo_impl(__s, __e, __m, __re, __flags,
+       __detail::_RegexExecutorPolicy::_S_auto, true);
     }
 
   /**
@@ -2363,9 +2361,8 @@ _GLIBCXX_END_NAMESPACE_CXX11
                 regex_constants::match_flag_type __flags
                 = regex_constants::match_default)
     {
-      return __detail::__regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits,
-       __detail::_RegexExecutorPolicy::_S_auto, false>
-         (__s, __e, __m, __re, __flags);
+      return __detail::__regex_algo_impl(__s, __e, __m, __re, __flags,
+       __detail::_RegexExecutorPolicy::_S_auto, false);
     }
 
   /**
index 7d720ca7b423bef5851258a1529769550d0a7ddf..2b90b04c560a5fc04602d70e62312d1cbb49b363 100644 (file)
@@ -43,15 +43,15 @@ namespace __detail
   //
   // That __match_mode is true means regex_match, else regex_search.
   template<typename _BiIter, typename _Alloc,
-          typename _CharT, typename _TraitsT,
-          _RegexExecutorPolicy __policy,
-          bool __match_mode>
+          typename _CharT, typename _TraitsT>
     bool
     __regex_algo_impl(_BiIter                              __s,
                      _BiIter                              __e,
                      match_results<_BiIter, _Alloc>&      __m,
                      const basic_regex<_CharT, _TraitsT>& __re,
-                     regex_constants::match_flag_type     __flags)
+                     regex_constants::match_flag_type     __flags,
+                     _RegexExecutorPolicy                 __policy,
+                     bool                                 __match_mode)
     {
       if (__re._M_automaton == nullptr)
        return false;
index 6a9af358c4bdd54a8047113597785442dad74099..174aefe75f72b7d118831add221122ce5ba31309 100644 (file)
@@ -221,9 +221,9 @@ namespace __detail
       _CharT
       _M_translate(_CharT __ch) const
       {
-       if (__icase)
+       if _GLIBCXX17_CONSTEXPR (__icase)
          return _M_traits.translate_nocase(__ch);
-       else if (__collate)
+       else if _GLIBCXX17_CONSTEXPR (__collate)
          return _M_traits.translate(__ch);
        else
          return __ch;
@@ -285,9 +285,10 @@ namespace __detail
       bool
       _M_match_range(_CharT __first, _CharT __last, _CharT __ch) const
       {
-       if (!__icase)
+       if _GLIBCXX17_CONSTEXPR (!__icase)
          return __first <= __ch && __ch <= __last;
-       return this->_M_in_range_icase(__first, __last, __ch);
+       else
+         return this->_M_in_range_icase(__first, __last, __ch);
       }
     };
 
index b3e2726a55fd69720cd72ae5357fc735da3f304f..b93e958075e3d3266ae01b8dd1ffca8f41d67d4e 100644 (file)
@@ -425,7 +425,7 @@ namespace __detail
     void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
     _M_handle_accept(_Match_mode __match_mode, _StateIdT)
     {
-      if (__dfs_mode)
+      if _GLIBCXX17_CONSTEXPR (__dfs_mode)
        {
          __glibcxx_assert(!_M_has_sol);
          if (__match_mode == _Match_mode::_Exact)
index f2bb068024d8ca0ee5b6e79cc0f1bcb5d186f3e5..4e163c3a3f8ada93ed85c8fbb3d6e4ce6c10f8da 100644 (file)
@@ -143,13 +143,13 @@ namespace __gnu_test
                      = std::regex_constants::match_default)
     {
       using namespace std::__detail;
-      auto __res1 = __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits,
-          _RegexExecutorPolicy::_S_auto, true>
-       (__s, __e, __m, __re, __flags);
+      auto __res1 = __regex_algo_impl(__s, __e, __m, __re, __flags,
+                                     _RegexExecutorPolicy::_S_auto,
+                                     true);
       match_results<_Bi_iter, _Alloc> __mm;
-      auto __res2 = __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits,
-          _RegexExecutorPolicy::_S_alternate, true>
-       (__s, __e, __mm, __re, __flags);
+      auto __res2 = __regex_algo_impl(__s, __e, __mm, __re, __flags,
+                                     _RegexExecutorPolicy::_S_alternate,
+                                     true);
       if (__res1 == __res2 && __m == __mm)
        return __res1;
       throw std::exception();
@@ -229,13 +229,13 @@ namespace __gnu_test
                       = std::regex_constants::match_default)
     {
       using namespace std::__detail;
-      auto __res1 = __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits,
-          _RegexExecutorPolicy::_S_auto, false>
-        (__s, __e, __m, __re, __flags);
+      auto __res1 = __regex_algo_impl(__s, __e, __m, __re, __flags,
+                                     _RegexExecutorPolicy::_S_auto,
+                                     false);
       match_results<_Bi_iter, _Alloc> __mm;
-      auto __res2 = __regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits,
-          _RegexExecutorPolicy::_S_alternate, false>
-        (__s, __e, __mm, __re, __flags);
+      auto __res2 = __regex_algo_impl(__s, __e, __mm, __re, __flags,
+                                     _RegexExecutorPolicy::_S_alternate,
+                                     false);
       if (__res1 == __res2 && __m == __mm)
         return __res1;
       throw(std::exception()); // Let test fail. Give it a name.