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);
99 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
101 template<
bool __match_mode>
102 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
108 _M_cur_results = _M_results;
109 _M_dfs<__match_mode>(_M_start_state);
114 _M_match_queue->push_back(
make_pair(_M_start_state, _M_results));
119 if (_M_match_queue->empty())
121 _M_visited->assign(_M_visited->size(),
false);
122 auto _M_old_queue = std::move(*_M_match_queue);
123 for (
auto __task : _M_old_queue)
125 _M_cur_results = __task.second;
126 _M_dfs<__match_mode>(__task.first);
130 if (_M_current == _M_end)
141 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
143 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
144 _M_lookahead(_State<_TraitsT> __state)
146 _ResultsVec __what(_M_cur_results.size());
152 __sub->_M_start_state = __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];
164 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
166 template<
bool __match_mode>
167 void _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
168 _M_dfs(_StateIdT __i)
172 if ((*_M_visited)[__i])
174 (*_M_visited)[__i] =
true;
177 const auto& __state = _M_nfa[__i];
180 switch (__state._M_opcode)
186 case _S_opcode_alternative:
191 _M_dfs<__match_mode>(__state._M_alt);
193 if (!__dfs_mode || !_M_has_sol)
194 _M_dfs<__match_mode>(__state._M_next);
201 _M_dfs<__match_mode>(__state._M_next);
203 _M_dfs<__match_mode>(__state._M_alt);
212 _M_dfs<__match_mode>(__state._M_next);
217 _M_dfs<__match_mode>(__state._M_alt);
222 case _S_opcode_subexpr_begin:
226 if (!_M_cur_results[__state._M_subexpr].matched
227 || _M_cur_results[__state._M_subexpr].first != _M_current)
229 auto& __res = _M_cur_results[__state._M_subexpr];
230 auto __back = __res.first;
231 __res.first = _M_current;
232 _M_dfs<__match_mode>(__state._M_next);
233 __res.first = __back;
236 case _S_opcode_subexpr_end:
237 if (_M_cur_results[__state._M_subexpr].second != _M_current
238 || _M_cur_results[__state._M_subexpr].matched !=
true)
240 auto& __res = _M_cur_results[__state._M_subexpr];
242 __res.second = _M_current;
243 __res.matched =
true;
244 _M_dfs<__match_mode>(__state._M_next);
248 _M_dfs<__match_mode>(__state._M_next);
250 case _S_opcode_line_begin_assertion:
252 _M_dfs<__match_mode>(__state._M_next);
254 case _S_opcode_line_end_assertion:
256 _M_dfs<__match_mode>(__state._M_next);
258 case _S_opcode_word_boundary:
259 if (_M_word_boundary(__state) == !__state._M_neg)
260 _M_dfs<__match_mode>(__state._M_next);
264 case _S_opcode_subexpr_lookahead:
265 if (_M_lookahead(__state) == !__state._M_neg)
266 _M_dfs<__match_mode>(__state._M_next);
268 case _S_opcode_match:
271 if (_M_current != _M_end && __state._M_matches(*_M_current))
274 _M_dfs<__match_mode>(__state._M_next);
279 if (__state._M_matches(*_M_current))
280 _M_match_queue->push_back(
make_pair(__state._M_next,
287 case _S_opcode_backref:
289 _GLIBCXX_DEBUG_ASSERT(__dfs_mode);
290 auto& __submatch = _M_cur_results[__state._M_backref_index];
291 if (!__submatch.matched)
293 auto __last = _M_current;
294 for (
auto __tmp = __submatch.first;
295 __last != _M_end && __tmp != __submatch.second;
298 if (_M_re._M_traits.transform(__submatch.first,
300 == _M_re._M_traits.transform(_M_current, __last))
302 if (__last != _M_current)
304 auto __backup = _M_current;
306 _M_dfs<__match_mode>(__state._M_next);
307 _M_current = __backup;
310 _M_dfs<__match_mode>(__state._M_next);
314 case _S_opcode_accept:
317 _GLIBCXX_DEBUG_ASSERT(!_M_has_sol);
319 _M_has_sol = _M_current == _M_end;
322 if (_M_current == _M_begin
326 _M_results = _M_cur_results;
330 if (_M_current == _M_begin
331 && (_M_flags & regex_constants::match_not_null))
333 if (!__match_mode || _M_current == _M_end)
337 _M_results = _M_cur_results;
342 _GLIBCXX_DEBUG_ASSERT(
false);
347 template<
typename _BiIter,
typename _Alloc,
typename _TraitsT,
349 bool _Executor<_BiIter, _Alloc, _TraitsT, __dfs_mode>::
350 _M_word_boundary(_State<_TraitsT> __state)
const
354 auto __pre = _M_current;
356 if (!(_M_at_begin() && _M_at_end()))
359 __ans = _M_is_word(*_M_current)
361 else if (_M_at_end())
362 __ans = _M_is_word(*__pre)
365 __ans = _M_is_word(*_M_current)
366 != _M_is_word(*__pre);
371 _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.