31 namespace std _GLIBCXX_VISIBILITY(default)
35 _GLIBCXX_BEGIN_NAMESPACE_VERSION
37 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
39 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
43 return _M_search_from_first();
44 auto __cur = _M_begin;
52 while (__cur++ != _M_end);
100 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
102 template<
bool __match_mode>
103 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
109 _M_cur_results = _M_results;
110 _M_dfs<__match_mode>(_M_start_state);
115 _M_match_queue->push_back(
make_pair(_M_start_state, _M_results));
120 if (_M_match_queue->empty())
122 _M_visited->assign(_M_visited->size(),
false);
123 auto _M_old_queue = std::move(*_M_match_queue);
124 for (
auto __task : _M_old_queue)
126 _M_cur_results = __task.second;
127 _M_dfs<__match_mode>(__task.first);
131 if (_M_current == _M_end)
142 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
144 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
145 _M_lookahead(_State<_TraitsT> __state)
147 _ResultsVec __what(_M_cur_results.size());
153 __sub->_M_start_state = __state._M_alt;
154 if (__sub->_M_search_from_first())
156 for (
size_t __i = 0; __i < __what.size(); __i++)
157 if (__what[__i].matched)
158 _M_cur_results[__i] = __what[__i];
165 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
167 template<
bool __match_mode>
168 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
169 _M_dfs(_StateIdT __i)
173 if ((*_M_visited)[__i])
175 (*_M_visited)[__i] =
true;
178 const auto& __state = _M_nfa[__i];
181 switch (__state._M_opcode)
187 case _S_opcode_alternative:
192 _M_dfs<__match_mode>(__state._M_alt);
194 if (!__dfs_mode || !_M_has_sol)
195 _M_dfs<__match_mode>(__state._M_next);
202 _M_dfs<__match_mode>(__state._M_next);
204 _M_dfs<__match_mode>(__state._M_alt);
213 _M_dfs<__match_mode>(__state._M_next);
218 _M_dfs<__match_mode>(__state._M_alt);
223 case _S_opcode_subexpr_begin:
227 if (!_M_cur_results[__state._M_subexpr].matched
228 || _M_cur_results[__state._M_subexpr].first != _M_current)
230 auto& __res = _M_cur_results[__state._M_subexpr];
231 auto __back = __res.first;
232 __res.first = _M_current;
233 _M_dfs<__match_mode>(__state._M_next);
234 __res.first = __back;
237 case _S_opcode_subexpr_end:
238 if (_M_cur_results[__state._M_subexpr].second != _M_current
239 || _M_cur_results[__state._M_subexpr].matched !=
true)
241 auto& __res = _M_cur_results[__state._M_subexpr];
243 __res.second = _M_current;
244 __res.matched =
true;
245 _M_dfs<__match_mode>(__state._M_next);
249 _M_dfs<__match_mode>(__state._M_next);
251 case _S_opcode_line_begin_assertion:
253 _M_dfs<__match_mode>(__state._M_next);
255 case _S_opcode_line_end_assertion:
257 _M_dfs<__match_mode>(__state._M_next);
259 case _S_opcode_word_boundary:
260 if (_M_word_boundary(__state) == !__state._M_neg)
261 _M_dfs<__match_mode>(__state._M_next);
265 case _S_opcode_subexpr_lookahead:
266 if (_M_lookahead(__state) == !__state._M_neg)
267 _M_dfs<__match_mode>(__state._M_next);
269 case _S_opcode_match:
272 if (_M_current != _M_end && __state._M_matches(*_M_current))
275 _M_dfs<__match_mode>(__state._M_next);
280 if (__state._M_matches(*_M_current))
281 _M_match_queue->push_back(
make_pair(__state._M_next,
288 case _S_opcode_backref:
290 _GLIBCXX_DEBUG_ASSERT(__dfs_mode);
291 auto& __submatch = _M_cur_results[__state._M_backref_index];
292 if (!__submatch.matched)
294 auto __last = _M_current;
295 for (
auto __tmp = __submatch.first;
296 __last != _M_end && __tmp != __submatch.second;
299 if (_M_re._M_traits.transform(__submatch.first,
301 == _M_re._M_traits.transform(_M_current, __last))
303 if (__last != _M_current)
305 auto __backup = _M_current;
307 _M_dfs<__match_mode>(__state._M_next);
308 _M_current = __backup;
311 _M_dfs<__match_mode>(__state._M_next);
315 case _S_opcode_accept:
318 _GLIBCXX_DEBUG_ASSERT(!_M_has_sol);
320 _M_has_sol = _M_current == _M_end;
323 if (_M_current == _M_begin
327 _M_results = _M_cur_results;
331 if (_M_current == _M_begin
332 && (_M_flags & regex_constants::match_not_null))
334 if (!__match_mode || _M_current == _M_end)
338 _M_results = _M_cur_results;
343 _GLIBCXX_DEBUG_ASSERT(
false);
348 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
350 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
351 _M_word_boundary(_State<_TraitsT> __state)
const
355 auto __pre = _M_current;
357 if (!(_M_at_begin() && _M_at_end()))
360 __ans = _M_is_word(*_M_current)
362 else if (_M_at_end())
363 __ans = _M_is_word(*__pre)
366 __ans = _M_is_word(*_M_current)
367 != _M_is_word(*__pre);
372 _GLIBCXX_END_NAMESPACE_VERSION
20.7.1.2 unique_ptr for single objects.
constexpr pair< typename __decay_and_strip< _T1 >::__type, typename __decay_and_strip< _T2 >::__type > make_pair(_T1 &&__x, _T2 &&__y)
A convenience wrapper for creating a pair from two objects.