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>::
42 if (_M_search_from_first())
47 while (_M_begin != _M_end)
50 if (_M_search_from_first())
79 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
81 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
82 _M_main_dispatch(_Match_mode __match_mode, __dfs)
85 *_M_states._M_get_sol_pos() = _BiIter();
86 _M_cur_results = _M_results;
87 _M_dfs(__match_mode, _M_states._M_start);
113 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
115 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
116 _M_main_dispatch(_Match_mode __match_mode, __bfs)
118 _M_states._M_queue(_M_states._M_start, _M_results);
123 if (_M_states._M_match_queue.empty())
125 std::fill_n(_M_states._M_visited_states.get(), _M_nfa.size(),
false);
126 auto __old_queue = std::move(_M_states._M_match_queue);
127 for (
auto& __task : __old_queue)
129 _M_cur_results = std::move(__task.second);
130 _M_dfs(__match_mode, __task.first);
132 if (__match_mode == _Match_mode::_Prefix)
134 if (_M_current == _M_end)
138 if (__match_mode == _Match_mode::_Exact)
140 _M_states._M_match_queue.clear();
145 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
147 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
148 _M_lookahead(_State<_TraitsT> __state)
153 _ResultsVec __what(_M_cur_results);
154 _Executor __sub(_M_current, _M_end, __what, _M_re, _M_flags);
155 __sub._M_states._M_start = __state._M_alt;
156 if (__sub._M_search_from_first())
158 for (
size_t __i = 0; __i < __what.size(); __i++)
159 if (__what[__i].matched)
160 _M_cur_results[__i] = __what[__i];
172 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
174 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
175 _M_rep_once_more(_Match_mode __match_mode, _StateIdT __i)
177 const auto& __state = _M_nfa[__i];
178 auto& __rep_count = _M_rep_count[__i];
179 if (__rep_count.second == 0 || __rep_count.first != _M_current)
181 auto __back = __rep_count;
182 __rep_count.first = _M_current;
183 __rep_count.second = 1;
184 _M_dfs(__match_mode, __state._M_alt);
185 __rep_count = __back;
189 if (__rep_count.second < 2)
191 __rep_count.second++;
192 _M_dfs(__match_mode, __state._M_alt);
193 __rep_count.second--;
198 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
200 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
201 _M_dfs(_Match_mode __match_mode, _StateIdT __i)
203 if (_M_states._M_visited(__i))
206 const auto& __state = _M_nfa[__i];
209 switch (__state._M_opcode)
215 case _S_opcode_repeat:
220 _M_rep_once_more(__match_mode, __i);
222 if (!__dfs_mode || !_M_has_sol)
223 _M_dfs(__match_mode, __state._M_next);
230 _M_dfs(__match_mode, __state._M_next);
232 _M_rep_once_more(__match_mode, __i);
241 _M_dfs(__match_mode, __state._M_next);
246 _M_rep_once_more(__match_mode, __i);
252 case _S_opcode_subexpr_begin:
254 auto& __res = _M_cur_results[__state._M_subexpr];
255 auto __back = __res.first;
256 __res.first = _M_current;
257 _M_dfs(__match_mode, __state._M_next);
258 __res.first = __back;
261 case _S_opcode_subexpr_end:
263 auto& __res = _M_cur_results[__state._M_subexpr];
265 __res.second = _M_current;
266 __res.matched =
true;
267 _M_dfs(__match_mode, __state._M_next);
271 case _S_opcode_line_begin_assertion:
273 _M_dfs(__match_mode, __state._M_next);
275 case _S_opcode_line_end_assertion:
277 _M_dfs(__match_mode, __state._M_next);
279 case _S_opcode_word_boundary:
280 if (_M_word_boundary() == !__state._M_neg)
281 _M_dfs(__match_mode, __state._M_next);
285 case _S_opcode_subexpr_lookahead:
286 if (_M_lookahead(__state) == !__state._M_neg)
287 _M_dfs(__match_mode, __state._M_next);
289 case _S_opcode_match:
290 if (_M_current == _M_end)
294 if (__state._M_matches(*_M_current))
297 _M_dfs(__match_mode, __state._M_next);
302 if (__state._M_matches(*_M_current))
303 _M_states._M_queue(__state._M_next, _M_cur_results);
309 case _S_opcode_backref:
311 _GLIBCXX_DEBUG_ASSERT(__dfs_mode);
312 auto& __submatch = _M_cur_results[__state._M_backref_index];
313 if (!__submatch.matched)
315 auto __last = _M_current;
316 for (
auto __tmp = __submatch.first;
317 __last != _M_end && __tmp != __submatch.second;
320 if (_M_re._M_automaton->_M_traits.transform(__submatch.first,
322 == _M_re._M_automaton->_M_traits.transform(_M_current, __last))
324 if (__last != _M_current)
326 auto __backup = _M_current;
328 _M_dfs(__match_mode, __state._M_next);
329 _M_current = __backup;
332 _M_dfs(__match_mode, __state._M_next);
336 case _S_opcode_accept:
339 _GLIBCXX_DEBUG_ASSERT(!_M_has_sol);
340 if (__match_mode == _Match_mode::_Exact)
341 _M_has_sol = _M_current == _M_end;
344 if (_M_current == _M_begin
350 _M_results = _M_cur_results;
353 _GLIBCXX_DEBUG_ASSERT(_M_states._M_get_sol_pos());
361 if (*_M_states._M_get_sol_pos() == _BiIter()
363 *_M_states._M_get_sol_pos())
366 *_M_states._M_get_sol_pos() = _M_current;
367 _M_results = _M_cur_results;
374 if (_M_current == _M_begin
375 && (_M_flags & regex_constants::match_not_null))
377 if (__match_mode == _Match_mode::_Prefix || _M_current == _M_end)
381 _M_results = _M_cur_results;
385 case _S_opcode_alternative:
389 _GLIBCXX_DEBUG_ASSERT(__dfs_mode);
390 _M_dfs(__match_mode, __state._M_alt);
393 _M_dfs(__match_mode, __state._M_next);
399 _M_dfs(__match_mode, __state._M_alt);
400 auto __has_sol = _M_has_sol;
402 _M_dfs(__match_mode, __state._M_next);
403 _M_has_sol |= __has_sol;
407 _GLIBCXX_DEBUG_ASSERT(
false);
412 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
414 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
415 _M_word_boundary()
const 417 bool __left_is_word =
false;
418 if (_M_current != _M_begin
421 auto __prev = _M_current;
422 if (_M_is_word(*std::prev(__prev)))
423 __left_is_word =
true;
425 bool __right_is_word =
426 _M_current != _M_end && _M_is_word(*_M_current);
428 if (__left_is_word == __right_is_word)
437 _GLIBCXX_END_NAMESPACE_VERSION
constexpr match_flag_type match_prev_avail
constexpr match_flag_type match_not_eow
constexpr match_flag_type match_not_bow
iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
_OI fill_n(_OI __first, _Size __n, const _Tp &__value)
Fills the range [first,first+n) with copies of value.
constexpr syntax_option_type ECMAScript
ISO C++ entities toplevel namespace is std.
constexpr match_flag_type match_not_null
constexpr match_flag_type match_continuous