31 namespace std _GLIBCXX_VISIBILITY(default)
33 _GLIBCXX_BEGIN_NAMESPACE_VERSION
34 _GLIBCXX_BEGIN_NAMESPACE_CXX11
39 _GLIBCXX_END_NAMESPACE_CXX11
40 _GLIBCXX_END_NAMESPACE_VERSION
44 _GLIBCXX_BEGIN_NAMESPACE_VERSION
51 template<
typename,
bool,
bool>
59 template<
typename _TraitsT>
63 typedef typename _TraitsT::char_type _CharT;
64 typedef const _CharT* _IterT;
65 typedef _NFA<_TraitsT> _RegexT;
69 const typename _TraitsT::locale_type& __traits, _FlagT __flags);
73 {
return std::move(_M_nfa); }
77 typedef typename _TraitsT::string_type _StringT;
78 typedef typename _ScannerT::_TokenT _TokenT;
85 _M_match_token(_TokenT __token);
106 _M_bracket_expression();
108 template<
bool __icase,
bool __collate>
110 _M_insert_any_matcher_ecma();
112 template<
bool __icase,
bool __collate>
114 _M_insert_any_matcher_posix();
116 template<
bool __icase,
bool __collate>
118 _M_insert_char_matcher();
120 template<
bool __icase,
bool __collate>
122 _M_insert_character_class_matcher();
124 template<
bool __icase,
bool __collate>
126 _M_insert_bracket_matcher(
bool __neg);
130 template<
bool __icase,
bool __collate>
137 _M_cur_int_value(
int __radix);
145 auto ret = _M_stack.
top();
151 _ScannerT _M_scanner;
155 const _TraitsT& _M_traits;
156 const _CtypeT& _M_ctype;
159 template<
typename _Tp>
162 template<
typename _Ch,
typename _Tr,
typename _Alloc>
163 struct __has_contiguous_iter<std::
basic_string<_Ch, _Tr, _Alloc>>
167 template<
typename _Tp,
typename _Alloc>
168 struct __has_contiguous_iter<std::
vector<_Tp, _Alloc>>
172 template<
typename _Tp>
175 template<
typename _CharT>
178 template<
typename _Tp,
typename _Cont>
180 __is_contiguous_normal_iter<__gnu_cxx::__normal_iterator<_Tp, _Cont>>
184 template<
typename _Iter,
typename _TraitsT>
185 using __enable_if_contiguous_normal_iter
186 =
typename enable_if< __is_contiguous_normal_iter<_Iter>::value,
189 template<
typename _Iter,
typename _TraitsT>
190 using __disable_if_contiguous_normal_iter
191 =
typename enable_if< !__is_contiguous_normal_iter<_Iter>::value,
194 template<
typename _FwdIter,
typename _TraitsT>
195 inline __enable_if_contiguous_normal_iter<_FwdIter, _TraitsT>
196 __compile_nfa(_FwdIter __first, _FwdIter __last,
197 const typename _TraitsT::locale_type& __loc,
200 size_t __len = __last - __first;
203 return _Cmplr(__cfirst, __cfirst + __len, __loc, __flags)._M_get_nfa();
206 template<
typename _FwdIter,
typename _TraitsT>
207 inline __disable_if_contiguous_normal_iter<_FwdIter, _TraitsT>
208 __compile_nfa(_FwdIter __first, _FwdIter __last,
209 const typename _TraitsT::locale_type& __loc,
212 using char_type =
typename _TraitsT::char_type;
214 return __compile_nfa<const char_type*, _TraitsT>(__str.
data(),
215 __str.
data() + __str.
size(), __loc, __flags);
219 template<
typename _TraitsT,
bool __icase,
bool __collate>
220 class _RegexTranslatorBase
223 typedef typename _TraitsT::char_type _CharT;
224 typedef typename _TraitsT::string_type _StringT;
225 typedef _StringT _StrTransT;
228 _RegexTranslatorBase(
const _TraitsT& __traits)
229 : _M_traits(__traits)
233 _M_translate(_CharT __ch)
const 236 return _M_traits.translate_nocase(__ch);
238 return _M_traits.translate(__ch);
244 _M_transform(_CharT __ch)
const 246 _StrTransT __str(1, __ch);
247 return _M_traits.transform(__str.begin(), __str.end());
254 _M_match_range(
const _StrTransT& __first,
const _StrTransT& __last,
255 const _StrTransT& __s)
const 256 {
return __first <= __s && __s <= __last; }
259 bool _M_in_range_icase(_CharT __first, _CharT __last, _CharT __ch)
const 262 const auto& __fctyp = use_facet<__ctype_type>(this->_M_traits.getloc());
263 auto __lower = __fctyp.
tolower(__ch);
264 auto __upper = __fctyp.toupper(__ch);
265 return (__first <= __lower && __lower <= __last)
266 || (__first <= __upper && __upper <= __last);
269 const _TraitsT& _M_traits;
272 template<
typename _TraitsT,
bool __icase,
bool __collate>
273 class _RegexTranslator
274 :
public _RegexTranslatorBase<_TraitsT, __icase, __collate>
277 typedef _RegexTranslatorBase<_TraitsT, __icase, __collate> _Base;
281 template<
typename _TraitsT,
bool __icase>
282 class _RegexTranslator<_TraitsT, __icase, false>
283 :
public _RegexTranslatorBase<_TraitsT, __icase, false>
286 typedef _RegexTranslatorBase<_TraitsT, __icase, false> _Base;
287 typedef typename _Base::_CharT _CharT;
288 typedef _CharT _StrTransT;
293 _M_transform(_CharT __ch)
const 297 _M_match_range(_CharT __first, _CharT __last, _CharT __ch)
const 300 return __first <= __ch && __ch <= __last;
301 return this->_M_in_range_icase(__first, __last, __ch);
305 template<
typename _CharType>
306 class _RegexTranslator<std::
regex_traits<_CharType>, true, true>
307 :
public _RegexTranslatorBase<std::regex_traits<_CharType>, true, true>
310 typedef _RegexTranslatorBase<std::regex_traits<_CharType>,
true,
true>
312 typedef typename _Base::_CharT _CharT;
313 typedef typename _Base::_StrTransT _StrTransT;
318 _M_match_range(
const _StrTransT& __first,
const _StrTransT& __last,
319 const _StrTransT& __str)
const 321 __glibcxx_assert(__first.size() == 1);
322 __glibcxx_assert(__last.size() == 1);
323 __glibcxx_assert(__str.size() == 1);
324 return this->_M_in_range_icase(__first[0], __last[0], __str[0]);
328 template<
typename _TraitsT>
329 class _RegexTranslator<_TraitsT, false, false>
332 typedef typename _TraitsT::char_type _CharT;
333 typedef _CharT _StrTransT;
336 _RegexTranslator(
const _TraitsT&)
340 _M_translate(_CharT __ch)
const 344 _M_transform(_CharT __ch)
const 348 _M_match_range(_CharT __first, _CharT __last, _CharT __ch)
const 349 {
return __first <= __ch && __ch <= __last; }
352 template<
typename _TraitsT,
bool __is_ecma,
bool __icase,
bool __collate>
355 template<
typename _TraitsT,
bool __icase,
bool __collate>
356 struct _AnyMatcher<_TraitsT, false, __icase, __collate>
358 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
359 typedef typename _TransT::_CharT _CharT;
362 _AnyMatcher(
const _TraitsT& __traits)
363 : _M_translator(__traits)
367 operator()(_CharT __ch)
const 369 static auto __nul = _M_translator._M_translate(
'\0');
370 return _M_translator._M_translate(__ch) != __nul;
373 _TransT _M_translator;
376 template<
typename _TraitsT,
bool __icase,
bool __collate>
377 struct _AnyMatcher<_TraitsT, true, __icase, __collate>
379 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
380 typedef typename _TransT::_CharT _CharT;
383 _AnyMatcher(
const _TraitsT& __traits)
384 : _M_translator(__traits)
388 operator()(_CharT __ch)
const 389 {
return _M_apply(__ch,
typename is_same<_CharT, char>::type()); }
394 auto __c = _M_translator._M_translate(__ch);
395 auto __n = _M_translator._M_translate(
'\n');
396 auto __r = _M_translator._M_translate(
'\r');
397 return __c != __n && __c != __r;
403 auto __c = _M_translator._M_translate(__ch);
404 auto __n = _M_translator._M_translate(
'\n');
405 auto __r = _M_translator._M_translate(
'\r');
406 auto __u2028 = _M_translator._M_translate(u
'\u2028');
407 auto __u2029 = _M_translator._M_translate(u
'\u2029');
408 return __c != __n && __c != __r && __c != __u2028 && __c != __u2029;
411 _TransT _M_translator;
414 template<
typename _TraitsT,
bool __icase,
bool __collate>
417 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
418 typedef typename _TransT::_CharT _CharT;
420 _CharMatcher(_CharT __ch,
const _TraitsT& __traits)
421 : _M_translator(__traits), _M_ch(_M_translator._M_translate(__ch))
425 operator()(_CharT __ch)
const 426 {
return _M_ch == _M_translator._M_translate(__ch); }
428 _TransT _M_translator;
433 template<
typename _TraitsT,
bool __icase,
bool __collate>
437 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
438 typedef typename _TransT::_CharT _CharT;
439 typedef typename _TransT::_StrTransT _StrTransT;
440 typedef typename _TraitsT::string_type _StringT;
441 typedef typename _TraitsT::char_class_type _CharClassT;
445 const _TraitsT& __traits)
446 : _M_class_set(0), _M_translator(__traits), _M_traits(__traits),
447 _M_is_non_matching(__is_non_matching)
451 operator()(_CharT __ch)
const 453 _GLIBCXX_DEBUG_ASSERT(_M_is_ready);
454 return _M_apply(__ch, _UseCache());
458 _M_add_char(_CharT __c)
460 _M_char_set.push_back(_M_translator._M_translate(__c));
461 _GLIBCXX_DEBUG_ONLY(_M_is_ready =
false);
465 _M_add_collate_element(
const _StringT& __s)
467 auto __st = _M_traits.lookup_collatename(__s.data(),
468 __s.data() + __s.size());
471 "Invalid collate element.");
472 _M_char_set.push_back(_M_translator._M_translate(__st[0]));
473 _GLIBCXX_DEBUG_ONLY(_M_is_ready =
false);
478 _M_add_equivalence_class(
const _StringT& __s)
480 auto __st = _M_traits.lookup_collatename(__s.data(),
481 __s.data() + __s.size());
484 "Invalid equivalence class.");
485 __st = _M_traits.transform_primary(__st.data(),
486 __st.data() + __st.size());
487 _M_equiv_set.push_back(__st);
488 _GLIBCXX_DEBUG_ONLY(_M_is_ready =
false);
493 _M_add_character_class(
const _StringT& __s,
bool __neg)
495 auto __mask = _M_traits.lookup_classname(__s.data(),
496 __s.data() + __s.size(),
500 "Invalid character class.");
502 _M_class_set |= __mask;
504 _M_neg_class_set.push_back(__mask);
505 _GLIBCXX_DEBUG_ONLY(_M_is_ready =
false);
509 _M_make_range(_CharT __l, _CharT __r)
513 "Invalid range in bracket expression.");
514 _M_range_set.push_back(
make_pair(_M_translator._M_transform(__l),
515 _M_translator._M_transform(__r)));
516 _GLIBCXX_DEBUG_ONLY(_M_is_ready =
false);
522 std::sort(_M_char_set.begin(), _M_char_set.end());
523 auto __end =
std::unique(_M_char_set.begin(), _M_char_set.end());
524 _M_char_set.erase(__end, _M_char_set.end());
525 _M_make_cache(_UseCache());
526 _GLIBCXX_DEBUG_ONLY(_M_is_ready =
true);
531 typedef typename std::is_same<_CharT, char>::type _UseCache;
533 static constexpr
size_t 536 return 1ul << (
sizeof(_CharT) * __CHAR_BIT__ *
int(_UseCache::value));
540 typedef typename std::conditional<_UseCache::value,
542 _Dummy>::type _CacheT;
543 typedef typename std::make_unsigned<_CharT>::type _UnsignedCharT;
550 {
return _M_cache[
static_cast<_UnsignedCharT
>(__ch)]; }
555 for (
unsigned __i = 0; __i < _M_cache.size(); __i++)
556 _M_cache[__i] = _M_apply(static_cast<_CharT>(__i),
false_type());
568 _CharClassT _M_class_set;
569 _TransT _M_translator;
570 const _TraitsT& _M_traits;
571 bool _M_is_non_matching;
573 #ifdef _GLIBCXX_DEBUG 574 bool _M_is_ready =
false;
579 _GLIBCXX_END_NAMESPACE_VERSION
Managing sequences of characters and character-like objects.
Matches a character range (bracket expression)
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.
constexpr error_type error_range(_S_error_range)
constexpr _Tp * __addressof(_Tp &__r) noexcept
Same as C++11 std::addressof.
size_type size() const noexcept
Returns the number of characters in the string, not including any null-termination.
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 sort(_RandomAccessIterator __first, _RandomAccessIterator __last, _Compare __comp)
Sort the elements of a sequence using a predicate for comparison.
Describes a sequence of one or more _State, its current start and end(s). This structure contains fra...
A smart pointer with reference-counted copy semantics.
ISO C++ entities toplevel namespace is std.
A standard container which offers fixed time access to individual elements in any order...
Builds an NFA from an input iterator range.
Struct holding two objects of arbitrary type.
Scans an input range for regex tokens.
integral_constant< bool, false > false_type
The type used as a compile-time boolean with false value.
void pop()
Removes first element.
char_type tolower(char_type __c) const
Convert to lowercase.
syntax_option_type
This is a bitmask type indicating how to interpret the regex.
The bitset class represents a fixed-size sequence of bits.(Note that bitset does not meet the formal ...
const _CharT * data() const noexcept
Return const pointer to contents.
Describes aspects of a regular expression.
Primary class template ctype facet.This template class defines classification and conversion function...