31namespace std _GLIBCXX_VISIBILITY(default)
33_GLIBCXX_BEGIN_NAMESPACE_VERSION
35#pragma GCC diagnostic push
36#pragma GCC diagnostic ignored "-Wc++17-extensions"
39 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
44 if (_M_search_from_first())
49 while (_M_begin != _M_end)
52 if (_M_search_from_first())
81 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
87 *_M_states._M_get_sol_pos() = _BiIter();
88 _M_cur_results = _M_results;
89 _M_dfs(__match_mode, _M_states._M_start);
115 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
120 _M_states._M_queue(_M_states._M_start, _M_results);
125 if (_M_states._M_match_queue.empty())
127 std::fill_n(_M_states._M_visited_states, _M_nfa.size(),
false);
128 auto __old_queue =
std::move(_M_states._M_match_queue);
129 auto __alloc = _M_cur_results.get_allocator();
130 for (
auto& __task : __old_queue)
132 _M_cur_results = _ResultsVec(
std::move(__task.second), __alloc);
133 _M_dfs(__match_mode, __task.first);
135 if (__match_mode == _Match_mode::_Prefix)
137 if (_M_current == _M_end)
141 if (__match_mode == _Match_mode::_Exact)
143 _M_states._M_match_queue.clear();
148 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
156 _ResultsVec __what(_M_cur_results);
157 _Executor __sub(_M_current, _M_end, __what, _M_re, _M_flags);
158 __sub._M_states._M_start = __next;
159 if (__sub._M_search_from_first())
161 for (
size_t __i = 0; __i < __what.size(); __i++)
162 if (__what[__i].matched)
163 _M_cur_results[__i] = __what[__i];
175 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
180 const auto& __state = _M_nfa[__i];
181 auto& __rep_count = _M_rep_count[__i];
182 if (__rep_count.second == 0 || __rep_count.first != _M_current)
184 auto __back = __rep_count;
185 __rep_count.first = _M_current;
186 __rep_count.second = 1;
187 _M_dfs(__match_mode, __state._M_alt);
188 __rep_count = __back;
192 if (__rep_count.second < 2)
194 __rep_count.second++;
195 _M_dfs(__match_mode, __state._M_alt);
196 __rep_count.second--;
205 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
210 const auto& __state = _M_nfa[__i];
215 _M_rep_once_more(__match_mode, __i);
217 if (!__dfs_mode || !_M_has_sol)
218 _M_dfs(__match_mode, __state._M_next);
222 if constexpr (__dfs_mode)
225 _M_dfs(__match_mode, __state._M_next);
227 _M_rep_once_more(__match_mode, __i);
236 _M_dfs(__match_mode, __state._M_next);
241 _M_rep_once_more(__match_mode, __i);
247 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
252 const auto& __state = _M_nfa[__i];
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 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
266 const auto& __state = _M_nfa[__i];
268 auto& __res = _M_cur_results[__state._M_subexpr];
270 __res.second = _M_current;
271 __res.matched =
true;
272 _M_dfs(__match_mode, __state._M_next);
276 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
281 const auto& __state = _M_nfa[__i];
283 _M_dfs(__match_mode, __state._M_next);
286 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
291 const auto& __state = _M_nfa[__i];
293 _M_dfs(__match_mode, __state._M_next);
296 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
301 const auto& __state = _M_nfa[__i];
302 if (_M_word_boundary() == !__state._M_neg)
303 _M_dfs(__match_mode, __state._M_next);
308 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
313 const auto& __state = _M_nfa[__i];
314 if (_M_lookahead(__state._M_alt) == !__state._M_neg)
315 _M_dfs(__match_mode, __state._M_next);
318 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
323 const auto& __state = _M_nfa[__i];
325 if (_M_current == _M_end)
327 if constexpr (__dfs_mode)
329 if (__state._M_matches(*_M_current))
332 _M_dfs(__match_mode, __state._M_next);
337 if (__state._M_matches(*_M_current))
338 _M_states._M_queue(__state._M_next, _M_cur_results);
341 template<
typename _BiIter,
typename _TraitsT>
342 struct _Backref_matcher
344 _Backref_matcher(
bool ,
const _TraitsT& __traits)
345 : _M_traits(__traits) { }
348 _M_apply(_BiIter __expected_begin,
349 _BiIter __expected_end, _BiIter __actual_begin,
350 _BiIter __actual_end)
352 return _M_traits.transform(__expected_begin, __expected_end)
353 == _M_traits.transform(__actual_begin, __actual_end);
356 const _TraitsT& _M_traits;
359 template<
typename _BiIter,
typename _CharT>
360 struct _Backref_matcher<_BiIter, std::regex_traits<_CharT>>
362 using _TraitsT = std::regex_traits<_CharT>;
363 _Backref_matcher(
bool __icase,
const _TraitsT& __traits)
364 : _M_icase(__icase), _M_traits(__traits) { }
367 _M_apply(_BiIter __expected_begin,
368 _BiIter __expected_end, _BiIter __actual_begin,
369 _BiIter __actual_end)
372 return _GLIBCXX_STD_A::__equal4(__expected_begin, __expected_end,
373 __actual_begin, __actual_end);
374 typedef std::ctype<_CharT> __ctype_type;
376 return _GLIBCXX_STD_A::__equal4(__expected_begin, __expected_end,
377 __actual_begin, __actual_end,
378 [
this, &__fctyp](_CharT __lhs, _CharT __rhs)
380 return __fctyp.tolower(__lhs)
381 == __fctyp.tolower(__rhs);
386 const _TraitsT& _M_traits;
393 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
398 static_assert(__dfs_mode,
"this should never be instantiated");
400 const auto& __state = _M_nfa[__i];
401 auto& __submatch = _M_cur_results[__state._M_backref_index];
402 if (!__submatch.matched)
404 auto __last = _M_current;
405 for (
auto __tmp = __submatch.first;
406 __last != _M_end && __tmp != __submatch.second;
409 if (_Backref_matcher<_BiIter, _TraitsT>(
411 _M_re._M_automaton->_M_traits)._M_apply(
412 __submatch.first, __submatch.second, _M_current, __last))
414 if (__last != _M_current)
416 auto __backup = _M_current;
418 _M_dfs(__match_mode, __state._M_next);
419 _M_current = __backup;
422 _M_dfs(__match_mode, __state._M_next);
426 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
431 if constexpr (__dfs_mode)
433 __glibcxx_assert(!_M_has_sol);
434 if (__match_mode == _Match_mode::_Exact)
435 _M_has_sol = _M_current == _M_end;
438 if (_M_current == _M_begin
444 _M_results = _M_cur_results;
447 __glibcxx_assert(_M_states._M_get_sol_pos());
455 if (*_M_states._M_get_sol_pos() == _BiIter()
457 *_M_states._M_get_sol_pos())
460 *_M_states._M_get_sol_pos() = _M_current;
461 _M_results = _M_cur_results;
468 if (_M_current == _M_begin
471 if (__match_mode == _Match_mode::_Prefix || _M_current == _M_end)
475 _M_results = _M_cur_results;
480 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
485 const auto& __state = _M_nfa[__i];
490 _M_dfs(__match_mode, __state._M_alt);
493 _M_dfs(__match_mode, __state._M_next);
499 _M_dfs(__match_mode, __state._M_alt);
500 auto __has_sol = _M_has_sol;
502 _M_dfs(__match_mode, __state._M_next);
503 _M_has_sol |= __has_sol;
507 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
510 _M_dfs(_Match_mode __match_mode, _StateIdT __i)
512 if (_M_states._M_visited(__i))
515 switch (_M_nfa[__i]._M_opcode())
517 case _S_opcode_repeat:
518 _M_handle_repeat(__match_mode, __i);
break;
519 case _S_opcode_subexpr_begin:
520 _M_handle_subexpr_begin(__match_mode, __i);
break;
521 case _S_opcode_subexpr_end:
522 _M_handle_subexpr_end(__match_mode, __i);
break;
523 case _S_opcode_line_begin_assertion:
524 _M_handle_line_begin_assertion(__match_mode, __i);
break;
525 case _S_opcode_line_end_assertion:
526 _M_handle_line_end_assertion(__match_mode, __i);
break;
527 case _S_opcode_word_boundary:
528 _M_handle_word_boundary(__match_mode, __i);
break;
529 case _S_opcode_subexpr_lookahead:
530 _M_handle_subexpr_lookahead(__match_mode, __i);
break;
531 case _S_opcode_match:
532 _M_handle_match(__match_mode, __i);
break;
533 case _S_opcode_backref:
534 if constexpr (__dfs_mode)
535 _M_handle_backref(__match_mode, __i);
537 __builtin_unreachable();
539 case _S_opcode_accept:
540 _M_handle_accept(__match_mode, __i);
break;
541 case _S_opcode_alternative:
542 _M_handle_alternative(__match_mode, __i);
break;
544 __glibcxx_assert(
false);
549 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
559 bool __left_is_word =
false;
560 if (_M_current != _M_begin
563 auto __prev = _M_current;
564 if (_M_is_word(*std::prev(__prev)))
565 __left_is_word =
true;
567 bool __right_is_word =
568 _M_current != _M_end && _M_is_word(*_M_current);
570 return __left_is_word != __right_is_word;
573#pragma GCC diagnostic pop
575_GLIBCXX_END_NAMESPACE_VERSION
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
const _Facet & use_facet(const locale &__loc)
Return a facet.
ISO C++ entities toplevel namespace is std.
constexpr iterator_traits< _InputIterator >::difference_type distance(_InputIterator __first, _InputIterator __last)
A generalization of pointer arithmetic.
Implementation details not part of the namespace std interface.
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
Takes a regex and an input string and does the matching.