111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// class template regex -*- C++ -*-
211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Copyright (C) 2010-2014 Free Software Foundation, Inc.
411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//
511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is part of the GNU ISO C++ Library.  This library is free
611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// software; you can redistribute it and/or modify it under the
711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// terms of the GNU General Public License as published by the
811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Free Software Foundation; either version 3, or (at your option)
911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// any later version.
1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This library is distributed in the hope that it will be useful,
1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// but WITHOUT ANY WARRANTY; without even the implied warranty of
1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// GNU General Public License for more details.
1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Under Section 7 of GPL version 3, you are granted additional
1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// permissions described in the GCC Runtime Library Exception, version
1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 3.1, as published by the Free Software Foundation.
1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// You should have received a copy of the GNU General Public License and
2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// a copy of the GCC Runtime Library Exception along with this program;
2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <http://www.gnu.org/licenses/>.
2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert/**
2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  @file bits/regex_compiler.h
2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  This is an internal header file, included by other library headers.
2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert *  Do not attempt to use it directly. @headername{regex}
2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert */
3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace std _GLIBCXX_VISIBILITY(default)
3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albertnamespace __detail
3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{
3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_BEGIN_NAMESPACE_VERSION
3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @addtogroup regex-detail
3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @{
4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename, bool, bool>
4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct _BracketMatcher;
4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /**
4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * @brief Builds an NFA from an input iterator interval.
4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   *
4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   * The %_TraitsT type should fulfill requirements [28.3].
4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert   */
5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _TraitsT>
5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class _Compiler
5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _TraitsT::char_type        _CharT;
5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef const _CharT*                       _IterT;
5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _NFA<_TraitsT>              	  _RegexT;
5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef regex_constants::syntax_option_type _FlagT;
5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _Compiler(_IterT __b, _IterT __e,
6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		const _TraitsT& __traits, _FlagT __flags);
6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::shared_ptr<_RegexT>
6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_get_nfa()
6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return make_shared<_RegexT>(std::move(_M_nfa)); }
6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _Scanner<_CharT>               _ScannerT;
6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _TraitsT::string_type _StringT;
6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _ScannerT::_TokenT    _TokenT;
7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _StateSeq<_TraitsT>            _StateSeqT;
7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef std::stack<_StateSeqT>         _StackT;
7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef std::ctype<_CharT>             _CtypeT;
7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // accepts a specific token or returns false.
7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_match_token(_TokenT __token);
7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_disjunction();
8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_alternative();
8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_term();
8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_assertion();
8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_quantifier();
9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_atom();
9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
9711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_bracket_expression();
9811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
9911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<bool __icase, bool __collate>
10011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
10111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_insert_any_matcher_ecma();
10211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<bool __icase, bool __collate>
10411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
10511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_insert_any_matcher_posix();
10611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
10711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<bool __icase, bool __collate>
10811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
10911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_insert_char_matcher();
11011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<bool __icase, bool __collate>
11211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
11311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_insert_character_class_matcher();
11411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<bool __icase, bool __collate>
11611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
11711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_insert_bracket_matcher(bool __neg);
11811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
11911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      template<bool __icase, bool __collate>
12011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	void
12111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_expression_term(_BracketMatcher<_TraitsT, __icase, __collate>&
12211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert			   __matcher);
12311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      int
12511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_cur_int_value(int __radix);
12611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
12711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
12811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_try_char();
12911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _StateSeqT
13111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_pop()
13211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
13311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto ret = _M_stack.top();
13411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_stack.pop();
13511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return ret;
13611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
13711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
13811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _FlagT          _M_flags;
13911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _TraitsT& _M_traits;
14011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _CtypeT&  _M_ctype;
14111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _ScannerT       _M_scanner;
14211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RegexT         _M_nfa;
14311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _StringT        _M_value;
14411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _StackT         _M_stack;
14511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
14611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
14711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _TraitsT>
14811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    inline std::shared_ptr<_NFA<_TraitsT>>
14911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    __compile_nfa(const typename _TraitsT::char_type* __first,
15011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		  const typename _TraitsT::char_type* __last,
15111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		  const _TraitsT& __traits,
15211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		  regex_constants::syntax_option_type __flags)
15311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
15411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      using _Cmplr = _Compiler<_TraitsT>;
15511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      return _Cmplr(__first, __last, __traits, __flags)._M_get_nfa();
15611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    }
15711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
15811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  // [28.13.14]
15911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _TraitsT, bool __icase, bool __collate>
16011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class _RegexTranslator
16111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
16211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
16311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _TraitsT::char_type	      _CharT;
16411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _TraitsT::string_type	      _StringT;
16511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename std::conditional<__collate,
16611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					_StringT,
16711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					_CharT>::type _StrTransT;
16811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
16911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
17011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RegexTranslator(const _TraitsT& __traits)
17111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_traits(__traits)
17211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
17311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
17411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _CharT
17511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_translate(_CharT __ch) const
17611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
17711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (__icase)
17811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return _M_traits.translate_nocase(__ch);
17911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	else if (__collate)
18011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return _M_traits.translate(__ch);
18111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	else
18211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  return __ch;
18311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
18411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
18511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _StrTransT
18611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_transform(_CharT __ch) const
18711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
18811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_transform_impl(__ch, typename integral_constant<bool,
18911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				 __collate>::type());
19011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
19111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
19311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _StrTransT
19411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_transform_impl(_CharT __ch, false_type) const
19511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __ch; }
19611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
19711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _StrTransT
19811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_transform_impl(_CharT __ch, true_type) const
19911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
20011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_StrTransT __str = _StrTransT(1, _M_translate(__ch));
20111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_traits.transform(__str.begin(), __str.end());
20211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
20311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _TraitsT& _M_traits;
20511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
20611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
20711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _TraitsT>
20811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    class _RegexTranslator<_TraitsT, false, false>
20911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
21011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
21111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _TraitsT::char_type _CharT;
21211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _CharT                       _StrTransT;
21311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
21511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _RegexTranslator(const _TraitsT& __traits)
21611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
21711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
21811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _CharT
21911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_translate(_CharT __ch) const
22011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __ch; }
22111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _StrTransT
22311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_transform(_CharT __ch) const
22411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return __ch; }
22511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
22611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
22711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _TraitsT, bool __is_ecma, bool __icase, bool __collate>
22811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct _AnyMatcher;
22911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _TraitsT, bool __icase, bool __collate>
23111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct _AnyMatcher<_TraitsT, false, __icase, __collate>
23211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
23311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
23411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _TransT::_CharT                       _CharT;
23511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
23611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
23711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _AnyMatcher(const _TraitsT& __traits)
23811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_translator(__traits)
23911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
24011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
24211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_CharT __ch) const
24311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
24411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	static auto __nul = _M_translator._M_translate('\0');
24511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_translator._M_translate(__ch) != __nul;
24611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
24711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
24811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _TransT _M_translator;
24911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
25011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _TraitsT, bool __icase, bool __collate>
25211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct _AnyMatcher<_TraitsT, true, __icase, __collate>
25311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
25411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
25511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _TransT::_CharT                       _CharT;
25611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
25711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      explicit
25811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _AnyMatcher(const _TraitsT& __traits)
25911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_translator(__traits)
26011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
26111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
26311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_CharT __ch) const
26411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_apply(__ch, typename is_same<_CharT, char>::type()); }
26511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
26611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
26711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_apply(_CharT __ch, true_type) const
26811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
26911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto __c = _M_translator._M_translate(__ch);
27011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto __n = _M_translator._M_translate('\n');
27111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto __r = _M_translator._M_translate('\r');
27211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return __c != __n && __c != __r;
27311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
27411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
27511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
27611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_apply(_CharT __ch, false_type) const
27711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
27811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto __c = _M_translator._M_translate(__ch);
27911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto __n = _M_translator._M_translate('\n');
28011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto __r = _M_translator._M_translate('\r');
28111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto __u2028 = _M_translator._M_translate(u'\u2028');
28211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto __u2029 = _M_translator._M_translate(u'\u2029');
28311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return __c != __n && __c != __r && __c != __u2028 && __c != __u2029;
28411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
28511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _TransT _M_translator;
28711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
28811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
28911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _TraitsT, bool __icase, bool __collate>
29011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct _CharMatcher
29111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
29211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
29311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _TransT::_CharT                       _CharT;
29411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _CharMatcher(_CharT __ch, const _TraitsT& __traits)
29611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_translator(__traits), _M_ch(_M_translator._M_translate(__ch))
29711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
29811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
29911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
30011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_CharT __ch) const
30111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_ch == _M_translator._M_translate(__ch); }
30211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _TransT _M_translator;
30411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _CharT  _M_ch;
30511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
30611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
30711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  /// Matches a character range (bracket expression)
30811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert  template<typename _TraitsT, bool __icase, bool __collate>
30911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    struct _BracketMatcher
31011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    {
31111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
31211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef _RegexTranslator<_TraitsT, __icase, __collate> _TransT;
31311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _TransT::_CharT                       _CharT;
31411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _TransT::_StrTransT                   _StrTransT;
31511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _TraitsT::string_type                 _StringT;
31611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename _TraitsT::char_class_type             _CharClassT;
31711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
31811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    public:
31911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _BracketMatcher(bool __is_non_matching,
32011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert		      const _TraitsT& __traits)
32111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      : _M_class_set(0), _M_translator(__traits), _M_traits(__traits),
32211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_is_non_matching(__is_non_matching)
32311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG
32411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      , _M_is_ready(false)
32511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
32611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
32711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
32811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
32911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      operator()(_CharT __ch) const
33011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
33111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_GLIBCXX_DEBUG_ASSERT(_M_is_ready);
33211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	return _M_apply(__ch, _IsChar());
33311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
33411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
33511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
33611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_add_char(_CharT __c)
33711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
33811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_char_set.push_back(_M_translator._M_translate(__c));
33911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG
34011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_is_ready = false;
34111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
34211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
34311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
34411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
34511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_add_collating_element(const _StringT& __s)
34611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
34711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto __st = _M_traits.lookup_collatename(__s.data(),
34811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert						 __s.data() + __s.size());
34911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (__st.empty())
35011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_regex_error(regex_constants::error_collate);
35111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_char_set.push_back(_M_translator._M_translate(__st[0]));
35211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG
35311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_is_ready = false;
35411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
35511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
35611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
35711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
35811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_add_equivalence_class(const _StringT& __s)
35911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
36011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto __st = _M_traits.lookup_collatename(__s.data(),
36111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert						 __s.data() + __s.size());
36211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (__st.empty())
36311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_regex_error(regex_constants::error_collate);
36411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	__st = _M_traits.transform_primary(__st.data(),
36511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					   __st.data() + __st.size());
36611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_equiv_set.push_back(__st);
36711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG
36811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_is_ready = false;
36911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
37011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
37111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
37211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      // __neg should be true for \D, \S and \W only.
37311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
37411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_add_character_class(const _StringT& __s, bool __neg)
37511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
37611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	auto __mask = _M_traits.lookup_classname(__s.data(),
37711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert						 __s.data() + __s.size(),
37811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert						 __icase);
37911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (__mask == 0)
38011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  __throw_regex_error(regex_constants::error_ctype);
38111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	if (!__neg)
38211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_class_set |= __mask;
38311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	else
38411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_neg_class_set.push_back(__mask);
38511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG
38611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_is_ready = false;
38711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
38811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
38911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
39011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
39111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_make_range(_CharT __l, _CharT __r)
39211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
39311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_range_set.push_back(make_pair(_M_translator._M_transform(__l),
39411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert					 _M_translator._M_transform(__r)));
39511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG
39611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_is_ready = false;
39711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
39811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
39911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
40111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_ready()
40211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
40311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_make_cache(_IsChar());
40411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG
40511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	_M_is_ready = true;
40611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
40711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
40811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
40911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
41011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename is_same<_CharT, char>::type _IsChar;
41111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      struct _Dummy { };
41211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename conditional<_IsChar::value,
41311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				   std::bitset<1 << (8 * sizeof(_CharT))>,
41411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert				   _Dummy>::type _CacheT;
41511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      typedef typename make_unsigned<_CharT>::type _UnsignedCharT;
41611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
41711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
41811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
41911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_apply(_CharT __ch, false_type) const;
42011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool
42211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_apply(_CharT __ch, true_type) const
42311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { return _M_cache[static_cast<_UnsignedCharT>(__ch)]; }
42411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
42511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
42611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_make_cache(true_type)
42711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      {
42811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	for (int __i = 0; __i < _M_cache.size(); __i++)
42911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	  _M_cache[static_cast<_UnsignedCharT>(__i)] =
43011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert	    _M_apply(__i, false_type());
43111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      }
43211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      void
43411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _M_make_cache(false_type)
43511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      { }
43611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
43711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    private:
43811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _CacheT                                   _M_cache;
43911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::vector<_CharT>                       _M_char_set;
44011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::vector<_StringT>                     _M_equiv_set;
44111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::vector<pair<_StrTransT, _StrTransT>> _M_range_set;
44211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      std::vector<_CharClassT>                  _M_neg_class_set;
44311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _CharClassT                               _M_class_set;
44411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      _TransT                                   _M_translator;
44511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      const _TraitsT&                           _M_traits;
44611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool                                      _M_is_non_matching;
44711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#ifdef _GLIBCXX_DEBUG
44811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert      bool                                      _M_is_ready;
44911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#endif
45011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert    };
45111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert //@} regex-detail
45311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert_GLIBCXX_END_NAMESPACE_VERSION
45411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace __detail
45511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} // namespace std
45611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert
45711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <bits/regex_compiler.tcc>
458