aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2021-12-17 18:04:28 +0000
committerJonathan Wakely <jwakely@redhat.com>2022-01-05 13:47:01 +0000
commite09366718ad8c93678618a47016e18cb6e927131 (patch)
tree68ba1bd45d0963ee49e07fc2923d4d8b80f9ab45
parent9a2451c1013c21e76da89df89c3c8e5e6afe6154 (diff)
downloadgcc-e09366718ad8c93678618a47016e18cb6e927131.zip
gcc-e09366718ad8c93678618a47016e18cb6e927131.tar.gz
gcc-e09366718ad8c93678618a47016e18cb6e927131.tar.bz2
libstdc++: Reduce template instantiations in <regex>
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.
-rw-r--r--libstdc++-v3/include/bits/regex.h33
-rw-r--r--libstdc++-v3/include/bits/regex.tcc8
-rw-r--r--libstdc++-v3/include/bits/regex_compiler.h9
-rw-r--r--libstdc++-v3/include/bits/regex_executor.tcc2
-rw-r--r--libstdc++-v3/testsuite/util/testsuite_regex.h24
5 files changed, 37 insertions, 39 deletions
diff --git a/libstdc++-v3/include/bits/regex.h b/libstdc++-v3/include/bits/regex.h
index ff09f49..7480b0a 100644
--- a/libstdc++-v3/include/bits/regex.h
+++ b/libstdc++-v3/include/bits/regex.h
@@ -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);
}
/**
diff --git a/libstdc++-v3/include/bits/regex.tcc b/libstdc++-v3/include/bits/regex.tcc
index 7d720ca..2b90b04 100644
--- a/libstdc++-v3/include/bits/regex.tcc
+++ b/libstdc++-v3/include/bits/regex.tcc
@@ -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;
diff --git a/libstdc++-v3/include/bits/regex_compiler.h b/libstdc++-v3/include/bits/regex_compiler.h
index 6a9af35..174aefe 100644
--- a/libstdc++-v3/include/bits/regex_compiler.h
+++ b/libstdc++-v3/include/bits/regex_compiler.h
@@ -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);
}
};
diff --git a/libstdc++-v3/include/bits/regex_executor.tcc b/libstdc++-v3/include/bits/regex_executor.tcc
index b3e2726..b93e958 100644
--- a/libstdc++-v3/include/bits/regex_executor.tcc
+++ b/libstdc++-v3/include/bits/regex_executor.tcc
@@ -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)
diff --git a/libstdc++-v3/testsuite/util/testsuite_regex.h b/libstdc++-v3/testsuite/util/testsuite_regex.h
index f2bb068..4e163c3 100644
--- a/libstdc++-v3/testsuite/util/testsuite_regex.h
+++ b/libstdc++-v3/testsuite/util/testsuite_regex.h
@@ -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.