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)
147 _ResultsVec __what(_M_cur_results.size());
153 __sub->_M_start_state = __state._M_alt;
154 if (__sub->_M_search_from_first())
156 for (
size_t __i = 0; __i < __what.size(); __i++)
157 if (__what[__i].matched)
158 _M_cur_results[__i] = __what[__i];
165 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
167 template<
bool __match_mode>
168 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
169 _M_dfs(_StateIdT __i)
173 if ((*_M_visited)[__i])
175 (*_M_visited)[__i] =
true;
178 const auto& __state = _M_nfa[__i];
181 switch (__state._M_opcode)
187 case _S_opcode_alternative:
192 _M_dfs<__match_mode>(__state._M_alt);
194 if (!__dfs_mode || !_M_has_sol)
195 _M_dfs<__match_mode>(__state._M_next);
202 _M_dfs<__match_mode>(__state._M_next);
204 _M_dfs<__match_mode>(__state._M_alt);
213 _M_dfs<__match_mode>(__state._M_next);
218 _M_dfs<__match_mode>(__state._M_alt);
223 case _S_opcode_subexpr_begin:
227 if (!_M_cur_results[__state._M_subexpr].matched
228 || _M_cur_results[__state._M_subexpr].first != _M_current)
230 auto& __res = _M_cur_results[__state._M_subexpr];
231 auto __back = __res.first;
232 __res.first = _M_current;
233 _M_dfs<__match_mode>(__state._M_next);
234 __res.first = __back;
237 case _S_opcode_subexpr_end:
238 if (_M_cur_results[__state._M_subexpr].second != _M_current
239 || _M_cur_results[__state._M_subexpr].matched !=
true)
241 auto& __res = _M_cur_results[__state._M_subexpr];
243 __res.second = _M_current;
244 __res.matched =
true;
245 _M_dfs<__match_mode>(__state._M_next);
249 _M_dfs<__match_mode>(__state._M_next);
251 case _S_opcode_line_begin_assertion:
253 _M_dfs<__match_mode>(__state._M_next);
255 case _S_opcode_line_end_assertion:
257 _M_dfs<__match_mode>(__state._M_next);
259 case _S_opcode_word_boundary:
260 if (_M_word_boundary(__state) == !__state._M_neg)
261 _M_dfs<__match_mode>(__state._M_next);
265 case _S_opcode_subexpr_lookahead:
266 if (_M_lookahead(__state) == !__state._M_neg)
267 _M_dfs<__match_mode>(__state._M_next);
269 case _S_opcode_match:
270 if (_M_current == _M_end)
274 if (__state._M_matches(*_M_current))
277 _M_dfs<__match_mode>(__state._M_next);
282 if (__state._M_matches(*_M_current))
283 _M_match_queue->push_back(
make_pair(__state._M_next,
290 case _S_opcode_backref:
292 _GLIBCXX_DEBUG_ASSERT(__dfs_mode);
293 auto& __submatch = _M_cur_results[__state._M_backref_index];
294 if (!__submatch.matched)
296 auto __last = _M_current;
297 for (
auto __tmp = __submatch.first;
298 __last != _M_end && __tmp != __submatch.second;
301 if (_M_re._M_traits.transform(__submatch.first,
303 == _M_re._M_traits.transform(_M_current, __last))
305 if (__last != _M_current)
307 auto __backup = _M_current;
309 _M_dfs<__match_mode>(__state._M_next);
310 _M_current = __backup;
313 _M_dfs<__match_mode>(__state._M_next);
317 case _S_opcode_accept:
320 _GLIBCXX_DEBUG_ASSERT(!_M_has_sol);
322 _M_has_sol = _M_current == _M_end;
325 if (_M_current == _M_begin
329 _M_results = _M_cur_results;
333 if (_M_current == _M_begin
334 && (_M_flags & regex_constants::match_not_null))
336 if (!__match_mode || _M_current == _M_end)
340 _M_results = _M_cur_results;
345 _GLIBCXX_DEBUG_ASSERT(
false);
350 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
352 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
353 _M_word_boundary(_State<_TraitsT> __state)
const
355 bool __left_is_word =
false;
356 if (_M_current != _M_begin
359 auto __prev = _M_current;
360 if (_M_is_word(*std::prev(__prev)))
361 __left_is_word =
true;
363 bool __right_is_word =
364 _M_current != _M_end && _M_is_word(*_M_current);
366 if (__left_is_word == __right_is_word)
375 _GLIBCXX_END_NAMESPACE_VERSION
20.7.1.2 unique_ptr for single objects.
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.