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)
150 _ResultsVec __what(_M_cur_results.size());
151 _Executor __sub(_M_current, _M_end, __what, _M_re, _M_flags);
152 __sub._M_states._M_start = __state._M_alt;
153 if (__sub._M_search_from_first())
155 for (
size_t __i = 0; __i < __what.size(); __i++)
156 if (__what[__i].matched)
157 _M_cur_results[__i] = __what[__i];
169 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
171 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
172 _M_rep_once_more(_Match_mode __match_mode, _StateIdT __i)
174 const auto& __state = _M_nfa[__i];
175 auto& __rep_count = _M_rep_count[__i];
176 if (__rep_count.second == 0 || __rep_count.first != _M_current)
178 auto __back = __rep_count;
179 __rep_count.first = _M_current;
180 __rep_count.second = 1;
181 _M_dfs(__match_mode, __state._M_alt);
182 __rep_count = __back;
186 if (__rep_count.second < 2)
188 __rep_count.second++;
189 _M_dfs(__match_mode, __state._M_alt);
190 __rep_count.second--;
195 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
197 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
198 _M_dfs(_Match_mode __match_mode, _StateIdT __i)
200 if (_M_states._M_visited(__i))
203 const auto& __state = _M_nfa[__i];
206 switch (__state._M_opcode)
212 case _S_opcode_repeat:
217 _M_rep_once_more(__match_mode, __i);
219 if (!__dfs_mode || !_M_has_sol)
220 _M_dfs(__match_mode, __state._M_next);
227 _M_dfs(__match_mode, __state._M_next);
229 _M_rep_once_more(__match_mode, __i);
238 _M_dfs(__match_mode, __state._M_next);
243 _M_rep_once_more(__match_mode, __i);
249 case _S_opcode_subexpr_begin:
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 case _S_opcode_subexpr_end:
260 auto& __res = _M_cur_results[__state._M_subexpr];
262 __res.second = _M_current;
263 __res.matched =
true;
264 _M_dfs(__match_mode, __state._M_next);
268 case _S_opcode_line_begin_assertion:
270 _M_dfs(__match_mode, __state._M_next);
272 case _S_opcode_line_end_assertion:
274 _M_dfs(__match_mode, __state._M_next);
276 case _S_opcode_word_boundary:
277 if (_M_word_boundary() == !__state._M_neg)
278 _M_dfs(__match_mode, __state._M_next);
282 case _S_opcode_subexpr_lookahead:
283 if (_M_lookahead(__state) == !__state._M_neg)
284 _M_dfs(__match_mode, __state._M_next);
286 case _S_opcode_match:
287 if (_M_current == _M_end)
291 if (__state._M_matches(*_M_current))
294 _M_dfs(__match_mode, __state._M_next);
299 if (__state._M_matches(*_M_current))
300 _M_states._M_queue(__state._M_next, _M_cur_results);
306 case _S_opcode_backref:
308 _GLIBCXX_DEBUG_ASSERT(__dfs_mode);
309 auto& __submatch = _M_cur_results[__state._M_backref_index];
310 if (!__submatch.matched)
312 auto __last = _M_current;
313 for (
auto __tmp = __submatch.first;
314 __last != _M_end && __tmp != __submatch.second;
317 if (_M_re._M_automaton->_M_traits.transform(__submatch.first,
319 == _M_re._M_automaton->_M_traits.transform(_M_current, __last))
321 if (__last != _M_current)
323 auto __backup = _M_current;
325 _M_dfs(__match_mode, __state._M_next);
326 _M_current = __backup;
329 _M_dfs(__match_mode, __state._M_next);
333 case _S_opcode_accept:
336 _GLIBCXX_DEBUG_ASSERT(!_M_has_sol);
337 if (__match_mode == _Match_mode::_Exact)
338 _M_has_sol = _M_current == _M_end;
341 if (_M_current == _M_begin
347 _M_results = _M_cur_results;
350 _GLIBCXX_DEBUG_ASSERT(_M_states._M_get_sol_pos());
358 if (*_M_states._M_get_sol_pos() == _BiIter()
360 *_M_states._M_get_sol_pos())
363 *_M_states._M_get_sol_pos() = _M_current;
364 _M_results = _M_cur_results;
371 if (_M_current == _M_begin
372 && (_M_flags & regex_constants::match_not_null))
374 if (__match_mode == _Match_mode::_Prefix || _M_current == _M_end)
378 _M_results = _M_cur_results;
382 case _S_opcode_alternative:
386 _GLIBCXX_DEBUG_ASSERT(__dfs_mode);
387 _M_dfs(__match_mode, __state._M_alt);
390 _M_dfs(__match_mode, __state._M_next);
396 _M_dfs(__match_mode, __state._M_alt);
397 auto __has_sol = _M_has_sol;
399 _M_dfs(__match_mode, __state._M_next);
400 _M_has_sol |= __has_sol;
404 _GLIBCXX_DEBUG_ASSERT(
false);
409 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
411 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
412 _M_word_boundary()
const
414 bool __left_is_word =
false;
415 if (_M_current != _M_begin
418 auto __prev = _M_current;
419 if (_M_is_word(*std::prev(__prev)))
420 __left_is_word =
true;
422 bool __right_is_word =
423 _M_current != _M_end && _M_is_word(*_M_current);
425 if (__left_is_word == __right_is_word)
434 _GLIBCXX_END_NAMESPACE_VERSION
constexpr match_flag_type match_not_null
constexpr match_flag_type match_prev_avail
constexpr match_flag_type match_not_eow
constexpr match_flag_type match_not_bow
constexpr match_flag_type match_continuous
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