This patch mechanically removes _Executor's __dfs_mode template
parameter. In passing we can also get rid of the _V2 inline namespace
because this change is sufficient to make all of _Executor's member
function signatures different from the previous (GCC <= 15) recursive
implementation, so that mixing the two implementations won't conflict.
libstdc++-v3/ChangeLog:
* include/bits/regex.h (_Executor): Remove __dfs_mode template
parameter and _V2 inline namespace.
* include/bits/regex.tcc (__regex_algo_impl): Adjust after
__dfs_mode template parameter removal.
* include/bits/regex_executor.h (_Executor): Remove __dfs_mode
parameter and _V2 inline namespace.
* include/bits/regex_executor.tcc (_Executor): Likewise.
---
libstdc++-v3/include/bits/regex.h | 8 +-
libstdc++-v3/include/bits/regex.tcc | 2 +-
libstdc++-v3/include/bits/regex_executor.h | 7 +-
libstdc++-v3/include/bits/regex_executor.tcc | 97 ++++++++------------
4 files changed, 44 insertions(+), 70 deletions(-)
diff --git a/libstdc++-v3/include/bits/regex.h
b/libstdc++-v3/include/bits/regex.h
index 5bcb9a447ce2..0e815ca086eb 100644
--- a/libstdc++-v3/include/bits/regex.h
+++ b/libstdc++-v3/include/bits/regex.h
@@ -61,10 +61,8 @@ namespace __detail
_RegexExecutorPolicy __policy,
bool __match_mode);
-_GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
- template<typename, typename, typename, bool>
+ template<typename, typename, typename>
class _Executor;
-_GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)
template<typename _Tp>
struct __is_contiguous_iter : false_type { };
@@ -842,7 +840,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
regex_constants::match_flag_type,
__detail::_RegexExecutorPolicy, bool);
- template<typename, typename, typename, bool>
+ template<typename, typename, typename>
friend class __detail::_Executor;
flag_type _M_flags;
@@ -2136,7 +2134,7 @@ _GLIBCXX_BEGIN_NAMESPACE_CXX11
/// @cond undocumented
- template<typename, typename, typename, bool>
+ template<typename, typename, typename>
friend class __detail::_Executor;
template<typename _Bp, typename _Ap, typename _Cp, typename _Rp>
diff --git a/libstdc++-v3/include/bits/regex.tcc
b/libstdc++-v3/include/bits/regex.tcc
index 6ffe1beca08a..a9050478b620 100644
--- a/libstdc++-v3/include/bits/regex.tcc
+++ b/libstdc++-v3/include/bits/regex.tcc
@@ -67,7 +67,7 @@ namespace __detail
&& !__re._M_automaton->_M_has_backref))
__search_mode = false; // use BFS when requested
- _Executor<_BiIter, _Alloc, _TraitsT, true>
+ _Executor<_BiIter, _Alloc, _TraitsT>
__executor(__s, __e, __res, __re, __flags, __search_mode);
if (__match_mode)
__ret = __executor._M_match();
diff --git a/libstdc++-v3/include/bits/regex_executor.h
b/libstdc++-v3/include/bits/regex_executor.h
index 550fa751c002..a229d43791d2 100644
--- a/libstdc++-v3/include/bits/regex_executor.h
+++ b/libstdc++-v3/include/bits/regex_executor.h
@@ -36,7 +36,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
namespace __detail
{
-_GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
/**
* @addtogroup regex-detail
* @{
@@ -49,10 +48,9 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
* @brief Takes a regex and an input string and does the matching.
*
* The %_Executor class has two modes: DFS mode and BFS mode, controlled
- * by the template parameter %__dfs_mode.
+ * by the function parameter %__search_mode.
*/
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
class _Executor
{
enum class _Search_mode : unsigned char { _BFS = 0, _DFS = 1 };
@@ -288,7 +286,6 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
};
///@} regex-detail
-_GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)
} // namespace __detail
_GLIBCXX_END_NAMESPACE_VERSION
} // namespace std
diff --git a/libstdc++-v3/include/bits/regex_executor.tcc
b/libstdc++-v3/include/bits/regex_executor.tcc
index 0ae7bdf6839a..4eda6bdf5531 100644
--- a/libstdc++-v3/include/bits/regex_executor.tcc
+++ b/libstdc++-v3/include/bits/regex_executor.tcc
@@ -36,10 +36,8 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#pragma GCC diagnostic ignored "-Wc++17-extensions" // if constexpr
namespace __detail
{
-_GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ bool _Executor<_BiIter, _Alloc, _TraitsT>::
_M_search()
{
if (_M_search_from_first())
@@ -160,9 +158,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
// Time complexity: \Omega(match_length), O(2^(_M_nfa.size()))
// Space complexity: \theta(match_results.size() + match_length)
//
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ bool _Executor<_BiIter, _Alloc, _TraitsT>::
_M_main_dfs(_Match_mode __match_mode)
{
_M_has_sol = false;
@@ -194,9 +191,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
// O(match_length * _M_nfa.size() * match_results.size())
// Space complexity: \Omega(_M_nfa.size() + match_results.size())
// O(_M_nfa.size() * match_results.size())
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ bool _Executor<_BiIter, _Alloc, _TraitsT>::
_M_main_bfs(_Match_mode __match_mode)
{
_M_match_queue.emplace_back(_M_start, _M_results);
@@ -227,9 +223,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
}
// Return whether now match the given sub-NFA.
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ bool _Executor<_BiIter, _Alloc, _TraitsT>::
_M_lookahead(_StateIdT __next)
{
// Backreferences may refer to captured content.
@@ -255,9 +250,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
// infinite loop by refusing to continue when it's already been
// visited more than twice. It's `twice` instead of `once` because
// we need to spare one more time for potential group capture.
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_rep_once_more(_Match_mode __match_mode, _StateIdT __i)
{
const auto& __state = _M_nfa[__i];
@@ -286,9 +280,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
// of this quantifier". Executing _M_next first or _M_alt first don't
// mean the same thing, and we need to choose the correct order under
// given greedy mode.
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_handle_repeat(_Match_mode __match_mode, _StateIdT __i)
{
const auto& __state = _M_nfa[__i];
@@ -329,9 +322,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
}
}
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_handle_subexpr_begin(_Match_mode __match_mode, _StateIdT __i)
{
const auto& __state = _M_nfa[__i];
@@ -343,9 +335,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
_M_frames.emplace_back(_S_fopcode_next, __state._M_next);
}
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_handle_subexpr_end(_Match_mode __match_mode, _StateIdT __i)
{
const auto& __state = _M_nfa[__i];
@@ -360,9 +351,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
_M_frames.emplace_back(_S_fopcode_next, __state._M_next);
}
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- inline void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ inline void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_handle_line_begin_assertion(_Match_mode __match_mode, _StateIdT __i)
{
const auto& __state = _M_nfa[__i];
@@ -370,9 +360,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
_M_frames.emplace_back(_S_fopcode_next, __state._M_next);
}
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- inline void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ inline void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_handle_line_end_assertion(_Match_mode __match_mode, _StateIdT __i)
{
const auto& __state = _M_nfa[__i];
@@ -380,9 +369,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
_M_frames.emplace_back(_S_fopcode_next, __state._M_next);
}
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- inline void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ inline void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_handle_word_boundary(_Match_mode __match_mode, _StateIdT __i)
{
const auto& __state = _M_nfa[__i];
@@ -392,9 +380,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
// Here __state._M_alt offers a single start node for a sub-NFA.
// We recursively invoke our algorithm to match the sub-NFA.
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_handle_subexpr_lookahead(_Match_mode __match_mode, _StateIdT __i)
{
const auto& __state = _M_nfa[__i];
@@ -402,9 +389,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
_M_frames.emplace_back(_S_fopcode_next, __state._M_next);
}
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_handle_match(_Match_mode __match_mode, _StateIdT __i)
{
const auto& __state = _M_nfa[__i];
@@ -475,9 +461,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
// then compare it with
// (_M_current, _M_current + (__submatch.second - __submatch.first)).
// If matched, keep going; else just return and try another state.
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_handle_backref(_Match_mode __match_mode, _StateIdT __i)
{
__glibcxx_assert(_M_search_mode == _Search_mode::_DFS);
@@ -501,9 +486,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
}
}
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_handle_accept(_Match_mode __match_mode, _StateIdT)
{
if (_M_search_mode == _Search_mode::_DFS)
@@ -554,9 +538,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
}
}
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_handle_alternative(_Match_mode __match_mode, _StateIdT __i)
{
const auto& __state = _M_nfa[__i];
@@ -578,12 +561,11 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
}
}
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
#ifdef __OPTIMIZE__
[[__gnu__::__always_inline__]]
#endif
- inline void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ inline void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_node(_Match_mode __match_mode, _StateIdT __i)
{
if (_M_visited(__i))
@@ -622,9 +604,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
}
}
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dummy>
- void _Executor<_BiIter, _Alloc, _TraitsT, __dummy>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ void _Executor<_BiIter, _Alloc, _TraitsT>::
_M_dfs(_Match_mode __match_mode, _StateIdT __start)
{
const bool __dfs_mode = (_M_search_mode == _Search_mode::_DFS);
@@ -692,9 +673,8 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
}
// Return whether now is at some word boundary.
- template<typename _BiIter, typename _Alloc, typename _TraitsT,
- bool __dfs_mode>
- bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
+ template<typename _BiIter, typename _Alloc, typename _TraitsT>
+ bool _Executor<_BiIter, _Alloc, _TraitsT>::
_M_word_boundary() const
{
if (_M_current == _M_begin && (_M_flags &
regex_constants::match_not_bow))
@@ -715,7 +695,6 @@ _GLIBCXX_BEGIN_INLINE_ABI_NAMESPACE(_V2)
return __left_is_word != __right_is_word;
}
-_GLIBCXX_END_INLINE_ABI_NAMESPACE(_V2)
} // namespace __detail
#pragma GCC diagnostic pop
--
2.53.0.rc1.65.gea24e2c554