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>::
43 return _M_search_from_first();
44 auto __cur = _M_begin;
52 while (__cur++ != _M_end);
100 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
102 template<
bool __match_mode>
103 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
109 _M_cur_results = _M_results;
110 _M_dfs<__match_mode>(_M_start_state);
115 _M_match_queue->push_back(
make_pair(_M_start_state, _M_results));
120 if (_M_match_queue->empty())
122 _M_visited->assign(_M_visited->size(),
false);
123 auto __old_queue = std::move(*_M_match_queue);
124 for (
auto& __task : __old_queue)
126 _M_cur_results = std::move(__task.second);
127 _M_dfs<__match_mode>(__task.first);
131 if (_M_current == _M_end)
142 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
144 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
145 _M_lookahead(_State<_TraitsT> __state)
150 _ResultsVec __what(_M_cur_results);
156 __sub->_M_start_state = __state._M_alt;
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];
168 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
170 template<
bool __match_mode>
171 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
172 _M_dfs(_StateIdT __i)
176 if ((*_M_visited)[__i])
178 (*_M_visited)[__i] =
true;
181 const auto& __state = _M_nfa[__i];
184 switch (__state._M_opcode)
190 case _S_opcode_alternative:
195 _M_dfs<__match_mode>(__state._M_alt);
197 if (!__dfs_mode || !_M_has_sol)
198 _M_dfs<__match_mode>(__state._M_next);
205 _M_dfs<__match_mode>(__state._M_next);
207 _M_dfs<__match_mode>(__state._M_alt);
216 _M_dfs<__match_mode>(__state._M_next);
221 _M_dfs<__match_mode>(__state._M_alt);
226 case _S_opcode_subexpr_begin:
230 if (!_M_cur_results[__state._M_subexpr].matched
231 || _M_cur_results[__state._M_subexpr].first != _M_current)
233 auto& __res = _M_cur_results[__state._M_subexpr];
234 auto __back = __res.first;
235 __res.first = _M_current;
236 _M_dfs<__match_mode>(__state._M_next);
237 __res.first = __back;
240 case _S_opcode_subexpr_end:
241 if (_M_cur_results[__state._M_subexpr].second != _M_current
242 || _M_cur_results[__state._M_subexpr].matched !=
true)
244 auto& __res = _M_cur_results[__state._M_subexpr];
246 __res.second = _M_current;
247 __res.matched =
true;
248 _M_dfs<__match_mode>(__state._M_next);
252 _M_dfs<__match_mode>(__state._M_next);
254 case _S_opcode_line_begin_assertion:
256 _M_dfs<__match_mode>(__state._M_next);
258 case _S_opcode_line_end_assertion:
260 _M_dfs<__match_mode>(__state._M_next);
262 case _S_opcode_word_boundary:
263 if (_M_word_boundary(__state) == !__state._M_neg)
264 _M_dfs<__match_mode>(__state._M_next);
268 case _S_opcode_subexpr_lookahead:
269 if (_M_lookahead(__state) == !__state._M_neg)
270 _M_dfs<__match_mode>(__state._M_next);
272 case _S_opcode_match:
273 if (_M_current == _M_end)
277 if (__state._M_matches(*_M_current))
280 _M_dfs<__match_mode>(__state._M_next);
285 if (__state._M_matches(*_M_current))
286 _M_match_queue->push_back(
make_pair(__state._M_next,
293 case _S_opcode_backref:
295 _GLIBCXX_DEBUG_ASSERT(__dfs_mode);
296 auto& __submatch = _M_cur_results[__state._M_backref_index];
297 if (!__submatch.matched)
299 auto __last = _M_current;
300 for (
auto __tmp = __submatch.first;
301 __last != _M_end && __tmp != __submatch.second;
304 if (_M_re._M_traits.transform(__submatch.first,
306 == _M_re._M_traits.transform(_M_current, __last))
308 if (__last != _M_current)
310 auto __backup = _M_current;
312 _M_dfs<__match_mode>(__state._M_next);
313 _M_current = __backup;
316 _M_dfs<__match_mode>(__state._M_next);
320 case _S_opcode_accept:
323 _GLIBCXX_DEBUG_ASSERT(!_M_has_sol);
325 _M_has_sol = _M_current == _M_end;
328 if (_M_current == _M_begin
332 _M_results = _M_cur_results;
336 if (_M_current == _M_begin
337 && (_M_flags & regex_constants::match_not_null))
339 if (!__match_mode || _M_current == _M_end)
343 _M_results = _M_cur_results;
348 _GLIBCXX_DEBUG_ASSERT(
false);
353 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
355 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
356 _M_word_boundary(_State<_TraitsT> __state)
const
358 bool __left_is_word =
false;
359 if (_M_current != _M_begin
362 auto __prev = _M_current;
363 if (_M_is_word(*std::prev(__prev)))
364 __left_is_word =
true;
366 bool __right_is_word =
367 _M_current != _M_end && _M_is_word(*_M_current);
369 if (__left_is_word == __right_is_word)
378 _GLIBCXX_END_NAMESPACE_VERSION
constexpr pair< typename __decay_and_strip< _T1 >::__type, typename __decay_and_strip< _T2 >::__type > make_pair(_T1 &&__x, _T2 &&__y)
A convenience wrapper for creating a pair from two objects.
20.7.1.2 unique_ptr for single objects.