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 _TraitsT& __traits, _FlagT __flags);
64 {
return make_shared<_RegexT>(
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 const _TraitsT& _M_traits;
143 const _CtypeT& _M_ctype;
144 _ScannerT _M_scanner;
150 template<
typename _TraitsT>
152 __compile_nfa(
const typename _TraitsT::char_type* __first,
153 const typename _TraitsT::char_type* __last,
154 const _TraitsT& __traits,
158 return _Cmplr(__first, __last, __traits, __flags)._M_get_nfa();
162 template<
typename _TraitsT,
bool __icase,
bool __collate>
163 class _RegexTranslator
166 typedef typename _TraitsT::char_type _CharT;
167 typedef typename _TraitsT::string_type _StringT;
168 typedef typename std::conditional<__collate,
170 _CharT>::type _StrTransT;
173 _RegexTranslator(
const _TraitsT& __traits)
174 : _M_traits(__traits)
178 _M_translate(_CharT __ch)
const 181 return _M_traits.translate_nocase(__ch);
183 return _M_traits.translate(__ch);
189 _M_transform(_CharT __ch)
const 191 return _M_transform_impl(__ch,
typename integral_constant<
bool,
197 _M_transform_impl(_CharT __ch, false_type)
const 201 _M_transform_impl(_CharT __ch, true_type)
const 203 _StrTransT __str = _StrTransT(1, _M_translate(__ch));
204 return _M_traits.transform(__str.begin(), __str.end());
207 const _TraitsT& _M_traits;
210 template<
typename _TraitsT>
211 class _RegexTranslator<_TraitsT, false, false>
214 typedef typename _TraitsT::char_type _CharT;
215 typedef _CharT _StrTransT;
218 _RegexTranslator(
const _TraitsT& __traits)
222 _M_translate(_CharT __ch)
const 226 _M_transform(_CharT __ch)
const 230 template<
typename _TraitsT,
bool __is_ecma,
bool __icase,
bool __collate>
233 template<
typename _TraitsT,
bool __icase,
bool __collate>
234 struct _AnyMatcher<_TraitsT, false, __icase, __collate>
236 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
237 typedef typename _TransT::_CharT _CharT;
240 _AnyMatcher(
const _TraitsT& __traits)
241 : _M_translator(__traits)
245 operator()(_CharT __ch)
const 247 static auto __nul = _M_translator._M_translate(
'\0');
248 return _M_translator._M_translate(__ch) != __nul;
251 _TransT _M_translator;
254 template<
typename _TraitsT,
bool __icase,
bool __collate>
255 struct _AnyMatcher<_TraitsT, true, __icase, __collate>
257 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
258 typedef typename _TransT::_CharT _CharT;
261 _AnyMatcher(
const _TraitsT& __traits)
262 : _M_translator(__traits)
266 operator()(_CharT __ch)
const 267 {
return _M_apply(__ch,
typename is_same<_CharT, char>::type()); }
270 _M_apply(_CharT __ch, true_type)
const 272 auto __c = _M_translator._M_translate(__ch);
273 auto __n = _M_translator._M_translate(
'\n');
274 auto __r = _M_translator._M_translate(
'\r');
275 return __c != __n && __c != __r;
279 _M_apply(_CharT __ch, false_type)
const 281 auto __c = _M_translator._M_translate(__ch);
282 auto __n = _M_translator._M_translate(
'\n');
283 auto __r = _M_translator._M_translate(
'\r');
284 auto __u2028 = _M_translator._M_translate(u
'\u2028');
285 auto __u2029 = _M_translator._M_translate(u
'\u2029');
286 return __c != __n && __c != __r && __c != __u2028 && __c != __u2029;
289 _TransT _M_translator;
292 template<
typename _TraitsT,
bool __icase,
bool __collate>
295 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
296 typedef typename _TransT::_CharT _CharT;
298 _CharMatcher(_CharT __ch,
const _TraitsT& __traits)
299 : _M_translator(__traits), _M_ch(_M_translator._M_translate(__ch))
303 operator()(_CharT __ch)
const 304 {
return _M_ch == _M_translator._M_translate(__ch); }
306 _TransT _M_translator;
311 template<
typename _TraitsT,
bool __icase,
bool __collate>
315 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
316 typedef typename _TransT::_CharT _CharT;
317 typedef typename _TransT::_StrTransT _StrTransT;
318 typedef typename _TraitsT::string_type _StringT;
319 typedef typename _TraitsT::char_class_type _CharClassT;
323 const _TraitsT& __traits)
324 : _M_class_set(0), _M_translator(__traits), _M_traits(__traits),
325 _M_is_non_matching(__is_non_matching)
326 #ifdef _GLIBCXX_DEBUG 332 operator()(_CharT __ch)
const 334 _GLIBCXX_DEBUG_ASSERT(_M_is_ready);
335 return _M_apply(__ch, _IsChar());
339 _M_add_char(_CharT __c)
341 _M_char_set.push_back(_M_translator._M_translate(__c));
342 #ifdef _GLIBCXX_DEBUG 348 _M_add_collate_element(
const _StringT& __s)
350 auto __st = _M_traits.lookup_collatename(__s.data(),
351 __s.data() + __s.size());
354 _M_char_set.push_back(_M_translator._M_translate(__st[0]));
355 #ifdef _GLIBCXX_DEBUG 362 _M_add_equivalence_class(
const _StringT& __s)
364 auto __st = _M_traits.lookup_collatename(__s.data(),
365 __s.data() + __s.size());
368 __st = _M_traits.transform_primary(__st.data(),
369 __st.data() + __st.size());
370 _M_equiv_set.push_back(__st);
371 #ifdef _GLIBCXX_DEBUG 378 _M_add_character_class(
const _StringT& __s,
bool __neg)
380 auto __mask = _M_traits.lookup_classname(__s.data(),
381 __s.data() + __s.size(),
386 _M_class_set |= __mask;
388 _M_neg_class_set.push_back(__mask);
389 #ifdef _GLIBCXX_DEBUG 395 _M_make_range(_CharT __l, _CharT __r)
399 _M_range_set.push_back(
make_pair(_M_translator._M_transform(__l),
400 _M_translator._M_transform(__r)));
401 #ifdef _GLIBCXX_DEBUG 409 _M_make_cache(_IsChar());
410 #ifdef _GLIBCXX_DEBUG 416 typedef typename is_same<_CharT, char>::type _IsChar;
418 typedef typename conditional<_IsChar::value,
419 std::bitset<1 << (8 * sizeof(_CharT))>,
420 _Dummy>::type _CacheT;
421 typedef typename make_unsigned<_CharT>::type _UnsignedCharT;
425 _M_apply(_CharT __ch, false_type)
const;
428 _M_apply(_CharT __ch, true_type)
const 429 {
return _M_cache[
static_cast<_UnsignedCharT
>(__ch)]; }
432 _M_make_cache(true_type)
434 for (
int __i = 0; __i < _M_cache.size(); __i++)
435 _M_cache[static_cast<_UnsignedCharT>(__i)] =
436 _M_apply(__i, false_type());
440 _M_make_cache(false_type)
449 _CharClassT _M_class_set;
450 _TransT _M_translator;
451 const _TraitsT& _M_traits;
452 bool _M_is_non_matching;
453 #ifdef _GLIBCXX_DEBUG 459 _GLIBCXX_END_NAMESPACE_VERSION
463 #include <bits/regex_compiler.tcc> Primary class template ctype facet.This template class defines classification and conversion function...
Describes a sequence of one or more _State, its current start and end(s). This structure contains fra...
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
constexpr error_type error_range(_S_error_range)
constexpr error_type error_ctype(_S_error_ctype)
Scans an input range for regex tokens.
syntax_option_type
This is a bitmask type indicating how to interpret the regex.
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.
Builds an NFA from an input iterator interval.
ISO C++ entities toplevel namespace is std.
constexpr error_type error_collate(_S_error_collate)
Matches a character range (bracket expression)
Struct holding two objects of arbitrary type.
void pop()
Removes first element.
A smart pointer with reference-counted copy semantics.