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);
119 template<
bool __icase,
bool __collate>
126 _M_cur_int_value(
int __radix);
134 auto ret = _M_stack.
top();
140 const _TraitsT& _M_traits;
141 const _CtypeT& _M_ctype;
142 _ScannerT _M_scanner;
148 template<
typename _TraitsT>
150 __compile_nfa(
const typename _TraitsT::char_type* __first,
151 const typename _TraitsT::char_type* __last,
152 const _TraitsT& __traits,
156 return _Cmplr(__first, __last, __traits, __flags)._M_get_nfa();
160 template<
typename _TraitsT,
bool __icase,
bool __collate>
161 class _RegexTranslator
164 typedef typename _TraitsT::char_type _CharT;
165 typedef typename _TraitsT::string_type _StringT;
166 typedef typename std::conditional<__collate,
168 _CharT>::type _StrTransT;
171 _RegexTranslator(
const _TraitsT& __traits)
172 : _M_traits(__traits)
176 _M_translate(_CharT __ch)
const
179 return _M_traits.translate_nocase(__ch);
181 return _M_traits.translate(__ch);
187 _M_transform(_CharT __ch)
const
189 return _M_transform_impl(__ch,
typename integral_constant<
bool,
195 _M_transform_impl(_CharT __ch, false_type)
const
199 _M_transform_impl(_CharT __ch, true_type)
const
201 _StrTransT __str = _StrTransT(1, _M_translate(__ch));
202 return _M_traits.transform(__str.begin(), __str.end());
205 const _TraitsT& _M_traits;
208 template<
typename _TraitsT>
209 class _RegexTranslator<_TraitsT, false, false>
212 typedef typename _TraitsT::char_type _CharT;
213 typedef _CharT _StrTransT;
216 _RegexTranslator(
const _TraitsT& __traits)
220 _M_translate(_CharT __ch)
const
224 _M_transform(_CharT __ch)
const
228 template<
typename _TraitsT,
bool __is_ecma,
bool __icase,
bool __collate>
231 template<
typename _TraitsT,
bool __icase,
bool __collate>
232 struct _AnyMatcher<_TraitsT, false, __icase, __collate>
234 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
235 typedef typename _TransT::_CharT _CharT;
238 _AnyMatcher(
const _TraitsT& __traits)
239 : _M_translator(__traits)
243 operator()(_CharT __ch)
const
245 static auto __nul = _M_translator._M_translate(
'\0');
246 return _M_translator._M_translate(__ch) != __nul;
249 _TransT _M_translator;
252 template<
typename _TraitsT,
bool __icase,
bool __collate>
253 struct _AnyMatcher<_TraitsT, true, __icase, __collate>
255 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
256 typedef typename _TransT::_CharT _CharT;
259 _AnyMatcher(
const _TraitsT& __traits)
260 : _M_translator(__traits)
264 operator()(_CharT __ch)
const
265 {
return _M_apply(__ch,
typename is_same<_CharT, char>::type()); }
268 _M_apply(_CharT __ch, true_type)
const
270 auto __c = _M_translator._M_translate(__ch);
271 auto __n = _M_translator._M_translate(
'\n');
272 auto __r = _M_translator._M_translate(
'\r');
273 return __c != __n && __c != __r;
277 _M_apply(_CharT __ch, false_type)
const
279 auto __c = _M_translator._M_translate(__ch);
280 auto __n = _M_translator._M_translate(
'\n');
281 auto __r = _M_translator._M_translate(
'\r');
282 auto __u2028 = _M_translator._M_translate(u
'\u2028');
283 auto __u2029 = _M_translator._M_translate(u
'\u2029');
284 return __c != __n && __c != __r && __c != __u2028 && __c != __u2029;
287 _TransT _M_translator;
290 template<
typename _TraitsT,
bool __icase,
bool __collate>
293 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
294 typedef typename _TransT::_CharT _CharT;
296 _CharMatcher(_CharT __ch,
const _TraitsT& __traits)
297 : _M_translator(__traits), _M_ch(_M_translator._M_translate(__ch))
301 operator()(_CharT __ch)
const
302 {
return _M_ch == _M_translator._M_translate(__ch); }
304 _TransT _M_translator;
309 template<
typename _TraitsT,
bool __icase,
bool __collate>
310 struct _BracketMatcher
313 typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
314 typedef typename _TransT::_CharT _CharT;
315 typedef typename _TransT::_StrTransT _StrTransT;
316 typedef typename _TraitsT::string_type _StringT;
317 typedef typename _TraitsT::char_class_type _CharClassT;
320 _BracketMatcher(
bool __is_non_matching,
321 const _TraitsT& __traits)
322 : _M_class_set(0), _M_translator(__traits), _M_traits(__traits),
323 _M_is_non_matching(__is_non_matching)
324 #ifdef _GLIBCXX_DEBUG
330 operator()(_CharT __ch)
const
332 _GLIBCXX_DEBUG_ASSERT(_M_is_ready);
333 return _M_apply(__ch, _IsChar());
337 _M_add_char(_CharT __c)
339 _M_char_set.
push_back(_M_translator._M_translate(__c));
340 #ifdef _GLIBCXX_DEBUG
346 _M_add_collating_element(
const _StringT& __s)
348 auto __st = _M_traits.lookup_collatename(__s.data(),
349 __s.data() + __s.size());
352 _M_char_set.
push_back(_M_translator._M_translate(__st[0]));
353 #ifdef _GLIBCXX_DEBUG
359 _M_add_equivalence_class(
const _StringT& __s)
361 auto __st = _M_traits.lookup_collatename(__s.data(),
362 __s.data() + __s.size());
365 __st = _M_traits.transform_primary(__st.data(),
366 __st.data() + __st.size());
368 #ifdef _GLIBCXX_DEBUG
375 _M_add_character_class(
const _StringT& __s,
bool __neg)
377 auto __mask = _M_traits.lookup_classname(__s.data(),
378 __s.data() + __s.size(),
383 _M_class_set |= __mask;
386 #ifdef _GLIBCXX_DEBUG
392 _M_make_range(_CharT __l, _CharT __r)
396 _M_range_set.push_back(
make_pair(_M_translator._M_transform(__l),
397 _M_translator._M_transform(__r)));
398 #ifdef _GLIBCXX_DEBUG
406 _M_make_cache(_IsChar());
407 #ifdef _GLIBCXX_DEBUG
413 typedef typename is_same<_CharT, char>::type _IsChar;
415 typedef typename conditional<_IsChar::value,
416 std::bitset<1 << (8 * sizeof(_CharT))>,
417 _Dummy>::type _CacheT;
418 typedef typename make_unsigned<_CharT>::type _UnsignedCharT;
422 _M_apply(_CharT __ch, false_type)
const;
425 _M_apply(_CharT __ch, true_type)
const
426 {
return _M_cache[
static_cast<_UnsignedCharT
>(__ch)]; }
429 _M_make_cache(true_type)
431 for (
int __i = 0; __i < _M_cache.size(); __i++)
432 _M_cache[static_cast<_UnsignedCharT>(__i)] =
433 _M_apply(__i, false_type());
437 _M_make_cache(false_type)
446 _CharClassT _M_class_set;
447 _TransT _M_translator;
448 const _TraitsT& _M_traits;
449 bool _M_is_non_matching;
450 #ifdef _GLIBCXX_DEBUG
456 _GLIBCXX_END_NAMESPACE_VERSION
460 #include <bits/regex_compiler.tcc>
syntax_option_type
This is a bitmask type indicating how to interpret the regex.
constexpr error_type error_ctype(_S_error_ctype)
Matches a character range (bracket expression)
A smart pointer with reference-counted copy semantics.
Primary class template ctype facet.This template class defines classification and conversion function...
Scans an input range for regex tokens.
constexpr error_type error_collate(_S_error_collate)
Describes a sequence of one or more _State, its current start and end(s). This structure contains fra...
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.
Struct holding two objects of arbitrary type.
constexpr error_type error_range(_S_error_range)
constexpr std::remove_reference< _Tp >::type && move(_Tp &&__t) noexcept
Convert a value to an rvalue.
Builds an NFA from an input iterator interval.
void push_back(const value_type &__x)
Add data to the end of the vector.
void pop()
Removes first element.
ISO C++ entities toplevel namespace is std.