31 namespace std _GLIBCXX_VISIBILITY(default)
33 _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(_StateIdT __next)
153 _ResultsVec __what(_M_cur_results);
154 _Executor __sub(_M_current, _M_end, __what, _M_re, _M_flags);
155 __sub._M_states._M_start = __next;
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--;
202 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
204 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
205 _M_handle_repeat(_Match_mode __match_mode, _StateIdT __i)
207 const auto& __state = _M_nfa[__i];
212 _M_rep_once_more(__match_mode, __i);
214 if (!__dfs_mode || !_M_has_sol)
215 _M_dfs(__match_mode, __state._M_next);
222 _M_dfs(__match_mode, __state._M_next);
224 _M_rep_once_more(__match_mode, __i);
233 _M_dfs(__match_mode, __state._M_next);
238 _M_rep_once_more(__match_mode, __i);
244 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
246 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
247 _M_handle_subexpr_begin(_Match_mode __match_mode, _StateIdT __i)
249 const auto& __state = _M_nfa[__i];
251 auto& __res = _M_cur_results[__state._M_subexpr];
252 auto __back = __res.first;
253 __res.first = _M_current;
254 _M_dfs(__match_mode, __state._M_next);
255 __res.first = __back;
258 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
260 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
261 _M_handle_subexpr_end(_Match_mode __match_mode, _StateIdT __i)
263 const auto& __state = _M_nfa[__i];
265 auto& __res = _M_cur_results[__state._M_subexpr];
267 __res.second = _M_current;
268 __res.matched =
true;
269 _M_dfs(__match_mode, __state._M_next);
273 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
275 inline void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
276 _M_handle_line_begin_assertion(_Match_mode __match_mode, _StateIdT __i)
278 const auto& __state = _M_nfa[__i];
280 _M_dfs(__match_mode, __state._M_next);
283 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
285 inline void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
286 _M_handle_line_end_assertion(_Match_mode __match_mode, _StateIdT __i)
288 const auto& __state = _M_nfa[__i];
290 _M_dfs(__match_mode, __state._M_next);
293 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
295 inline void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
296 _M_handle_word_boundary(_Match_mode __match_mode, _StateIdT __i)
298 const auto& __state = _M_nfa[__i];
299 if (_M_word_boundary() == !__state._M_neg)
300 _M_dfs(__match_mode, __state._M_next);
305 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
307 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
308 _M_handle_subexpr_lookahead(_Match_mode __match_mode, _StateIdT __i)
310 const auto& __state = _M_nfa[__i];
311 if (_M_lookahead(__state._M_alt) == !__state._M_neg)
312 _M_dfs(__match_mode, __state._M_next);
315 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
317 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
318 _M_handle_match(_Match_mode __match_mode, _StateIdT __i)
320 const auto& __state = _M_nfa[__i];
322 if (_M_current == _M_end)
326 if (__state._M_matches(*_M_current))
329 _M_dfs(__match_mode, __state._M_next);
334 if (__state._M_matches(*_M_current))
335 _M_states._M_queue(__state._M_next, _M_cur_results);
338 template<
typename _BiIter,
typename _TraitsT>
339 struct _Backref_matcher
341 _Backref_matcher(
bool __icase,
const _TraitsT& __traits)
342 : _M_traits(__traits) { }
345 _M_apply(_BiIter __expected_begin,
346 _BiIter __expected_end, _BiIter __actual_begin,
347 _BiIter __actual_end)
349 return _M_traits.transform(__expected_begin, __expected_end)
350 == _M_traits.transform(__actual_begin, __actual_end);
353 const _TraitsT& _M_traits;
356 template<
typename _BiIter,
typename _CharT>
357 struct _Backref_matcher<_BiIter,
std::regex_traits<_CharT>>
360 _Backref_matcher(
bool __icase,
const _TraitsT& __traits)
361 : _M_icase(__icase), _M_traits(__traits) { }
364 _M_apply(_BiIter __expected_begin,
365 _BiIter __expected_end, _BiIter __actual_begin,
366 _BiIter __actual_end)
369 return _GLIBCXX_STD_A::__equal4(__expected_begin, __expected_end,
370 __actual_begin, __actual_end);
372 const auto& __fctyp = use_facet<__ctype_type>(_M_traits.getloc());
373 return _GLIBCXX_STD_A::__equal4(__expected_begin, __expected_end,
374 __actual_begin, __actual_end,
375 [
this, &__fctyp](_CharT __lhs, _CharT __rhs)
377 return __fctyp.tolower(__lhs)
378 == __fctyp.tolower(__rhs);
383 const _TraitsT& _M_traits;
390 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
392 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
393 _M_handle_backref(_Match_mode __match_mode, _StateIdT __i)
395 __glibcxx_assert(__dfs_mode);
397 const auto& __state = _M_nfa[__i];
398 auto& __submatch = _M_cur_results[__state._M_backref_index];
399 if (!__submatch.matched)
401 auto __last = _M_current;
402 for (
auto __tmp = __submatch.first;
403 __last != _M_end && __tmp != __submatch.second;
406 if (_Backref_matcher<_BiIter, _TraitsT>(
408 _M_re._M_automaton->_M_traits)._M_apply(
409 __submatch.first, __submatch.second, _M_current, __last))
411 if (__last != _M_current)
413 auto __backup = _M_current;
415 _M_dfs(__match_mode, __state._M_next);
416 _M_current = __backup;
419 _M_dfs(__match_mode, __state._M_next);
423 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
425 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
426 _M_handle_accept(_Match_mode __match_mode, _StateIdT __i)
430 __glibcxx_assert(!_M_has_sol);
431 if (__match_mode == _Match_mode::_Exact)
432 _M_has_sol = _M_current == _M_end;
435 if (_M_current == _M_begin
441 _M_results = _M_cur_results;
444 __glibcxx_assert(_M_states._M_get_sol_pos());
452 if (*_M_states._M_get_sol_pos() == _BiIter()
454 *_M_states._M_get_sol_pos())
457 *_M_states._M_get_sol_pos() = _M_current;
458 _M_results = _M_cur_results;
465 if (_M_current == _M_begin
468 if (__match_mode == _Match_mode::_Prefix || _M_current == _M_end)
472 _M_results = _M_cur_results;
477 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
479 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
480 _M_handle_alternative(_Match_mode __match_mode, _StateIdT __i)
482 const auto& __state = _M_nfa[__i];
487 _M_dfs(__match_mode, __state._M_alt);
490 _M_dfs(__match_mode, __state._M_next);
496 _M_dfs(__match_mode, __state._M_alt);
497 auto __has_sol = _M_has_sol;
499 _M_dfs(__match_mode, __state._M_next);
500 _M_has_sol |= __has_sol;
504 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
506 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
507 _M_dfs(_Match_mode __match_mode, _StateIdT __i)
509 if (_M_states._M_visited(__i))
512 switch (_M_nfa[__i]._M_opcode())
514 case _S_opcode_repeat:
515 _M_handle_repeat(__match_mode, __i);
break;
516 case _S_opcode_subexpr_begin:
517 _M_handle_subexpr_begin(__match_mode, __i);
break;
518 case _S_opcode_subexpr_end:
519 _M_handle_subexpr_end(__match_mode, __i);
break;
520 case _S_opcode_line_begin_assertion:
521 _M_handle_line_begin_assertion(__match_mode, __i);
break;
522 case _S_opcode_line_end_assertion:
523 _M_handle_line_end_assertion(__match_mode, __i);
break;
524 case _S_opcode_word_boundary:
525 _M_handle_word_boundary(__match_mode, __i);
break;
526 case _S_opcode_subexpr_lookahead:
527 _M_handle_subexpr_lookahead(__match_mode, __i);
break;
528 case _S_opcode_match:
529 _M_handle_match(__match_mode, __i);
break;
530 case _S_opcode_backref:
531 _M_handle_backref(__match_mode, __i);
break;
532 case _S_opcode_accept:
533 _M_handle_accept(__match_mode, __i);
break;
534 case _S_opcode_alternative:
535 _M_handle_alternative(__match_mode, __i);
break;
537 __glibcxx_assert(
false);
542 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
544 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
545 _M_word_boundary()
const
552 bool __left_is_word =
false;
553 if (_M_current != _M_begin
556 auto __prev = _M_current;
557 if (_M_is_word(*std::prev(__prev)))
558 __left_is_word =
true;
560 bool __right_is_word =
561 _M_current != _M_end && _M_is_word(*_M_current);
563 return __left_is_word != __right_is_word;
567 _GLIBCXX_END_NAMESPACE_VERSION
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
ISO C++ entities toplevel namespace is std.
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
constexpr match_flag_type match_not_bow
constexpr syntax_option_type ECMAScript
constexpr match_flag_type match_continuous
constexpr syntax_option_type icase
constexpr match_flag_type match_prev_avail
constexpr match_flag_type match_not_eow
constexpr match_flag_type match_not_null
Primary class template ctype facet.
Describes aspects of a regular expression.