31namespace 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, _M_nfa.size(),
false);
126 auto __old_queue =
std::move(_M_states._M_match_queue);
127 auto __alloc = _M_cur_results.get_allocator();
128 for (
auto& __task : __old_queue)
130 _M_cur_results = _ResultsVec(
std::move(__task.second), __alloc);
131 _M_dfs(__match_mode, __task.first);
133 if (__match_mode == _Match_mode::_Prefix)
135 if (_M_current == _M_end)
139 if (__match_mode == _Match_mode::_Exact)
141 _M_states._M_match_queue.clear();
146 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
148 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
149 _M_lookahead(_StateIdT __next)
154 _ResultsVec __what(_M_cur_results);
155 _Executor __sub(_M_current, _M_end, __what, _M_re, _M_flags);
156 __sub._M_states._M_start = __next;
157 if (__sub._M_search_from_first())
159 for (
size_t __i = 0; __i < __what.size(); __i++)
160 if (__what[__i].matched)
161 _M_cur_results[__i] = __what[__i];
173 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
175 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
176 _M_rep_once_more(_Match_mode __match_mode, _StateIdT __i)
178 const auto& __state = _M_nfa[__i];
179 auto& __rep_count = _M_rep_count[__i];
180 if (__rep_count.second == 0 || __rep_count.first != _M_current)
182 auto __back = __rep_count;
183 __rep_count.first = _M_current;
184 __rep_count.second = 1;
185 _M_dfs(__match_mode, __state._M_alt);
186 __rep_count = __back;
190 if (__rep_count.second < 2)
192 __rep_count.second++;
193 _M_dfs(__match_mode, __state._M_alt);
194 __rep_count.second--;
203 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
205 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
206 _M_handle_repeat(_Match_mode __match_mode, _StateIdT __i)
208 const auto& __state = _M_nfa[__i];
213 _M_rep_once_more(__match_mode, __i);
215 if (!__dfs_mode || !_M_has_sol)
216 _M_dfs(__match_mode, __state._M_next);
223 _M_dfs(__match_mode, __state._M_next);
225 _M_rep_once_more(__match_mode, __i);
234 _M_dfs(__match_mode, __state._M_next);
239 _M_rep_once_more(__match_mode, __i);
245 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
247 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
248 _M_handle_subexpr_begin(_Match_mode __match_mode, _StateIdT __i)
250 const auto& __state = _M_nfa[__i];
252 auto& __res = _M_cur_results[__state._M_subexpr];
253 auto __back = __res.first;
254 __res.first = _M_current;
255 _M_dfs(__match_mode, __state._M_next);
256 __res.first = __back;
259 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
261 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
262 _M_handle_subexpr_end(_Match_mode __match_mode, _StateIdT __i)
264 const auto& __state = _M_nfa[__i];
266 auto& __res = _M_cur_results[__state._M_subexpr];
268 __res.second = _M_current;
269 __res.matched =
true;
270 _M_dfs(__match_mode, __state._M_next);
274 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
276 inline void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
277 _M_handle_line_begin_assertion(_Match_mode __match_mode, _StateIdT __i)
279 const auto& __state = _M_nfa[__i];
281 _M_dfs(__match_mode, __state._M_next);
284 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
286 inline void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
287 _M_handle_line_end_assertion(_Match_mode __match_mode, _StateIdT __i)
289 const auto& __state = _M_nfa[__i];
291 _M_dfs(__match_mode, __state._M_next);
294 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
296 inline void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
297 _M_handle_word_boundary(_Match_mode __match_mode, _StateIdT __i)
299 const auto& __state = _M_nfa[__i];
300 if (_M_word_boundary() == !__state._M_neg)
301 _M_dfs(__match_mode, __state._M_next);
306 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
308 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
309 _M_handle_subexpr_lookahead(_Match_mode __match_mode, _StateIdT __i)
311 const auto& __state = _M_nfa[__i];
312 if (_M_lookahead(__state._M_alt) == !__state._M_neg)
313 _M_dfs(__match_mode, __state._M_next);
316 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
318 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
319 _M_handle_match(_Match_mode __match_mode, _StateIdT __i)
321 const auto& __state = _M_nfa[__i];
323 if (_M_current == _M_end)
327 if (__state._M_matches(*_M_current))
330 _M_dfs(__match_mode, __state._M_next);
335 if (__state._M_matches(*_M_current))
336 _M_states._M_queue(__state._M_next, _M_cur_results);
339 template<
typename _BiIter,
typename _TraitsT>
340 struct _Backref_matcher
342 _Backref_matcher(
bool __icase,
const _TraitsT& __traits)
343 : _M_traits(__traits) { }
346 _M_apply(_BiIter __expected_begin,
347 _BiIter __expected_end, _BiIter __actual_begin,
348 _BiIter __actual_end)
350 return _M_traits.transform(__expected_begin, __expected_end)
351 == _M_traits.transform(__actual_begin, __actual_end);
354 const _TraitsT& _M_traits;
357 template<
typename _BiIter,
typename _CharT>
358 struct _Backref_matcher<_BiIter,
std::regex_traits<_CharT>>
361 _Backref_matcher(
bool __icase,
const _TraitsT& __traits)
362 : _M_icase(__icase), _M_traits(__traits) { }
365 _M_apply(_BiIter __expected_begin,
366 _BiIter __expected_end, _BiIter __actual_begin,
367 _BiIter __actual_end)
370 return _GLIBCXX_STD_A::__equal4(__expected_begin, __expected_end,
371 __actual_begin, __actual_end);
373 const auto& __fctyp = use_facet<__ctype_type>(_M_traits.getloc());
374 return _GLIBCXX_STD_A::__equal4(__expected_begin, __expected_end,
375 __actual_begin, __actual_end,
376 [
this, &__fctyp](_CharT __lhs, _CharT __rhs)
378 return __fctyp.tolower(__lhs)
379 == __fctyp.tolower(__rhs);
384 const _TraitsT& _M_traits;
391 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
393 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
394 _M_handle_backref(_Match_mode __match_mode, _StateIdT __i)
396 __glibcxx_assert(__dfs_mode);
398 const auto& __state = _M_nfa[__i];
399 auto& __submatch = _M_cur_results[__state._M_backref_index];
400 if (!__submatch.matched)
402 auto __last = _M_current;
403 for (
auto __tmp = __submatch.first;
404 __last != _M_end && __tmp != __submatch.second;
407 if (_Backref_matcher<_BiIter, _TraitsT>(
409 _M_re._M_automaton->_M_traits)._M_apply(
410 __submatch.first, __submatch.second, _M_current, __last))
412 if (__last != _M_current)
414 auto __backup = _M_current;
416 _M_dfs(__match_mode, __state._M_next);
417 _M_current = __backup;
420 _M_dfs(__match_mode, __state._M_next);
424 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
426 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
427 _M_handle_accept(_Match_mode __match_mode, _StateIdT)
429 if _GLIBCXX17_CONSTEXPR (__dfs_mode)
431 __glibcxx_assert(!_M_has_sol);
432 if (__match_mode == _Match_mode::_Exact)
433 _M_has_sol = _M_current == _M_end;
436 if (_M_current == _M_begin
442 _M_results = _M_cur_results;
445 __glibcxx_assert(_M_states._M_get_sol_pos());
453 if (*_M_states._M_get_sol_pos() == _BiIter()
455 *_M_states._M_get_sol_pos())
458 *_M_states._M_get_sol_pos() = _M_current;
459 _M_results = _M_cur_results;
466 if (_M_current == _M_begin
469 if (__match_mode == _Match_mode::_Prefix || _M_current == _M_end)
473 _M_results = _M_cur_results;
478 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
480 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
481 _M_handle_alternative(_Match_mode __match_mode, _StateIdT __i)
483 const auto& __state = _M_nfa[__i];
488 _M_dfs(__match_mode, __state._M_alt);
491 _M_dfs(__match_mode, __state._M_next);
497 _M_dfs(__match_mode, __state._M_alt);
498 auto __has_sol = _M_has_sol;
500 _M_dfs(__match_mode, __state._M_next);
501 _M_has_sol |= __has_sol;
505 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
507 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
508 _M_dfs(_Match_mode __match_mode, _StateIdT __i)
510 if (_M_states._M_visited(__i))
513 switch (_M_nfa[__i]._M_opcode())
515 case _S_opcode_repeat:
516 _M_handle_repeat(__match_mode, __i);
break;
517 case _S_opcode_subexpr_begin:
518 _M_handle_subexpr_begin(__match_mode, __i);
break;
519 case _S_opcode_subexpr_end:
520 _M_handle_subexpr_end(__match_mode, __i);
break;
521 case _S_opcode_line_begin_assertion:
522 _M_handle_line_begin_assertion(__match_mode, __i);
break;
523 case _S_opcode_line_end_assertion:
524 _M_handle_line_end_assertion(__match_mode, __i);
break;
525 case _S_opcode_word_boundary:
526 _M_handle_word_boundary(__match_mode, __i);
break;
527 case _S_opcode_subexpr_lookahead:
528 _M_handle_subexpr_lookahead(__match_mode, __i);
break;
529 case _S_opcode_match:
530 _M_handle_match(__match_mode, __i);
break;
531 case _S_opcode_backref:
532 _M_handle_backref(__match_mode, __i);
break;
533 case _S_opcode_accept:
534 _M_handle_accept(__match_mode, __i);
break;
535 case _S_opcode_alternative:
536 _M_handle_alternative(__match_mode, __i);
break;
538 __glibcxx_assert(
false);
543 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
545 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
546 _M_word_boundary()
const
553 bool __left_is_word =
false;
554 if (_M_current != _M_begin
557 auto __prev = _M_current;
558 if (_M_is_word(*std::prev(__prev)))
559 __left_is_word =
true;
561 bool __right_is_word =
562 _M_current != _M_end && _M_is_word(*_M_current);
564 return __left_is_word != __right_is_word;
568_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.