31 namespace std _GLIBCXX_VISIBILITY(default)
35 _GLIBCXX_BEGIN_NAMESPACE_VERSION
42 template<
typename,
bool,
bool>
50 template<
typename _TraitsT>
54 typedef typename _TraitsT::char_type _CharT;
55 typedef const _CharT* _IterT;
56 typedef _NFA<_TraitsT> _RegexT;
60 const typename _TraitsT::locale_type& __traits, _FlagT __flags);
64 {
return std::move(_M_nfa); }
68 typedef typename _TraitsT::string_type _StringT;
69 typedef typename _ScannerT::_TokenT _TokenT;
76 _M_match_token(_TokenT __token);
97 _M_bracket_expression();
99 template<
bool __icase,
bool __collate>
101 _M_insert_any_matcher_ecma();
103 template<
bool __icase,
bool __collate>
105 _M_insert_any_matcher_posix();
107 template<
bool __icase,
bool __collate>
109 _M_insert_char_matcher();
111 template<
bool __icase,
bool __collate>
113 _M_insert_character_class_matcher();
115 template<
bool __icase,
bool __collate>
117 _M_insert_bracket_matcher(
bool __neg);
121 template<
bool __icase,
bool __collate>
128 _M_cur_int_value(
int __radix);
136 auto ret = _M_stack.
top();
142 _ScannerT _M_scanner;
146 const _TraitsT& _M_traits;
147 const _CtypeT& _M_ctype;
150 template<
typename _Tp>
151 struct __has_contiguous_iter : std::false_type { };
153 template<
typename _Ch,
typename _Tr,
typename _Alloc>
158 template<
typename _Tp,
typename _Alloc>
159 struct __has_contiguous_iter<
std::vector<_Tp, _Alloc>>
163 template<
typename _Tp>
164 struct __is_contiguous_normal_iter : std::false_type { };
166 template<
typename _CharT>
167 struct __is_contiguous_normal_iter<_CharT*> : std::true_type { };
169 template<
typename _Tp,
typename _Cont>
171 __is_contiguous_normal_iter<__gnu_cxx::__normal_iterator<_Tp, _Cont>>
172 : __has_contiguous_iter<_Cont>::type
175 template<
typename _Iter,
typename _TraitsT>
176 using __enable_if_contiguous_normal_iter
177 =
typename enable_if< __is_contiguous_normal_iter<_Iter>::value,
180 template<
typename _Iter,
typename _TraitsT>
181 using __disable_if_contiguous_normal_iter
182 =
typename enable_if< !__is_contiguous_normal_iter<_Iter>::value,
185 template<
typename _FwdIter,
typename _TraitsT>
186 inline __enable_if_contiguous_normal_iter<_FwdIter, _TraitsT>
187 __compile_nfa(_FwdIter __first, _FwdIter __last,
188 const typename _TraitsT::locale_type& __loc,
191 size_t __len = __last - __first;
193 using _Cmplr = _Compiler<_TraitsT>;
194 return _Cmplr(__cfirst, __cfirst + __len, __loc, __flags)._M_get_nfa();
197 template<
typename _FwdIter,
typename _TraitsT>
198 inline __disable_if_contiguous_normal_iter<_FwdIter, _TraitsT>
199 __compile_nfa(_FwdIter __first, _FwdIter __last,
200 const typename _TraitsT::locale_type& __loc,
203 using char_type =
typename _TraitsT::char_type;
204 const basic_string<char_type> __str(__first, __last);
205 return __compile_nfa<const char_type*, _TraitsT>(__str.data(),
206 __str.data() + __str.size(), __loc, __flags);
210 template<
typename _TraitsT,
bool __icase,
bool __collate>
211 class _RegexTranslator
214 typedef typename _TraitsT::char_type _CharT;
215 typedef typename _TraitsT::string_type _StringT;
216 typedef typename std::conditional<__collate,
218 _CharT>::type _StrTransT;
221 _RegexTranslator(
const _TraitsT& __traits)
222 : _M_traits(__traits)
226 _M_translate(_CharT __ch)
const
229 return _M_traits.translate_nocase(__ch);
231 return _M_traits.translate(__ch);
237 _M_transform(_CharT __ch)
const
239 return _M_transform_impl(__ch,
typename integral_constant<
bool,
245 _M_transform_impl(_CharT __ch, false_type)
const
249 _M_transform_impl(_CharT __ch, true_type)
const
251 _StrTransT __str = _StrTransT(1, _M_translate(__ch));
252 return _M_traits.transform(__str.begin(), __str.end());
255 const _TraitsT& _M_traits;
258 template<
typename _TraitsT>
259 class _RegexTranslator<_TraitsT, false, false>
262 typedef typename _TraitsT::char_type _CharT;
263 typedef _CharT _StrTransT;
266 _RegexTranslator(
const _TraitsT&)
270 _M_translate(_CharT __ch)
const
274 _M_transform(_CharT __ch)
const
278 template<
typename _TraitsT,
bool __is_ecma,
bool __icase,
bool __collate>
281 template<
typename _TraitsT,
bool __icase,
bool __collate>
282 struct _AnyMatcher<_TraitsT, false, __icase, __collate>
284 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
285 typedef typename _TransT::_CharT _CharT;
288 _AnyMatcher(
const _TraitsT& __traits)
289 : _M_translator(__traits)
293 operator()(_CharT __ch)
const
295 static auto __nul = _M_translator._M_translate(
'\0');
296 return _M_translator._M_translate(__ch) != __nul;
299 _TransT _M_translator;
302 template<
typename _TraitsT,
bool __icase,
bool __collate>
303 struct _AnyMatcher<_TraitsT, true, __icase, __collate>
305 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
306 typedef typename _TransT::_CharT _CharT;
309 _AnyMatcher(
const _TraitsT& __traits)
310 : _M_translator(__traits)
314 operator()(_CharT __ch)
const
315 {
return _M_apply(__ch,
typename is_same<_CharT, char>::type()); }
318 _M_apply(_CharT __ch, true_type)
const
320 auto __c = _M_translator._M_translate(__ch);
321 auto __n = _M_translator._M_translate(
'\n');
322 auto __r = _M_translator._M_translate(
'\r');
323 return __c != __n && __c != __r;
327 _M_apply(_CharT __ch, false_type)
const
329 auto __c = _M_translator._M_translate(__ch);
330 auto __n = _M_translator._M_translate(
'\n');
331 auto __r = _M_translator._M_translate(
'\r');
332 auto __u2028 = _M_translator._M_translate(u
'\u2028');
333 auto __u2029 = _M_translator._M_translate(u
'\u2029');
334 return __c != __n && __c != __r && __c != __u2028 && __c != __u2029;
337 _TransT _M_translator;
340 template<
typename _TraitsT,
bool __icase,
bool __collate>
343 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
344 typedef typename _TransT::_CharT _CharT;
346 _CharMatcher(_CharT __ch,
const _TraitsT& __traits)
347 : _M_translator(__traits), _M_ch(_M_translator._M_translate(__ch))
351 operator()(_CharT __ch)
const
352 {
return _M_ch == _M_translator._M_translate(__ch); }
354 _TransT _M_translator;
359 template<
typename _TraitsT,
bool __icase,
bool __collate>
360 struct _BracketMatcher
363 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
364 typedef typename _TransT::_CharT _CharT;
365 typedef typename _TransT::_StrTransT _StrTransT;
366 typedef typename _TraitsT::string_type _StringT;
367 typedef typename _TraitsT::char_class_type _CharClassT;
370 _BracketMatcher(
bool __is_non_matching,
371 const _TraitsT& __traits)
372 : _M_class_set(0), _M_translator(__traits), _M_traits(__traits),
373 _M_is_non_matching(__is_non_matching)
377 operator()(_CharT __ch)
const
379 _GLIBCXX_DEBUG_ASSERT(_M_is_ready);
380 return _M_apply(__ch, _UseCache());
384 _M_add_char(_CharT __c)
386 _M_char_set.
push_back(_M_translator._M_translate(__c));
387 _GLIBCXX_DEBUG_ONLY(_M_is_ready =
false);
391 _M_add_collate_element(
const _StringT& __s)
393 auto __st = _M_traits.lookup_collatename(__s.data(),
394 __s.data() + __s.size());
397 "Invalid collate element.");
398 _M_char_set.
push_back(_M_translator._M_translate(__st[0]));
399 _GLIBCXX_DEBUG_ONLY(_M_is_ready =
false);
404 _M_add_equivalence_class(
const _StringT& __s)
406 auto __st = _M_traits.lookup_collatename(__s.data(),
407 __s.data() + __s.size());
410 "Invalid equivalence class.");
411 __st = _M_traits.transform_primary(__st.data(),
412 __st.data() + __st.size());
414 _GLIBCXX_DEBUG_ONLY(_M_is_ready =
false);
419 _M_add_character_class(
const _StringT& __s,
bool __neg)
421 auto __mask = _M_traits.lookup_classname(__s.data(),
422 __s.data() + __s.size(),
426 "Invalid character class.");
428 _M_class_set |= __mask;
431 _GLIBCXX_DEBUG_ONLY(_M_is_ready =
false);
435 _M_make_range(_CharT __l, _CharT __r)
439 "Invalid range in bracket expression.");
440 _M_range_set.push_back(
make_pair(_M_translator._M_transform(__l),
441 _M_translator._M_transform(__r)));
442 _GLIBCXX_DEBUG_ONLY(_M_is_ready =
false);
450 _M_char_set.
erase(__end, _M_char_set.
end());
451 _M_make_cache(_UseCache());
452 _GLIBCXX_DEBUG_ONLY(_M_is_ready =
true);
457 typedef typename std::is_same<_CharT, char>::type _UseCache;
459 static constexpr
size_t
462 return 1ul << (
sizeof(_CharT) * __CHAR_BIT__ *
int(_UseCache::value));
466 typedef typename std::conditional<_UseCache::value,
467 std::bitset<_S_cache_size()>,
468 _Dummy>::type _CacheT;
469 typedef typename std::make_unsigned<_CharT>::type _UnsignedCharT;
472 _M_apply(_CharT __ch, false_type)
const;
475 _M_apply(_CharT __ch, true_type)
const
476 {
return _M_cache[
static_cast<_UnsignedCharT
>(__ch)]; }
479 _M_make_cache(true_type)
481 for (
unsigned __i = 0; __i < _M_cache.size(); __i++)
482 _M_cache[__i] = _M_apply(static_cast<_CharT>(__i), false_type());
486 _M_make_cache(false_type)
494 _CharClassT _M_class_set;
495 _TransT _M_translator;
496 const _TraitsT& _M_traits;
497 bool _M_is_non_matching;
499 #ifdef _GLIBCXX_DEBUG
500 bool _M_is_ready =
false;
505 _GLIBCXX_END_NAMESPACE_VERSION
Managing sequences of characters and character-like objects.
Builds an NFA from an input iterator range.
Primary class template ctype facet.This template class defines classification and conversion function...
Struct holding two objects of arbitrary type.
void sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
Sort the elements of a sequence using a predicate for comparison.
void pop()
Removes first element.
Scans an input range for regex tokens.
Matches a character range (bracket expression)
ISO C++ entities toplevel namespace is std.
constexpr error_type error_collate(_S_error_collate)
_ForwardIterator unique(_ForwardIterator __first, _ForwardIterator __last, _BinaryPredicate __binary_pred)
Remove consecutive values from a sequence using a predicate.
iterator erase(const_iterator __position)
Remove element at given position.
Describes a sequence of one or more _State, its current start and end(s). This structure contains fra...
_Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
iterator begin() noexcept
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.
void push_back(const value_type &__x)
Add data to the end of the vector.
A smart pointer with reference-counted copy semantics.
constexpr error_type error_range(_S_error_range)
syntax_option_type
This is a bitmask type indicating how to interpret the regex.