xref: /aosp_15_r20/external/libcxx/include/regex (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
1*58b9f456SAndroid Build Coastguard Worker// -*- C++ -*-
2*58b9f456SAndroid Build Coastguard Worker//===--------------------------- regex ------------------------------------===//
3*58b9f456SAndroid Build Coastguard Worker//
4*58b9f456SAndroid Build Coastguard Worker//                     The LLVM Compiler Infrastructure
5*58b9f456SAndroid Build Coastguard Worker//
6*58b9f456SAndroid Build Coastguard Worker// This file is dual licensed under the MIT and the University of Illinois Open
7*58b9f456SAndroid Build Coastguard Worker// Source Licenses. See LICENSE.TXT for details.
8*58b9f456SAndroid Build Coastguard Worker//
9*58b9f456SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===//
10*58b9f456SAndroid Build Coastguard Worker
11*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_REGEX
12*58b9f456SAndroid Build Coastguard Worker#define _LIBCPP_REGEX
13*58b9f456SAndroid Build Coastguard Worker
14*58b9f456SAndroid Build Coastguard Worker/*
15*58b9f456SAndroid Build Coastguard Worker    regex synopsis
16*58b9f456SAndroid Build Coastguard Worker
17*58b9f456SAndroid Build Coastguard Worker#include <initializer_list>
18*58b9f456SAndroid Build Coastguard Worker
19*58b9f456SAndroid Build Coastguard Workernamespace std
20*58b9f456SAndroid Build Coastguard Worker{
21*58b9f456SAndroid Build Coastguard Worker
22*58b9f456SAndroid Build Coastguard Workernamespace regex_constants
23*58b9f456SAndroid Build Coastguard Worker{
24*58b9f456SAndroid Build Coastguard Worker
25*58b9f456SAndroid Build Coastguard Workeremum syntax_option_type
26*58b9f456SAndroid Build Coastguard Worker{
27*58b9f456SAndroid Build Coastguard Worker    icase      = unspecified,
28*58b9f456SAndroid Build Coastguard Worker    nosubs     = unspecified,
29*58b9f456SAndroid Build Coastguard Worker    optimize   = unspecified,
30*58b9f456SAndroid Build Coastguard Worker    collate    = unspecified,
31*58b9f456SAndroid Build Coastguard Worker    ECMAScript = unspecified,
32*58b9f456SAndroid Build Coastguard Worker    basic      = unspecified,
33*58b9f456SAndroid Build Coastguard Worker    extended   = unspecified,
34*58b9f456SAndroid Build Coastguard Worker    awk        = unspecified,
35*58b9f456SAndroid Build Coastguard Worker    grep       = unspecified,
36*58b9f456SAndroid Build Coastguard Worker    egrep      = unspecified
37*58b9f456SAndroid Build Coastguard Worker};
38*58b9f456SAndroid Build Coastguard Worker
39*58b9f456SAndroid Build Coastguard Workerconstexpr syntax_option_type operator~(syntax_option_type f);
40*58b9f456SAndroid Build Coastguard Workerconstexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs);
41*58b9f456SAndroid Build Coastguard Workerconstexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs);
42*58b9f456SAndroid Build Coastguard Worker
43*58b9f456SAndroid Build Coastguard Workerenum match_flag_type
44*58b9f456SAndroid Build Coastguard Worker{
45*58b9f456SAndroid Build Coastguard Worker    match_default     = 0,
46*58b9f456SAndroid Build Coastguard Worker    match_not_bol     = unspecified,
47*58b9f456SAndroid Build Coastguard Worker    match_not_eol     = unspecified,
48*58b9f456SAndroid Build Coastguard Worker    match_not_bow     = unspecified,
49*58b9f456SAndroid Build Coastguard Worker    match_not_eow     = unspecified,
50*58b9f456SAndroid Build Coastguard Worker    match_any         = unspecified,
51*58b9f456SAndroid Build Coastguard Worker    match_not_null    = unspecified,
52*58b9f456SAndroid Build Coastguard Worker    match_continuous  = unspecified,
53*58b9f456SAndroid Build Coastguard Worker    match_prev_avail  = unspecified,
54*58b9f456SAndroid Build Coastguard Worker    format_default    = 0,
55*58b9f456SAndroid Build Coastguard Worker    format_sed        = unspecified,
56*58b9f456SAndroid Build Coastguard Worker    format_no_copy    = unspecified,
57*58b9f456SAndroid Build Coastguard Worker    format_first_only = unspecified
58*58b9f456SAndroid Build Coastguard Worker};
59*58b9f456SAndroid Build Coastguard Worker
60*58b9f456SAndroid Build Coastguard Workerconstexpr match_flag_type operator~(match_flag_type f);
61*58b9f456SAndroid Build Coastguard Workerconstexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs);
62*58b9f456SAndroid Build Coastguard Workerconstexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs);
63*58b9f456SAndroid Build Coastguard Worker
64*58b9f456SAndroid Build Coastguard Workerenum error_type
65*58b9f456SAndroid Build Coastguard Worker{
66*58b9f456SAndroid Build Coastguard Worker    error_collate    = unspecified,
67*58b9f456SAndroid Build Coastguard Worker    error_ctype      = unspecified,
68*58b9f456SAndroid Build Coastguard Worker    error_escape     = unspecified,
69*58b9f456SAndroid Build Coastguard Worker    error_backref    = unspecified,
70*58b9f456SAndroid Build Coastguard Worker    error_brack      = unspecified,
71*58b9f456SAndroid Build Coastguard Worker    error_paren      = unspecified,
72*58b9f456SAndroid Build Coastguard Worker    error_brace      = unspecified,
73*58b9f456SAndroid Build Coastguard Worker    error_badbrace   = unspecified,
74*58b9f456SAndroid Build Coastguard Worker    error_range      = unspecified,
75*58b9f456SAndroid Build Coastguard Worker    error_space      = unspecified,
76*58b9f456SAndroid Build Coastguard Worker    error_badrepeat  = unspecified,
77*58b9f456SAndroid Build Coastguard Worker    error_complexity = unspecified,
78*58b9f456SAndroid Build Coastguard Worker    error_stack      = unspecified
79*58b9f456SAndroid Build Coastguard Worker};
80*58b9f456SAndroid Build Coastguard Worker
81*58b9f456SAndroid Build Coastguard Worker}  // regex_constants
82*58b9f456SAndroid Build Coastguard Worker
83*58b9f456SAndroid Build Coastguard Workerclass regex_error
84*58b9f456SAndroid Build Coastguard Worker    : public runtime_error
85*58b9f456SAndroid Build Coastguard Worker{
86*58b9f456SAndroid Build Coastguard Workerpublic:
87*58b9f456SAndroid Build Coastguard Worker    explicit regex_error(regex_constants::error_type ecode);
88*58b9f456SAndroid Build Coastguard Worker    regex_constants::error_type code() const;
89*58b9f456SAndroid Build Coastguard Worker};
90*58b9f456SAndroid Build Coastguard Worker
91*58b9f456SAndroid Build Coastguard Workertemplate <class charT>
92*58b9f456SAndroid Build Coastguard Workerstruct regex_traits
93*58b9f456SAndroid Build Coastguard Worker{
94*58b9f456SAndroid Build Coastguard Workerpublic:
95*58b9f456SAndroid Build Coastguard Worker    typedef charT                   char_type;
96*58b9f456SAndroid Build Coastguard Worker    typedef basic_string<char_type> string_type;
97*58b9f456SAndroid Build Coastguard Worker    typedef locale                  locale_type;
98*58b9f456SAndroid Build Coastguard Worker    typedef /bitmask_type/          char_class_type;
99*58b9f456SAndroid Build Coastguard Worker
100*58b9f456SAndroid Build Coastguard Worker    regex_traits();
101*58b9f456SAndroid Build Coastguard Worker
102*58b9f456SAndroid Build Coastguard Worker    static size_t length(const char_type* p);
103*58b9f456SAndroid Build Coastguard Worker    charT translate(charT c) const;
104*58b9f456SAndroid Build Coastguard Worker    charT translate_nocase(charT c) const;
105*58b9f456SAndroid Build Coastguard Worker    template <class ForwardIterator>
106*58b9f456SAndroid Build Coastguard Worker        string_type
107*58b9f456SAndroid Build Coastguard Worker        transform(ForwardIterator first, ForwardIterator last) const;
108*58b9f456SAndroid Build Coastguard Worker    template <class ForwardIterator>
109*58b9f456SAndroid Build Coastguard Worker        string_type
110*58b9f456SAndroid Build Coastguard Worker        transform_primary( ForwardIterator first, ForwardIterator last) const;
111*58b9f456SAndroid Build Coastguard Worker    template <class ForwardIterator>
112*58b9f456SAndroid Build Coastguard Worker        string_type
113*58b9f456SAndroid Build Coastguard Worker        lookup_collatename(ForwardIterator first, ForwardIterator last) const;
114*58b9f456SAndroid Build Coastguard Worker    template <class ForwardIterator>
115*58b9f456SAndroid Build Coastguard Worker        char_class_type
116*58b9f456SAndroid Build Coastguard Worker        lookup_classname(ForwardIterator first, ForwardIterator last,
117*58b9f456SAndroid Build Coastguard Worker                         bool icase = false) const;
118*58b9f456SAndroid Build Coastguard Worker    bool isctype(charT c, char_class_type f) const;
119*58b9f456SAndroid Build Coastguard Worker    int value(charT ch, int radix) const;
120*58b9f456SAndroid Build Coastguard Worker    locale_type imbue(locale_type l);
121*58b9f456SAndroid Build Coastguard Worker    locale_type getloc()const;
122*58b9f456SAndroid Build Coastguard Worker};
123*58b9f456SAndroid Build Coastguard Worker
124*58b9f456SAndroid Build Coastguard Workertemplate <class charT, class traits = regex_traits<charT>>
125*58b9f456SAndroid Build Coastguard Workerclass basic_regex
126*58b9f456SAndroid Build Coastguard Worker{
127*58b9f456SAndroid Build Coastguard Workerpublic:
128*58b9f456SAndroid Build Coastguard Worker    // types:
129*58b9f456SAndroid Build Coastguard Worker    typedef charT                               value_type;
130*58b9f456SAndroid Build Coastguard Worker    typedef traits                              traits_type;
131*58b9f456SAndroid Build Coastguard Worker    typedef typename traits::string_type        string_type;
132*58b9f456SAndroid Build Coastguard Worker    typedef regex_constants::syntax_option_type flag_type;
133*58b9f456SAndroid Build Coastguard Worker    typedef typename traits::locale_type        locale_type;
134*58b9f456SAndroid Build Coastguard Worker
135*58b9f456SAndroid Build Coastguard Worker    // constants:
136*58b9f456SAndroid Build Coastguard Worker    static constexpr regex_constants::syntax_option_type icase = regex_constants::icase;
137*58b9f456SAndroid Build Coastguard Worker    static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
138*58b9f456SAndroid Build Coastguard Worker    static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize;
139*58b9f456SAndroid Build Coastguard Worker    static constexpr regex_constants::syntax_option_type collate = regex_constants::collate;
140*58b9f456SAndroid Build Coastguard Worker    static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
141*58b9f456SAndroid Build Coastguard Worker    static constexpr regex_constants::syntax_option_type basic = regex_constants::basic;
142*58b9f456SAndroid Build Coastguard Worker    static constexpr regex_constants::syntax_option_type extended = regex_constants::extended;
143*58b9f456SAndroid Build Coastguard Worker    static constexpr regex_constants::syntax_option_type awk = regex_constants::awk;
144*58b9f456SAndroid Build Coastguard Worker    static constexpr regex_constants::syntax_option_type grep = regex_constants::grep;
145*58b9f456SAndroid Build Coastguard Worker    static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep;
146*58b9f456SAndroid Build Coastguard Worker
147*58b9f456SAndroid Build Coastguard Worker    // construct/copy/destroy:
148*58b9f456SAndroid Build Coastguard Worker    basic_regex();
149*58b9f456SAndroid Build Coastguard Worker    explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
150*58b9f456SAndroid Build Coastguard Worker    basic_regex(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
151*58b9f456SAndroid Build Coastguard Worker    basic_regex(const basic_regex&);
152*58b9f456SAndroid Build Coastguard Worker    basic_regex(basic_regex&&) noexcept;
153*58b9f456SAndroid Build Coastguard Worker    template <class ST, class SA>
154*58b9f456SAndroid Build Coastguard Worker        explicit basic_regex(const basic_string<charT, ST, SA>& p,
155*58b9f456SAndroid Build Coastguard Worker                             flag_type f = regex_constants::ECMAScript);
156*58b9f456SAndroid Build Coastguard Worker    template <class ForwardIterator>
157*58b9f456SAndroid Build Coastguard Worker        basic_regex(ForwardIterator first, ForwardIterator last,
158*58b9f456SAndroid Build Coastguard Worker                    flag_type f = regex_constants::ECMAScript);
159*58b9f456SAndroid Build Coastguard Worker    basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
160*58b9f456SAndroid Build Coastguard Worker
161*58b9f456SAndroid Build Coastguard Worker    ~basic_regex();
162*58b9f456SAndroid Build Coastguard Worker
163*58b9f456SAndroid Build Coastguard Worker    basic_regex& operator=(const basic_regex&);
164*58b9f456SAndroid Build Coastguard Worker    basic_regex& operator=(basic_regex&&) noexcept;
165*58b9f456SAndroid Build Coastguard Worker    basic_regex& operator=(const charT* ptr);
166*58b9f456SAndroid Build Coastguard Worker    basic_regex& operator=(initializer_list<charT> il);
167*58b9f456SAndroid Build Coastguard Worker    template <class ST, class SA>
168*58b9f456SAndroid Build Coastguard Worker        basic_regex& operator=(const basic_string<charT, ST, SA>& p);
169*58b9f456SAndroid Build Coastguard Worker
170*58b9f456SAndroid Build Coastguard Worker    // assign:
171*58b9f456SAndroid Build Coastguard Worker    basic_regex& assign(const basic_regex& that);
172*58b9f456SAndroid Build Coastguard Worker    basic_regex& assign(basic_regex&& that) noexcept;
173*58b9f456SAndroid Build Coastguard Worker    basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);
174*58b9f456SAndroid Build Coastguard Worker    basic_regex& assign(const charT* p, size_t len, flag_type f);
175*58b9f456SAndroid Build Coastguard Worker    template <class string_traits, class A>
176*58b9f456SAndroid Build Coastguard Worker        basic_regex& assign(const basic_string<charT, string_traits, A>& s,
177*58b9f456SAndroid Build Coastguard Worker                            flag_type f = regex_constants::ECMAScript);
178*58b9f456SAndroid Build Coastguard Worker    template <class InputIterator>
179*58b9f456SAndroid Build Coastguard Worker        basic_regex& assign(InputIterator first, InputIterator last,
180*58b9f456SAndroid Build Coastguard Worker                            flag_type f = regex_constants::ECMAScript);
181*58b9f456SAndroid Build Coastguard Worker    basic_regex& assign(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
182*58b9f456SAndroid Build Coastguard Worker
183*58b9f456SAndroid Build Coastguard Worker    // const operations:
184*58b9f456SAndroid Build Coastguard Worker    unsigned mark_count() const;
185*58b9f456SAndroid Build Coastguard Worker    flag_type flags() const;
186*58b9f456SAndroid Build Coastguard Worker
187*58b9f456SAndroid Build Coastguard Worker    // locale:
188*58b9f456SAndroid Build Coastguard Worker    locale_type imbue(locale_type loc);
189*58b9f456SAndroid Build Coastguard Worker    locale_type getloc() const;
190*58b9f456SAndroid Build Coastguard Worker
191*58b9f456SAndroid Build Coastguard Worker    // swap:
192*58b9f456SAndroid Build Coastguard Worker    void swap(basic_regex&);
193*58b9f456SAndroid Build Coastguard Worker};
194*58b9f456SAndroid Build Coastguard Worker
195*58b9f456SAndroid Build Coastguard Workertemplate<class ForwardIterator>
196*58b9f456SAndroid Build Coastguard Workerbasic_regex(ForwardIterator, ForwardIterator,
197*58b9f456SAndroid Build Coastguard Worker            regex_constants::syntax_option_type = regex_constants::ECMAScript)
198*58b9f456SAndroid Build Coastguard Worker    -> basic_regex<typename iterator_traits<ForwardIterator>::value_type>; // C++17
199*58b9f456SAndroid Build Coastguard Worker
200*58b9f456SAndroid Build Coastguard Workertypedef basic_regex<char>    regex;
201*58b9f456SAndroid Build Coastguard Workertypedef basic_regex<wchar_t> wregex;
202*58b9f456SAndroid Build Coastguard Worker
203*58b9f456SAndroid Build Coastguard Workertemplate <class charT, class traits>
204*58b9f456SAndroid Build Coastguard Worker    void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
205*58b9f456SAndroid Build Coastguard Worker
206*58b9f456SAndroid Build Coastguard Workertemplate <class BidirectionalIterator>
207*58b9f456SAndroid Build Coastguard Workerclass sub_match
208*58b9f456SAndroid Build Coastguard Worker    : public pair<BidirectionalIterator, BidirectionalIterator>
209*58b9f456SAndroid Build Coastguard Worker{
210*58b9f456SAndroid Build Coastguard Workerpublic:
211*58b9f456SAndroid Build Coastguard Worker    typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
212*58b9f456SAndroid Build Coastguard Worker    typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
213*58b9f456SAndroid Build Coastguard Worker    typedef BidirectionalIterator                                      iterator;
214*58b9f456SAndroid Build Coastguard Worker    typedef basic_string<value_type>                                string_type;
215*58b9f456SAndroid Build Coastguard Worker
216*58b9f456SAndroid Build Coastguard Worker    bool matched;
217*58b9f456SAndroid Build Coastguard Worker
218*58b9f456SAndroid Build Coastguard Worker    constexpr sub_match();
219*58b9f456SAndroid Build Coastguard Worker
220*58b9f456SAndroid Build Coastguard Worker    difference_type length() const;
221*58b9f456SAndroid Build Coastguard Worker    operator string_type() const;
222*58b9f456SAndroid Build Coastguard Worker    string_type str() const;
223*58b9f456SAndroid Build Coastguard Worker
224*58b9f456SAndroid Build Coastguard Worker    int compare(const sub_match& s) const;
225*58b9f456SAndroid Build Coastguard Worker    int compare(const string_type& s) const;
226*58b9f456SAndroid Build Coastguard Worker    int compare(const value_type* s) const;
227*58b9f456SAndroid Build Coastguard Worker};
228*58b9f456SAndroid Build Coastguard Worker
229*58b9f456SAndroid Build Coastguard Workertypedef sub_match<const char*>             csub_match;
230*58b9f456SAndroid Build Coastguard Workertypedef sub_match<const wchar_t*>          wcsub_match;
231*58b9f456SAndroid Build Coastguard Workertypedef sub_match<string::const_iterator>  ssub_match;
232*58b9f456SAndroid Build Coastguard Workertypedef sub_match<wstring::const_iterator> wssub_match;
233*58b9f456SAndroid Build Coastguard Worker
234*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
235*58b9f456SAndroid Build Coastguard Worker    bool
236*58b9f456SAndroid Build Coastguard Worker    operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
237*58b9f456SAndroid Build Coastguard Worker
238*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
239*58b9f456SAndroid Build Coastguard Worker    bool
240*58b9f456SAndroid Build Coastguard Worker    operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
241*58b9f456SAndroid Build Coastguard Worker
242*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
243*58b9f456SAndroid Build Coastguard Worker    bool
244*58b9f456SAndroid Build Coastguard Worker    operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
245*58b9f456SAndroid Build Coastguard Worker
246*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
247*58b9f456SAndroid Build Coastguard Worker    bool
248*58b9f456SAndroid Build Coastguard Worker    operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
249*58b9f456SAndroid Build Coastguard Worker
250*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
251*58b9f456SAndroid Build Coastguard Worker    bool
252*58b9f456SAndroid Build Coastguard Worker    operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
253*58b9f456SAndroid Build Coastguard Worker
254*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
255*58b9f456SAndroid Build Coastguard Worker    bool
256*58b9f456SAndroid Build Coastguard Worker    operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
257*58b9f456SAndroid Build Coastguard Worker
258*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter, class ST, class SA>
259*58b9f456SAndroid Build Coastguard Worker    bool
260*58b9f456SAndroid Build Coastguard Worker    operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
261*58b9f456SAndroid Build Coastguard Worker               const sub_match<BiIter>& rhs);
262*58b9f456SAndroid Build Coastguard Worker
263*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter, class ST, class SA>
264*58b9f456SAndroid Build Coastguard Worker    bool
265*58b9f456SAndroid Build Coastguard Worker    operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
266*58b9f456SAndroid Build Coastguard Worker               const sub_match<BiIter>& rhs);
267*58b9f456SAndroid Build Coastguard Worker
268*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter, class ST, class SA>
269*58b9f456SAndroid Build Coastguard Worker    bool
270*58b9f456SAndroid Build Coastguard Worker    operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
271*58b9f456SAndroid Build Coastguard Worker              const sub_match<BiIter>& rhs);
272*58b9f456SAndroid Build Coastguard Worker
273*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter, class ST, class SA>
274*58b9f456SAndroid Build Coastguard Worker    bool
275*58b9f456SAndroid Build Coastguard Worker    operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
276*58b9f456SAndroid Build Coastguard Worker              const sub_match<BiIter>& rhs);
277*58b9f456SAndroid Build Coastguard Worker
278*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter, class ST, class SA>
279*58b9f456SAndroid Build Coastguard Worker    bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
280*58b9f456SAndroid Build Coastguard Worker                    const sub_match<BiIter>& rhs);
281*58b9f456SAndroid Build Coastguard Worker
282*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter, class ST, class SA>
283*58b9f456SAndroid Build Coastguard Worker    bool
284*58b9f456SAndroid Build Coastguard Worker    operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
285*58b9f456SAndroid Build Coastguard Worker               const sub_match<BiIter>& rhs);
286*58b9f456SAndroid Build Coastguard Worker
287*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter, class ST, class SA>
288*58b9f456SAndroid Build Coastguard Worker    bool
289*58b9f456SAndroid Build Coastguard Worker    operator==(const sub_match<BiIter>& lhs,
290*58b9f456SAndroid Build Coastguard Worker               const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
291*58b9f456SAndroid Build Coastguard Worker
292*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter, class ST, class SA>
293*58b9f456SAndroid Build Coastguard Worker    bool
294*58b9f456SAndroid Build Coastguard Worker    operator!=(const sub_match<BiIter>& lhs,
295*58b9f456SAndroid Build Coastguard Worker               const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
296*58b9f456SAndroid Build Coastguard Worker
297*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter, class ST, class SA>
298*58b9f456SAndroid Build Coastguard Worker    bool
299*58b9f456SAndroid Build Coastguard Worker    operator<(const sub_match<BiIter>& lhs,
300*58b9f456SAndroid Build Coastguard Worker              const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
301*58b9f456SAndroid Build Coastguard Worker
302*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter, class ST, class SA>
303*58b9f456SAndroid Build Coastguard Worker    bool operator>(const sub_match<BiIter>& lhs,
304*58b9f456SAndroid Build Coastguard Worker                   const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
305*58b9f456SAndroid Build Coastguard Worker
306*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter, class ST, class SA>
307*58b9f456SAndroid Build Coastguard Worker    bool
308*58b9f456SAndroid Build Coastguard Worker    operator>=(const sub_match<BiIter>& lhs,
309*58b9f456SAndroid Build Coastguard Worker               const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
310*58b9f456SAndroid Build Coastguard Worker
311*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter, class ST, class SA>
312*58b9f456SAndroid Build Coastguard Worker    bool
313*58b9f456SAndroid Build Coastguard Worker    operator<=(const sub_match<BiIter>& lhs,
314*58b9f456SAndroid Build Coastguard Worker               const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
315*58b9f456SAndroid Build Coastguard Worker
316*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
317*58b9f456SAndroid Build Coastguard Worker    bool
318*58b9f456SAndroid Build Coastguard Worker    operator==(typename iterator_traits<BiIter>::value_type const* lhs,
319*58b9f456SAndroid Build Coastguard Worker               const sub_match<BiIter>& rhs);
320*58b9f456SAndroid Build Coastguard Worker
321*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
322*58b9f456SAndroid Build Coastguard Worker    bool
323*58b9f456SAndroid Build Coastguard Worker    operator!=(typename iterator_traits<BiIter>::value_type const* lhs,
324*58b9f456SAndroid Build Coastguard Worker               const sub_match<BiIter>& rhs);
325*58b9f456SAndroid Build Coastguard Worker
326*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
327*58b9f456SAndroid Build Coastguard Worker    bool
328*58b9f456SAndroid Build Coastguard Worker    operator<(typename iterator_traits<BiIter>::value_type const* lhs,
329*58b9f456SAndroid Build Coastguard Worker              const sub_match<BiIter>& rhs);
330*58b9f456SAndroid Build Coastguard Worker
331*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
332*58b9f456SAndroid Build Coastguard Worker    bool
333*58b9f456SAndroid Build Coastguard Worker    operator>(typename iterator_traits<BiIter>::value_type const* lhs,
334*58b9f456SAndroid Build Coastguard Worker              const sub_match<BiIter>& rhs);
335*58b9f456SAndroid Build Coastguard Worker
336*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
337*58b9f456SAndroid Build Coastguard Worker    bool
338*58b9f456SAndroid Build Coastguard Worker    operator>=(typename iterator_traits<BiIter>::value_type const* lhs,
339*58b9f456SAndroid Build Coastguard Worker               const sub_match<BiIter>& rhs);
340*58b9f456SAndroid Build Coastguard Worker
341*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
342*58b9f456SAndroid Build Coastguard Worker    bool
343*58b9f456SAndroid Build Coastguard Worker    operator<=(typename iterator_traits<BiIter>::value_type const* lhs,
344*58b9f456SAndroid Build Coastguard Worker               const sub_match<BiIter>& rhs);
345*58b9f456SAndroid Build Coastguard Worker
346*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
347*58b9f456SAndroid Build Coastguard Worker    bool
348*58b9f456SAndroid Build Coastguard Worker    operator==(const sub_match<BiIter>& lhs,
349*58b9f456SAndroid Build Coastguard Worker               typename iterator_traits<BiIter>::value_type const* rhs);
350*58b9f456SAndroid Build Coastguard Worker
351*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
352*58b9f456SAndroid Build Coastguard Worker    bool
353*58b9f456SAndroid Build Coastguard Worker    operator!=(const sub_match<BiIter>& lhs,
354*58b9f456SAndroid Build Coastguard Worker               typename iterator_traits<BiIter>::value_type const* rhs);
355*58b9f456SAndroid Build Coastguard Worker
356*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
357*58b9f456SAndroid Build Coastguard Worker    bool
358*58b9f456SAndroid Build Coastguard Worker    operator<(const sub_match<BiIter>& lhs,
359*58b9f456SAndroid Build Coastguard Worker              typename iterator_traits<BiIter>::value_type const* rhs);
360*58b9f456SAndroid Build Coastguard Worker
361*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
362*58b9f456SAndroid Build Coastguard Worker    bool
363*58b9f456SAndroid Build Coastguard Worker    operator>(const sub_match<BiIter>& lhs,
364*58b9f456SAndroid Build Coastguard Worker              typename iterator_traits<BiIter>::value_type const* rhs);
365*58b9f456SAndroid Build Coastguard Worker
366*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
367*58b9f456SAndroid Build Coastguard Worker    bool
368*58b9f456SAndroid Build Coastguard Worker    operator>=(const sub_match<BiIter>& lhs,
369*58b9f456SAndroid Build Coastguard Worker               typename iterator_traits<BiIter>::value_type const* rhs);
370*58b9f456SAndroid Build Coastguard Worker
371*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
372*58b9f456SAndroid Build Coastguard Worker    bool
373*58b9f456SAndroid Build Coastguard Worker    operator<=(const sub_match<BiIter>& lhs,
374*58b9f456SAndroid Build Coastguard Worker               typename iterator_traits<BiIter>::value_type const* rhs);
375*58b9f456SAndroid Build Coastguard Worker
376*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
377*58b9f456SAndroid Build Coastguard Worker    bool
378*58b9f456SAndroid Build Coastguard Worker    operator==(typename iterator_traits<BiIter>::value_type const& lhs,
379*58b9f456SAndroid Build Coastguard Worker               const sub_match<BiIter>& rhs);
380*58b9f456SAndroid Build Coastguard Worker
381*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
382*58b9f456SAndroid Build Coastguard Worker    bool
383*58b9f456SAndroid Build Coastguard Worker    operator!=(typename iterator_traits<BiIter>::value_type const& lhs,
384*58b9f456SAndroid Build Coastguard Worker               const sub_match<BiIter>& rhs);
385*58b9f456SAndroid Build Coastguard Worker
386*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
387*58b9f456SAndroid Build Coastguard Worker    bool
388*58b9f456SAndroid Build Coastguard Worker    operator<(typename iterator_traits<BiIter>::value_type const& lhs,
389*58b9f456SAndroid Build Coastguard Worker              const sub_match<BiIter>& rhs);
390*58b9f456SAndroid Build Coastguard Worker
391*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
392*58b9f456SAndroid Build Coastguard Worker    bool
393*58b9f456SAndroid Build Coastguard Worker    operator>(typename iterator_traits<BiIter>::value_type const& lhs,
394*58b9f456SAndroid Build Coastguard Worker              const sub_match<BiIter>& rhs);
395*58b9f456SAndroid Build Coastguard Worker
396*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
397*58b9f456SAndroid Build Coastguard Worker    bool
398*58b9f456SAndroid Build Coastguard Worker    operator>=(typename iterator_traits<BiIter>::value_type const& lhs,
399*58b9f456SAndroid Build Coastguard Worker               const sub_match<BiIter>& rhs);
400*58b9f456SAndroid Build Coastguard Worker
401*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
402*58b9f456SAndroid Build Coastguard Worker    bool
403*58b9f456SAndroid Build Coastguard Worker    operator<=(typename iterator_traits<BiIter>::value_type const& lhs,
404*58b9f456SAndroid Build Coastguard Worker               const sub_match<BiIter>& rhs);
405*58b9f456SAndroid Build Coastguard Worker
406*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
407*58b9f456SAndroid Build Coastguard Worker    bool
408*58b9f456SAndroid Build Coastguard Worker    operator==(const sub_match<BiIter>& lhs,
409*58b9f456SAndroid Build Coastguard Worker               typename iterator_traits<BiIter>::value_type const& rhs);
410*58b9f456SAndroid Build Coastguard Worker
411*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
412*58b9f456SAndroid Build Coastguard Worker    bool
413*58b9f456SAndroid Build Coastguard Worker    operator!=(const sub_match<BiIter>& lhs,
414*58b9f456SAndroid Build Coastguard Worker               typename iterator_traits<BiIter>::value_type const& rhs);
415*58b9f456SAndroid Build Coastguard Worker
416*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
417*58b9f456SAndroid Build Coastguard Worker    bool
418*58b9f456SAndroid Build Coastguard Worker    operator<(const sub_match<BiIter>& lhs,
419*58b9f456SAndroid Build Coastguard Worker              typename iterator_traits<BiIter>::value_type const& rhs);
420*58b9f456SAndroid Build Coastguard Worker
421*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
422*58b9f456SAndroid Build Coastguard Worker    bool
423*58b9f456SAndroid Build Coastguard Worker    operator>(const sub_match<BiIter>& lhs,
424*58b9f456SAndroid Build Coastguard Worker              typename iterator_traits<BiIter>::value_type const& rhs);
425*58b9f456SAndroid Build Coastguard Worker
426*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
427*58b9f456SAndroid Build Coastguard Worker    bool
428*58b9f456SAndroid Build Coastguard Worker    operator>=(const sub_match<BiIter>& lhs,
429*58b9f456SAndroid Build Coastguard Worker               typename iterator_traits<BiIter>::value_type const& rhs);
430*58b9f456SAndroid Build Coastguard Worker
431*58b9f456SAndroid Build Coastguard Workertemplate <class BiIter>
432*58b9f456SAndroid Build Coastguard Worker    bool
433*58b9f456SAndroid Build Coastguard Worker    operator<=(const sub_match<BiIter>& lhs,
434*58b9f456SAndroid Build Coastguard Worker               typename iterator_traits<BiIter>::value_type const& rhs);
435*58b9f456SAndroid Build Coastguard Worker
436*58b9f456SAndroid Build Coastguard Workertemplate <class charT, class ST, class BiIter>
437*58b9f456SAndroid Build Coastguard Worker    basic_ostream<charT, ST>&
438*58b9f456SAndroid Build Coastguard Worker    operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
439*58b9f456SAndroid Build Coastguard Worker
440*58b9f456SAndroid Build Coastguard Workertemplate <class BidirectionalIterator,
441*58b9f456SAndroid Build Coastguard Worker          class Allocator = allocator<sub_match<BidirectionalIterator>>>
442*58b9f456SAndroid Build Coastguard Workerclass match_results
443*58b9f456SAndroid Build Coastguard Worker{
444*58b9f456SAndroid Build Coastguard Workerpublic:
445*58b9f456SAndroid Build Coastguard Worker    typedef sub_match<BidirectionalIterator>                  value_type;
446*58b9f456SAndroid Build Coastguard Worker    typedef const value_type&                                 const_reference;
447*58b9f456SAndroid Build Coastguard Worker    typedef value_type&                                       reference;
448*58b9f456SAndroid Build Coastguard Worker    typedef /implementation-defined/                          const_iterator;
449*58b9f456SAndroid Build Coastguard Worker    typedef const_iterator                                    iterator;
450*58b9f456SAndroid Build Coastguard Worker    typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
451*58b9f456SAndroid Build Coastguard Worker    typedef typename allocator_traits<Allocator>::size_type   size_type;
452*58b9f456SAndroid Build Coastguard Worker    typedef Allocator                                         allocator_type;
453*58b9f456SAndroid Build Coastguard Worker    typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
454*58b9f456SAndroid Build Coastguard Worker    typedef basic_string<char_type>                           string_type;
455*58b9f456SAndroid Build Coastguard Worker
456*58b9f456SAndroid Build Coastguard Worker    // construct/copy/destroy:
457*58b9f456SAndroid Build Coastguard Worker    explicit match_results(const Allocator& a = Allocator());
458*58b9f456SAndroid Build Coastguard Worker    match_results(const match_results& m);
459*58b9f456SAndroid Build Coastguard Worker    match_results(match_results&& m) noexcept;
460*58b9f456SAndroid Build Coastguard Worker    match_results& operator=(const match_results& m);
461*58b9f456SAndroid Build Coastguard Worker    match_results& operator=(match_results&& m);
462*58b9f456SAndroid Build Coastguard Worker    ~match_results();
463*58b9f456SAndroid Build Coastguard Worker
464*58b9f456SAndroid Build Coastguard Worker    bool ready() const;
465*58b9f456SAndroid Build Coastguard Worker
466*58b9f456SAndroid Build Coastguard Worker    // size:
467*58b9f456SAndroid Build Coastguard Worker    size_type size() const;
468*58b9f456SAndroid Build Coastguard Worker    size_type max_size() const;
469*58b9f456SAndroid Build Coastguard Worker    bool empty() const;
470*58b9f456SAndroid Build Coastguard Worker
471*58b9f456SAndroid Build Coastguard Worker    // element access:
472*58b9f456SAndroid Build Coastguard Worker    difference_type length(size_type sub = 0) const;
473*58b9f456SAndroid Build Coastguard Worker    difference_type position(size_type sub = 0) const;
474*58b9f456SAndroid Build Coastguard Worker    string_type str(size_type sub = 0) const;
475*58b9f456SAndroid Build Coastguard Worker    const_reference operator[](size_type n) const;
476*58b9f456SAndroid Build Coastguard Worker
477*58b9f456SAndroid Build Coastguard Worker    const_reference prefix() const;
478*58b9f456SAndroid Build Coastguard Worker    const_reference suffix() const;
479*58b9f456SAndroid Build Coastguard Worker
480*58b9f456SAndroid Build Coastguard Worker    const_iterator begin() const;
481*58b9f456SAndroid Build Coastguard Worker    const_iterator end() const;
482*58b9f456SAndroid Build Coastguard Worker    const_iterator cbegin() const;
483*58b9f456SAndroid Build Coastguard Worker    const_iterator cend() const;
484*58b9f456SAndroid Build Coastguard Worker
485*58b9f456SAndroid Build Coastguard Worker    // format:
486*58b9f456SAndroid Build Coastguard Worker    template <class OutputIter>
487*58b9f456SAndroid Build Coastguard Worker        OutputIter
488*58b9f456SAndroid Build Coastguard Worker        format(OutputIter out, const char_type* fmt_first,
489*58b9f456SAndroid Build Coastguard Worker               const char_type* fmt_last,
490*58b9f456SAndroid Build Coastguard Worker               regex_constants::match_flag_type flags = regex_constants::format_default) const;
491*58b9f456SAndroid Build Coastguard Worker    template <class OutputIter, class ST, class SA>
492*58b9f456SAndroid Build Coastguard Worker        OutputIter
493*58b9f456SAndroid Build Coastguard Worker        format(OutputIter out, const basic_string<char_type, ST, SA>& fmt,
494*58b9f456SAndroid Build Coastguard Worker               regex_constants::match_flag_type flags = regex_constants::format_default) const;
495*58b9f456SAndroid Build Coastguard Worker    template <class ST, class SA>
496*58b9f456SAndroid Build Coastguard Worker        basic_string<char_type, ST, SA>
497*58b9f456SAndroid Build Coastguard Worker        format(const basic_string<char_type, ST, SA>& fmt,
498*58b9f456SAndroid Build Coastguard Worker               regex_constants::match_flag_type flags = regex_constants::format_default) const;
499*58b9f456SAndroid Build Coastguard Worker    string_type
500*58b9f456SAndroid Build Coastguard Worker        format(const char_type* fmt,
501*58b9f456SAndroid Build Coastguard Worker               regex_constants::match_flag_type flags = regex_constants::format_default) const;
502*58b9f456SAndroid Build Coastguard Worker
503*58b9f456SAndroid Build Coastguard Worker    // allocator:
504*58b9f456SAndroid Build Coastguard Worker    allocator_type get_allocator() const;
505*58b9f456SAndroid Build Coastguard Worker
506*58b9f456SAndroid Build Coastguard Worker    // swap:
507*58b9f456SAndroid Build Coastguard Worker    void swap(match_results& that);
508*58b9f456SAndroid Build Coastguard Worker};
509*58b9f456SAndroid Build Coastguard Worker
510*58b9f456SAndroid Build Coastguard Workertypedef match_results<const char*>             cmatch;
511*58b9f456SAndroid Build Coastguard Workertypedef match_results<const wchar_t*>          wcmatch;
512*58b9f456SAndroid Build Coastguard Workertypedef match_results<string::const_iterator>  smatch;
513*58b9f456SAndroid Build Coastguard Workertypedef match_results<wstring::const_iterator> wsmatch;
514*58b9f456SAndroid Build Coastguard Worker
515*58b9f456SAndroid Build Coastguard Workertemplate <class BidirectionalIterator, class Allocator>
516*58b9f456SAndroid Build Coastguard Worker    bool
517*58b9f456SAndroid Build Coastguard Worker    operator==(const match_results<BidirectionalIterator, Allocator>& m1,
518*58b9f456SAndroid Build Coastguard Worker               const match_results<BidirectionalIterator, Allocator>& m2);
519*58b9f456SAndroid Build Coastguard Worker
520*58b9f456SAndroid Build Coastguard Workertemplate <class BidirectionalIterator, class Allocator>
521*58b9f456SAndroid Build Coastguard Worker    bool
522*58b9f456SAndroid Build Coastguard Worker    operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
523*58b9f456SAndroid Build Coastguard Worker               const match_results<BidirectionalIterator, Allocator>& m2);
524*58b9f456SAndroid Build Coastguard Worker
525*58b9f456SAndroid Build Coastguard Workertemplate <class BidirectionalIterator, class Allocator>
526*58b9f456SAndroid Build Coastguard Worker    void
527*58b9f456SAndroid Build Coastguard Worker    swap(match_results<BidirectionalIterator, Allocator>& m1,
528*58b9f456SAndroid Build Coastguard Worker         match_results<BidirectionalIterator, Allocator>& m2);
529*58b9f456SAndroid Build Coastguard Worker
530*58b9f456SAndroid Build Coastguard Workertemplate <class BidirectionalIterator, class Allocator, class charT, class traits>
531*58b9f456SAndroid Build Coastguard Worker    bool
532*58b9f456SAndroid Build Coastguard Worker    regex_match(BidirectionalIterator first, BidirectionalIterator last,
533*58b9f456SAndroid Build Coastguard Worker                match_results<BidirectionalIterator, Allocator>& m,
534*58b9f456SAndroid Build Coastguard Worker                const basic_regex<charT, traits>& e,
535*58b9f456SAndroid Build Coastguard Worker                regex_constants::match_flag_type flags = regex_constants::match_default);
536*58b9f456SAndroid Build Coastguard Worker
537*58b9f456SAndroid Build Coastguard Workertemplate <class BidirectionalIterator, class charT, class traits>
538*58b9f456SAndroid Build Coastguard Worker    bool
539*58b9f456SAndroid Build Coastguard Worker    regex_match(BidirectionalIterator first, BidirectionalIterator last,
540*58b9f456SAndroid Build Coastguard Worker                const basic_regex<charT, traits>& e,
541*58b9f456SAndroid Build Coastguard Worker                regex_constants::match_flag_type flags = regex_constants::match_default);
542*58b9f456SAndroid Build Coastguard Worker
543*58b9f456SAndroid Build Coastguard Workertemplate <class charT, class Allocator, class traits>
544*58b9f456SAndroid Build Coastguard Worker    bool
545*58b9f456SAndroid Build Coastguard Worker    regex_match(const charT* str, match_results<const charT*, Allocator>& m,
546*58b9f456SAndroid Build Coastguard Worker                const basic_regex<charT, traits>& e,
547*58b9f456SAndroid Build Coastguard Worker                regex_constants::match_flag_type flags = regex_constants::match_default);
548*58b9f456SAndroid Build Coastguard Worker
549*58b9f456SAndroid Build Coastguard Workertemplate <class ST, class SA, class Allocator, class charT, class traits>
550*58b9f456SAndroid Build Coastguard Worker    bool
551*58b9f456SAndroid Build Coastguard Worker    regex_match(const basic_string<charT, ST, SA>& s,
552*58b9f456SAndroid Build Coastguard Worker                match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
553*58b9f456SAndroid Build Coastguard Worker                const basic_regex<charT, traits>& e,
554*58b9f456SAndroid Build Coastguard Worker                regex_constants::match_flag_type flags = regex_constants::match_default);
555*58b9f456SAndroid Build Coastguard Worker
556*58b9f456SAndroid Build Coastguard Workertemplate <class ST, class SA, class Allocator, class charT, class traits>
557*58b9f456SAndroid Build Coastguard Worker    bool
558*58b9f456SAndroid Build Coastguard Worker    regex_match(const basic_string<charT, ST, SA>&& s,
559*58b9f456SAndroid Build Coastguard Worker                match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
560*58b9f456SAndroid Build Coastguard Worker                const basic_regex<charT, traits>& e,
561*58b9f456SAndroid Build Coastguard Worker                regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
562*58b9f456SAndroid Build Coastguard Worker
563*58b9f456SAndroid Build Coastguard Workertemplate <class charT, class traits>
564*58b9f456SAndroid Build Coastguard Worker    bool
565*58b9f456SAndroid Build Coastguard Worker    regex_match(const charT* str, const basic_regex<charT, traits>& e,
566*58b9f456SAndroid Build Coastguard Worker                regex_constants::match_flag_type flags = regex_constants::match_default);
567*58b9f456SAndroid Build Coastguard Worker
568*58b9f456SAndroid Build Coastguard Workertemplate <class ST, class SA, class charT, class traits>
569*58b9f456SAndroid Build Coastguard Worker    bool
570*58b9f456SAndroid Build Coastguard Worker    regex_match(const basic_string<charT, ST, SA>& s,
571*58b9f456SAndroid Build Coastguard Worker                const basic_regex<charT, traits>& e,
572*58b9f456SAndroid Build Coastguard Worker                regex_constants::match_flag_type flags = regex_constants::match_default);
573*58b9f456SAndroid Build Coastguard Worker
574*58b9f456SAndroid Build Coastguard Workertemplate <class BidirectionalIterator, class Allocator, class charT, class traits>
575*58b9f456SAndroid Build Coastguard Worker    bool
576*58b9f456SAndroid Build Coastguard Worker    regex_search(BidirectionalIterator first, BidirectionalIterator last,
577*58b9f456SAndroid Build Coastguard Worker                 match_results<BidirectionalIterator, Allocator>& m,
578*58b9f456SAndroid Build Coastguard Worker                 const basic_regex<charT, traits>& e,
579*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type flags = regex_constants::match_default);
580*58b9f456SAndroid Build Coastguard Worker
581*58b9f456SAndroid Build Coastguard Workertemplate <class BidirectionalIterator, class charT, class traits>
582*58b9f456SAndroid Build Coastguard Worker    bool
583*58b9f456SAndroid Build Coastguard Worker    regex_search(BidirectionalIterator first, BidirectionalIterator last,
584*58b9f456SAndroid Build Coastguard Worker                 const basic_regex<charT, traits>& e,
585*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type flags = regex_constants::match_default);
586*58b9f456SAndroid Build Coastguard Worker
587*58b9f456SAndroid Build Coastguard Workertemplate <class charT, class Allocator, class traits>
588*58b9f456SAndroid Build Coastguard Worker    bool
589*58b9f456SAndroid Build Coastguard Worker    regex_search(const charT* str, match_results<const charT*, Allocator>& m,
590*58b9f456SAndroid Build Coastguard Worker                 const basic_regex<charT, traits>& e,
591*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type flags = regex_constants::match_default);
592*58b9f456SAndroid Build Coastguard Worker
593*58b9f456SAndroid Build Coastguard Workertemplate <class charT, class traits>
594*58b9f456SAndroid Build Coastguard Worker    bool
595*58b9f456SAndroid Build Coastguard Worker    regex_search(const charT* str, const basic_regex<charT, traits>& e,
596*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type flags = regex_constants::match_default);
597*58b9f456SAndroid Build Coastguard Worker
598*58b9f456SAndroid Build Coastguard Workertemplate <class ST, class SA, class charT, class traits>
599*58b9f456SAndroid Build Coastguard Worker    bool
600*58b9f456SAndroid Build Coastguard Worker    regex_search(const basic_string<charT, ST, SA>& s,
601*58b9f456SAndroid Build Coastguard Worker                 const basic_regex<charT, traits>& e,
602*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type flags = regex_constants::match_default);
603*58b9f456SAndroid Build Coastguard Worker
604*58b9f456SAndroid Build Coastguard Workertemplate <class ST, class SA, class Allocator, class charT, class traits>
605*58b9f456SAndroid Build Coastguard Worker    bool
606*58b9f456SAndroid Build Coastguard Worker    regex_search(const basic_string<charT, ST, SA>& s,
607*58b9f456SAndroid Build Coastguard Worker                 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
608*58b9f456SAndroid Build Coastguard Worker                 const basic_regex<charT, traits>& e,
609*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type flags = regex_constants::match_default);
610*58b9f456SAndroid Build Coastguard Worker
611*58b9f456SAndroid Build Coastguard Workertemplate <class ST, class SA, class Allocator, class charT, class traits>
612*58b9f456SAndroid Build Coastguard Worker    bool
613*58b9f456SAndroid Build Coastguard Worker    regex_search(const basic_string<charT, ST, SA>&& s,
614*58b9f456SAndroid Build Coastguard Worker                 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
615*58b9f456SAndroid Build Coastguard Worker                 const basic_regex<charT, traits>& e,
616*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
617*58b9f456SAndroid Build Coastguard Worker
618*58b9f456SAndroid Build Coastguard Workertemplate <class OutputIterator, class BidirectionalIterator,
619*58b9f456SAndroid Build Coastguard Worker          class traits, class charT, class ST, class SA>
620*58b9f456SAndroid Build Coastguard Worker    OutputIterator
621*58b9f456SAndroid Build Coastguard Worker    regex_replace(OutputIterator out,
622*58b9f456SAndroid Build Coastguard Worker                  BidirectionalIterator first, BidirectionalIterator last,
623*58b9f456SAndroid Build Coastguard Worker                  const basic_regex<charT, traits>& e,
624*58b9f456SAndroid Build Coastguard Worker                  const basic_string<charT, ST, SA>& fmt,
625*58b9f456SAndroid Build Coastguard Worker                  regex_constants::match_flag_type flags = regex_constants::match_default);
626*58b9f456SAndroid Build Coastguard Worker
627*58b9f456SAndroid Build Coastguard Workertemplate <class OutputIterator, class BidirectionalIterator,
628*58b9f456SAndroid Build Coastguard Worker          class traits, class charT>
629*58b9f456SAndroid Build Coastguard Worker    OutputIterator
630*58b9f456SAndroid Build Coastguard Worker    regex_replace(OutputIterator out,
631*58b9f456SAndroid Build Coastguard Worker                  BidirectionalIterator first, BidirectionalIterator last,
632*58b9f456SAndroid Build Coastguard Worker                  const basic_regex<charT, traits>& e, const charT* fmt,
633*58b9f456SAndroid Build Coastguard Worker                  regex_constants::match_flag_type flags = regex_constants::match_default);
634*58b9f456SAndroid Build Coastguard Worker
635*58b9f456SAndroid Build Coastguard Workertemplate <class traits, class charT, class ST, class SA, class FST, class FSA>>
636*58b9f456SAndroid Build Coastguard Worker    basic_string<charT, ST, SA>
637*58b9f456SAndroid Build Coastguard Worker    regex_replace(const basic_string<charT, ST, SA>& s,
638*58b9f456SAndroid Build Coastguard Worker                  const basic_regex<charT, traits>& e,
639*58b9f456SAndroid Build Coastguard Worker                  const basic_string<charT, FST, FSA>& fmt,
640*58b9f456SAndroid Build Coastguard Worker                  regex_constants::match_flag_type flags = regex_constants::match_default);
641*58b9f456SAndroid Build Coastguard Worker
642*58b9f456SAndroid Build Coastguard Workertemplate <class traits, class charT, class ST, class SA>
643*58b9f456SAndroid Build Coastguard Worker    basic_string<charT, ST, SA>
644*58b9f456SAndroid Build Coastguard Worker    regex_replace(const basic_string<charT, ST, SA>& s,
645*58b9f456SAndroid Build Coastguard Worker                  const basic_regex<charT, traits>& e, const charT* fmt,
646*58b9f456SAndroid Build Coastguard Worker                  regex_constants::match_flag_type flags = regex_constants::match_default);
647*58b9f456SAndroid Build Coastguard Worker
648*58b9f456SAndroid Build Coastguard Workertemplate <class traits, class charT, class ST, class SA>
649*58b9f456SAndroid Build Coastguard Worker    basic_string<charT>
650*58b9f456SAndroid Build Coastguard Worker    regex_replace(const charT* s,
651*58b9f456SAndroid Build Coastguard Worker                  const basic_regex<charT, traits>& e,
652*58b9f456SAndroid Build Coastguard Worker                  const basic_string<charT, ST, SA>& fmt,
653*58b9f456SAndroid Build Coastguard Worker                  regex_constants::match_flag_type flags = regex_constants::match_default);
654*58b9f456SAndroid Build Coastguard Worker
655*58b9f456SAndroid Build Coastguard Workertemplate <class traits, class charT>
656*58b9f456SAndroid Build Coastguard Worker    basic_string<charT>
657*58b9f456SAndroid Build Coastguard Worker    regex_replace(const charT* s,
658*58b9f456SAndroid Build Coastguard Worker                  const basic_regex<charT, traits>& e,
659*58b9f456SAndroid Build Coastguard Worker                  const charT* fmt,
660*58b9f456SAndroid Build Coastguard Worker                  regex_constants::match_flag_type flags = regex_constants::match_default);
661*58b9f456SAndroid Build Coastguard Worker
662*58b9f456SAndroid Build Coastguard Workertemplate <class BidirectionalIterator,
663*58b9f456SAndroid Build Coastguard Worker          class charT = typename iterator_traits< BidirectionalIterator>::value_type,
664*58b9f456SAndroid Build Coastguard Worker          class traits = regex_traits<charT>>
665*58b9f456SAndroid Build Coastguard Workerclass regex_iterator
666*58b9f456SAndroid Build Coastguard Worker{
667*58b9f456SAndroid Build Coastguard Workerpublic:
668*58b9f456SAndroid Build Coastguard Worker    typedef basic_regex<charT, traits>           regex_type;
669*58b9f456SAndroid Build Coastguard Worker    typedef match_results<BidirectionalIterator> value_type;
670*58b9f456SAndroid Build Coastguard Worker    typedef ptrdiff_t                            difference_type;
671*58b9f456SAndroid Build Coastguard Worker    typedef const value_type*                    pointer;
672*58b9f456SAndroid Build Coastguard Worker    typedef const value_type&                    reference;
673*58b9f456SAndroid Build Coastguard Worker    typedef forward_iterator_tag                 iterator_category;
674*58b9f456SAndroid Build Coastguard Worker
675*58b9f456SAndroid Build Coastguard Worker    regex_iterator();
676*58b9f456SAndroid Build Coastguard Worker    regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
677*58b9f456SAndroid Build Coastguard Worker                   const regex_type& re,
678*58b9f456SAndroid Build Coastguard Worker                   regex_constants::match_flag_type m = regex_constants::match_default);
679*58b9f456SAndroid Build Coastguard Worker    regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
680*58b9f456SAndroid Build Coastguard Worker                   const regex_type&& __re,
681*58b9f456SAndroid Build Coastguard Worker                   regex_constants::match_flag_type __m
682*58b9f456SAndroid Build Coastguard Worker                                     = regex_constants::match_default) = delete; // C++14
683*58b9f456SAndroid Build Coastguard Worker    regex_iterator(const regex_iterator&);
684*58b9f456SAndroid Build Coastguard Worker    regex_iterator& operator=(const regex_iterator&);
685*58b9f456SAndroid Build Coastguard Worker
686*58b9f456SAndroid Build Coastguard Worker    bool operator==(const regex_iterator&) const;
687*58b9f456SAndroid Build Coastguard Worker    bool operator!=(const regex_iterator&) const;
688*58b9f456SAndroid Build Coastguard Worker
689*58b9f456SAndroid Build Coastguard Worker    const value_type& operator*() const;
690*58b9f456SAndroid Build Coastguard Worker    const value_type* operator->() const;
691*58b9f456SAndroid Build Coastguard Worker
692*58b9f456SAndroid Build Coastguard Worker    regex_iterator& operator++();
693*58b9f456SAndroid Build Coastguard Worker    regex_iterator operator++(int);
694*58b9f456SAndroid Build Coastguard Worker};
695*58b9f456SAndroid Build Coastguard Worker
696*58b9f456SAndroid Build Coastguard Workertypedef regex_iterator<const char*>             cregex_iterator;
697*58b9f456SAndroid Build Coastguard Workertypedef regex_iterator<const wchar_t*>          wcregex_iterator;
698*58b9f456SAndroid Build Coastguard Workertypedef regex_iterator<string::const_iterator>  sregex_iterator;
699*58b9f456SAndroid Build Coastguard Workertypedef regex_iterator<wstring::const_iterator> wsregex_iterator;
700*58b9f456SAndroid Build Coastguard Worker
701*58b9f456SAndroid Build Coastguard Workertemplate <class BidirectionalIterator,
702*58b9f456SAndroid Build Coastguard Worker          class charT = typename iterator_traits< BidirectionalIterator>::value_type,
703*58b9f456SAndroid Build Coastguard Worker          class traits = regex_traits<charT>>
704*58b9f456SAndroid Build Coastguard Workerclass regex_token_iterator
705*58b9f456SAndroid Build Coastguard Worker{
706*58b9f456SAndroid Build Coastguard Workerpublic:
707*58b9f456SAndroid Build Coastguard Worker    typedef basic_regex<charT, traits>       regex_type;
708*58b9f456SAndroid Build Coastguard Worker    typedef sub_match<BidirectionalIterator> value_type;
709*58b9f456SAndroid Build Coastguard Worker    typedef ptrdiff_t                        difference_type;
710*58b9f456SAndroid Build Coastguard Worker    typedef const value_type*                pointer;
711*58b9f456SAndroid Build Coastguard Worker    typedef const value_type&                reference;
712*58b9f456SAndroid Build Coastguard Worker    typedef forward_iterator_tag             iterator_category;
713*58b9f456SAndroid Build Coastguard Worker
714*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator();
715*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
716*58b9f456SAndroid Build Coastguard Worker                         const regex_type& re, int submatch = 0,
717*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type m = regex_constants::match_default);
718*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
719*58b9f456SAndroid Build Coastguard Worker                         const regex_type&& re, int submatch = 0,
720*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
721*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
722*58b9f456SAndroid Build Coastguard Worker                         const regex_type& re, const vector<int>& submatches,
723*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type m = regex_constants::match_default);
724*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
725*58b9f456SAndroid Build Coastguard Worker                         const regex_type&& re, const vector<int>& submatches,
726*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
727*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
728*58b9f456SAndroid Build Coastguard Worker                         const regex_type& re, initializer_list<int> submatches,
729*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type m = regex_constants::match_default);
730*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
731*58b9f456SAndroid Build Coastguard Worker                         const regex_type&& re, initializer_list<int> submatches,
732*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
733*58b9f456SAndroid Build Coastguard Worker    template <size_t N>
734*58b9f456SAndroid Build Coastguard Worker        regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
735*58b9f456SAndroid Build Coastguard Worker                             const regex_type& re, const int (&submatches)[N],
736*58b9f456SAndroid Build Coastguard Worker                             regex_constants::match_flag_type m = regex_constants::match_default);
737*58b9f456SAndroid Build Coastguard Worker    template <size_t N>
738*58b9f456SAndroid Build Coastguard Worker        regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
739*58b9f456SAndroid Build Coastguard Worker                             const regex_type& re, const int (&submatches)[N],
740*58b9f456SAndroid Build Coastguard Worker                             regex_constants::match_flag_type m = regex_constants::match_default) = delete // C++14;
741*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(const regex_token_iterator&);
742*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator& operator=(const regex_token_iterator&);
743*58b9f456SAndroid Build Coastguard Worker
744*58b9f456SAndroid Build Coastguard Worker    bool operator==(const regex_token_iterator&) const;
745*58b9f456SAndroid Build Coastguard Worker    bool operator!=(const regex_token_iterator&) const;
746*58b9f456SAndroid Build Coastguard Worker
747*58b9f456SAndroid Build Coastguard Worker    const value_type& operator*() const;
748*58b9f456SAndroid Build Coastguard Worker    const value_type* operator->() const;
749*58b9f456SAndroid Build Coastguard Worker
750*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator& operator++();
751*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator operator++(int);
752*58b9f456SAndroid Build Coastguard Worker};
753*58b9f456SAndroid Build Coastguard Worker
754*58b9f456SAndroid Build Coastguard Workertypedef regex_token_iterator<const char*>             cregex_token_iterator;
755*58b9f456SAndroid Build Coastguard Workertypedef regex_token_iterator<const wchar_t*>          wcregex_token_iterator;
756*58b9f456SAndroid Build Coastguard Workertypedef regex_token_iterator<string::const_iterator>  sregex_token_iterator;
757*58b9f456SAndroid Build Coastguard Workertypedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
758*58b9f456SAndroid Build Coastguard Worker
759*58b9f456SAndroid Build Coastguard Worker} // std
760*58b9f456SAndroid Build Coastguard Worker*/
761*58b9f456SAndroid Build Coastguard Worker
762*58b9f456SAndroid Build Coastguard Worker#include <__config>
763*58b9f456SAndroid Build Coastguard Worker#include <stdexcept>
764*58b9f456SAndroid Build Coastguard Worker#include <__locale>
765*58b9f456SAndroid Build Coastguard Worker#include <initializer_list>
766*58b9f456SAndroid Build Coastguard Worker#include <utility>
767*58b9f456SAndroid Build Coastguard Worker#include <iterator>
768*58b9f456SAndroid Build Coastguard Worker#include <string>
769*58b9f456SAndroid Build Coastguard Worker#include <memory>
770*58b9f456SAndroid Build Coastguard Worker#include <vector>
771*58b9f456SAndroid Build Coastguard Worker#include <deque>
772*58b9f456SAndroid Build Coastguard Worker#include <version>
773*58b9f456SAndroid Build Coastguard Worker
774*58b9f456SAndroid Build Coastguard Worker#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
775*58b9f456SAndroid Build Coastguard Worker#pragma GCC system_header
776*58b9f456SAndroid Build Coastguard Worker#endif
777*58b9f456SAndroid Build Coastguard Worker
778*58b9f456SAndroid Build Coastguard Worker_LIBCPP_PUSH_MACROS
779*58b9f456SAndroid Build Coastguard Worker#include <__undef_macros>
780*58b9f456SAndroid Build Coastguard Worker
781*58b9f456SAndroid Build Coastguard Worker
782*58b9f456SAndroid Build Coastguard Worker#define _LIBCPP_REGEX_COMPLEXITY_FACTOR 4096
783*58b9f456SAndroid Build Coastguard Worker
784*58b9f456SAndroid Build Coastguard Worker_LIBCPP_BEGIN_NAMESPACE_STD
785*58b9f456SAndroid Build Coastguard Worker
786*58b9f456SAndroid Build Coastguard Workernamespace regex_constants
787*58b9f456SAndroid Build Coastguard Worker{
788*58b9f456SAndroid Build Coastguard Worker
789*58b9f456SAndroid Build Coastguard Worker// syntax_option_type
790*58b9f456SAndroid Build Coastguard Worker
791*58b9f456SAndroid Build Coastguard Workerenum syntax_option_type
792*58b9f456SAndroid Build Coastguard Worker{
793*58b9f456SAndroid Build Coastguard Worker    icase      = 1 << 0,
794*58b9f456SAndroid Build Coastguard Worker    nosubs     = 1 << 1,
795*58b9f456SAndroid Build Coastguard Worker    optimize   = 1 << 2,
796*58b9f456SAndroid Build Coastguard Worker    collate    = 1 << 3,
797*58b9f456SAndroid Build Coastguard Worker    ECMAScript = 0,
798*58b9f456SAndroid Build Coastguard Worker    basic      = 1 << 4,
799*58b9f456SAndroid Build Coastguard Worker    extended   = 1 << 5,
800*58b9f456SAndroid Build Coastguard Worker    awk        = 1 << 6,
801*58b9f456SAndroid Build Coastguard Worker    grep       = 1 << 7,
802*58b9f456SAndroid Build Coastguard Worker    egrep      = 1 << 8
803*58b9f456SAndroid Build Coastguard Worker};
804*58b9f456SAndroid Build Coastguard Worker
805*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
806*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR
807*58b9f456SAndroid Build Coastguard Workersyntax_option_type
808*58b9f456SAndroid Build Coastguard Workeroperator~(syntax_option_type __x)
809*58b9f456SAndroid Build Coastguard Worker{
810*58b9f456SAndroid Build Coastguard Worker    return syntax_option_type(~int(__x) & 0x1FF);
811*58b9f456SAndroid Build Coastguard Worker}
812*58b9f456SAndroid Build Coastguard Worker
813*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
814*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR
815*58b9f456SAndroid Build Coastguard Workersyntax_option_type
816*58b9f456SAndroid Build Coastguard Workeroperator&(syntax_option_type __x, syntax_option_type __y)
817*58b9f456SAndroid Build Coastguard Worker{
818*58b9f456SAndroid Build Coastguard Worker    return syntax_option_type(int(__x) & int(__y));
819*58b9f456SAndroid Build Coastguard Worker}
820*58b9f456SAndroid Build Coastguard Worker
821*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
822*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR
823*58b9f456SAndroid Build Coastguard Workersyntax_option_type
824*58b9f456SAndroid Build Coastguard Workeroperator|(syntax_option_type __x, syntax_option_type __y)
825*58b9f456SAndroid Build Coastguard Worker{
826*58b9f456SAndroid Build Coastguard Worker    return syntax_option_type(int(__x) | int(__y));
827*58b9f456SAndroid Build Coastguard Worker}
828*58b9f456SAndroid Build Coastguard Worker
829*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
830*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR
831*58b9f456SAndroid Build Coastguard Workersyntax_option_type
832*58b9f456SAndroid Build Coastguard Workeroperator^(syntax_option_type __x, syntax_option_type __y)
833*58b9f456SAndroid Build Coastguard Worker{
834*58b9f456SAndroid Build Coastguard Worker    return syntax_option_type(int(__x) ^ int(__y));
835*58b9f456SAndroid Build Coastguard Worker}
836*58b9f456SAndroid Build Coastguard Worker
837*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
838*58b9f456SAndroid Build Coastguard Workersyntax_option_type&
839*58b9f456SAndroid Build Coastguard Workeroperator&=(syntax_option_type& __x, syntax_option_type __y)
840*58b9f456SAndroid Build Coastguard Worker{
841*58b9f456SAndroid Build Coastguard Worker    __x = __x & __y;
842*58b9f456SAndroid Build Coastguard Worker    return __x;
843*58b9f456SAndroid Build Coastguard Worker}
844*58b9f456SAndroid Build Coastguard Worker
845*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
846*58b9f456SAndroid Build Coastguard Workersyntax_option_type&
847*58b9f456SAndroid Build Coastguard Workeroperator|=(syntax_option_type& __x, syntax_option_type __y)
848*58b9f456SAndroid Build Coastguard Worker{
849*58b9f456SAndroid Build Coastguard Worker    __x = __x | __y;
850*58b9f456SAndroid Build Coastguard Worker    return __x;
851*58b9f456SAndroid Build Coastguard Worker}
852*58b9f456SAndroid Build Coastguard Worker
853*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
854*58b9f456SAndroid Build Coastguard Workersyntax_option_type&
855*58b9f456SAndroid Build Coastguard Workeroperator^=(syntax_option_type& __x, syntax_option_type __y)
856*58b9f456SAndroid Build Coastguard Worker{
857*58b9f456SAndroid Build Coastguard Worker    __x = __x ^ __y;
858*58b9f456SAndroid Build Coastguard Worker    return __x;
859*58b9f456SAndroid Build Coastguard Worker}
860*58b9f456SAndroid Build Coastguard Worker
861*58b9f456SAndroid Build Coastguard Worker// match_flag_type
862*58b9f456SAndroid Build Coastguard Worker
863*58b9f456SAndroid Build Coastguard Workerenum match_flag_type
864*58b9f456SAndroid Build Coastguard Worker{
865*58b9f456SAndroid Build Coastguard Worker    match_default     = 0,
866*58b9f456SAndroid Build Coastguard Worker    match_not_bol     = 1 << 0,
867*58b9f456SAndroid Build Coastguard Worker    match_not_eol     = 1 << 1,
868*58b9f456SAndroid Build Coastguard Worker    match_not_bow     = 1 << 2,
869*58b9f456SAndroid Build Coastguard Worker    match_not_eow     = 1 << 3,
870*58b9f456SAndroid Build Coastguard Worker    match_any         = 1 << 4,
871*58b9f456SAndroid Build Coastguard Worker    match_not_null    = 1 << 5,
872*58b9f456SAndroid Build Coastguard Worker    match_continuous  = 1 << 6,
873*58b9f456SAndroid Build Coastguard Worker    match_prev_avail  = 1 << 7,
874*58b9f456SAndroid Build Coastguard Worker    format_default    = 0,
875*58b9f456SAndroid Build Coastguard Worker    format_sed        = 1 << 8,
876*58b9f456SAndroid Build Coastguard Worker    format_no_copy    = 1 << 9,
877*58b9f456SAndroid Build Coastguard Worker    format_first_only = 1 << 10,
878*58b9f456SAndroid Build Coastguard Worker    __no_update_pos   = 1 << 11,
879*58b9f456SAndroid Build Coastguard Worker    __full_match      = 1 << 12
880*58b9f456SAndroid Build Coastguard Worker};
881*58b9f456SAndroid Build Coastguard Worker
882*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
883*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR
884*58b9f456SAndroid Build Coastguard Workermatch_flag_type
885*58b9f456SAndroid Build Coastguard Workeroperator~(match_flag_type __x)
886*58b9f456SAndroid Build Coastguard Worker{
887*58b9f456SAndroid Build Coastguard Worker    return match_flag_type(~int(__x) & 0x0FFF);
888*58b9f456SAndroid Build Coastguard Worker}
889*58b9f456SAndroid Build Coastguard Worker
890*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
891*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR
892*58b9f456SAndroid Build Coastguard Workermatch_flag_type
893*58b9f456SAndroid Build Coastguard Workeroperator&(match_flag_type __x, match_flag_type __y)
894*58b9f456SAndroid Build Coastguard Worker{
895*58b9f456SAndroid Build Coastguard Worker    return match_flag_type(int(__x) & int(__y));
896*58b9f456SAndroid Build Coastguard Worker}
897*58b9f456SAndroid Build Coastguard Worker
898*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
899*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR
900*58b9f456SAndroid Build Coastguard Workermatch_flag_type
901*58b9f456SAndroid Build Coastguard Workeroperator|(match_flag_type __x, match_flag_type __y)
902*58b9f456SAndroid Build Coastguard Worker{
903*58b9f456SAndroid Build Coastguard Worker    return match_flag_type(int(__x) | int(__y));
904*58b9f456SAndroid Build Coastguard Worker}
905*58b9f456SAndroid Build Coastguard Worker
906*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
907*58b9f456SAndroid Build Coastguard Worker_LIBCPP_CONSTEXPR
908*58b9f456SAndroid Build Coastguard Workermatch_flag_type
909*58b9f456SAndroid Build Coastguard Workeroperator^(match_flag_type __x, match_flag_type __y)
910*58b9f456SAndroid Build Coastguard Worker{
911*58b9f456SAndroid Build Coastguard Worker    return match_flag_type(int(__x) ^ int(__y));
912*58b9f456SAndroid Build Coastguard Worker}
913*58b9f456SAndroid Build Coastguard Worker
914*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
915*58b9f456SAndroid Build Coastguard Workermatch_flag_type&
916*58b9f456SAndroid Build Coastguard Workeroperator&=(match_flag_type& __x, match_flag_type __y)
917*58b9f456SAndroid Build Coastguard Worker{
918*58b9f456SAndroid Build Coastguard Worker    __x = __x & __y;
919*58b9f456SAndroid Build Coastguard Worker    return __x;
920*58b9f456SAndroid Build Coastguard Worker}
921*58b9f456SAndroid Build Coastguard Worker
922*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
923*58b9f456SAndroid Build Coastguard Workermatch_flag_type&
924*58b9f456SAndroid Build Coastguard Workeroperator|=(match_flag_type& __x, match_flag_type __y)
925*58b9f456SAndroid Build Coastguard Worker{
926*58b9f456SAndroid Build Coastguard Worker    __x = __x | __y;
927*58b9f456SAndroid Build Coastguard Worker    return __x;
928*58b9f456SAndroid Build Coastguard Worker}
929*58b9f456SAndroid Build Coastguard Worker
930*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
931*58b9f456SAndroid Build Coastguard Workermatch_flag_type&
932*58b9f456SAndroid Build Coastguard Workeroperator^=(match_flag_type& __x, match_flag_type __y)
933*58b9f456SAndroid Build Coastguard Worker{
934*58b9f456SAndroid Build Coastguard Worker    __x = __x ^ __y;
935*58b9f456SAndroid Build Coastguard Worker    return __x;
936*58b9f456SAndroid Build Coastguard Worker}
937*58b9f456SAndroid Build Coastguard Worker
938*58b9f456SAndroid Build Coastguard Workerenum error_type
939*58b9f456SAndroid Build Coastguard Worker{
940*58b9f456SAndroid Build Coastguard Worker    error_collate = 1,
941*58b9f456SAndroid Build Coastguard Worker    error_ctype,
942*58b9f456SAndroid Build Coastguard Worker    error_escape,
943*58b9f456SAndroid Build Coastguard Worker    error_backref,
944*58b9f456SAndroid Build Coastguard Worker    error_brack,
945*58b9f456SAndroid Build Coastguard Worker    error_paren,
946*58b9f456SAndroid Build Coastguard Worker    error_brace,
947*58b9f456SAndroid Build Coastguard Worker    error_badbrace,
948*58b9f456SAndroid Build Coastguard Worker    error_range,
949*58b9f456SAndroid Build Coastguard Worker    error_space,
950*58b9f456SAndroid Build Coastguard Worker    error_badrepeat,
951*58b9f456SAndroid Build Coastguard Worker    error_complexity,
952*58b9f456SAndroid Build Coastguard Worker    error_stack,
953*58b9f456SAndroid Build Coastguard Worker    __re_err_grammar,
954*58b9f456SAndroid Build Coastguard Worker    __re_err_empty,
955*58b9f456SAndroid Build Coastguard Worker    __re_err_unknown
956*58b9f456SAndroid Build Coastguard Worker};
957*58b9f456SAndroid Build Coastguard Worker
958*58b9f456SAndroid Build Coastguard Worker}  // regex_constants
959*58b9f456SAndroid Build Coastguard Worker
960*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_EXCEPTION_ABI regex_error
961*58b9f456SAndroid Build Coastguard Worker    : public runtime_error
962*58b9f456SAndroid Build Coastguard Worker{
963*58b9f456SAndroid Build Coastguard Worker    regex_constants::error_type __code_;
964*58b9f456SAndroid Build Coastguard Workerpublic:
965*58b9f456SAndroid Build Coastguard Worker    explicit regex_error(regex_constants::error_type __ecode);
966*58b9f456SAndroid Build Coastguard Worker    virtual ~regex_error() throw();
967*58b9f456SAndroid Build Coastguard Worker     _LIBCPP_INLINE_VISIBILITY
968*58b9f456SAndroid Build Coastguard Worker    regex_constants::error_type code() const {return __code_;}
969*58b9f456SAndroid Build Coastguard Worker};
970*58b9f456SAndroid Build Coastguard Worker
971*58b9f456SAndroid Build Coastguard Workertemplate <regex_constants::error_type _Ev>
972*58b9f456SAndroid Build Coastguard Worker_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
973*58b9f456SAndroid Build Coastguard Workervoid __throw_regex_error()
974*58b9f456SAndroid Build Coastguard Worker{
975*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_NO_EXCEPTIONS
976*58b9f456SAndroid Build Coastguard Worker    throw regex_error(_Ev);
977*58b9f456SAndroid Build Coastguard Worker#else
978*58b9f456SAndroid Build Coastguard Worker    _VSTD::abort();
979*58b9f456SAndroid Build Coastguard Worker#endif
980*58b9f456SAndroid Build Coastguard Worker}
981*58b9f456SAndroid Build Coastguard Worker
982*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
983*58b9f456SAndroid Build Coastguard Workerstruct _LIBCPP_TEMPLATE_VIS regex_traits
984*58b9f456SAndroid Build Coastguard Worker{
985*58b9f456SAndroid Build Coastguard Workerpublic:
986*58b9f456SAndroid Build Coastguard Worker    typedef _CharT                  char_type;
987*58b9f456SAndroid Build Coastguard Worker    typedef basic_string<char_type> string_type;
988*58b9f456SAndroid Build Coastguard Worker    typedef locale                  locale_type;
989*58b9f456SAndroid Build Coastguard Worker#ifdef __BIONIC__
990*58b9f456SAndroid Build Coastguard Worker    typedef uint16_t                char_class_type;
991*58b9f456SAndroid Build Coastguard Worker#else
992*58b9f456SAndroid Build Coastguard Worker    typedef ctype_base::mask        char_class_type;
993*58b9f456SAndroid Build Coastguard Worker#endif
994*58b9f456SAndroid Build Coastguard Worker
995*58b9f456SAndroid Build Coastguard Worker#ifdef __BIONIC__
996*58b9f456SAndroid Build Coastguard Worker    static const char_class_type __regex_word = 0x8000;
997*58b9f456SAndroid Build Coastguard Worker#elif defined(__mips__) && defined(__GLIBC__)
998*58b9f456SAndroid Build Coastguard Worker    static const char_class_type __regex_word = static_cast<char_class_type>(_ISbit(15));
999*58b9f456SAndroid Build Coastguard Worker#elif defined(__NetBSD__)
1000*58b9f456SAndroid Build Coastguard Worker    // NetBSD defines classes up to 0x2000
1001*58b9f456SAndroid Build Coastguard Worker    // see sys/ctype_bits.h, _CTYPE_Q
1002*58b9f456SAndroid Build Coastguard Worker    static const char_class_type __regex_word = 0x8000;
1003*58b9f456SAndroid Build Coastguard Worker#else
1004*58b9f456SAndroid Build Coastguard Worker    static const char_class_type __regex_word = 0x80;
1005*58b9f456SAndroid Build Coastguard Worker#endif
1006*58b9f456SAndroid Build Coastguard Worker
1007*58b9f456SAndroid Build Coastguard Workerprivate:
1008*58b9f456SAndroid Build Coastguard Worker    locale __loc_;
1009*58b9f456SAndroid Build Coastguard Worker    const ctype<char_type>* __ct_;
1010*58b9f456SAndroid Build Coastguard Worker    const collate<char_type>* __col_;
1011*58b9f456SAndroid Build Coastguard Worker
1012*58b9f456SAndroid Build Coastguard Workerpublic:
1013*58b9f456SAndroid Build Coastguard Worker    regex_traits();
1014*58b9f456SAndroid Build Coastguard Worker
1015*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1016*58b9f456SAndroid Build Coastguard Worker    static size_t length(const char_type* __p)
1017*58b9f456SAndroid Build Coastguard Worker        {return char_traits<char_type>::length(__p);}
1018*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1019*58b9f456SAndroid Build Coastguard Worker    char_type translate(char_type __c) const {return __c;}
1020*58b9f456SAndroid Build Coastguard Worker    char_type translate_nocase(char_type __c) const;
1021*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
1022*58b9f456SAndroid Build Coastguard Worker        string_type
1023*58b9f456SAndroid Build Coastguard Worker        transform(_ForwardIterator __f, _ForwardIterator __l) const;
1024*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
1025*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
1026*58b9f456SAndroid Build Coastguard Worker        string_type
1027*58b9f456SAndroid Build Coastguard Worker        transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
1028*58b9f456SAndroid Build Coastguard Worker            {return __transform_primary(__f, __l, char_type());}
1029*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
1030*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
1031*58b9f456SAndroid Build Coastguard Worker        string_type
1032*58b9f456SAndroid Build Coastguard Worker        lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
1033*58b9f456SAndroid Build Coastguard Worker            {return __lookup_collatename(__f, __l, char_type());}
1034*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
1035*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
1036*58b9f456SAndroid Build Coastguard Worker        char_class_type
1037*58b9f456SAndroid Build Coastguard Worker        lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1038*58b9f456SAndroid Build Coastguard Worker                         bool __icase = false) const
1039*58b9f456SAndroid Build Coastguard Worker            {return __lookup_classname(__f, __l, __icase, char_type());}
1040*58b9f456SAndroid Build Coastguard Worker    bool isctype(char_type __c, char_class_type __m) const;
1041*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1042*58b9f456SAndroid Build Coastguard Worker    int value(char_type __ch, int __radix) const
1043*58b9f456SAndroid Build Coastguard Worker        {return __regex_traits_value(__ch, __radix);}
1044*58b9f456SAndroid Build Coastguard Worker    locale_type imbue(locale_type __l);
1045*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1046*58b9f456SAndroid Build Coastguard Worker    locale_type getloc()const {return __loc_;}
1047*58b9f456SAndroid Build Coastguard Worker
1048*58b9f456SAndroid Build Coastguard Workerprivate:
1049*58b9f456SAndroid Build Coastguard Worker    void __init();
1050*58b9f456SAndroid Build Coastguard Worker
1051*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
1052*58b9f456SAndroid Build Coastguard Worker        string_type
1053*58b9f456SAndroid Build Coastguard Worker        __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
1054*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
1055*58b9f456SAndroid Build Coastguard Worker        string_type
1056*58b9f456SAndroid Build Coastguard Worker        __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
1057*58b9f456SAndroid Build Coastguard Worker
1058*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
1059*58b9f456SAndroid Build Coastguard Worker        string_type
1060*58b9f456SAndroid Build Coastguard Worker        __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
1061*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
1062*58b9f456SAndroid Build Coastguard Worker        string_type
1063*58b9f456SAndroid Build Coastguard Worker        __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
1064*58b9f456SAndroid Build Coastguard Worker
1065*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
1066*58b9f456SAndroid Build Coastguard Worker        char_class_type
1067*58b9f456SAndroid Build Coastguard Worker        __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1068*58b9f456SAndroid Build Coastguard Worker                           bool __icase, char) const;
1069*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
1070*58b9f456SAndroid Build Coastguard Worker        char_class_type
1071*58b9f456SAndroid Build Coastguard Worker        __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1072*58b9f456SAndroid Build Coastguard Worker                           bool __icase, wchar_t) const;
1073*58b9f456SAndroid Build Coastguard Worker
1074*58b9f456SAndroid Build Coastguard Worker    static int __regex_traits_value(unsigned char __ch, int __radix);
1075*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1076*58b9f456SAndroid Build Coastguard Worker    int __regex_traits_value(char __ch, int __radix) const
1077*58b9f456SAndroid Build Coastguard Worker        {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
1078*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1079*58b9f456SAndroid Build Coastguard Worker    int __regex_traits_value(wchar_t __ch, int __radix) const;
1080*58b9f456SAndroid Build Coastguard Worker};
1081*58b9f456SAndroid Build Coastguard Worker
1082*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1083*58b9f456SAndroid Build Coastguard Workerconst typename regex_traits<_CharT>::char_class_type
1084*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::__regex_word;
1085*58b9f456SAndroid Build Coastguard Worker
1086*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1087*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::regex_traits()
1088*58b9f456SAndroid Build Coastguard Worker{
1089*58b9f456SAndroid Build Coastguard Worker    __init();
1090*58b9f456SAndroid Build Coastguard Worker}
1091*58b9f456SAndroid Build Coastguard Worker
1092*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1093*58b9f456SAndroid Build Coastguard Workertypename regex_traits<_CharT>::char_type
1094*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::translate_nocase(char_type __c) const
1095*58b9f456SAndroid Build Coastguard Worker{
1096*58b9f456SAndroid Build Coastguard Worker    return __ct_->tolower(__c);
1097*58b9f456SAndroid Build Coastguard Worker}
1098*58b9f456SAndroid Build Coastguard Worker
1099*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1100*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
1101*58b9f456SAndroid Build Coastguard Workertypename regex_traits<_CharT>::string_type
1102*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
1103*58b9f456SAndroid Build Coastguard Worker{
1104*58b9f456SAndroid Build Coastguard Worker    string_type __s(__f, __l);
1105*58b9f456SAndroid Build Coastguard Worker    return __col_->transform(__s.data(), __s.data() + __s.size());
1106*58b9f456SAndroid Build Coastguard Worker}
1107*58b9f456SAndroid Build Coastguard Worker
1108*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1109*58b9f456SAndroid Build Coastguard Workervoid
1110*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::__init()
1111*58b9f456SAndroid Build Coastguard Worker{
1112*58b9f456SAndroid Build Coastguard Worker    __ct_ = &use_facet<ctype<char_type> >(__loc_);
1113*58b9f456SAndroid Build Coastguard Worker    __col_ = &use_facet<collate<char_type> >(__loc_);
1114*58b9f456SAndroid Build Coastguard Worker}
1115*58b9f456SAndroid Build Coastguard Worker
1116*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1117*58b9f456SAndroid Build Coastguard Workertypename regex_traits<_CharT>::locale_type
1118*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::imbue(locale_type __l)
1119*58b9f456SAndroid Build Coastguard Worker{
1120*58b9f456SAndroid Build Coastguard Worker    locale __r = __loc_;
1121*58b9f456SAndroid Build Coastguard Worker    __loc_ = __l;
1122*58b9f456SAndroid Build Coastguard Worker    __init();
1123*58b9f456SAndroid Build Coastguard Worker    return __r;
1124*58b9f456SAndroid Build Coastguard Worker}
1125*58b9f456SAndroid Build Coastguard Worker
1126*58b9f456SAndroid Build Coastguard Worker// transform_primary is very FreeBSD-specific
1127*58b9f456SAndroid Build Coastguard Worker
1128*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1129*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
1130*58b9f456SAndroid Build Coastguard Workertypename regex_traits<_CharT>::string_type
1131*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1132*58b9f456SAndroid Build Coastguard Worker                                          _ForwardIterator __l, char) const
1133*58b9f456SAndroid Build Coastguard Worker{
1134*58b9f456SAndroid Build Coastguard Worker    const string_type __s(__f, __l);
1135*58b9f456SAndroid Build Coastguard Worker    string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1136*58b9f456SAndroid Build Coastguard Worker    switch (__d.size())
1137*58b9f456SAndroid Build Coastguard Worker    {
1138*58b9f456SAndroid Build Coastguard Worker    case 1:
1139*58b9f456SAndroid Build Coastguard Worker        break;
1140*58b9f456SAndroid Build Coastguard Worker    case 12:
1141*58b9f456SAndroid Build Coastguard Worker        __d[11] = __d[3];
1142*58b9f456SAndroid Build Coastguard Worker        break;
1143*58b9f456SAndroid Build Coastguard Worker    default:
1144*58b9f456SAndroid Build Coastguard Worker        __d.clear();
1145*58b9f456SAndroid Build Coastguard Worker        break;
1146*58b9f456SAndroid Build Coastguard Worker    }
1147*58b9f456SAndroid Build Coastguard Worker    return __d;
1148*58b9f456SAndroid Build Coastguard Worker}
1149*58b9f456SAndroid Build Coastguard Worker
1150*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1151*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
1152*58b9f456SAndroid Build Coastguard Workertypename regex_traits<_CharT>::string_type
1153*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1154*58b9f456SAndroid Build Coastguard Worker                                          _ForwardIterator __l, wchar_t) const
1155*58b9f456SAndroid Build Coastguard Worker{
1156*58b9f456SAndroid Build Coastguard Worker    const string_type __s(__f, __l);
1157*58b9f456SAndroid Build Coastguard Worker    string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1158*58b9f456SAndroid Build Coastguard Worker    switch (__d.size())
1159*58b9f456SAndroid Build Coastguard Worker    {
1160*58b9f456SAndroid Build Coastguard Worker    case 1:
1161*58b9f456SAndroid Build Coastguard Worker        break;
1162*58b9f456SAndroid Build Coastguard Worker    case 3:
1163*58b9f456SAndroid Build Coastguard Worker        __d[2] = __d[0];
1164*58b9f456SAndroid Build Coastguard Worker        break;
1165*58b9f456SAndroid Build Coastguard Worker    default:
1166*58b9f456SAndroid Build Coastguard Worker        __d.clear();
1167*58b9f456SAndroid Build Coastguard Worker        break;
1168*58b9f456SAndroid Build Coastguard Worker    }
1169*58b9f456SAndroid Build Coastguard Worker    return __d;
1170*58b9f456SAndroid Build Coastguard Worker}
1171*58b9f456SAndroid Build Coastguard Worker
1172*58b9f456SAndroid Build Coastguard Worker// lookup_collatename is very FreeBSD-specific
1173*58b9f456SAndroid Build Coastguard Worker
1174*58b9f456SAndroid Build Coastguard Worker_LIBCPP_FUNC_VIS string __get_collation_name(const char* __s);
1175*58b9f456SAndroid Build Coastguard Worker
1176*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1177*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
1178*58b9f456SAndroid Build Coastguard Workertypename regex_traits<_CharT>::string_type
1179*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1180*58b9f456SAndroid Build Coastguard Worker                                           _ForwardIterator __l, char) const
1181*58b9f456SAndroid Build Coastguard Worker{
1182*58b9f456SAndroid Build Coastguard Worker    string_type __s(__f, __l);
1183*58b9f456SAndroid Build Coastguard Worker    string_type __r;
1184*58b9f456SAndroid Build Coastguard Worker    if (!__s.empty())
1185*58b9f456SAndroid Build Coastguard Worker    {
1186*58b9f456SAndroid Build Coastguard Worker        __r = __get_collation_name(__s.c_str());
1187*58b9f456SAndroid Build Coastguard Worker        if (__r.empty() && __s.size() <= 2)
1188*58b9f456SAndroid Build Coastguard Worker        {
1189*58b9f456SAndroid Build Coastguard Worker            __r = __col_->transform(__s.data(), __s.data() + __s.size());
1190*58b9f456SAndroid Build Coastguard Worker            if (__r.size() == 1 || __r.size() == 12)
1191*58b9f456SAndroid Build Coastguard Worker                __r = __s;
1192*58b9f456SAndroid Build Coastguard Worker            else
1193*58b9f456SAndroid Build Coastguard Worker                __r.clear();
1194*58b9f456SAndroid Build Coastguard Worker        }
1195*58b9f456SAndroid Build Coastguard Worker    }
1196*58b9f456SAndroid Build Coastguard Worker    return __r;
1197*58b9f456SAndroid Build Coastguard Worker}
1198*58b9f456SAndroid Build Coastguard Worker
1199*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1200*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
1201*58b9f456SAndroid Build Coastguard Workertypename regex_traits<_CharT>::string_type
1202*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1203*58b9f456SAndroid Build Coastguard Worker                                           _ForwardIterator __l, wchar_t) const
1204*58b9f456SAndroid Build Coastguard Worker{
1205*58b9f456SAndroid Build Coastguard Worker    string_type __s(__f, __l);
1206*58b9f456SAndroid Build Coastguard Worker    string __n;
1207*58b9f456SAndroid Build Coastguard Worker    __n.reserve(__s.size());
1208*58b9f456SAndroid Build Coastguard Worker    for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1209*58b9f456SAndroid Build Coastguard Worker                                                              __i != __e; ++__i)
1210*58b9f456SAndroid Build Coastguard Worker    {
1211*58b9f456SAndroid Build Coastguard Worker        if (static_cast<unsigned>(*__i) >= 127)
1212*58b9f456SAndroid Build Coastguard Worker            return string_type();
1213*58b9f456SAndroid Build Coastguard Worker        __n.push_back(char(*__i));
1214*58b9f456SAndroid Build Coastguard Worker    }
1215*58b9f456SAndroid Build Coastguard Worker    string_type __r;
1216*58b9f456SAndroid Build Coastguard Worker    if (!__s.empty())
1217*58b9f456SAndroid Build Coastguard Worker    {
1218*58b9f456SAndroid Build Coastguard Worker        __n = __get_collation_name(__n.c_str());
1219*58b9f456SAndroid Build Coastguard Worker        if (!__n.empty())
1220*58b9f456SAndroid Build Coastguard Worker            __r.assign(__n.begin(), __n.end());
1221*58b9f456SAndroid Build Coastguard Worker        else if (__s.size() <= 2)
1222*58b9f456SAndroid Build Coastguard Worker        {
1223*58b9f456SAndroid Build Coastguard Worker            __r = __col_->transform(__s.data(), __s.data() + __s.size());
1224*58b9f456SAndroid Build Coastguard Worker            if (__r.size() == 1 || __r.size() == 3)
1225*58b9f456SAndroid Build Coastguard Worker                __r = __s;
1226*58b9f456SAndroid Build Coastguard Worker            else
1227*58b9f456SAndroid Build Coastguard Worker                __r.clear();
1228*58b9f456SAndroid Build Coastguard Worker        }
1229*58b9f456SAndroid Build Coastguard Worker    }
1230*58b9f456SAndroid Build Coastguard Worker    return __r;
1231*58b9f456SAndroid Build Coastguard Worker}
1232*58b9f456SAndroid Build Coastguard Worker
1233*58b9f456SAndroid Build Coastguard Worker// lookup_classname
1234*58b9f456SAndroid Build Coastguard Worker
1235*58b9f456SAndroid Build Coastguard Workerregex_traits<char>::char_class_type _LIBCPP_FUNC_VIS
1236*58b9f456SAndroid Build Coastguard Worker__get_classname(const char* __s, bool __icase);
1237*58b9f456SAndroid Build Coastguard Worker
1238*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1239*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
1240*58b9f456SAndroid Build Coastguard Workertypename regex_traits<_CharT>::char_class_type
1241*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1242*58b9f456SAndroid Build Coastguard Worker                                         _ForwardIterator __l,
1243*58b9f456SAndroid Build Coastguard Worker                                         bool __icase, char) const
1244*58b9f456SAndroid Build Coastguard Worker{
1245*58b9f456SAndroid Build Coastguard Worker    string_type __s(__f, __l);
1246*58b9f456SAndroid Build Coastguard Worker    __ct_->tolower(&__s[0], &__s[0] + __s.size());
1247*58b9f456SAndroid Build Coastguard Worker    return __get_classname(__s.c_str(), __icase);
1248*58b9f456SAndroid Build Coastguard Worker}
1249*58b9f456SAndroid Build Coastguard Worker
1250*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1251*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
1252*58b9f456SAndroid Build Coastguard Workertypename regex_traits<_CharT>::char_class_type
1253*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1254*58b9f456SAndroid Build Coastguard Worker                                         _ForwardIterator __l,
1255*58b9f456SAndroid Build Coastguard Worker                                         bool __icase, wchar_t) const
1256*58b9f456SAndroid Build Coastguard Worker{
1257*58b9f456SAndroid Build Coastguard Worker    string_type __s(__f, __l);
1258*58b9f456SAndroid Build Coastguard Worker    __ct_->tolower(&__s[0], &__s[0] + __s.size());
1259*58b9f456SAndroid Build Coastguard Worker    string __n;
1260*58b9f456SAndroid Build Coastguard Worker    __n.reserve(__s.size());
1261*58b9f456SAndroid Build Coastguard Worker    for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1262*58b9f456SAndroid Build Coastguard Worker                                                              __i != __e; ++__i)
1263*58b9f456SAndroid Build Coastguard Worker    {
1264*58b9f456SAndroid Build Coastguard Worker        if (static_cast<unsigned>(*__i) >= 127)
1265*58b9f456SAndroid Build Coastguard Worker            return char_class_type();
1266*58b9f456SAndroid Build Coastguard Worker        __n.push_back(char(*__i));
1267*58b9f456SAndroid Build Coastguard Worker    }
1268*58b9f456SAndroid Build Coastguard Worker    return __get_classname(__n.c_str(), __icase);
1269*58b9f456SAndroid Build Coastguard Worker}
1270*58b9f456SAndroid Build Coastguard Worker
1271*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1272*58b9f456SAndroid Build Coastguard Workerbool
1273*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
1274*58b9f456SAndroid Build Coastguard Worker{
1275*58b9f456SAndroid Build Coastguard Worker    if (__ct_->is(__m, __c))
1276*58b9f456SAndroid Build Coastguard Worker        return true;
1277*58b9f456SAndroid Build Coastguard Worker    return (__c == '_' && (__m & __regex_word));
1278*58b9f456SAndroid Build Coastguard Worker}
1279*58b9f456SAndroid Build Coastguard Worker
1280*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1281*58b9f456SAndroid Build Coastguard Workerint
1282*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
1283*58b9f456SAndroid Build Coastguard Worker{
1284*58b9f456SAndroid Build Coastguard Worker    if ((__ch & 0xF8u) == 0x30)  // '0' <= __ch && __ch <= '7'
1285*58b9f456SAndroid Build Coastguard Worker        return __ch - '0';
1286*58b9f456SAndroid Build Coastguard Worker    if (__radix != 8)
1287*58b9f456SAndroid Build Coastguard Worker    {
1288*58b9f456SAndroid Build Coastguard Worker        if ((__ch & 0xFEu) == 0x38)  // '8' <= __ch && __ch <= '9'
1289*58b9f456SAndroid Build Coastguard Worker            return __ch - '0';
1290*58b9f456SAndroid Build Coastguard Worker        if (__radix == 16)
1291*58b9f456SAndroid Build Coastguard Worker        {
1292*58b9f456SAndroid Build Coastguard Worker            __ch |= 0x20;  // tolower
1293*58b9f456SAndroid Build Coastguard Worker            if ('a' <= __ch && __ch <= 'f')
1294*58b9f456SAndroid Build Coastguard Worker                return __ch - ('a' - 10);
1295*58b9f456SAndroid Build Coastguard Worker        }
1296*58b9f456SAndroid Build Coastguard Worker    }
1297*58b9f456SAndroid Build Coastguard Worker    return -1;
1298*58b9f456SAndroid Build Coastguard Worker}
1299*58b9f456SAndroid Build Coastguard Worker
1300*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1301*58b9f456SAndroid Build Coastguard Workerinline
1302*58b9f456SAndroid Build Coastguard Workerint
1303*58b9f456SAndroid Build Coastguard Workerregex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
1304*58b9f456SAndroid Build Coastguard Worker{
1305*58b9f456SAndroid Build Coastguard Worker    return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
1306*58b9f456SAndroid Build Coastguard Worker}
1307*58b9f456SAndroid Build Coastguard Worker
1308*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT> class __node;
1309*58b9f456SAndroid Build Coastguard Worker
1310*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator> class _LIBCPP_TEMPLATE_VIS sub_match;
1311*58b9f456SAndroid Build Coastguard Worker
1312*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator,
1313*58b9f456SAndroid Build Coastguard Worker          class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
1314*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS match_results;
1315*58b9f456SAndroid Build Coastguard Worker
1316*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1317*58b9f456SAndroid Build Coastguard Workerstruct __state
1318*58b9f456SAndroid Build Coastguard Worker{
1319*58b9f456SAndroid Build Coastguard Worker    enum
1320*58b9f456SAndroid Build Coastguard Worker    {
1321*58b9f456SAndroid Build Coastguard Worker        __end_state = -1000,
1322*58b9f456SAndroid Build Coastguard Worker        __consume_input,  // -999
1323*58b9f456SAndroid Build Coastguard Worker        __begin_marked_expr, // -998
1324*58b9f456SAndroid Build Coastguard Worker        __end_marked_expr,   // -997
1325*58b9f456SAndroid Build Coastguard Worker        __pop_state,           // -996
1326*58b9f456SAndroid Build Coastguard Worker        __accept_and_consume,  // -995
1327*58b9f456SAndroid Build Coastguard Worker        __accept_but_not_consume,  // -994
1328*58b9f456SAndroid Build Coastguard Worker        __reject,                  // -993
1329*58b9f456SAndroid Build Coastguard Worker        __split,
1330*58b9f456SAndroid Build Coastguard Worker        __repeat
1331*58b9f456SAndroid Build Coastguard Worker    };
1332*58b9f456SAndroid Build Coastguard Worker
1333*58b9f456SAndroid Build Coastguard Worker    int __do_;
1334*58b9f456SAndroid Build Coastguard Worker    const _CharT* __first_;
1335*58b9f456SAndroid Build Coastguard Worker    const _CharT* __current_;
1336*58b9f456SAndroid Build Coastguard Worker    const _CharT* __last_;
1337*58b9f456SAndroid Build Coastguard Worker    vector<sub_match<const _CharT*> > __sub_matches_;
1338*58b9f456SAndroid Build Coastguard Worker    vector<pair<size_t, const _CharT*> > __loop_data_;
1339*58b9f456SAndroid Build Coastguard Worker    const __node<_CharT>* __node_;
1340*58b9f456SAndroid Build Coastguard Worker    regex_constants::match_flag_type __flags_;
1341*58b9f456SAndroid Build Coastguard Worker    bool __at_first_;
1342*58b9f456SAndroid Build Coastguard Worker
1343*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1344*58b9f456SAndroid Build Coastguard Worker    __state()
1345*58b9f456SAndroid Build Coastguard Worker        : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
1346*58b9f456SAndroid Build Coastguard Worker          __node_(nullptr), __flags_() {}
1347*58b9f456SAndroid Build Coastguard Worker};
1348*58b9f456SAndroid Build Coastguard Worker
1349*58b9f456SAndroid Build Coastguard Worker// __node
1350*58b9f456SAndroid Build Coastguard Worker
1351*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1352*58b9f456SAndroid Build Coastguard Workerclass __node
1353*58b9f456SAndroid Build Coastguard Worker{
1354*58b9f456SAndroid Build Coastguard Worker    __node(const __node&);
1355*58b9f456SAndroid Build Coastguard Worker    __node& operator=(const __node&);
1356*58b9f456SAndroid Build Coastguard Workerpublic:
1357*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1358*58b9f456SAndroid Build Coastguard Worker
1359*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1360*58b9f456SAndroid Build Coastguard Worker    __node() {}
1361*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1362*58b9f456SAndroid Build Coastguard Worker    virtual ~__node() {}
1363*58b9f456SAndroid Build Coastguard Worker
1364*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1365*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const {}
1366*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1367*58b9f456SAndroid Build Coastguard Worker    virtual void __exec_split(bool, __state&) const {}
1368*58b9f456SAndroid Build Coastguard Worker};
1369*58b9f456SAndroid Build Coastguard Worker
1370*58b9f456SAndroid Build Coastguard Worker// __end_state
1371*58b9f456SAndroid Build Coastguard Worker
1372*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1373*58b9f456SAndroid Build Coastguard Workerclass __end_state
1374*58b9f456SAndroid Build Coastguard Worker    : public __node<_CharT>
1375*58b9f456SAndroid Build Coastguard Worker{
1376*58b9f456SAndroid Build Coastguard Workerpublic:
1377*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1378*58b9f456SAndroid Build Coastguard Worker
1379*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1380*58b9f456SAndroid Build Coastguard Worker    __end_state() {}
1381*58b9f456SAndroid Build Coastguard Worker
1382*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
1383*58b9f456SAndroid Build Coastguard Worker};
1384*58b9f456SAndroid Build Coastguard Worker
1385*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1386*58b9f456SAndroid Build Coastguard Workervoid
1387*58b9f456SAndroid Build Coastguard Worker__end_state<_CharT>::__exec(__state& __s) const
1388*58b9f456SAndroid Build Coastguard Worker{
1389*58b9f456SAndroid Build Coastguard Worker    __s.__do_ = __state::__end_state;
1390*58b9f456SAndroid Build Coastguard Worker}
1391*58b9f456SAndroid Build Coastguard Worker
1392*58b9f456SAndroid Build Coastguard Worker// __has_one_state
1393*58b9f456SAndroid Build Coastguard Worker
1394*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1395*58b9f456SAndroid Build Coastguard Workerclass __has_one_state
1396*58b9f456SAndroid Build Coastguard Worker    : public __node<_CharT>
1397*58b9f456SAndroid Build Coastguard Worker{
1398*58b9f456SAndroid Build Coastguard Worker    __node<_CharT>* __first_;
1399*58b9f456SAndroid Build Coastguard Worker
1400*58b9f456SAndroid Build Coastguard Workerpublic:
1401*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1402*58b9f456SAndroid Build Coastguard Worker    explicit __has_one_state(__node<_CharT>* __s)
1403*58b9f456SAndroid Build Coastguard Worker        : __first_(__s) {}
1404*58b9f456SAndroid Build Coastguard Worker
1405*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1406*58b9f456SAndroid Build Coastguard Worker    __node<_CharT>*  first() const {return __first_;}
1407*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1408*58b9f456SAndroid Build Coastguard Worker    __node<_CharT>*& first()       {return __first_;}
1409*58b9f456SAndroid Build Coastguard Worker};
1410*58b9f456SAndroid Build Coastguard Worker
1411*58b9f456SAndroid Build Coastguard Worker// __owns_one_state
1412*58b9f456SAndroid Build Coastguard Worker
1413*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1414*58b9f456SAndroid Build Coastguard Workerclass __owns_one_state
1415*58b9f456SAndroid Build Coastguard Worker    : public __has_one_state<_CharT>
1416*58b9f456SAndroid Build Coastguard Worker{
1417*58b9f456SAndroid Build Coastguard Worker    typedef __has_one_state<_CharT> base;
1418*58b9f456SAndroid Build Coastguard Worker
1419*58b9f456SAndroid Build Coastguard Workerpublic:
1420*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1421*58b9f456SAndroid Build Coastguard Worker    explicit __owns_one_state(__node<_CharT>* __s)
1422*58b9f456SAndroid Build Coastguard Worker        : base(__s) {}
1423*58b9f456SAndroid Build Coastguard Worker
1424*58b9f456SAndroid Build Coastguard Worker    virtual ~__owns_one_state();
1425*58b9f456SAndroid Build Coastguard Worker};
1426*58b9f456SAndroid Build Coastguard Worker
1427*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1428*58b9f456SAndroid Build Coastguard Worker__owns_one_state<_CharT>::~__owns_one_state()
1429*58b9f456SAndroid Build Coastguard Worker{
1430*58b9f456SAndroid Build Coastguard Worker    delete this->first();
1431*58b9f456SAndroid Build Coastguard Worker}
1432*58b9f456SAndroid Build Coastguard Worker
1433*58b9f456SAndroid Build Coastguard Worker// __empty_state
1434*58b9f456SAndroid Build Coastguard Worker
1435*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1436*58b9f456SAndroid Build Coastguard Workerclass __empty_state
1437*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
1438*58b9f456SAndroid Build Coastguard Worker{
1439*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
1440*58b9f456SAndroid Build Coastguard Worker
1441*58b9f456SAndroid Build Coastguard Workerpublic:
1442*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1443*58b9f456SAndroid Build Coastguard Worker
1444*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1445*58b9f456SAndroid Build Coastguard Worker    explicit __empty_state(__node<_CharT>* __s)
1446*58b9f456SAndroid Build Coastguard Worker        : base(__s) {}
1447*58b9f456SAndroid Build Coastguard Worker
1448*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
1449*58b9f456SAndroid Build Coastguard Worker};
1450*58b9f456SAndroid Build Coastguard Worker
1451*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1452*58b9f456SAndroid Build Coastguard Workervoid
1453*58b9f456SAndroid Build Coastguard Worker__empty_state<_CharT>::__exec(__state& __s) const
1454*58b9f456SAndroid Build Coastguard Worker{
1455*58b9f456SAndroid Build Coastguard Worker    __s.__do_ = __state::__accept_but_not_consume;
1456*58b9f456SAndroid Build Coastguard Worker    __s.__node_ = this->first();
1457*58b9f456SAndroid Build Coastguard Worker}
1458*58b9f456SAndroid Build Coastguard Worker
1459*58b9f456SAndroid Build Coastguard Worker// __empty_non_own_state
1460*58b9f456SAndroid Build Coastguard Worker
1461*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1462*58b9f456SAndroid Build Coastguard Workerclass __empty_non_own_state
1463*58b9f456SAndroid Build Coastguard Worker    : public __has_one_state<_CharT>
1464*58b9f456SAndroid Build Coastguard Worker{
1465*58b9f456SAndroid Build Coastguard Worker    typedef __has_one_state<_CharT> base;
1466*58b9f456SAndroid Build Coastguard Worker
1467*58b9f456SAndroid Build Coastguard Workerpublic:
1468*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1469*58b9f456SAndroid Build Coastguard Worker
1470*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1471*58b9f456SAndroid Build Coastguard Worker    explicit __empty_non_own_state(__node<_CharT>* __s)
1472*58b9f456SAndroid Build Coastguard Worker        : base(__s) {}
1473*58b9f456SAndroid Build Coastguard Worker
1474*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
1475*58b9f456SAndroid Build Coastguard Worker};
1476*58b9f456SAndroid Build Coastguard Worker
1477*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1478*58b9f456SAndroid Build Coastguard Workervoid
1479*58b9f456SAndroid Build Coastguard Worker__empty_non_own_state<_CharT>::__exec(__state& __s) const
1480*58b9f456SAndroid Build Coastguard Worker{
1481*58b9f456SAndroid Build Coastguard Worker    __s.__do_ = __state::__accept_but_not_consume;
1482*58b9f456SAndroid Build Coastguard Worker    __s.__node_ = this->first();
1483*58b9f456SAndroid Build Coastguard Worker}
1484*58b9f456SAndroid Build Coastguard Worker
1485*58b9f456SAndroid Build Coastguard Worker// __repeat_one_loop
1486*58b9f456SAndroid Build Coastguard Worker
1487*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1488*58b9f456SAndroid Build Coastguard Workerclass __repeat_one_loop
1489*58b9f456SAndroid Build Coastguard Worker    : public __has_one_state<_CharT>
1490*58b9f456SAndroid Build Coastguard Worker{
1491*58b9f456SAndroid Build Coastguard Worker    typedef __has_one_state<_CharT> base;
1492*58b9f456SAndroid Build Coastguard Worker
1493*58b9f456SAndroid Build Coastguard Workerpublic:
1494*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1495*58b9f456SAndroid Build Coastguard Worker
1496*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1497*58b9f456SAndroid Build Coastguard Worker    explicit __repeat_one_loop(__node<_CharT>* __s)
1498*58b9f456SAndroid Build Coastguard Worker        : base(__s) {}
1499*58b9f456SAndroid Build Coastguard Worker
1500*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
1501*58b9f456SAndroid Build Coastguard Worker};
1502*58b9f456SAndroid Build Coastguard Worker
1503*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1504*58b9f456SAndroid Build Coastguard Workervoid
1505*58b9f456SAndroid Build Coastguard Worker__repeat_one_loop<_CharT>::__exec(__state& __s) const
1506*58b9f456SAndroid Build Coastguard Worker{
1507*58b9f456SAndroid Build Coastguard Worker    __s.__do_ = __state::__repeat;
1508*58b9f456SAndroid Build Coastguard Worker    __s.__node_ = this->first();
1509*58b9f456SAndroid Build Coastguard Worker}
1510*58b9f456SAndroid Build Coastguard Worker
1511*58b9f456SAndroid Build Coastguard Worker// __owns_two_states
1512*58b9f456SAndroid Build Coastguard Worker
1513*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1514*58b9f456SAndroid Build Coastguard Workerclass __owns_two_states
1515*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
1516*58b9f456SAndroid Build Coastguard Worker{
1517*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
1518*58b9f456SAndroid Build Coastguard Worker
1519*58b9f456SAndroid Build Coastguard Worker    base* __second_;
1520*58b9f456SAndroid Build Coastguard Worker
1521*58b9f456SAndroid Build Coastguard Workerpublic:
1522*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1523*58b9f456SAndroid Build Coastguard Worker    explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
1524*58b9f456SAndroid Build Coastguard Worker        : base(__s1), __second_(__s2) {}
1525*58b9f456SAndroid Build Coastguard Worker
1526*58b9f456SAndroid Build Coastguard Worker    virtual ~__owns_two_states();
1527*58b9f456SAndroid Build Coastguard Worker
1528*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1529*58b9f456SAndroid Build Coastguard Worker    base*  second() const {return __second_;}
1530*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1531*58b9f456SAndroid Build Coastguard Worker    base*& second()       {return __second_;}
1532*58b9f456SAndroid Build Coastguard Worker};
1533*58b9f456SAndroid Build Coastguard Worker
1534*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1535*58b9f456SAndroid Build Coastguard Worker__owns_two_states<_CharT>::~__owns_two_states()
1536*58b9f456SAndroid Build Coastguard Worker{
1537*58b9f456SAndroid Build Coastguard Worker    delete __second_;
1538*58b9f456SAndroid Build Coastguard Worker}
1539*58b9f456SAndroid Build Coastguard Worker
1540*58b9f456SAndroid Build Coastguard Worker// __loop
1541*58b9f456SAndroid Build Coastguard Worker
1542*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1543*58b9f456SAndroid Build Coastguard Workerclass __loop
1544*58b9f456SAndroid Build Coastguard Worker    : public __owns_two_states<_CharT>
1545*58b9f456SAndroid Build Coastguard Worker{
1546*58b9f456SAndroid Build Coastguard Worker    typedef __owns_two_states<_CharT> base;
1547*58b9f456SAndroid Build Coastguard Worker
1548*58b9f456SAndroid Build Coastguard Worker    size_t __min_;
1549*58b9f456SAndroid Build Coastguard Worker    size_t __max_;
1550*58b9f456SAndroid Build Coastguard Worker    unsigned __loop_id_;
1551*58b9f456SAndroid Build Coastguard Worker    unsigned __mexp_begin_;
1552*58b9f456SAndroid Build Coastguard Worker    unsigned __mexp_end_;
1553*58b9f456SAndroid Build Coastguard Worker    bool __greedy_;
1554*58b9f456SAndroid Build Coastguard Worker
1555*58b9f456SAndroid Build Coastguard Workerpublic:
1556*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1557*58b9f456SAndroid Build Coastguard Worker
1558*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1559*58b9f456SAndroid Build Coastguard Worker    explicit __loop(unsigned __loop_id,
1560*58b9f456SAndroid Build Coastguard Worker                          __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
1561*58b9f456SAndroid Build Coastguard Worker                          unsigned __mexp_begin, unsigned __mexp_end,
1562*58b9f456SAndroid Build Coastguard Worker                          bool __greedy = true,
1563*58b9f456SAndroid Build Coastguard Worker                          size_t __min = 0,
1564*58b9f456SAndroid Build Coastguard Worker                          size_t __max = numeric_limits<size_t>::max())
1565*58b9f456SAndroid Build Coastguard Worker        : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
1566*58b9f456SAndroid Build Coastguard Worker          __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
1567*58b9f456SAndroid Build Coastguard Worker          __greedy_(__greedy) {}
1568*58b9f456SAndroid Build Coastguard Worker
1569*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state& __s) const;
1570*58b9f456SAndroid Build Coastguard Worker    virtual void __exec_split(bool __second, __state& __s) const;
1571*58b9f456SAndroid Build Coastguard Worker
1572*58b9f456SAndroid Build Coastguard Workerprivate:
1573*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1574*58b9f456SAndroid Build Coastguard Worker    void __init_repeat(__state& __s) const
1575*58b9f456SAndroid Build Coastguard Worker    {
1576*58b9f456SAndroid Build Coastguard Worker        __s.__loop_data_[__loop_id_].second = __s.__current_;
1577*58b9f456SAndroid Build Coastguard Worker        for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
1578*58b9f456SAndroid Build Coastguard Worker        {
1579*58b9f456SAndroid Build Coastguard Worker            __s.__sub_matches_[__i].first = __s.__last_;
1580*58b9f456SAndroid Build Coastguard Worker            __s.__sub_matches_[__i].second = __s.__last_;
1581*58b9f456SAndroid Build Coastguard Worker            __s.__sub_matches_[__i].matched = false;
1582*58b9f456SAndroid Build Coastguard Worker        }
1583*58b9f456SAndroid Build Coastguard Worker    }
1584*58b9f456SAndroid Build Coastguard Worker};
1585*58b9f456SAndroid Build Coastguard Worker
1586*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1587*58b9f456SAndroid Build Coastguard Workervoid
1588*58b9f456SAndroid Build Coastguard Worker__loop<_CharT>::__exec(__state& __s) const
1589*58b9f456SAndroid Build Coastguard Worker{
1590*58b9f456SAndroid Build Coastguard Worker    if (__s.__do_ == __state::__repeat)
1591*58b9f456SAndroid Build Coastguard Worker    {
1592*58b9f456SAndroid Build Coastguard Worker        bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
1593*58b9f456SAndroid Build Coastguard Worker        bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
1594*58b9f456SAndroid Build Coastguard Worker        if (__do_repeat && __do_alt &&
1595*58b9f456SAndroid Build Coastguard Worker                               __s.__loop_data_[__loop_id_].second == __s.__current_)
1596*58b9f456SAndroid Build Coastguard Worker            __do_repeat = false;
1597*58b9f456SAndroid Build Coastguard Worker        if (__do_repeat && __do_alt)
1598*58b9f456SAndroid Build Coastguard Worker            __s.__do_ = __state::__split;
1599*58b9f456SAndroid Build Coastguard Worker        else if (__do_repeat)
1600*58b9f456SAndroid Build Coastguard Worker        {
1601*58b9f456SAndroid Build Coastguard Worker            __s.__do_ = __state::__accept_but_not_consume;
1602*58b9f456SAndroid Build Coastguard Worker            __s.__node_ = this->first();
1603*58b9f456SAndroid Build Coastguard Worker            __init_repeat(__s);
1604*58b9f456SAndroid Build Coastguard Worker        }
1605*58b9f456SAndroid Build Coastguard Worker        else
1606*58b9f456SAndroid Build Coastguard Worker        {
1607*58b9f456SAndroid Build Coastguard Worker            __s.__do_ = __state::__accept_but_not_consume;
1608*58b9f456SAndroid Build Coastguard Worker            __s.__node_ = this->second();
1609*58b9f456SAndroid Build Coastguard Worker        }
1610*58b9f456SAndroid Build Coastguard Worker    }
1611*58b9f456SAndroid Build Coastguard Worker    else
1612*58b9f456SAndroid Build Coastguard Worker    {
1613*58b9f456SAndroid Build Coastguard Worker        __s.__loop_data_[__loop_id_].first = 0;
1614*58b9f456SAndroid Build Coastguard Worker        bool __do_repeat = 0 < __max_;
1615*58b9f456SAndroid Build Coastguard Worker        bool __do_alt = 0 >= __min_;
1616*58b9f456SAndroid Build Coastguard Worker        if (__do_repeat && __do_alt)
1617*58b9f456SAndroid Build Coastguard Worker            __s.__do_ = __state::__split;
1618*58b9f456SAndroid Build Coastguard Worker        else if (__do_repeat)
1619*58b9f456SAndroid Build Coastguard Worker        {
1620*58b9f456SAndroid Build Coastguard Worker            __s.__do_ = __state::__accept_but_not_consume;
1621*58b9f456SAndroid Build Coastguard Worker            __s.__node_ = this->first();
1622*58b9f456SAndroid Build Coastguard Worker            __init_repeat(__s);
1623*58b9f456SAndroid Build Coastguard Worker        }
1624*58b9f456SAndroid Build Coastguard Worker        else
1625*58b9f456SAndroid Build Coastguard Worker        {
1626*58b9f456SAndroid Build Coastguard Worker            __s.__do_ = __state::__accept_but_not_consume;
1627*58b9f456SAndroid Build Coastguard Worker            __s.__node_ = this->second();
1628*58b9f456SAndroid Build Coastguard Worker        }
1629*58b9f456SAndroid Build Coastguard Worker    }
1630*58b9f456SAndroid Build Coastguard Worker}
1631*58b9f456SAndroid Build Coastguard Worker
1632*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1633*58b9f456SAndroid Build Coastguard Workervoid
1634*58b9f456SAndroid Build Coastguard Worker__loop<_CharT>::__exec_split(bool __second, __state& __s) const
1635*58b9f456SAndroid Build Coastguard Worker{
1636*58b9f456SAndroid Build Coastguard Worker    __s.__do_ = __state::__accept_but_not_consume;
1637*58b9f456SAndroid Build Coastguard Worker    if (__greedy_ != __second)
1638*58b9f456SAndroid Build Coastguard Worker    {
1639*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->first();
1640*58b9f456SAndroid Build Coastguard Worker        __init_repeat(__s);
1641*58b9f456SAndroid Build Coastguard Worker    }
1642*58b9f456SAndroid Build Coastguard Worker    else
1643*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->second();
1644*58b9f456SAndroid Build Coastguard Worker}
1645*58b9f456SAndroid Build Coastguard Worker
1646*58b9f456SAndroid Build Coastguard Worker// __alternate
1647*58b9f456SAndroid Build Coastguard Worker
1648*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1649*58b9f456SAndroid Build Coastguard Workerclass __alternate
1650*58b9f456SAndroid Build Coastguard Worker    : public __owns_two_states<_CharT>
1651*58b9f456SAndroid Build Coastguard Worker{
1652*58b9f456SAndroid Build Coastguard Worker    typedef __owns_two_states<_CharT> base;
1653*58b9f456SAndroid Build Coastguard Worker
1654*58b9f456SAndroid Build Coastguard Workerpublic:
1655*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1656*58b9f456SAndroid Build Coastguard Worker
1657*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1658*58b9f456SAndroid Build Coastguard Worker    explicit __alternate(__owns_one_state<_CharT>* __s1,
1659*58b9f456SAndroid Build Coastguard Worker                         __owns_one_state<_CharT>* __s2)
1660*58b9f456SAndroid Build Coastguard Worker        : base(__s1, __s2) {}
1661*58b9f456SAndroid Build Coastguard Worker
1662*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state& __s) const;
1663*58b9f456SAndroid Build Coastguard Worker    virtual void __exec_split(bool __second, __state& __s) const;
1664*58b9f456SAndroid Build Coastguard Worker};
1665*58b9f456SAndroid Build Coastguard Worker
1666*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1667*58b9f456SAndroid Build Coastguard Workervoid
1668*58b9f456SAndroid Build Coastguard Worker__alternate<_CharT>::__exec(__state& __s) const
1669*58b9f456SAndroid Build Coastguard Worker{
1670*58b9f456SAndroid Build Coastguard Worker    __s.__do_ = __state::__split;
1671*58b9f456SAndroid Build Coastguard Worker}
1672*58b9f456SAndroid Build Coastguard Worker
1673*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1674*58b9f456SAndroid Build Coastguard Workervoid
1675*58b9f456SAndroid Build Coastguard Worker__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
1676*58b9f456SAndroid Build Coastguard Worker{
1677*58b9f456SAndroid Build Coastguard Worker    __s.__do_ = __state::__accept_but_not_consume;
1678*58b9f456SAndroid Build Coastguard Worker    if (__second)
1679*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->second();
1680*58b9f456SAndroid Build Coastguard Worker    else
1681*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->first();
1682*58b9f456SAndroid Build Coastguard Worker}
1683*58b9f456SAndroid Build Coastguard Worker
1684*58b9f456SAndroid Build Coastguard Worker// __begin_marked_subexpression
1685*58b9f456SAndroid Build Coastguard Worker
1686*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1687*58b9f456SAndroid Build Coastguard Workerclass __begin_marked_subexpression
1688*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
1689*58b9f456SAndroid Build Coastguard Worker{
1690*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
1691*58b9f456SAndroid Build Coastguard Worker
1692*58b9f456SAndroid Build Coastguard Worker    unsigned __mexp_;
1693*58b9f456SAndroid Build Coastguard Workerpublic:
1694*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1695*58b9f456SAndroid Build Coastguard Worker
1696*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1697*58b9f456SAndroid Build Coastguard Worker    explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
1698*58b9f456SAndroid Build Coastguard Worker        : base(__s), __mexp_(__mexp) {}
1699*58b9f456SAndroid Build Coastguard Worker
1700*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
1701*58b9f456SAndroid Build Coastguard Worker};
1702*58b9f456SAndroid Build Coastguard Worker
1703*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1704*58b9f456SAndroid Build Coastguard Workervoid
1705*58b9f456SAndroid Build Coastguard Worker__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
1706*58b9f456SAndroid Build Coastguard Worker{
1707*58b9f456SAndroid Build Coastguard Worker    __s.__do_ = __state::__accept_but_not_consume;
1708*58b9f456SAndroid Build Coastguard Worker    __s.__sub_matches_[__mexp_-1].first = __s.__current_;
1709*58b9f456SAndroid Build Coastguard Worker    __s.__node_ = this->first();
1710*58b9f456SAndroid Build Coastguard Worker}
1711*58b9f456SAndroid Build Coastguard Worker
1712*58b9f456SAndroid Build Coastguard Worker// __end_marked_subexpression
1713*58b9f456SAndroid Build Coastguard Worker
1714*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1715*58b9f456SAndroid Build Coastguard Workerclass __end_marked_subexpression
1716*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
1717*58b9f456SAndroid Build Coastguard Worker{
1718*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
1719*58b9f456SAndroid Build Coastguard Worker
1720*58b9f456SAndroid Build Coastguard Worker    unsigned __mexp_;
1721*58b9f456SAndroid Build Coastguard Workerpublic:
1722*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1723*58b9f456SAndroid Build Coastguard Worker
1724*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1725*58b9f456SAndroid Build Coastguard Worker    explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
1726*58b9f456SAndroid Build Coastguard Worker        : base(__s), __mexp_(__mexp) {}
1727*58b9f456SAndroid Build Coastguard Worker
1728*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
1729*58b9f456SAndroid Build Coastguard Worker};
1730*58b9f456SAndroid Build Coastguard Worker
1731*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1732*58b9f456SAndroid Build Coastguard Workervoid
1733*58b9f456SAndroid Build Coastguard Worker__end_marked_subexpression<_CharT>::__exec(__state& __s) const
1734*58b9f456SAndroid Build Coastguard Worker{
1735*58b9f456SAndroid Build Coastguard Worker    __s.__do_ = __state::__accept_but_not_consume;
1736*58b9f456SAndroid Build Coastguard Worker    __s.__sub_matches_[__mexp_-1].second = __s.__current_;
1737*58b9f456SAndroid Build Coastguard Worker    __s.__sub_matches_[__mexp_-1].matched = true;
1738*58b9f456SAndroid Build Coastguard Worker    __s.__node_ = this->first();
1739*58b9f456SAndroid Build Coastguard Worker}
1740*58b9f456SAndroid Build Coastguard Worker
1741*58b9f456SAndroid Build Coastguard Worker// __back_ref
1742*58b9f456SAndroid Build Coastguard Worker
1743*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1744*58b9f456SAndroid Build Coastguard Workerclass __back_ref
1745*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
1746*58b9f456SAndroid Build Coastguard Worker{
1747*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
1748*58b9f456SAndroid Build Coastguard Worker
1749*58b9f456SAndroid Build Coastguard Worker    unsigned __mexp_;
1750*58b9f456SAndroid Build Coastguard Workerpublic:
1751*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1752*58b9f456SAndroid Build Coastguard Worker
1753*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1754*58b9f456SAndroid Build Coastguard Worker    explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
1755*58b9f456SAndroid Build Coastguard Worker        : base(__s), __mexp_(__mexp) {}
1756*58b9f456SAndroid Build Coastguard Worker
1757*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
1758*58b9f456SAndroid Build Coastguard Worker};
1759*58b9f456SAndroid Build Coastguard Worker
1760*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1761*58b9f456SAndroid Build Coastguard Workervoid
1762*58b9f456SAndroid Build Coastguard Worker__back_ref<_CharT>::__exec(__state& __s) const
1763*58b9f456SAndroid Build Coastguard Worker{
1764*58b9f456SAndroid Build Coastguard Worker    if (__mexp_ > __s.__sub_matches_.size())
1765*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::error_backref>();
1766*58b9f456SAndroid Build Coastguard Worker    sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1767*58b9f456SAndroid Build Coastguard Worker    if (__sm.matched)
1768*58b9f456SAndroid Build Coastguard Worker    {
1769*58b9f456SAndroid Build Coastguard Worker        ptrdiff_t __len = __sm.second - __sm.first;
1770*58b9f456SAndroid Build Coastguard Worker        if (__s.__last_ - __s.__current_ >= __len &&
1771*58b9f456SAndroid Build Coastguard Worker            _VSTD::equal(__sm.first, __sm.second, __s.__current_))
1772*58b9f456SAndroid Build Coastguard Worker        {
1773*58b9f456SAndroid Build Coastguard Worker            __s.__do_ = __state::__accept_but_not_consume;
1774*58b9f456SAndroid Build Coastguard Worker            __s.__current_ += __len;
1775*58b9f456SAndroid Build Coastguard Worker            __s.__node_ = this->first();
1776*58b9f456SAndroid Build Coastguard Worker        }
1777*58b9f456SAndroid Build Coastguard Worker        else
1778*58b9f456SAndroid Build Coastguard Worker        {
1779*58b9f456SAndroid Build Coastguard Worker            __s.__do_ = __state::__reject;
1780*58b9f456SAndroid Build Coastguard Worker            __s.__node_ = nullptr;
1781*58b9f456SAndroid Build Coastguard Worker        }
1782*58b9f456SAndroid Build Coastguard Worker    }
1783*58b9f456SAndroid Build Coastguard Worker    else
1784*58b9f456SAndroid Build Coastguard Worker    {
1785*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__reject;
1786*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = nullptr;
1787*58b9f456SAndroid Build Coastguard Worker    }
1788*58b9f456SAndroid Build Coastguard Worker}
1789*58b9f456SAndroid Build Coastguard Worker
1790*58b9f456SAndroid Build Coastguard Worker// __back_ref_icase
1791*58b9f456SAndroid Build Coastguard Worker
1792*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
1793*58b9f456SAndroid Build Coastguard Workerclass __back_ref_icase
1794*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
1795*58b9f456SAndroid Build Coastguard Worker{
1796*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
1797*58b9f456SAndroid Build Coastguard Worker
1798*58b9f456SAndroid Build Coastguard Worker    _Traits __traits_;
1799*58b9f456SAndroid Build Coastguard Worker    unsigned __mexp_;
1800*58b9f456SAndroid Build Coastguard Workerpublic:
1801*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1802*58b9f456SAndroid Build Coastguard Worker
1803*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1804*58b9f456SAndroid Build Coastguard Worker    explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
1805*58b9f456SAndroid Build Coastguard Worker                              __node<_CharT>* __s)
1806*58b9f456SAndroid Build Coastguard Worker        : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1807*58b9f456SAndroid Build Coastguard Worker
1808*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
1809*58b9f456SAndroid Build Coastguard Worker};
1810*58b9f456SAndroid Build Coastguard Worker
1811*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
1812*58b9f456SAndroid Build Coastguard Workervoid
1813*58b9f456SAndroid Build Coastguard Worker__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
1814*58b9f456SAndroid Build Coastguard Worker{
1815*58b9f456SAndroid Build Coastguard Worker    sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1816*58b9f456SAndroid Build Coastguard Worker    if (__sm.matched)
1817*58b9f456SAndroid Build Coastguard Worker    {
1818*58b9f456SAndroid Build Coastguard Worker        ptrdiff_t __len = __sm.second - __sm.first;
1819*58b9f456SAndroid Build Coastguard Worker        if (__s.__last_ - __s.__current_ >= __len)
1820*58b9f456SAndroid Build Coastguard Worker        {
1821*58b9f456SAndroid Build Coastguard Worker            for (ptrdiff_t __i = 0; __i < __len; ++__i)
1822*58b9f456SAndroid Build Coastguard Worker            {
1823*58b9f456SAndroid Build Coastguard Worker                if (__traits_.translate_nocase(__sm.first[__i]) !=
1824*58b9f456SAndroid Build Coastguard Worker                                __traits_.translate_nocase(__s.__current_[__i]))
1825*58b9f456SAndroid Build Coastguard Worker                    goto __not_equal;
1826*58b9f456SAndroid Build Coastguard Worker            }
1827*58b9f456SAndroid Build Coastguard Worker            __s.__do_ = __state::__accept_but_not_consume;
1828*58b9f456SAndroid Build Coastguard Worker            __s.__current_ += __len;
1829*58b9f456SAndroid Build Coastguard Worker            __s.__node_ = this->first();
1830*58b9f456SAndroid Build Coastguard Worker        }
1831*58b9f456SAndroid Build Coastguard Worker        else
1832*58b9f456SAndroid Build Coastguard Worker        {
1833*58b9f456SAndroid Build Coastguard Worker            __s.__do_ = __state::__reject;
1834*58b9f456SAndroid Build Coastguard Worker            __s.__node_ = nullptr;
1835*58b9f456SAndroid Build Coastguard Worker        }
1836*58b9f456SAndroid Build Coastguard Worker    }
1837*58b9f456SAndroid Build Coastguard Worker    else
1838*58b9f456SAndroid Build Coastguard Worker    {
1839*58b9f456SAndroid Build Coastguard Worker__not_equal:
1840*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__reject;
1841*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = nullptr;
1842*58b9f456SAndroid Build Coastguard Worker    }
1843*58b9f456SAndroid Build Coastguard Worker}
1844*58b9f456SAndroid Build Coastguard Worker
1845*58b9f456SAndroid Build Coastguard Worker// __back_ref_collate
1846*58b9f456SAndroid Build Coastguard Worker
1847*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
1848*58b9f456SAndroid Build Coastguard Workerclass __back_ref_collate
1849*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
1850*58b9f456SAndroid Build Coastguard Worker{
1851*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
1852*58b9f456SAndroid Build Coastguard Worker
1853*58b9f456SAndroid Build Coastguard Worker    _Traits __traits_;
1854*58b9f456SAndroid Build Coastguard Worker    unsigned __mexp_;
1855*58b9f456SAndroid Build Coastguard Workerpublic:
1856*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1857*58b9f456SAndroid Build Coastguard Worker
1858*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1859*58b9f456SAndroid Build Coastguard Worker    explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
1860*58b9f456SAndroid Build Coastguard Worker                              __node<_CharT>* __s)
1861*58b9f456SAndroid Build Coastguard Worker        : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1862*58b9f456SAndroid Build Coastguard Worker
1863*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
1864*58b9f456SAndroid Build Coastguard Worker};
1865*58b9f456SAndroid Build Coastguard Worker
1866*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
1867*58b9f456SAndroid Build Coastguard Workervoid
1868*58b9f456SAndroid Build Coastguard Worker__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
1869*58b9f456SAndroid Build Coastguard Worker{
1870*58b9f456SAndroid Build Coastguard Worker    sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1871*58b9f456SAndroid Build Coastguard Worker    if (__sm.matched)
1872*58b9f456SAndroid Build Coastguard Worker    {
1873*58b9f456SAndroid Build Coastguard Worker        ptrdiff_t __len = __sm.second - __sm.first;
1874*58b9f456SAndroid Build Coastguard Worker        if (__s.__last_ - __s.__current_ >= __len)
1875*58b9f456SAndroid Build Coastguard Worker        {
1876*58b9f456SAndroid Build Coastguard Worker            for (ptrdiff_t __i = 0; __i < __len; ++__i)
1877*58b9f456SAndroid Build Coastguard Worker            {
1878*58b9f456SAndroid Build Coastguard Worker                if (__traits_.translate(__sm.first[__i]) !=
1879*58b9f456SAndroid Build Coastguard Worker                                       __traits_.translate(__s.__current_[__i]))
1880*58b9f456SAndroid Build Coastguard Worker                    goto __not_equal;
1881*58b9f456SAndroid Build Coastguard Worker            }
1882*58b9f456SAndroid Build Coastguard Worker            __s.__do_ = __state::__accept_but_not_consume;
1883*58b9f456SAndroid Build Coastguard Worker            __s.__current_ += __len;
1884*58b9f456SAndroid Build Coastguard Worker            __s.__node_ = this->first();
1885*58b9f456SAndroid Build Coastguard Worker        }
1886*58b9f456SAndroid Build Coastguard Worker        else
1887*58b9f456SAndroid Build Coastguard Worker        {
1888*58b9f456SAndroid Build Coastguard Worker            __s.__do_ = __state::__reject;
1889*58b9f456SAndroid Build Coastguard Worker            __s.__node_ = nullptr;
1890*58b9f456SAndroid Build Coastguard Worker        }
1891*58b9f456SAndroid Build Coastguard Worker    }
1892*58b9f456SAndroid Build Coastguard Worker    else
1893*58b9f456SAndroid Build Coastguard Worker    {
1894*58b9f456SAndroid Build Coastguard Worker__not_equal:
1895*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__reject;
1896*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = nullptr;
1897*58b9f456SAndroid Build Coastguard Worker    }
1898*58b9f456SAndroid Build Coastguard Worker}
1899*58b9f456SAndroid Build Coastguard Worker
1900*58b9f456SAndroid Build Coastguard Worker// __word_boundary
1901*58b9f456SAndroid Build Coastguard Worker
1902*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
1903*58b9f456SAndroid Build Coastguard Workerclass __word_boundary
1904*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
1905*58b9f456SAndroid Build Coastguard Worker{
1906*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
1907*58b9f456SAndroid Build Coastguard Worker
1908*58b9f456SAndroid Build Coastguard Worker    _Traits __traits_;
1909*58b9f456SAndroid Build Coastguard Worker    bool __invert_;
1910*58b9f456SAndroid Build Coastguard Workerpublic:
1911*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1912*58b9f456SAndroid Build Coastguard Worker
1913*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1914*58b9f456SAndroid Build Coastguard Worker    explicit __word_boundary(const _Traits& __traits, bool __invert,
1915*58b9f456SAndroid Build Coastguard Worker                             __node<_CharT>* __s)
1916*58b9f456SAndroid Build Coastguard Worker        : base(__s), __traits_(__traits), __invert_(__invert) {}
1917*58b9f456SAndroid Build Coastguard Worker
1918*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
1919*58b9f456SAndroid Build Coastguard Worker};
1920*58b9f456SAndroid Build Coastguard Worker
1921*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
1922*58b9f456SAndroid Build Coastguard Workervoid
1923*58b9f456SAndroid Build Coastguard Worker__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
1924*58b9f456SAndroid Build Coastguard Worker{
1925*58b9f456SAndroid Build Coastguard Worker    bool __is_word_b = false;
1926*58b9f456SAndroid Build Coastguard Worker    if (__s.__first_ != __s.__last_)
1927*58b9f456SAndroid Build Coastguard Worker    {
1928*58b9f456SAndroid Build Coastguard Worker        if (__s.__current_ == __s.__last_)
1929*58b9f456SAndroid Build Coastguard Worker        {
1930*58b9f456SAndroid Build Coastguard Worker            if (!(__s.__flags_ & regex_constants::match_not_eow))
1931*58b9f456SAndroid Build Coastguard Worker            {
1932*58b9f456SAndroid Build Coastguard Worker                _CharT __c = __s.__current_[-1];
1933*58b9f456SAndroid Build Coastguard Worker                __is_word_b = __c == '_' ||
1934*58b9f456SAndroid Build Coastguard Worker                              __traits_.isctype(__c, ctype_base::alnum);
1935*58b9f456SAndroid Build Coastguard Worker            }
1936*58b9f456SAndroid Build Coastguard Worker        }
1937*58b9f456SAndroid Build Coastguard Worker        else if (__s.__current_ == __s.__first_ &&
1938*58b9f456SAndroid Build Coastguard Worker                !(__s.__flags_ & regex_constants::match_prev_avail))
1939*58b9f456SAndroid Build Coastguard Worker        {
1940*58b9f456SAndroid Build Coastguard Worker            if (!(__s.__flags_ & regex_constants::match_not_bow))
1941*58b9f456SAndroid Build Coastguard Worker            {
1942*58b9f456SAndroid Build Coastguard Worker                _CharT __c = *__s.__current_;
1943*58b9f456SAndroid Build Coastguard Worker                __is_word_b = __c == '_' ||
1944*58b9f456SAndroid Build Coastguard Worker                              __traits_.isctype(__c, ctype_base::alnum);
1945*58b9f456SAndroid Build Coastguard Worker            }
1946*58b9f456SAndroid Build Coastguard Worker        }
1947*58b9f456SAndroid Build Coastguard Worker        else
1948*58b9f456SAndroid Build Coastguard Worker        {
1949*58b9f456SAndroid Build Coastguard Worker            _CharT __c1 = __s.__current_[-1];
1950*58b9f456SAndroid Build Coastguard Worker            _CharT __c2 = *__s.__current_;
1951*58b9f456SAndroid Build Coastguard Worker            bool __is_c1_b = __c1 == '_' ||
1952*58b9f456SAndroid Build Coastguard Worker                             __traits_.isctype(__c1, ctype_base::alnum);
1953*58b9f456SAndroid Build Coastguard Worker            bool __is_c2_b = __c2 == '_' ||
1954*58b9f456SAndroid Build Coastguard Worker                             __traits_.isctype(__c2, ctype_base::alnum);
1955*58b9f456SAndroid Build Coastguard Worker            __is_word_b = __is_c1_b != __is_c2_b;
1956*58b9f456SAndroid Build Coastguard Worker        }
1957*58b9f456SAndroid Build Coastguard Worker    }
1958*58b9f456SAndroid Build Coastguard Worker    if (__is_word_b != __invert_)
1959*58b9f456SAndroid Build Coastguard Worker    {
1960*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__accept_but_not_consume;
1961*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->first();
1962*58b9f456SAndroid Build Coastguard Worker    }
1963*58b9f456SAndroid Build Coastguard Worker    else
1964*58b9f456SAndroid Build Coastguard Worker    {
1965*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__reject;
1966*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = nullptr;
1967*58b9f456SAndroid Build Coastguard Worker    }
1968*58b9f456SAndroid Build Coastguard Worker}
1969*58b9f456SAndroid Build Coastguard Worker
1970*58b9f456SAndroid Build Coastguard Worker// __l_anchor
1971*58b9f456SAndroid Build Coastguard Worker
1972*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1973*58b9f456SAndroid Build Coastguard Workerclass __l_anchor
1974*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
1975*58b9f456SAndroid Build Coastguard Worker{
1976*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
1977*58b9f456SAndroid Build Coastguard Worker
1978*58b9f456SAndroid Build Coastguard Workerpublic:
1979*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
1980*58b9f456SAndroid Build Coastguard Worker
1981*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
1982*58b9f456SAndroid Build Coastguard Worker    __l_anchor(__node<_CharT>* __s)
1983*58b9f456SAndroid Build Coastguard Worker        : base(__s) {}
1984*58b9f456SAndroid Build Coastguard Worker
1985*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
1986*58b9f456SAndroid Build Coastguard Worker};
1987*58b9f456SAndroid Build Coastguard Worker
1988*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
1989*58b9f456SAndroid Build Coastguard Workervoid
1990*58b9f456SAndroid Build Coastguard Worker__l_anchor<_CharT>::__exec(__state& __s) const
1991*58b9f456SAndroid Build Coastguard Worker{
1992*58b9f456SAndroid Build Coastguard Worker    if (__s.__at_first_ && __s.__current_ == __s.__first_ &&
1993*58b9f456SAndroid Build Coastguard Worker        !(__s.__flags_ & regex_constants::match_not_bol))
1994*58b9f456SAndroid Build Coastguard Worker    {
1995*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__accept_but_not_consume;
1996*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->first();
1997*58b9f456SAndroid Build Coastguard Worker    }
1998*58b9f456SAndroid Build Coastguard Worker    else
1999*58b9f456SAndroid Build Coastguard Worker    {
2000*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__reject;
2001*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = nullptr;
2002*58b9f456SAndroid Build Coastguard Worker    }
2003*58b9f456SAndroid Build Coastguard Worker}
2004*58b9f456SAndroid Build Coastguard Worker
2005*58b9f456SAndroid Build Coastguard Worker// __r_anchor
2006*58b9f456SAndroid Build Coastguard Worker
2007*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
2008*58b9f456SAndroid Build Coastguard Workerclass __r_anchor
2009*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
2010*58b9f456SAndroid Build Coastguard Worker{
2011*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
2012*58b9f456SAndroid Build Coastguard Worker
2013*58b9f456SAndroid Build Coastguard Workerpublic:
2014*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
2015*58b9f456SAndroid Build Coastguard Worker
2016*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2017*58b9f456SAndroid Build Coastguard Worker    __r_anchor(__node<_CharT>* __s)
2018*58b9f456SAndroid Build Coastguard Worker        : base(__s) {}
2019*58b9f456SAndroid Build Coastguard Worker
2020*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
2021*58b9f456SAndroid Build Coastguard Worker};
2022*58b9f456SAndroid Build Coastguard Worker
2023*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
2024*58b9f456SAndroid Build Coastguard Workervoid
2025*58b9f456SAndroid Build Coastguard Worker__r_anchor<_CharT>::__exec(__state& __s) const
2026*58b9f456SAndroid Build Coastguard Worker{
2027*58b9f456SAndroid Build Coastguard Worker    if (__s.__current_ == __s.__last_ &&
2028*58b9f456SAndroid Build Coastguard Worker        !(__s.__flags_ & regex_constants::match_not_eol))
2029*58b9f456SAndroid Build Coastguard Worker    {
2030*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__accept_but_not_consume;
2031*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->first();
2032*58b9f456SAndroid Build Coastguard Worker    }
2033*58b9f456SAndroid Build Coastguard Worker    else
2034*58b9f456SAndroid Build Coastguard Worker    {
2035*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__reject;
2036*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = nullptr;
2037*58b9f456SAndroid Build Coastguard Worker    }
2038*58b9f456SAndroid Build Coastguard Worker}
2039*58b9f456SAndroid Build Coastguard Worker
2040*58b9f456SAndroid Build Coastguard Worker// __match_any
2041*58b9f456SAndroid Build Coastguard Worker
2042*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
2043*58b9f456SAndroid Build Coastguard Workerclass __match_any
2044*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
2045*58b9f456SAndroid Build Coastguard Worker{
2046*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
2047*58b9f456SAndroid Build Coastguard Worker
2048*58b9f456SAndroid Build Coastguard Workerpublic:
2049*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
2050*58b9f456SAndroid Build Coastguard Worker
2051*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2052*58b9f456SAndroid Build Coastguard Worker    __match_any(__node<_CharT>* __s)
2053*58b9f456SAndroid Build Coastguard Worker        : base(__s) {}
2054*58b9f456SAndroid Build Coastguard Worker
2055*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
2056*58b9f456SAndroid Build Coastguard Worker};
2057*58b9f456SAndroid Build Coastguard Worker
2058*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
2059*58b9f456SAndroid Build Coastguard Workervoid
2060*58b9f456SAndroid Build Coastguard Worker__match_any<_CharT>::__exec(__state& __s) const
2061*58b9f456SAndroid Build Coastguard Worker{
2062*58b9f456SAndroid Build Coastguard Worker    if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
2063*58b9f456SAndroid Build Coastguard Worker    {
2064*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__accept_and_consume;
2065*58b9f456SAndroid Build Coastguard Worker        ++__s.__current_;
2066*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->first();
2067*58b9f456SAndroid Build Coastguard Worker    }
2068*58b9f456SAndroid Build Coastguard Worker    else
2069*58b9f456SAndroid Build Coastguard Worker    {
2070*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__reject;
2071*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = nullptr;
2072*58b9f456SAndroid Build Coastguard Worker    }
2073*58b9f456SAndroid Build Coastguard Worker}
2074*58b9f456SAndroid Build Coastguard Worker
2075*58b9f456SAndroid Build Coastguard Worker// __match_any_but_newline
2076*58b9f456SAndroid Build Coastguard Worker
2077*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
2078*58b9f456SAndroid Build Coastguard Workerclass __match_any_but_newline
2079*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
2080*58b9f456SAndroid Build Coastguard Worker{
2081*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
2082*58b9f456SAndroid Build Coastguard Worker
2083*58b9f456SAndroid Build Coastguard Workerpublic:
2084*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
2085*58b9f456SAndroid Build Coastguard Worker
2086*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2087*58b9f456SAndroid Build Coastguard Worker    __match_any_but_newline(__node<_CharT>* __s)
2088*58b9f456SAndroid Build Coastguard Worker        : base(__s) {}
2089*58b9f456SAndroid Build Coastguard Worker
2090*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
2091*58b9f456SAndroid Build Coastguard Worker};
2092*58b9f456SAndroid Build Coastguard Worker
2093*58b9f456SAndroid Build Coastguard Workertemplate <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
2094*58b9f456SAndroid Build Coastguard Workertemplate <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
2095*58b9f456SAndroid Build Coastguard Worker
2096*58b9f456SAndroid Build Coastguard Worker// __match_char
2097*58b9f456SAndroid Build Coastguard Worker
2098*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
2099*58b9f456SAndroid Build Coastguard Workerclass __match_char
2100*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
2101*58b9f456SAndroid Build Coastguard Worker{
2102*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
2103*58b9f456SAndroid Build Coastguard Worker
2104*58b9f456SAndroid Build Coastguard Worker    _CharT __c_;
2105*58b9f456SAndroid Build Coastguard Worker
2106*58b9f456SAndroid Build Coastguard Worker    __match_char(const __match_char&);
2107*58b9f456SAndroid Build Coastguard Worker    __match_char& operator=(const __match_char&);
2108*58b9f456SAndroid Build Coastguard Workerpublic:
2109*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
2110*58b9f456SAndroid Build Coastguard Worker
2111*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2112*58b9f456SAndroid Build Coastguard Worker    __match_char(_CharT __c, __node<_CharT>* __s)
2113*58b9f456SAndroid Build Coastguard Worker        : base(__s), __c_(__c) {}
2114*58b9f456SAndroid Build Coastguard Worker
2115*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
2116*58b9f456SAndroid Build Coastguard Worker};
2117*58b9f456SAndroid Build Coastguard Worker
2118*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT>
2119*58b9f456SAndroid Build Coastguard Workervoid
2120*58b9f456SAndroid Build Coastguard Worker__match_char<_CharT>::__exec(__state& __s) const
2121*58b9f456SAndroid Build Coastguard Worker{
2122*58b9f456SAndroid Build Coastguard Worker    if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2123*58b9f456SAndroid Build Coastguard Worker    {
2124*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__accept_and_consume;
2125*58b9f456SAndroid Build Coastguard Worker        ++__s.__current_;
2126*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->first();
2127*58b9f456SAndroid Build Coastguard Worker    }
2128*58b9f456SAndroid Build Coastguard Worker    else
2129*58b9f456SAndroid Build Coastguard Worker    {
2130*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__reject;
2131*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = nullptr;
2132*58b9f456SAndroid Build Coastguard Worker    }
2133*58b9f456SAndroid Build Coastguard Worker}
2134*58b9f456SAndroid Build Coastguard Worker
2135*58b9f456SAndroid Build Coastguard Worker// __match_char_icase
2136*58b9f456SAndroid Build Coastguard Worker
2137*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2138*58b9f456SAndroid Build Coastguard Workerclass __match_char_icase
2139*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
2140*58b9f456SAndroid Build Coastguard Worker{
2141*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
2142*58b9f456SAndroid Build Coastguard Worker
2143*58b9f456SAndroid Build Coastguard Worker    _Traits __traits_;
2144*58b9f456SAndroid Build Coastguard Worker    _CharT __c_;
2145*58b9f456SAndroid Build Coastguard Worker
2146*58b9f456SAndroid Build Coastguard Worker    __match_char_icase(const __match_char_icase&);
2147*58b9f456SAndroid Build Coastguard Worker    __match_char_icase& operator=(const __match_char_icase&);
2148*58b9f456SAndroid Build Coastguard Workerpublic:
2149*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
2150*58b9f456SAndroid Build Coastguard Worker
2151*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2152*58b9f456SAndroid Build Coastguard Worker    __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2153*58b9f456SAndroid Build Coastguard Worker        : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2154*58b9f456SAndroid Build Coastguard Worker
2155*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
2156*58b9f456SAndroid Build Coastguard Worker};
2157*58b9f456SAndroid Build Coastguard Worker
2158*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2159*58b9f456SAndroid Build Coastguard Workervoid
2160*58b9f456SAndroid Build Coastguard Worker__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2161*58b9f456SAndroid Build Coastguard Worker{
2162*58b9f456SAndroid Build Coastguard Worker    if (__s.__current_ != __s.__last_ &&
2163*58b9f456SAndroid Build Coastguard Worker        __traits_.translate_nocase(*__s.__current_) == __c_)
2164*58b9f456SAndroid Build Coastguard Worker    {
2165*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__accept_and_consume;
2166*58b9f456SAndroid Build Coastguard Worker        ++__s.__current_;
2167*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->first();
2168*58b9f456SAndroid Build Coastguard Worker    }
2169*58b9f456SAndroid Build Coastguard Worker    else
2170*58b9f456SAndroid Build Coastguard Worker    {
2171*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__reject;
2172*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = nullptr;
2173*58b9f456SAndroid Build Coastguard Worker    }
2174*58b9f456SAndroid Build Coastguard Worker}
2175*58b9f456SAndroid Build Coastguard Worker
2176*58b9f456SAndroid Build Coastguard Worker// __match_char_collate
2177*58b9f456SAndroid Build Coastguard Worker
2178*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2179*58b9f456SAndroid Build Coastguard Workerclass __match_char_collate
2180*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
2181*58b9f456SAndroid Build Coastguard Worker{
2182*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
2183*58b9f456SAndroid Build Coastguard Worker
2184*58b9f456SAndroid Build Coastguard Worker    _Traits __traits_;
2185*58b9f456SAndroid Build Coastguard Worker    _CharT __c_;
2186*58b9f456SAndroid Build Coastguard Worker
2187*58b9f456SAndroid Build Coastguard Worker    __match_char_collate(const __match_char_collate&);
2188*58b9f456SAndroid Build Coastguard Worker    __match_char_collate& operator=(const __match_char_collate&);
2189*58b9f456SAndroid Build Coastguard Workerpublic:
2190*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
2191*58b9f456SAndroid Build Coastguard Worker
2192*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2193*58b9f456SAndroid Build Coastguard Worker    __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2194*58b9f456SAndroid Build Coastguard Worker        : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2195*58b9f456SAndroid Build Coastguard Worker
2196*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
2197*58b9f456SAndroid Build Coastguard Worker};
2198*58b9f456SAndroid Build Coastguard Worker
2199*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2200*58b9f456SAndroid Build Coastguard Workervoid
2201*58b9f456SAndroid Build Coastguard Worker__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2202*58b9f456SAndroid Build Coastguard Worker{
2203*58b9f456SAndroid Build Coastguard Worker    if (__s.__current_ != __s.__last_ &&
2204*58b9f456SAndroid Build Coastguard Worker        __traits_.translate(*__s.__current_) == __c_)
2205*58b9f456SAndroid Build Coastguard Worker    {
2206*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__accept_and_consume;
2207*58b9f456SAndroid Build Coastguard Worker        ++__s.__current_;
2208*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->first();
2209*58b9f456SAndroid Build Coastguard Worker    }
2210*58b9f456SAndroid Build Coastguard Worker    else
2211*58b9f456SAndroid Build Coastguard Worker    {
2212*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__reject;
2213*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = nullptr;
2214*58b9f456SAndroid Build Coastguard Worker    }
2215*58b9f456SAndroid Build Coastguard Worker}
2216*58b9f456SAndroid Build Coastguard Worker
2217*58b9f456SAndroid Build Coastguard Worker// __bracket_expression
2218*58b9f456SAndroid Build Coastguard Worker
2219*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2220*58b9f456SAndroid Build Coastguard Workerclass __bracket_expression
2221*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
2222*58b9f456SAndroid Build Coastguard Worker{
2223*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
2224*58b9f456SAndroid Build Coastguard Worker    typedef typename _Traits::string_type string_type;
2225*58b9f456SAndroid Build Coastguard Worker
2226*58b9f456SAndroid Build Coastguard Worker    _Traits __traits_;
2227*58b9f456SAndroid Build Coastguard Worker    vector<_CharT> __chars_;
2228*58b9f456SAndroid Build Coastguard Worker    vector<_CharT> __neg_chars_;
2229*58b9f456SAndroid Build Coastguard Worker    vector<pair<string_type, string_type> > __ranges_;
2230*58b9f456SAndroid Build Coastguard Worker    vector<pair<_CharT, _CharT> > __digraphs_;
2231*58b9f456SAndroid Build Coastguard Worker    vector<string_type> __equivalences_;
2232*58b9f456SAndroid Build Coastguard Worker    typename regex_traits<_CharT>::char_class_type __mask_;
2233*58b9f456SAndroid Build Coastguard Worker    typename regex_traits<_CharT>::char_class_type __neg_mask_;
2234*58b9f456SAndroid Build Coastguard Worker    bool __negate_;
2235*58b9f456SAndroid Build Coastguard Worker    bool __icase_;
2236*58b9f456SAndroid Build Coastguard Worker    bool __collate_;
2237*58b9f456SAndroid Build Coastguard Worker    bool __might_have_digraph_;
2238*58b9f456SAndroid Build Coastguard Worker
2239*58b9f456SAndroid Build Coastguard Worker    __bracket_expression(const __bracket_expression&);
2240*58b9f456SAndroid Build Coastguard Worker    __bracket_expression& operator=(const __bracket_expression&);
2241*58b9f456SAndroid Build Coastguard Workerpublic:
2242*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
2243*58b9f456SAndroid Build Coastguard Worker
2244*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2245*58b9f456SAndroid Build Coastguard Worker    __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2246*58b9f456SAndroid Build Coastguard Worker                                 bool __negate, bool __icase, bool __collate)
2247*58b9f456SAndroid Build Coastguard Worker        : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2248*58b9f456SAndroid Build Coastguard Worker          __negate_(__negate), __icase_(__icase), __collate_(__collate),
2249*58b9f456SAndroid Build Coastguard Worker          __might_have_digraph_(__traits_.getloc().name() != "C") {}
2250*58b9f456SAndroid Build Coastguard Worker
2251*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
2252*58b9f456SAndroid Build Coastguard Worker
2253*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2254*58b9f456SAndroid Build Coastguard Worker    bool __negated() const {return __negate_;}
2255*58b9f456SAndroid Build Coastguard Worker
2256*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2257*58b9f456SAndroid Build Coastguard Worker    void __add_char(_CharT __c)
2258*58b9f456SAndroid Build Coastguard Worker        {
2259*58b9f456SAndroid Build Coastguard Worker            if (__icase_)
2260*58b9f456SAndroid Build Coastguard Worker                __chars_.push_back(__traits_.translate_nocase(__c));
2261*58b9f456SAndroid Build Coastguard Worker            else if (__collate_)
2262*58b9f456SAndroid Build Coastguard Worker                __chars_.push_back(__traits_.translate(__c));
2263*58b9f456SAndroid Build Coastguard Worker            else
2264*58b9f456SAndroid Build Coastguard Worker                __chars_.push_back(__c);
2265*58b9f456SAndroid Build Coastguard Worker        }
2266*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2267*58b9f456SAndroid Build Coastguard Worker    void __add_neg_char(_CharT __c)
2268*58b9f456SAndroid Build Coastguard Worker        {
2269*58b9f456SAndroid Build Coastguard Worker            if (__icase_)
2270*58b9f456SAndroid Build Coastguard Worker                __neg_chars_.push_back(__traits_.translate_nocase(__c));
2271*58b9f456SAndroid Build Coastguard Worker            else if (__collate_)
2272*58b9f456SAndroid Build Coastguard Worker                __neg_chars_.push_back(__traits_.translate(__c));
2273*58b9f456SAndroid Build Coastguard Worker            else
2274*58b9f456SAndroid Build Coastguard Worker                __neg_chars_.push_back(__c);
2275*58b9f456SAndroid Build Coastguard Worker        }
2276*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2277*58b9f456SAndroid Build Coastguard Worker    void __add_range(string_type __b, string_type __e)
2278*58b9f456SAndroid Build Coastguard Worker        {
2279*58b9f456SAndroid Build Coastguard Worker            if (__collate_)
2280*58b9f456SAndroid Build Coastguard Worker            {
2281*58b9f456SAndroid Build Coastguard Worker                if (__icase_)
2282*58b9f456SAndroid Build Coastguard Worker                {
2283*58b9f456SAndroid Build Coastguard Worker                    for (size_t __i = 0; __i < __b.size(); ++__i)
2284*58b9f456SAndroid Build Coastguard Worker                        __b[__i] = __traits_.translate_nocase(__b[__i]);
2285*58b9f456SAndroid Build Coastguard Worker                    for (size_t __i = 0; __i < __e.size(); ++__i)
2286*58b9f456SAndroid Build Coastguard Worker                        __e[__i] = __traits_.translate_nocase(__e[__i]);
2287*58b9f456SAndroid Build Coastguard Worker                }
2288*58b9f456SAndroid Build Coastguard Worker                else
2289*58b9f456SAndroid Build Coastguard Worker                {
2290*58b9f456SAndroid Build Coastguard Worker                    for (size_t __i = 0; __i < __b.size(); ++__i)
2291*58b9f456SAndroid Build Coastguard Worker                        __b[__i] = __traits_.translate(__b[__i]);
2292*58b9f456SAndroid Build Coastguard Worker                    for (size_t __i = 0; __i < __e.size(); ++__i)
2293*58b9f456SAndroid Build Coastguard Worker                        __e[__i] = __traits_.translate(__e[__i]);
2294*58b9f456SAndroid Build Coastguard Worker                }
2295*58b9f456SAndroid Build Coastguard Worker                __ranges_.push_back(make_pair(
2296*58b9f456SAndroid Build Coastguard Worker                                  __traits_.transform(__b.begin(), __b.end()),
2297*58b9f456SAndroid Build Coastguard Worker                                  __traits_.transform(__e.begin(), __e.end())));
2298*58b9f456SAndroid Build Coastguard Worker            }
2299*58b9f456SAndroid Build Coastguard Worker            else
2300*58b9f456SAndroid Build Coastguard Worker            {
2301*58b9f456SAndroid Build Coastguard Worker                if (__b.size() != 1 || __e.size() != 1)
2302*58b9f456SAndroid Build Coastguard Worker                    __throw_regex_error<regex_constants::error_collate>();
2303*58b9f456SAndroid Build Coastguard Worker                if (__icase_)
2304*58b9f456SAndroid Build Coastguard Worker                {
2305*58b9f456SAndroid Build Coastguard Worker                    __b[0] = __traits_.translate_nocase(__b[0]);
2306*58b9f456SAndroid Build Coastguard Worker                    __e[0] = __traits_.translate_nocase(__e[0]);
2307*58b9f456SAndroid Build Coastguard Worker                }
2308*58b9f456SAndroid Build Coastguard Worker                __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
2309*58b9f456SAndroid Build Coastguard Worker            }
2310*58b9f456SAndroid Build Coastguard Worker        }
2311*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2312*58b9f456SAndroid Build Coastguard Worker    void __add_digraph(_CharT __c1, _CharT __c2)
2313*58b9f456SAndroid Build Coastguard Worker        {
2314*58b9f456SAndroid Build Coastguard Worker            if (__icase_)
2315*58b9f456SAndroid Build Coastguard Worker                __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
2316*58b9f456SAndroid Build Coastguard Worker                                                __traits_.translate_nocase(__c2)));
2317*58b9f456SAndroid Build Coastguard Worker            else if (__collate_)
2318*58b9f456SAndroid Build Coastguard Worker                __digraphs_.push_back(make_pair(__traits_.translate(__c1),
2319*58b9f456SAndroid Build Coastguard Worker                                                __traits_.translate(__c2)));
2320*58b9f456SAndroid Build Coastguard Worker            else
2321*58b9f456SAndroid Build Coastguard Worker                __digraphs_.push_back(make_pair(__c1, __c2));
2322*58b9f456SAndroid Build Coastguard Worker        }
2323*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2324*58b9f456SAndroid Build Coastguard Worker    void __add_equivalence(const string_type& __s)
2325*58b9f456SAndroid Build Coastguard Worker        {__equivalences_.push_back(__s);}
2326*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2327*58b9f456SAndroid Build Coastguard Worker    void __add_class(typename regex_traits<_CharT>::char_class_type __mask)
2328*58b9f456SAndroid Build Coastguard Worker        {__mask_ |= __mask;}
2329*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2330*58b9f456SAndroid Build Coastguard Worker    void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask)
2331*58b9f456SAndroid Build Coastguard Worker        {__neg_mask_ |= __mask;}
2332*58b9f456SAndroid Build Coastguard Worker};
2333*58b9f456SAndroid Build Coastguard Worker
2334*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2335*58b9f456SAndroid Build Coastguard Workervoid
2336*58b9f456SAndroid Build Coastguard Worker__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2337*58b9f456SAndroid Build Coastguard Worker{
2338*58b9f456SAndroid Build Coastguard Worker    bool __found = false;
2339*58b9f456SAndroid Build Coastguard Worker    unsigned __consumed = 0;
2340*58b9f456SAndroid Build Coastguard Worker    if (__s.__current_ != __s.__last_)
2341*58b9f456SAndroid Build Coastguard Worker    {
2342*58b9f456SAndroid Build Coastguard Worker        ++__consumed;
2343*58b9f456SAndroid Build Coastguard Worker        if (__might_have_digraph_)
2344*58b9f456SAndroid Build Coastguard Worker        {
2345*58b9f456SAndroid Build Coastguard Worker            const _CharT* __next = _VSTD::next(__s.__current_);
2346*58b9f456SAndroid Build Coastguard Worker            if (__next != __s.__last_)
2347*58b9f456SAndroid Build Coastguard Worker            {
2348*58b9f456SAndroid Build Coastguard Worker                pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2349*58b9f456SAndroid Build Coastguard Worker                if (__icase_)
2350*58b9f456SAndroid Build Coastguard Worker                {
2351*58b9f456SAndroid Build Coastguard Worker                    __ch2.first = __traits_.translate_nocase(__ch2.first);
2352*58b9f456SAndroid Build Coastguard Worker                    __ch2.second = __traits_.translate_nocase(__ch2.second);
2353*58b9f456SAndroid Build Coastguard Worker                }
2354*58b9f456SAndroid Build Coastguard Worker                else if (__collate_)
2355*58b9f456SAndroid Build Coastguard Worker                {
2356*58b9f456SAndroid Build Coastguard Worker                    __ch2.first = __traits_.translate(__ch2.first);
2357*58b9f456SAndroid Build Coastguard Worker                    __ch2.second = __traits_.translate(__ch2.second);
2358*58b9f456SAndroid Build Coastguard Worker                }
2359*58b9f456SAndroid Build Coastguard Worker                if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2360*58b9f456SAndroid Build Coastguard Worker                {
2361*58b9f456SAndroid Build Coastguard Worker                    // __ch2 is a digraph in this locale
2362*58b9f456SAndroid Build Coastguard Worker                    ++__consumed;
2363*58b9f456SAndroid Build Coastguard Worker                    for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2364*58b9f456SAndroid Build Coastguard Worker                    {
2365*58b9f456SAndroid Build Coastguard Worker                        if (__ch2 == __digraphs_[__i])
2366*58b9f456SAndroid Build Coastguard Worker                        {
2367*58b9f456SAndroid Build Coastguard Worker                            __found = true;
2368*58b9f456SAndroid Build Coastguard Worker                            goto __exit;
2369*58b9f456SAndroid Build Coastguard Worker                        }
2370*58b9f456SAndroid Build Coastguard Worker                    }
2371*58b9f456SAndroid Build Coastguard Worker                    if (__collate_ && !__ranges_.empty())
2372*58b9f456SAndroid Build Coastguard Worker                    {
2373*58b9f456SAndroid Build Coastguard Worker                        string_type __s2 = __traits_.transform(&__ch2.first,
2374*58b9f456SAndroid Build Coastguard Worker                                                               &__ch2.first + 2);
2375*58b9f456SAndroid Build Coastguard Worker                        for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2376*58b9f456SAndroid Build Coastguard Worker                        {
2377*58b9f456SAndroid Build Coastguard Worker                            if (__ranges_[__i].first <= __s2 &&
2378*58b9f456SAndroid Build Coastguard Worker                                __s2 <= __ranges_[__i].second)
2379*58b9f456SAndroid Build Coastguard Worker                            {
2380*58b9f456SAndroid Build Coastguard Worker                                __found = true;
2381*58b9f456SAndroid Build Coastguard Worker                                goto __exit;
2382*58b9f456SAndroid Build Coastguard Worker                            }
2383*58b9f456SAndroid Build Coastguard Worker                        }
2384*58b9f456SAndroid Build Coastguard Worker                    }
2385*58b9f456SAndroid Build Coastguard Worker                    if (!__equivalences_.empty())
2386*58b9f456SAndroid Build Coastguard Worker                    {
2387*58b9f456SAndroid Build Coastguard Worker                        string_type __s2 = __traits_.transform_primary(&__ch2.first,
2388*58b9f456SAndroid Build Coastguard Worker                                                                       &__ch2.first + 2);
2389*58b9f456SAndroid Build Coastguard Worker                        for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2390*58b9f456SAndroid Build Coastguard Worker                        {
2391*58b9f456SAndroid Build Coastguard Worker                            if (__s2 == __equivalences_[__i])
2392*58b9f456SAndroid Build Coastguard Worker                            {
2393*58b9f456SAndroid Build Coastguard Worker                                __found = true;
2394*58b9f456SAndroid Build Coastguard Worker                                goto __exit;
2395*58b9f456SAndroid Build Coastguard Worker                            }
2396*58b9f456SAndroid Build Coastguard Worker                        }
2397*58b9f456SAndroid Build Coastguard Worker                    }
2398*58b9f456SAndroid Build Coastguard Worker                    if (__traits_.isctype(__ch2.first, __mask_) &&
2399*58b9f456SAndroid Build Coastguard Worker                        __traits_.isctype(__ch2.second, __mask_))
2400*58b9f456SAndroid Build Coastguard Worker                    {
2401*58b9f456SAndroid Build Coastguard Worker                        __found = true;
2402*58b9f456SAndroid Build Coastguard Worker                        goto __exit;
2403*58b9f456SAndroid Build Coastguard Worker                    }
2404*58b9f456SAndroid Build Coastguard Worker                    if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2405*58b9f456SAndroid Build Coastguard Worker                        !__traits_.isctype(__ch2.second, __neg_mask_))
2406*58b9f456SAndroid Build Coastguard Worker                    {
2407*58b9f456SAndroid Build Coastguard Worker                        __found = true;
2408*58b9f456SAndroid Build Coastguard Worker                        goto __exit;
2409*58b9f456SAndroid Build Coastguard Worker                    }
2410*58b9f456SAndroid Build Coastguard Worker                    goto __exit;
2411*58b9f456SAndroid Build Coastguard Worker                }
2412*58b9f456SAndroid Build Coastguard Worker            }
2413*58b9f456SAndroid Build Coastguard Worker        }
2414*58b9f456SAndroid Build Coastguard Worker        // test *__s.__current_ as not a digraph
2415*58b9f456SAndroid Build Coastguard Worker        _CharT __ch = *__s.__current_;
2416*58b9f456SAndroid Build Coastguard Worker        if (__icase_)
2417*58b9f456SAndroid Build Coastguard Worker            __ch = __traits_.translate_nocase(__ch);
2418*58b9f456SAndroid Build Coastguard Worker        else if (__collate_)
2419*58b9f456SAndroid Build Coastguard Worker            __ch = __traits_.translate(__ch);
2420*58b9f456SAndroid Build Coastguard Worker        for (size_t __i = 0; __i < __chars_.size(); ++__i)
2421*58b9f456SAndroid Build Coastguard Worker        {
2422*58b9f456SAndroid Build Coastguard Worker            if (__ch == __chars_[__i])
2423*58b9f456SAndroid Build Coastguard Worker            {
2424*58b9f456SAndroid Build Coastguard Worker                __found = true;
2425*58b9f456SAndroid Build Coastguard Worker                goto __exit;
2426*58b9f456SAndroid Build Coastguard Worker            }
2427*58b9f456SAndroid Build Coastguard Worker        }
2428*58b9f456SAndroid Build Coastguard Worker        // When there's at least one of __neg_chars_ and __neg_mask_, the set
2429*58b9f456SAndroid Build Coastguard Worker        // of "__found" chars is
2430*58b9f456SAndroid Build Coastguard Worker        //   union(complement(union(__neg_chars_, __neg_mask_)),
2431*58b9f456SAndroid Build Coastguard Worker        //         other cases...)
2432*58b9f456SAndroid Build Coastguard Worker        //
2433*58b9f456SAndroid Build Coastguard Worker        // It doesn't make sense to check this when there are no __neg_chars_
2434*58b9f456SAndroid Build Coastguard Worker        // and no __neg_mask_.
2435*58b9f456SAndroid Build Coastguard Worker        if (!(__neg_mask_ == 0 && __neg_chars_.empty()))
2436*58b9f456SAndroid Build Coastguard Worker        {
2437*58b9f456SAndroid Build Coastguard Worker            const bool __in_neg_mask = __traits_.isctype(__ch, __neg_mask_);
2438*58b9f456SAndroid Build Coastguard Worker          const bool __in_neg_chars =
2439*58b9f456SAndroid Build Coastguard Worker              std::find(__neg_chars_.begin(), __neg_chars_.end(), __ch) !=
2440*58b9f456SAndroid Build Coastguard Worker              __neg_chars_.end();
2441*58b9f456SAndroid Build Coastguard Worker          if (!(__in_neg_mask || __in_neg_chars))
2442*58b9f456SAndroid Build Coastguard Worker          {
2443*58b9f456SAndroid Build Coastguard Worker            __found = true;
2444*58b9f456SAndroid Build Coastguard Worker            goto __exit;
2445*58b9f456SAndroid Build Coastguard Worker          }
2446*58b9f456SAndroid Build Coastguard Worker        }
2447*58b9f456SAndroid Build Coastguard Worker        if (!__ranges_.empty())
2448*58b9f456SAndroid Build Coastguard Worker        {
2449*58b9f456SAndroid Build Coastguard Worker            string_type __s2 = __collate_ ?
2450*58b9f456SAndroid Build Coastguard Worker                                   __traits_.transform(&__ch, &__ch + 1) :
2451*58b9f456SAndroid Build Coastguard Worker                                   string_type(1, __ch);
2452*58b9f456SAndroid Build Coastguard Worker            for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2453*58b9f456SAndroid Build Coastguard Worker            {
2454*58b9f456SAndroid Build Coastguard Worker                if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2455*58b9f456SAndroid Build Coastguard Worker                {
2456*58b9f456SAndroid Build Coastguard Worker                    __found = true;
2457*58b9f456SAndroid Build Coastguard Worker                    goto __exit;
2458*58b9f456SAndroid Build Coastguard Worker                }
2459*58b9f456SAndroid Build Coastguard Worker            }
2460*58b9f456SAndroid Build Coastguard Worker        }
2461*58b9f456SAndroid Build Coastguard Worker        if (!__equivalences_.empty())
2462*58b9f456SAndroid Build Coastguard Worker        {
2463*58b9f456SAndroid Build Coastguard Worker            string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2464*58b9f456SAndroid Build Coastguard Worker            for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2465*58b9f456SAndroid Build Coastguard Worker            {
2466*58b9f456SAndroid Build Coastguard Worker                if (__s2 == __equivalences_[__i])
2467*58b9f456SAndroid Build Coastguard Worker                {
2468*58b9f456SAndroid Build Coastguard Worker                    __found = true;
2469*58b9f456SAndroid Build Coastguard Worker                    goto __exit;
2470*58b9f456SAndroid Build Coastguard Worker                }
2471*58b9f456SAndroid Build Coastguard Worker            }
2472*58b9f456SAndroid Build Coastguard Worker        }
2473*58b9f456SAndroid Build Coastguard Worker        if (__traits_.isctype(__ch, __mask_))
2474*58b9f456SAndroid Build Coastguard Worker        {
2475*58b9f456SAndroid Build Coastguard Worker            __found = true;
2476*58b9f456SAndroid Build Coastguard Worker            goto __exit;
2477*58b9f456SAndroid Build Coastguard Worker        }
2478*58b9f456SAndroid Build Coastguard Worker    }
2479*58b9f456SAndroid Build Coastguard Worker    else
2480*58b9f456SAndroid Build Coastguard Worker        __found = __negate_;  // force reject
2481*58b9f456SAndroid Build Coastguard Worker__exit:
2482*58b9f456SAndroid Build Coastguard Worker    if (__found != __negate_)
2483*58b9f456SAndroid Build Coastguard Worker    {
2484*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__accept_and_consume;
2485*58b9f456SAndroid Build Coastguard Worker        __s.__current_ += __consumed;
2486*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->first();
2487*58b9f456SAndroid Build Coastguard Worker    }
2488*58b9f456SAndroid Build Coastguard Worker    else
2489*58b9f456SAndroid Build Coastguard Worker    {
2490*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__reject;
2491*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = nullptr;
2492*58b9f456SAndroid Build Coastguard Worker    }
2493*58b9f456SAndroid Build Coastguard Worker}
2494*58b9f456SAndroid Build Coastguard Worker
2495*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits> class __lookahead;
2496*58b9f456SAndroid Build Coastguard Worker
2497*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits = regex_traits<_CharT> >
2498*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS basic_regex
2499*58b9f456SAndroid Build Coastguard Worker{
2500*58b9f456SAndroid Build Coastguard Workerpublic:
2501*58b9f456SAndroid Build Coastguard Worker    // types:
2502*58b9f456SAndroid Build Coastguard Worker    typedef _CharT                              value_type;
2503*58b9f456SAndroid Build Coastguard Worker    typedef _Traits                             traits_type;
2504*58b9f456SAndroid Build Coastguard Worker    typedef typename _Traits::string_type       string_type;
2505*58b9f456SAndroid Build Coastguard Worker    typedef regex_constants::syntax_option_type flag_type;
2506*58b9f456SAndroid Build Coastguard Worker    typedef typename _Traits::locale_type       locale_type;
2507*58b9f456SAndroid Build Coastguard Worker
2508*58b9f456SAndroid Build Coastguard Workerprivate:
2509*58b9f456SAndroid Build Coastguard Worker    _Traits   __traits_;
2510*58b9f456SAndroid Build Coastguard Worker    flag_type __flags_;
2511*58b9f456SAndroid Build Coastguard Worker    unsigned __marked_count_;
2512*58b9f456SAndroid Build Coastguard Worker    unsigned __loop_count_;
2513*58b9f456SAndroid Build Coastguard Worker    int __open_count_;
2514*58b9f456SAndroid Build Coastguard Worker    shared_ptr<__empty_state<_CharT> > __start_;
2515*58b9f456SAndroid Build Coastguard Worker    __owns_one_state<_CharT>* __end_;
2516*58b9f456SAndroid Build Coastguard Worker
2517*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
2518*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__node<_CharT> __node;
2519*58b9f456SAndroid Build Coastguard Worker
2520*58b9f456SAndroid Build Coastguard Workerpublic:
2521*58b9f456SAndroid Build Coastguard Worker    // constants:
2522*58b9f456SAndroid Build Coastguard Worker    static const regex_constants::syntax_option_type icase = regex_constants::icase;
2523*58b9f456SAndroid Build Coastguard Worker    static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2524*58b9f456SAndroid Build Coastguard Worker    static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
2525*58b9f456SAndroid Build Coastguard Worker    static const regex_constants::syntax_option_type collate = regex_constants::collate;
2526*58b9f456SAndroid Build Coastguard Worker    static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2527*58b9f456SAndroid Build Coastguard Worker    static const regex_constants::syntax_option_type basic = regex_constants::basic;
2528*58b9f456SAndroid Build Coastguard Worker    static const regex_constants::syntax_option_type extended = regex_constants::extended;
2529*58b9f456SAndroid Build Coastguard Worker    static const regex_constants::syntax_option_type awk = regex_constants::awk;
2530*58b9f456SAndroid Build Coastguard Worker    static const regex_constants::syntax_option_type grep = regex_constants::grep;
2531*58b9f456SAndroid Build Coastguard Worker    static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
2532*58b9f456SAndroid Build Coastguard Worker
2533*58b9f456SAndroid Build Coastguard Worker    // construct/copy/destroy:
2534*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2535*58b9f456SAndroid Build Coastguard Worker    basic_regex()
2536*58b9f456SAndroid Build Coastguard Worker        : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0),
2537*58b9f456SAndroid Build Coastguard Worker          __end_(0)
2538*58b9f456SAndroid Build Coastguard Worker        {}
2539*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2540*58b9f456SAndroid Build Coastguard Worker    explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2541*58b9f456SAndroid Build Coastguard Worker        : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2542*58b9f456SAndroid Build Coastguard Worker          __end_(0)
2543*58b9f456SAndroid Build Coastguard Worker        {__parse(__p, __p + __traits_.length(__p));}
2544*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2545*58b9f456SAndroid Build Coastguard Worker    basic_regex(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
2546*58b9f456SAndroid Build Coastguard Worker        : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2547*58b9f456SAndroid Build Coastguard Worker          __end_(0)
2548*58b9f456SAndroid Build Coastguard Worker        {__parse(__p, __p + __len);}
2549*58b9f456SAndroid Build Coastguard Worker//     basic_regex(const basic_regex&) = default;
2550*58b9f456SAndroid Build Coastguard Worker//     basic_regex(basic_regex&&) = default;
2551*58b9f456SAndroid Build Coastguard Worker    template <class _ST, class _SA>
2552*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
2553*58b9f456SAndroid Build Coastguard Worker        explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2554*58b9f456SAndroid Build Coastguard Worker                             flag_type __f = regex_constants::ECMAScript)
2555*58b9f456SAndroid Build Coastguard Worker        : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2556*58b9f456SAndroid Build Coastguard Worker          __end_(0)
2557*58b9f456SAndroid Build Coastguard Worker        {__parse(__p.begin(), __p.end());}
2558*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2559*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
2560*58b9f456SAndroid Build Coastguard Worker        basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2561*58b9f456SAndroid Build Coastguard Worker                    flag_type __f = regex_constants::ECMAScript)
2562*58b9f456SAndroid Build Coastguard Worker        : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2563*58b9f456SAndroid Build Coastguard Worker          __end_(0)
2564*58b9f456SAndroid Build Coastguard Worker        {__parse(__first, __last);}
2565*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
2566*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2567*58b9f456SAndroid Build Coastguard Worker    basic_regex(initializer_list<value_type> __il,
2568*58b9f456SAndroid Build Coastguard Worker                flag_type __f = regex_constants::ECMAScript)
2569*58b9f456SAndroid Build Coastguard Worker        : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2570*58b9f456SAndroid Build Coastguard Worker          __end_(0)
2571*58b9f456SAndroid Build Coastguard Worker        {__parse(__il.begin(), __il.end());}
2572*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_CXX03_LANG
2573*58b9f456SAndroid Build Coastguard Worker
2574*58b9f456SAndroid Build Coastguard Worker//    ~basic_regex() = default;
2575*58b9f456SAndroid Build Coastguard Worker
2576*58b9f456SAndroid Build Coastguard Worker//     basic_regex& operator=(const basic_regex&) = default;
2577*58b9f456SAndroid Build Coastguard Worker//     basic_regex& operator=(basic_regex&&) = default;
2578*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2579*58b9f456SAndroid Build Coastguard Worker    basic_regex& operator=(const value_type* __p)
2580*58b9f456SAndroid Build Coastguard Worker        {return assign(__p);}
2581*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
2582*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2583*58b9f456SAndroid Build Coastguard Worker    basic_regex& operator=(initializer_list<value_type> __il)
2584*58b9f456SAndroid Build Coastguard Worker        {return assign(__il);}
2585*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_CXX03_LANG
2586*58b9f456SAndroid Build Coastguard Worker    template <class _ST, class _SA>
2587*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
2588*58b9f456SAndroid Build Coastguard Worker        basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2589*58b9f456SAndroid Build Coastguard Worker        {return assign(__p);}
2590*58b9f456SAndroid Build Coastguard Worker
2591*58b9f456SAndroid Build Coastguard Worker    // assign:
2592*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2593*58b9f456SAndroid Build Coastguard Worker    basic_regex& assign(const basic_regex& __that)
2594*58b9f456SAndroid Build Coastguard Worker        {return *this = __that;}
2595*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
2596*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2597*58b9f456SAndroid Build Coastguard Worker    basic_regex& assign(basic_regex&& __that) _NOEXCEPT
2598*58b9f456SAndroid Build Coastguard Worker        {return *this = _VSTD::move(__that);}
2599*58b9f456SAndroid Build Coastguard Worker#endif
2600*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2601*58b9f456SAndroid Build Coastguard Worker    basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2602*58b9f456SAndroid Build Coastguard Worker        {return assign(__p, __p + __traits_.length(__p), __f);}
2603*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2604*58b9f456SAndroid Build Coastguard Worker    basic_regex& assign(const value_type* __p, size_t __len, flag_type __f)
2605*58b9f456SAndroid Build Coastguard Worker        {return assign(__p, __p + __len, __f);}
2606*58b9f456SAndroid Build Coastguard Worker    template <class _ST, class _SA>
2607*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
2608*58b9f456SAndroid Build Coastguard Worker        basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
2609*58b9f456SAndroid Build Coastguard Worker                            flag_type __f = regex_constants::ECMAScript)
2610*58b9f456SAndroid Build Coastguard Worker            {return assign(__s.begin(), __s.end(), __f);}
2611*58b9f456SAndroid Build Coastguard Worker
2612*58b9f456SAndroid Build Coastguard Worker    template <class _InputIterator>
2613*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
2614*58b9f456SAndroid Build Coastguard Worker        typename enable_if
2615*58b9f456SAndroid Build Coastguard Worker        <
2616*58b9f456SAndroid Build Coastguard Worker             __is_input_iterator  <_InputIterator>::value &&
2617*58b9f456SAndroid Build Coastguard Worker            !__is_forward_iterator<_InputIterator>::value,
2618*58b9f456SAndroid Build Coastguard Worker            basic_regex&
2619*58b9f456SAndroid Build Coastguard Worker        >::type
2620*58b9f456SAndroid Build Coastguard Worker        assign(_InputIterator __first, _InputIterator __last,
2621*58b9f456SAndroid Build Coastguard Worker                            flag_type __f = regex_constants::ECMAScript)
2622*58b9f456SAndroid Build Coastguard Worker        {
2623*58b9f456SAndroid Build Coastguard Worker            basic_string<_CharT> __t(__first, __last);
2624*58b9f456SAndroid Build Coastguard Worker            return assign(__t.begin(), __t.end(), __f);
2625*58b9f456SAndroid Build Coastguard Worker        }
2626*58b9f456SAndroid Build Coastguard Worker
2627*58b9f456SAndroid Build Coastguard Workerprivate:
2628*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2629*58b9f456SAndroid Build Coastguard Worker    void __member_init(flag_type __f)
2630*58b9f456SAndroid Build Coastguard Worker    {
2631*58b9f456SAndroid Build Coastguard Worker        __flags_ = __f;
2632*58b9f456SAndroid Build Coastguard Worker        __marked_count_ = 0;
2633*58b9f456SAndroid Build Coastguard Worker        __loop_count_ = 0;
2634*58b9f456SAndroid Build Coastguard Worker        __open_count_ = 0;
2635*58b9f456SAndroid Build Coastguard Worker        __end_ = nullptr;
2636*58b9f456SAndroid Build Coastguard Worker    }
2637*58b9f456SAndroid Build Coastguard Workerpublic:
2638*58b9f456SAndroid Build Coastguard Worker
2639*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2640*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
2641*58b9f456SAndroid Build Coastguard Worker        typename enable_if
2642*58b9f456SAndroid Build Coastguard Worker        <
2643*58b9f456SAndroid Build Coastguard Worker            __is_forward_iterator<_ForwardIterator>::value,
2644*58b9f456SAndroid Build Coastguard Worker            basic_regex&
2645*58b9f456SAndroid Build Coastguard Worker        >::type
2646*58b9f456SAndroid Build Coastguard Worker        assign(_ForwardIterator __first, _ForwardIterator __last,
2647*58b9f456SAndroid Build Coastguard Worker                            flag_type __f = regex_constants::ECMAScript)
2648*58b9f456SAndroid Build Coastguard Worker        {
2649*58b9f456SAndroid Build Coastguard Worker            return assign(basic_regex(__first, __last, __f));
2650*58b9f456SAndroid Build Coastguard Worker        }
2651*58b9f456SAndroid Build Coastguard Worker
2652*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
2653*58b9f456SAndroid Build Coastguard Worker
2654*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2655*58b9f456SAndroid Build Coastguard Worker    basic_regex& assign(initializer_list<value_type> __il,
2656*58b9f456SAndroid Build Coastguard Worker                        flag_type __f = regex_constants::ECMAScript)
2657*58b9f456SAndroid Build Coastguard Worker        {return assign(__il.begin(), __il.end(), __f);}
2658*58b9f456SAndroid Build Coastguard Worker
2659*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_CXX03_LANG
2660*58b9f456SAndroid Build Coastguard Worker
2661*58b9f456SAndroid Build Coastguard Worker    // const operations:
2662*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2663*58b9f456SAndroid Build Coastguard Worker    unsigned mark_count() const {return __marked_count_;}
2664*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2665*58b9f456SAndroid Build Coastguard Worker    flag_type flags() const {return __flags_;}
2666*58b9f456SAndroid Build Coastguard Worker
2667*58b9f456SAndroid Build Coastguard Worker    // locale:
2668*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2669*58b9f456SAndroid Build Coastguard Worker    locale_type imbue(locale_type __loc)
2670*58b9f456SAndroid Build Coastguard Worker    {
2671*58b9f456SAndroid Build Coastguard Worker        __member_init(ECMAScript);
2672*58b9f456SAndroid Build Coastguard Worker        __start_.reset();
2673*58b9f456SAndroid Build Coastguard Worker        return __traits_.imbue(__loc);
2674*58b9f456SAndroid Build Coastguard Worker    }
2675*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2676*58b9f456SAndroid Build Coastguard Worker    locale_type getloc() const {return __traits_.getloc();}
2677*58b9f456SAndroid Build Coastguard Worker
2678*58b9f456SAndroid Build Coastguard Worker    // swap:
2679*58b9f456SAndroid Build Coastguard Worker    void swap(basic_regex& __r);
2680*58b9f456SAndroid Build Coastguard Worker
2681*58b9f456SAndroid Build Coastguard Workerprivate:
2682*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2683*58b9f456SAndroid Build Coastguard Worker    unsigned __loop_count() const {return __loop_count_;}
2684*58b9f456SAndroid Build Coastguard Worker
2685*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2686*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2687*58b9f456SAndroid Build Coastguard Worker        __parse(_ForwardIterator __first, _ForwardIterator __last);
2688*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2689*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2690*58b9f456SAndroid Build Coastguard Worker        __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2691*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2692*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2693*58b9f456SAndroid Build Coastguard Worker        __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2694*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2695*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2696*58b9f456SAndroid Build Coastguard Worker        __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2697*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2698*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2699*58b9f456SAndroid Build Coastguard Worker        __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2700*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2701*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2702*58b9f456SAndroid Build Coastguard Worker        __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2703*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2704*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2705*58b9f456SAndroid Build Coastguard Worker        __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2706*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2707*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2708*58b9f456SAndroid Build Coastguard Worker        __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2709*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2710*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2711*58b9f456SAndroid Build Coastguard Worker        __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2712*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2713*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2714*58b9f456SAndroid Build Coastguard Worker        __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2715*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2716*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2717*58b9f456SAndroid Build Coastguard Worker        __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2718*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2719*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2720*58b9f456SAndroid Build Coastguard Worker        __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2721*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2722*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2723*58b9f456SAndroid Build Coastguard Worker        __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2724*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2725*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2726*58b9f456SAndroid Build Coastguard Worker        __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2727*58b9f456SAndroid Build Coastguard Worker                               __owns_one_state<_CharT>* __s,
2728*58b9f456SAndroid Build Coastguard Worker                               unsigned __mexp_begin, unsigned __mexp_end);
2729*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2730*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2731*58b9f456SAndroid Build Coastguard Worker        __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2732*58b9f456SAndroid Build Coastguard Worker                                __owns_one_state<_CharT>* __s,
2733*58b9f456SAndroid Build Coastguard Worker                                unsigned __mexp_begin, unsigned __mexp_end);
2734*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2735*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2736*58b9f456SAndroid Build Coastguard Worker        __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2737*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2738*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2739*58b9f456SAndroid Build Coastguard Worker        __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2740*58b9f456SAndroid Build Coastguard Worker                            __bracket_expression<_CharT, _Traits>* __ml);
2741*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2742*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2743*58b9f456SAndroid Build Coastguard Worker        __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2744*58b9f456SAndroid Build Coastguard Worker                                __bracket_expression<_CharT, _Traits>* __ml);
2745*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2746*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2747*58b9f456SAndroid Build Coastguard Worker        __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2748*58b9f456SAndroid Build Coastguard Worker                                  __bracket_expression<_CharT, _Traits>* __ml);
2749*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2750*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2751*58b9f456SAndroid Build Coastguard Worker        __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2752*58b9f456SAndroid Build Coastguard Worker                                __bracket_expression<_CharT, _Traits>* __ml);
2753*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2754*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2755*58b9f456SAndroid Build Coastguard Worker        __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2756*58b9f456SAndroid Build Coastguard Worker                                 basic_string<_CharT>& __col_sym);
2757*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2758*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2759*58b9f456SAndroid Build Coastguard Worker        __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
2760*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2761*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2762*58b9f456SAndroid Build Coastguard Worker        __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2763*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2764*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2765*58b9f456SAndroid Build Coastguard Worker        __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2766*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2767*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2768*58b9f456SAndroid Build Coastguard Worker        __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2769*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2770*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2771*58b9f456SAndroid Build Coastguard Worker        __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2772*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2773*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2774*58b9f456SAndroid Build Coastguard Worker        __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2775*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2776*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2777*58b9f456SAndroid Build Coastguard Worker        __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2778*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2779*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2780*58b9f456SAndroid Build Coastguard Worker        __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2781*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2782*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2783*58b9f456SAndroid Build Coastguard Worker        __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2784*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2785*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2786*58b9f456SAndroid Build Coastguard Worker        __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2787*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2788*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2789*58b9f456SAndroid Build Coastguard Worker        __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2790*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2791*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2792*58b9f456SAndroid Build Coastguard Worker        __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2793*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2794*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2795*58b9f456SAndroid Build Coastguard Worker        __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2796*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2797*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2798*58b9f456SAndroid Build Coastguard Worker        __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2799*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2800*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2801*58b9f456SAndroid Build Coastguard Worker        __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2802*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2803*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2804*58b9f456SAndroid Build Coastguard Worker        __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2805*58b9f456SAndroid Build Coastguard Worker                                 basic_string<_CharT>* __str = nullptr);
2806*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2807*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2808*58b9f456SAndroid Build Coastguard Worker        __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
2809*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2810*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2811*58b9f456SAndroid Build Coastguard Worker        __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2812*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2813*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2814*58b9f456SAndroid Build Coastguard Worker        __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
2815*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2816*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2817*58b9f456SAndroid Build Coastguard Worker        __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2818*58b9f456SAndroid Build Coastguard Worker                          basic_string<_CharT>& __str,
2819*58b9f456SAndroid Build Coastguard Worker                          __bracket_expression<_CharT, _Traits>* __ml);
2820*58b9f456SAndroid Build Coastguard Worker    template <class _ForwardIterator>
2821*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator
2822*58b9f456SAndroid Build Coastguard Worker        __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2823*58b9f456SAndroid Build Coastguard Worker                          basic_string<_CharT>* __str = nullptr);
2824*58b9f456SAndroid Build Coastguard Worker
2825*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2826*58b9f456SAndroid Build Coastguard Worker    void __push_l_anchor();
2827*58b9f456SAndroid Build Coastguard Worker    void __push_r_anchor();
2828*58b9f456SAndroid Build Coastguard Worker    void __push_match_any();
2829*58b9f456SAndroid Build Coastguard Worker    void __push_match_any_but_newline();
2830*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2831*58b9f456SAndroid Build Coastguard Worker    void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2832*58b9f456SAndroid Build Coastguard Worker                                  unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2833*58b9f456SAndroid Build Coastguard Worker        {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2834*58b9f456SAndroid Build Coastguard Worker                     __mexp_begin, __mexp_end);}
2835*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
2836*58b9f456SAndroid Build Coastguard Worker    void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2837*58b9f456SAndroid Build Coastguard Worker                                  unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2838*58b9f456SAndroid Build Coastguard Worker        {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2839*58b9f456SAndroid Build Coastguard Worker                     __mexp_begin, __mexp_end, false);}
2840*58b9f456SAndroid Build Coastguard Worker    void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
2841*58b9f456SAndroid Build Coastguard Worker                     size_t __mexp_begin = 0, size_t __mexp_end = 0,
2842*58b9f456SAndroid Build Coastguard Worker                     bool __greedy = true);
2843*58b9f456SAndroid Build Coastguard Worker    __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
2844*58b9f456SAndroid Build Coastguard Worker    void __push_char(value_type __c);
2845*58b9f456SAndroid Build Coastguard Worker    void __push_back_ref(int __i);
2846*58b9f456SAndroid Build Coastguard Worker    void __push_alternation(__owns_one_state<_CharT>* __sa,
2847*58b9f456SAndroid Build Coastguard Worker                            __owns_one_state<_CharT>* __sb);
2848*58b9f456SAndroid Build Coastguard Worker    void __push_begin_marked_subexpression();
2849*58b9f456SAndroid Build Coastguard Worker    void __push_end_marked_subexpression(unsigned);
2850*58b9f456SAndroid Build Coastguard Worker    void __push_empty();
2851*58b9f456SAndroid Build Coastguard Worker    void __push_word_boundary(bool);
2852*58b9f456SAndroid Build Coastguard Worker    void __push_lookahead(const basic_regex&, bool, unsigned);
2853*58b9f456SAndroid Build Coastguard Worker
2854*58b9f456SAndroid Build Coastguard Worker    template <class _Allocator>
2855*58b9f456SAndroid Build Coastguard Worker        bool
2856*58b9f456SAndroid Build Coastguard Worker        __search(const _CharT* __first, const _CharT* __last,
2857*58b9f456SAndroid Build Coastguard Worker                 match_results<const _CharT*, _Allocator>& __m,
2858*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type __flags) const;
2859*58b9f456SAndroid Build Coastguard Worker
2860*58b9f456SAndroid Build Coastguard Worker    template <class _Allocator>
2861*58b9f456SAndroid Build Coastguard Worker        bool
2862*58b9f456SAndroid Build Coastguard Worker        __match_at_start(const _CharT* __first, const _CharT* __last,
2863*58b9f456SAndroid Build Coastguard Worker                 match_results<const _CharT*, _Allocator>& __m,
2864*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type __flags, bool) const;
2865*58b9f456SAndroid Build Coastguard Worker    template <class _Allocator>
2866*58b9f456SAndroid Build Coastguard Worker        bool
2867*58b9f456SAndroid Build Coastguard Worker        __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
2868*58b9f456SAndroid Build Coastguard Worker                 match_results<const _CharT*, _Allocator>& __m,
2869*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type __flags, bool) const;
2870*58b9f456SAndroid Build Coastguard Worker    template <class _Allocator>
2871*58b9f456SAndroid Build Coastguard Worker        bool
2872*58b9f456SAndroid Build Coastguard Worker        __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
2873*58b9f456SAndroid Build Coastguard Worker                 match_results<const _CharT*, _Allocator>& __m,
2874*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type __flags, bool) const;
2875*58b9f456SAndroid Build Coastguard Worker    template <class _Allocator>
2876*58b9f456SAndroid Build Coastguard Worker        bool
2877*58b9f456SAndroid Build Coastguard Worker        __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
2878*58b9f456SAndroid Build Coastguard Worker                 match_results<const _CharT*, _Allocator>& __m,
2879*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type __flags, bool) const;
2880*58b9f456SAndroid Build Coastguard Worker
2881*58b9f456SAndroid Build Coastguard Worker    template <class _Bp, class _Ap, class _Cp, class _Tp>
2882*58b9f456SAndroid Build Coastguard Worker    friend
2883*58b9f456SAndroid Build Coastguard Worker    bool
2884*58b9f456SAndroid Build Coastguard Worker    regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
2885*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type);
2886*58b9f456SAndroid Build Coastguard Worker
2887*58b9f456SAndroid Build Coastguard Worker    template <class _Ap, class _Cp, class _Tp>
2888*58b9f456SAndroid Build Coastguard Worker    friend
2889*58b9f456SAndroid Build Coastguard Worker    bool
2890*58b9f456SAndroid Build Coastguard Worker    regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
2891*58b9f456SAndroid Build Coastguard Worker                 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
2892*58b9f456SAndroid Build Coastguard Worker
2893*58b9f456SAndroid Build Coastguard Worker    template <class _Bp, class _Cp, class _Tp>
2894*58b9f456SAndroid Build Coastguard Worker    friend
2895*58b9f456SAndroid Build Coastguard Worker    bool
2896*58b9f456SAndroid Build Coastguard Worker    regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
2897*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type);
2898*58b9f456SAndroid Build Coastguard Worker
2899*58b9f456SAndroid Build Coastguard Worker    template <class _Cp, class _Tp>
2900*58b9f456SAndroid Build Coastguard Worker    friend
2901*58b9f456SAndroid Build Coastguard Worker    bool
2902*58b9f456SAndroid Build Coastguard Worker    regex_search(const _Cp*, const _Cp*,
2903*58b9f456SAndroid Build Coastguard Worker                 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
2904*58b9f456SAndroid Build Coastguard Worker
2905*58b9f456SAndroid Build Coastguard Worker    template <class _Cp, class _Ap, class _Tp>
2906*58b9f456SAndroid Build Coastguard Worker    friend
2907*58b9f456SAndroid Build Coastguard Worker    bool
2908*58b9f456SAndroid Build Coastguard Worker    regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
2909*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type);
2910*58b9f456SAndroid Build Coastguard Worker
2911*58b9f456SAndroid Build Coastguard Worker    template <class _ST, class _SA, class _Cp, class _Tp>
2912*58b9f456SAndroid Build Coastguard Worker    friend
2913*58b9f456SAndroid Build Coastguard Worker    bool
2914*58b9f456SAndroid Build Coastguard Worker    regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2915*58b9f456SAndroid Build Coastguard Worker                 const basic_regex<_Cp, _Tp>& __e,
2916*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type __flags);
2917*58b9f456SAndroid Build Coastguard Worker
2918*58b9f456SAndroid Build Coastguard Worker    template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
2919*58b9f456SAndroid Build Coastguard Worker    friend
2920*58b9f456SAndroid Build Coastguard Worker    bool
2921*58b9f456SAndroid Build Coastguard Worker    regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2922*58b9f456SAndroid Build Coastguard Worker                 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
2923*58b9f456SAndroid Build Coastguard Worker                 const basic_regex<_Cp, _Tp>& __e,
2924*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type __flags);
2925*58b9f456SAndroid Build Coastguard Worker
2926*58b9f456SAndroid Build Coastguard Worker    template <class _Iter, class _Ap, class _Cp, class _Tp>
2927*58b9f456SAndroid Build Coastguard Worker    friend
2928*58b9f456SAndroid Build Coastguard Worker    bool
2929*58b9f456SAndroid Build Coastguard Worker    regex_search(__wrap_iter<_Iter> __first,
2930*58b9f456SAndroid Build Coastguard Worker                 __wrap_iter<_Iter> __last,
2931*58b9f456SAndroid Build Coastguard Worker                 match_results<__wrap_iter<_Iter>, _Ap>& __m,
2932*58b9f456SAndroid Build Coastguard Worker                 const basic_regex<_Cp, _Tp>& __e,
2933*58b9f456SAndroid Build Coastguard Worker                 regex_constants::match_flag_type __flags);
2934*58b9f456SAndroid Build Coastguard Worker
2935*58b9f456SAndroid Build Coastguard Worker    template <class, class> friend class __lookahead;
2936*58b9f456SAndroid Build Coastguard Worker};
2937*58b9f456SAndroid Build Coastguard Worker
2938*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
2939*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator,
2940*58b9f456SAndroid Build Coastguard Worker          class = typename enable_if<__is_forward_iterator<_ForwardIterator>::value, nullptr_t>::type
2941*58b9f456SAndroid Build Coastguard Worker>
2942*58b9f456SAndroid Build Coastguard Workerbasic_regex(_ForwardIterator, _ForwardIterator,
2943*58b9f456SAndroid Build Coastguard Worker            regex_constants::syntax_option_type = regex_constants::ECMAScript)
2944*58b9f456SAndroid Build Coastguard Worker    -> basic_regex<typename iterator_traits<_ForwardIterator>::value_type>;
2945*58b9f456SAndroid Build Coastguard Worker#endif
2946*58b9f456SAndroid Build Coastguard Worker
2947*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2948*58b9f456SAndroid Build Coastguard Worker    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
2949*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2950*58b9f456SAndroid Build Coastguard Worker    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
2951*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2952*58b9f456SAndroid Build Coastguard Worker    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
2953*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2954*58b9f456SAndroid Build Coastguard Worker    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
2955*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2956*58b9f456SAndroid Build Coastguard Worker    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
2957*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2958*58b9f456SAndroid Build Coastguard Worker    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
2959*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2960*58b9f456SAndroid Build Coastguard Worker    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
2961*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2962*58b9f456SAndroid Build Coastguard Worker    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
2963*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2964*58b9f456SAndroid Build Coastguard Worker    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
2965*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2966*58b9f456SAndroid Build Coastguard Worker    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
2967*58b9f456SAndroid Build Coastguard Worker
2968*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2969*58b9f456SAndroid Build Coastguard Workervoid
2970*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::swap(basic_regex& __r)
2971*58b9f456SAndroid Build Coastguard Worker{
2972*58b9f456SAndroid Build Coastguard Worker    using _VSTD::swap;
2973*58b9f456SAndroid Build Coastguard Worker    swap(__traits_, __r.__traits_);
2974*58b9f456SAndroid Build Coastguard Worker    swap(__flags_, __r.__flags_);
2975*58b9f456SAndroid Build Coastguard Worker    swap(__marked_count_, __r.__marked_count_);
2976*58b9f456SAndroid Build Coastguard Worker    swap(__loop_count_, __r.__loop_count_);
2977*58b9f456SAndroid Build Coastguard Worker    swap(__open_count_, __r.__open_count_);
2978*58b9f456SAndroid Build Coastguard Worker    swap(__start_, __r.__start_);
2979*58b9f456SAndroid Build Coastguard Worker    swap(__end_, __r.__end_);
2980*58b9f456SAndroid Build Coastguard Worker}
2981*58b9f456SAndroid Build Coastguard Worker
2982*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2983*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
2984*58b9f456SAndroid Build Coastguard Workervoid
2985*58b9f456SAndroid Build Coastguard Workerswap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
2986*58b9f456SAndroid Build Coastguard Worker{
2987*58b9f456SAndroid Build Coastguard Worker    return __x.swap(__y);
2988*58b9f456SAndroid Build Coastguard Worker}
2989*58b9f456SAndroid Build Coastguard Worker
2990*58b9f456SAndroid Build Coastguard Worker// __lookahead
2991*58b9f456SAndroid Build Coastguard Worker
2992*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
2993*58b9f456SAndroid Build Coastguard Workerclass __lookahead
2994*58b9f456SAndroid Build Coastguard Worker    : public __owns_one_state<_CharT>
2995*58b9f456SAndroid Build Coastguard Worker{
2996*58b9f456SAndroid Build Coastguard Worker    typedef __owns_one_state<_CharT> base;
2997*58b9f456SAndroid Build Coastguard Worker
2998*58b9f456SAndroid Build Coastguard Worker    basic_regex<_CharT, _Traits> __exp_;
2999*58b9f456SAndroid Build Coastguard Worker    unsigned __mexp_;
3000*58b9f456SAndroid Build Coastguard Worker    bool __invert_;
3001*58b9f456SAndroid Build Coastguard Worker
3002*58b9f456SAndroid Build Coastguard Worker    __lookahead(const __lookahead&);
3003*58b9f456SAndroid Build Coastguard Worker    __lookahead& operator=(const __lookahead&);
3004*58b9f456SAndroid Build Coastguard Workerpublic:
3005*58b9f456SAndroid Build Coastguard Worker    typedef _VSTD::__state<_CharT> __state;
3006*58b9f456SAndroid Build Coastguard Worker
3007*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
3008*58b9f456SAndroid Build Coastguard Worker    __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
3009*58b9f456SAndroid Build Coastguard Worker        : base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {}
3010*58b9f456SAndroid Build Coastguard Worker
3011*58b9f456SAndroid Build Coastguard Worker    virtual void __exec(__state&) const;
3012*58b9f456SAndroid Build Coastguard Worker};
3013*58b9f456SAndroid Build Coastguard Worker
3014*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3015*58b9f456SAndroid Build Coastguard Workervoid
3016*58b9f456SAndroid Build Coastguard Worker__lookahead<_CharT, _Traits>::__exec(__state& __s) const
3017*58b9f456SAndroid Build Coastguard Worker{
3018*58b9f456SAndroid Build Coastguard Worker    match_results<const _CharT*> __m;
3019*58b9f456SAndroid Build Coastguard Worker    __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
3020*58b9f456SAndroid Build Coastguard Worker    bool __matched = __exp_.__match_at_start_ecma(
3021*58b9f456SAndroid Build Coastguard Worker        __s.__current_, __s.__last_,
3022*58b9f456SAndroid Build Coastguard Worker        __m,
3023*58b9f456SAndroid Build Coastguard Worker        (__s.__flags_ | regex_constants::match_continuous) &
3024*58b9f456SAndroid Build Coastguard Worker        ~regex_constants::__full_match,
3025*58b9f456SAndroid Build Coastguard Worker        __s.__at_first_ && __s.__current_ == __s.__first_);
3026*58b9f456SAndroid Build Coastguard Worker    if (__matched != __invert_)
3027*58b9f456SAndroid Build Coastguard Worker    {
3028*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__accept_but_not_consume;
3029*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = this->first();
3030*58b9f456SAndroid Build Coastguard Worker        for (unsigned __i = 1; __i < __m.size(); ++__i) {
3031*58b9f456SAndroid Build Coastguard Worker            __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
3032*58b9f456SAndroid Build Coastguard Worker        }
3033*58b9f456SAndroid Build Coastguard Worker    }
3034*58b9f456SAndroid Build Coastguard Worker    else
3035*58b9f456SAndroid Build Coastguard Worker    {
3036*58b9f456SAndroid Build Coastguard Worker        __s.__do_ = __state::__reject;
3037*58b9f456SAndroid Build Coastguard Worker        __s.__node_ = nullptr;
3038*58b9f456SAndroid Build Coastguard Worker    }
3039*58b9f456SAndroid Build Coastguard Worker}
3040*58b9f456SAndroid Build Coastguard Worker
3041*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3042*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3043*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3044*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
3045*58b9f456SAndroid Build Coastguard Worker                                      _ForwardIterator __last)
3046*58b9f456SAndroid Build Coastguard Worker{
3047*58b9f456SAndroid Build Coastguard Worker    {
3048*58b9f456SAndroid Build Coastguard Worker        unique_ptr<__node> __h(new __end_state<_CharT>);
3049*58b9f456SAndroid Build Coastguard Worker        __start_.reset(new __empty_state<_CharT>(__h.get()));
3050*58b9f456SAndroid Build Coastguard Worker        __h.release();
3051*58b9f456SAndroid Build Coastguard Worker        __end_ = __start_.get();
3052*58b9f456SAndroid Build Coastguard Worker    }
3053*58b9f456SAndroid Build Coastguard Worker    switch (__flags_ & 0x1F0)
3054*58b9f456SAndroid Build Coastguard Worker    {
3055*58b9f456SAndroid Build Coastguard Worker    case ECMAScript:
3056*58b9f456SAndroid Build Coastguard Worker        __first = __parse_ecma_exp(__first, __last);
3057*58b9f456SAndroid Build Coastguard Worker        break;
3058*58b9f456SAndroid Build Coastguard Worker    case basic:
3059*58b9f456SAndroid Build Coastguard Worker        __first = __parse_basic_reg_exp(__first, __last);
3060*58b9f456SAndroid Build Coastguard Worker        break;
3061*58b9f456SAndroid Build Coastguard Worker    case extended:
3062*58b9f456SAndroid Build Coastguard Worker    case awk:
3063*58b9f456SAndroid Build Coastguard Worker        __first = __parse_extended_reg_exp(__first, __last);
3064*58b9f456SAndroid Build Coastguard Worker        break;
3065*58b9f456SAndroid Build Coastguard Worker    case grep:
3066*58b9f456SAndroid Build Coastguard Worker        __first = __parse_grep(__first, __last);
3067*58b9f456SAndroid Build Coastguard Worker        break;
3068*58b9f456SAndroid Build Coastguard Worker    case egrep:
3069*58b9f456SAndroid Build Coastguard Worker        __first = __parse_egrep(__first, __last);
3070*58b9f456SAndroid Build Coastguard Worker        break;
3071*58b9f456SAndroid Build Coastguard Worker    default:
3072*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::__re_err_grammar>();
3073*58b9f456SAndroid Build Coastguard Worker    }
3074*58b9f456SAndroid Build Coastguard Worker    return __first;
3075*58b9f456SAndroid Build Coastguard Worker}
3076*58b9f456SAndroid Build Coastguard Worker
3077*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3078*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3079*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3080*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
3081*58b9f456SAndroid Build Coastguard Worker                                                    _ForwardIterator __last)
3082*58b9f456SAndroid Build Coastguard Worker{
3083*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3084*58b9f456SAndroid Build Coastguard Worker    {
3085*58b9f456SAndroid Build Coastguard Worker        if (*__first == '^')
3086*58b9f456SAndroid Build Coastguard Worker        {
3087*58b9f456SAndroid Build Coastguard Worker            __push_l_anchor();
3088*58b9f456SAndroid Build Coastguard Worker            ++__first;
3089*58b9f456SAndroid Build Coastguard Worker        }
3090*58b9f456SAndroid Build Coastguard Worker        if (__first != __last)
3091*58b9f456SAndroid Build Coastguard Worker        {
3092*58b9f456SAndroid Build Coastguard Worker            __first = __parse_RE_expression(__first, __last);
3093*58b9f456SAndroid Build Coastguard Worker            if (__first != __last)
3094*58b9f456SAndroid Build Coastguard Worker            {
3095*58b9f456SAndroid Build Coastguard Worker                _ForwardIterator __temp = _VSTD::next(__first);
3096*58b9f456SAndroid Build Coastguard Worker                if (__temp == __last && *__first == '$')
3097*58b9f456SAndroid Build Coastguard Worker                {
3098*58b9f456SAndroid Build Coastguard Worker                    __push_r_anchor();
3099*58b9f456SAndroid Build Coastguard Worker                    ++__first;
3100*58b9f456SAndroid Build Coastguard Worker                }
3101*58b9f456SAndroid Build Coastguard Worker            }
3102*58b9f456SAndroid Build Coastguard Worker        }
3103*58b9f456SAndroid Build Coastguard Worker        if (__first != __last)
3104*58b9f456SAndroid Build Coastguard Worker            __throw_regex_error<regex_constants::__re_err_empty>();
3105*58b9f456SAndroid Build Coastguard Worker    }
3106*58b9f456SAndroid Build Coastguard Worker    return __first;
3107*58b9f456SAndroid Build Coastguard Worker}
3108*58b9f456SAndroid Build Coastguard Worker
3109*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3110*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3111*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3112*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
3113*58b9f456SAndroid Build Coastguard Worker                                                       _ForwardIterator __last)
3114*58b9f456SAndroid Build Coastguard Worker{
3115*58b9f456SAndroid Build Coastguard Worker    __owns_one_state<_CharT>* __sa = __end_;
3116*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
3117*58b9f456SAndroid Build Coastguard Worker    if (__temp == __first)
3118*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::__re_err_empty>();
3119*58b9f456SAndroid Build Coastguard Worker    __first = __temp;
3120*58b9f456SAndroid Build Coastguard Worker    while (__first != __last && *__first == '|')
3121*58b9f456SAndroid Build Coastguard Worker    {
3122*58b9f456SAndroid Build Coastguard Worker        __owns_one_state<_CharT>* __sb = __end_;
3123*58b9f456SAndroid Build Coastguard Worker        __temp = __parse_ERE_branch(++__first, __last);
3124*58b9f456SAndroid Build Coastguard Worker        if (__temp == __first)
3125*58b9f456SAndroid Build Coastguard Worker            __throw_regex_error<regex_constants::__re_err_empty>();
3126*58b9f456SAndroid Build Coastguard Worker        __push_alternation(__sa, __sb);
3127*58b9f456SAndroid Build Coastguard Worker        __first = __temp;
3128*58b9f456SAndroid Build Coastguard Worker    }
3129*58b9f456SAndroid Build Coastguard Worker    return __first;
3130*58b9f456SAndroid Build Coastguard Worker}
3131*58b9f456SAndroid Build Coastguard Worker
3132*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3133*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3134*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3135*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3136*58b9f456SAndroid Build Coastguard Worker                                                 _ForwardIterator __last)
3137*58b9f456SAndroid Build Coastguard Worker{
3138*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
3139*58b9f456SAndroid Build Coastguard Worker    if (__temp == __first)
3140*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::__re_err_empty>();
3141*58b9f456SAndroid Build Coastguard Worker    do
3142*58b9f456SAndroid Build Coastguard Worker    {
3143*58b9f456SAndroid Build Coastguard Worker        __first = __temp;
3144*58b9f456SAndroid Build Coastguard Worker        __temp = __parse_ERE_expression(__first, __last);
3145*58b9f456SAndroid Build Coastguard Worker    } while (__temp != __first);
3146*58b9f456SAndroid Build Coastguard Worker    return __first;
3147*58b9f456SAndroid Build Coastguard Worker}
3148*58b9f456SAndroid Build Coastguard Worker
3149*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3150*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3151*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3152*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3153*58b9f456SAndroid Build Coastguard Worker                                                     _ForwardIterator __last)
3154*58b9f456SAndroid Build Coastguard Worker{
3155*58b9f456SAndroid Build Coastguard Worker    __owns_one_state<_CharT>* __e = __end_;
3156*58b9f456SAndroid Build Coastguard Worker    unsigned __mexp_begin = __marked_count_;
3157*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3158*58b9f456SAndroid Build Coastguard Worker    if (__temp == __first && __temp != __last)
3159*58b9f456SAndroid Build Coastguard Worker    {
3160*58b9f456SAndroid Build Coastguard Worker        switch (*__temp)
3161*58b9f456SAndroid Build Coastguard Worker        {
3162*58b9f456SAndroid Build Coastguard Worker        case '^':
3163*58b9f456SAndroid Build Coastguard Worker            __push_l_anchor();
3164*58b9f456SAndroid Build Coastguard Worker            ++__temp;
3165*58b9f456SAndroid Build Coastguard Worker            break;
3166*58b9f456SAndroid Build Coastguard Worker        case '$':
3167*58b9f456SAndroid Build Coastguard Worker            __push_r_anchor();
3168*58b9f456SAndroid Build Coastguard Worker            ++__temp;
3169*58b9f456SAndroid Build Coastguard Worker            break;
3170*58b9f456SAndroid Build Coastguard Worker        case '(':
3171*58b9f456SAndroid Build Coastguard Worker            __push_begin_marked_subexpression();
3172*58b9f456SAndroid Build Coastguard Worker            unsigned __temp_count = __marked_count_;
3173*58b9f456SAndroid Build Coastguard Worker            ++__open_count_;
3174*58b9f456SAndroid Build Coastguard Worker            __temp = __parse_extended_reg_exp(++__temp, __last);
3175*58b9f456SAndroid Build Coastguard Worker            if (__temp == __last || *__temp != ')')
3176*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_paren>();
3177*58b9f456SAndroid Build Coastguard Worker            __push_end_marked_subexpression(__temp_count);
3178*58b9f456SAndroid Build Coastguard Worker            --__open_count_;
3179*58b9f456SAndroid Build Coastguard Worker            ++__temp;
3180*58b9f456SAndroid Build Coastguard Worker            break;
3181*58b9f456SAndroid Build Coastguard Worker        }
3182*58b9f456SAndroid Build Coastguard Worker    }
3183*58b9f456SAndroid Build Coastguard Worker    if (__temp != __first)
3184*58b9f456SAndroid Build Coastguard Worker        __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3185*58b9f456SAndroid Build Coastguard Worker                                         __marked_count_+1);
3186*58b9f456SAndroid Build Coastguard Worker    __first = __temp;
3187*58b9f456SAndroid Build Coastguard Worker    return __first;
3188*58b9f456SAndroid Build Coastguard Worker}
3189*58b9f456SAndroid Build Coastguard Worker
3190*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3191*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3192*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3193*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3194*58b9f456SAndroid Build Coastguard Worker                                                    _ForwardIterator __last)
3195*58b9f456SAndroid Build Coastguard Worker{
3196*58b9f456SAndroid Build Coastguard Worker    while (true)
3197*58b9f456SAndroid Build Coastguard Worker    {
3198*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3199*58b9f456SAndroid Build Coastguard Worker        if (__temp == __first)
3200*58b9f456SAndroid Build Coastguard Worker            break;
3201*58b9f456SAndroid Build Coastguard Worker        __first = __temp;
3202*58b9f456SAndroid Build Coastguard Worker    }
3203*58b9f456SAndroid Build Coastguard Worker    return __first;
3204*58b9f456SAndroid Build Coastguard Worker}
3205*58b9f456SAndroid Build Coastguard Worker
3206*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3207*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3208*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3209*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3210*58b9f456SAndroid Build Coastguard Worker                                                _ForwardIterator __last)
3211*58b9f456SAndroid Build Coastguard Worker{
3212*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3213*58b9f456SAndroid Build Coastguard Worker    {
3214*58b9f456SAndroid Build Coastguard Worker        __owns_one_state<_CharT>* __e = __end_;
3215*58b9f456SAndroid Build Coastguard Worker        unsigned __mexp_begin = __marked_count_;
3216*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3217*58b9f456SAndroid Build Coastguard Worker        if (__temp != __first)
3218*58b9f456SAndroid Build Coastguard Worker            __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3219*58b9f456SAndroid Build Coastguard Worker                                             __mexp_begin+1, __marked_count_+1);
3220*58b9f456SAndroid Build Coastguard Worker    }
3221*58b9f456SAndroid Build Coastguard Worker    return __first;
3222*58b9f456SAndroid Build Coastguard Worker}
3223*58b9f456SAndroid Build Coastguard Worker
3224*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3225*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3226*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3227*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3228*58b9f456SAndroid Build Coastguard Worker                                                 _ForwardIterator __last)
3229*58b9f456SAndroid Build Coastguard Worker{
3230*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __temp = __first;
3231*58b9f456SAndroid Build Coastguard Worker    __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3232*58b9f456SAndroid Build Coastguard Worker    if (__temp == __first)
3233*58b9f456SAndroid Build Coastguard Worker    {
3234*58b9f456SAndroid Build Coastguard Worker        __temp = __parse_Back_open_paren(__first, __last);
3235*58b9f456SAndroid Build Coastguard Worker        if (__temp != __first)
3236*58b9f456SAndroid Build Coastguard Worker        {
3237*58b9f456SAndroid Build Coastguard Worker            __push_begin_marked_subexpression();
3238*58b9f456SAndroid Build Coastguard Worker            unsigned __temp_count = __marked_count_;
3239*58b9f456SAndroid Build Coastguard Worker            __first = __parse_RE_expression(__temp, __last);
3240*58b9f456SAndroid Build Coastguard Worker            __temp = __parse_Back_close_paren(__first, __last);
3241*58b9f456SAndroid Build Coastguard Worker            if (__temp == __first)
3242*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_paren>();
3243*58b9f456SAndroid Build Coastguard Worker            __push_end_marked_subexpression(__temp_count);
3244*58b9f456SAndroid Build Coastguard Worker            __first = __temp;
3245*58b9f456SAndroid Build Coastguard Worker        }
3246*58b9f456SAndroid Build Coastguard Worker        else
3247*58b9f456SAndroid Build Coastguard Worker            __first = __parse_BACKREF(__first, __last);
3248*58b9f456SAndroid Build Coastguard Worker    }
3249*58b9f456SAndroid Build Coastguard Worker    return __first;
3250*58b9f456SAndroid Build Coastguard Worker}
3251*58b9f456SAndroid Build Coastguard Worker
3252*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3253*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3254*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3255*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3256*58b9f456SAndroid Build Coastguard Worker                                                       _ForwardIterator __first,
3257*58b9f456SAndroid Build Coastguard Worker                                                       _ForwardIterator __last)
3258*58b9f456SAndroid Build Coastguard Worker{
3259*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
3260*58b9f456SAndroid Build Coastguard Worker    if (__temp == __first)
3261*58b9f456SAndroid Build Coastguard Worker    {
3262*58b9f456SAndroid Build Coastguard Worker        __temp = __parse_QUOTED_CHAR(__first, __last);
3263*58b9f456SAndroid Build Coastguard Worker        if (__temp == __first)
3264*58b9f456SAndroid Build Coastguard Worker        {
3265*58b9f456SAndroid Build Coastguard Worker            if (__temp != __last && *__temp == '.')
3266*58b9f456SAndroid Build Coastguard Worker            {
3267*58b9f456SAndroid Build Coastguard Worker                __push_match_any();
3268*58b9f456SAndroid Build Coastguard Worker                ++__temp;
3269*58b9f456SAndroid Build Coastguard Worker            }
3270*58b9f456SAndroid Build Coastguard Worker            else
3271*58b9f456SAndroid Build Coastguard Worker                __temp = __parse_bracket_expression(__first, __last);
3272*58b9f456SAndroid Build Coastguard Worker        }
3273*58b9f456SAndroid Build Coastguard Worker    }
3274*58b9f456SAndroid Build Coastguard Worker    __first = __temp;
3275*58b9f456SAndroid Build Coastguard Worker    return __first;
3276*58b9f456SAndroid Build Coastguard Worker}
3277*58b9f456SAndroid Build Coastguard Worker
3278*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3279*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3280*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3281*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3282*58b9f456SAndroid Build Coastguard Worker                                                       _ForwardIterator __first,
3283*58b9f456SAndroid Build Coastguard Worker                                                       _ForwardIterator __last)
3284*58b9f456SAndroid Build Coastguard Worker{
3285*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3286*58b9f456SAndroid Build Coastguard Worker    if (__temp == __first)
3287*58b9f456SAndroid Build Coastguard Worker    {
3288*58b9f456SAndroid Build Coastguard Worker        __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3289*58b9f456SAndroid Build Coastguard Worker        if (__temp == __first)
3290*58b9f456SAndroid Build Coastguard Worker        {
3291*58b9f456SAndroid Build Coastguard Worker            if (__temp != __last && *__temp == '.')
3292*58b9f456SAndroid Build Coastguard Worker            {
3293*58b9f456SAndroid Build Coastguard Worker                __push_match_any();
3294*58b9f456SAndroid Build Coastguard Worker                ++__temp;
3295*58b9f456SAndroid Build Coastguard Worker            }
3296*58b9f456SAndroid Build Coastguard Worker            else
3297*58b9f456SAndroid Build Coastguard Worker                __temp = __parse_bracket_expression(__first, __last);
3298*58b9f456SAndroid Build Coastguard Worker        }
3299*58b9f456SAndroid Build Coastguard Worker    }
3300*58b9f456SAndroid Build Coastguard Worker    __first = __temp;
3301*58b9f456SAndroid Build Coastguard Worker    return __first;
3302*58b9f456SAndroid Build Coastguard Worker}
3303*58b9f456SAndroid Build Coastguard Worker
3304*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3305*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3306*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3307*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3308*58b9f456SAndroid Build Coastguard Worker                                                      _ForwardIterator __last)
3309*58b9f456SAndroid Build Coastguard Worker{
3310*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3311*58b9f456SAndroid Build Coastguard Worker    {
3312*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __temp = _VSTD::next(__first);
3313*58b9f456SAndroid Build Coastguard Worker        if (__temp != __last)
3314*58b9f456SAndroid Build Coastguard Worker        {
3315*58b9f456SAndroid Build Coastguard Worker            if (*__first == '\\' && *__temp == '(')
3316*58b9f456SAndroid Build Coastguard Worker                __first = ++__temp;
3317*58b9f456SAndroid Build Coastguard Worker        }
3318*58b9f456SAndroid Build Coastguard Worker    }
3319*58b9f456SAndroid Build Coastguard Worker    return __first;
3320*58b9f456SAndroid Build Coastguard Worker}
3321*58b9f456SAndroid Build Coastguard Worker
3322*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3323*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3324*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3325*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3326*58b9f456SAndroid Build Coastguard Worker                                                       _ForwardIterator __last)
3327*58b9f456SAndroid Build Coastguard Worker{
3328*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3329*58b9f456SAndroid Build Coastguard Worker    {
3330*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __temp = _VSTD::next(__first);
3331*58b9f456SAndroid Build Coastguard Worker        if (__temp != __last)
3332*58b9f456SAndroid Build Coastguard Worker        {
3333*58b9f456SAndroid Build Coastguard Worker            if (*__first == '\\' && *__temp == ')')
3334*58b9f456SAndroid Build Coastguard Worker                __first = ++__temp;
3335*58b9f456SAndroid Build Coastguard Worker        }
3336*58b9f456SAndroid Build Coastguard Worker    }
3337*58b9f456SAndroid Build Coastguard Worker    return __first;
3338*58b9f456SAndroid Build Coastguard Worker}
3339*58b9f456SAndroid Build Coastguard Worker
3340*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3341*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3342*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3343*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3344*58b9f456SAndroid Build Coastguard Worker                                                      _ForwardIterator __last)
3345*58b9f456SAndroid Build Coastguard Worker{
3346*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3347*58b9f456SAndroid Build Coastguard Worker    {
3348*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __temp = _VSTD::next(__first);
3349*58b9f456SAndroid Build Coastguard Worker        if (__temp != __last)
3350*58b9f456SAndroid Build Coastguard Worker        {
3351*58b9f456SAndroid Build Coastguard Worker            if (*__first == '\\' && *__temp == '{')
3352*58b9f456SAndroid Build Coastguard Worker                __first = ++__temp;
3353*58b9f456SAndroid Build Coastguard Worker        }
3354*58b9f456SAndroid Build Coastguard Worker    }
3355*58b9f456SAndroid Build Coastguard Worker    return __first;
3356*58b9f456SAndroid Build Coastguard Worker}
3357*58b9f456SAndroid Build Coastguard Worker
3358*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3359*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3360*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3361*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3362*58b9f456SAndroid Build Coastguard Worker                                                       _ForwardIterator __last)
3363*58b9f456SAndroid Build Coastguard Worker{
3364*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3365*58b9f456SAndroid Build Coastguard Worker    {
3366*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __temp = _VSTD::next(__first);
3367*58b9f456SAndroid Build Coastguard Worker        if (__temp != __last)
3368*58b9f456SAndroid Build Coastguard Worker        {
3369*58b9f456SAndroid Build Coastguard Worker            if (*__first == '\\' && *__temp == '}')
3370*58b9f456SAndroid Build Coastguard Worker                __first = ++__temp;
3371*58b9f456SAndroid Build Coastguard Worker        }
3372*58b9f456SAndroid Build Coastguard Worker    }
3373*58b9f456SAndroid Build Coastguard Worker    return __first;
3374*58b9f456SAndroid Build Coastguard Worker}
3375*58b9f456SAndroid Build Coastguard Worker
3376*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3377*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3378*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3379*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3380*58b9f456SAndroid Build Coastguard Worker                                              _ForwardIterator __last)
3381*58b9f456SAndroid Build Coastguard Worker{
3382*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3383*58b9f456SAndroid Build Coastguard Worker    {
3384*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __temp = _VSTD::next(__first);
3385*58b9f456SAndroid Build Coastguard Worker        if (__temp != __last)
3386*58b9f456SAndroid Build Coastguard Worker        {
3387*58b9f456SAndroid Build Coastguard Worker            if (*__first == '\\')
3388*58b9f456SAndroid Build Coastguard Worker            {
3389*58b9f456SAndroid Build Coastguard Worker                int __val = __traits_.value(*__temp, 10);
3390*58b9f456SAndroid Build Coastguard Worker                if (__val >= 1 && __val <= 9)
3391*58b9f456SAndroid Build Coastguard Worker                {
3392*58b9f456SAndroid Build Coastguard Worker                    __push_back_ref(__val);
3393*58b9f456SAndroid Build Coastguard Worker                    __first = ++__temp;
3394*58b9f456SAndroid Build Coastguard Worker                }
3395*58b9f456SAndroid Build Coastguard Worker            }
3396*58b9f456SAndroid Build Coastguard Worker        }
3397*58b9f456SAndroid Build Coastguard Worker    }
3398*58b9f456SAndroid Build Coastguard Worker    return __first;
3399*58b9f456SAndroid Build Coastguard Worker}
3400*58b9f456SAndroid Build Coastguard Worker
3401*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3402*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3403*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3404*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3405*58b9f456SAndroid Build Coastguard Worker                                               _ForwardIterator __last)
3406*58b9f456SAndroid Build Coastguard Worker{
3407*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3408*58b9f456SAndroid Build Coastguard Worker    {
3409*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __temp = _VSTD::next(__first);
3410*58b9f456SAndroid Build Coastguard Worker        if (__temp == __last && *__first == '$')
3411*58b9f456SAndroid Build Coastguard Worker            return __first;
3412*58b9f456SAndroid Build Coastguard Worker        // Not called inside a bracket
3413*58b9f456SAndroid Build Coastguard Worker        if (*__first == '.' || *__first == '\\' || *__first == '[')
3414*58b9f456SAndroid Build Coastguard Worker            return __first;
3415*58b9f456SAndroid Build Coastguard Worker        __push_char(*__first);
3416*58b9f456SAndroid Build Coastguard Worker        ++__first;
3417*58b9f456SAndroid Build Coastguard Worker    }
3418*58b9f456SAndroid Build Coastguard Worker    return __first;
3419*58b9f456SAndroid Build Coastguard Worker}
3420*58b9f456SAndroid Build Coastguard Worker
3421*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3422*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3423*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3424*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3425*58b9f456SAndroid Build Coastguard Worker                                                   _ForwardIterator __last)
3426*58b9f456SAndroid Build Coastguard Worker{
3427*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3428*58b9f456SAndroid Build Coastguard Worker    {
3429*58b9f456SAndroid Build Coastguard Worker        switch (*__first)
3430*58b9f456SAndroid Build Coastguard Worker        {
3431*58b9f456SAndroid Build Coastguard Worker        case '^':
3432*58b9f456SAndroid Build Coastguard Worker        case '.':
3433*58b9f456SAndroid Build Coastguard Worker        case '[':
3434*58b9f456SAndroid Build Coastguard Worker        case '$':
3435*58b9f456SAndroid Build Coastguard Worker        case '(':
3436*58b9f456SAndroid Build Coastguard Worker        case '|':
3437*58b9f456SAndroid Build Coastguard Worker        case '*':
3438*58b9f456SAndroid Build Coastguard Worker        case '+':
3439*58b9f456SAndroid Build Coastguard Worker        case '?':
3440*58b9f456SAndroid Build Coastguard Worker        case '{':
3441*58b9f456SAndroid Build Coastguard Worker        case '\\':
3442*58b9f456SAndroid Build Coastguard Worker            break;
3443*58b9f456SAndroid Build Coastguard Worker        case ')':
3444*58b9f456SAndroid Build Coastguard Worker            if (__open_count_ == 0)
3445*58b9f456SAndroid Build Coastguard Worker            {
3446*58b9f456SAndroid Build Coastguard Worker                __push_char(*__first);
3447*58b9f456SAndroid Build Coastguard Worker                ++__first;
3448*58b9f456SAndroid Build Coastguard Worker            }
3449*58b9f456SAndroid Build Coastguard Worker            break;
3450*58b9f456SAndroid Build Coastguard Worker        default:
3451*58b9f456SAndroid Build Coastguard Worker            __push_char(*__first);
3452*58b9f456SAndroid Build Coastguard Worker            ++__first;
3453*58b9f456SAndroid Build Coastguard Worker            break;
3454*58b9f456SAndroid Build Coastguard Worker        }
3455*58b9f456SAndroid Build Coastguard Worker    }
3456*58b9f456SAndroid Build Coastguard Worker    return __first;
3457*58b9f456SAndroid Build Coastguard Worker}
3458*58b9f456SAndroid Build Coastguard Worker
3459*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3460*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3461*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3462*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3463*58b9f456SAndroid Build Coastguard Worker                                                  _ForwardIterator __last)
3464*58b9f456SAndroid Build Coastguard Worker{
3465*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3466*58b9f456SAndroid Build Coastguard Worker    {
3467*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __temp = _VSTD::next(__first);
3468*58b9f456SAndroid Build Coastguard Worker        if (__temp != __last)
3469*58b9f456SAndroid Build Coastguard Worker        {
3470*58b9f456SAndroid Build Coastguard Worker            if (*__first == '\\')
3471*58b9f456SAndroid Build Coastguard Worker            {
3472*58b9f456SAndroid Build Coastguard Worker                switch (*__temp)
3473*58b9f456SAndroid Build Coastguard Worker                {
3474*58b9f456SAndroid Build Coastguard Worker                case '^':
3475*58b9f456SAndroid Build Coastguard Worker                case '.':
3476*58b9f456SAndroid Build Coastguard Worker                case '*':
3477*58b9f456SAndroid Build Coastguard Worker                case '[':
3478*58b9f456SAndroid Build Coastguard Worker                case '$':
3479*58b9f456SAndroid Build Coastguard Worker                case '\\':
3480*58b9f456SAndroid Build Coastguard Worker                    __push_char(*__temp);
3481*58b9f456SAndroid Build Coastguard Worker                    __first = ++__temp;
3482*58b9f456SAndroid Build Coastguard Worker                    break;
3483*58b9f456SAndroid Build Coastguard Worker                }
3484*58b9f456SAndroid Build Coastguard Worker            }
3485*58b9f456SAndroid Build Coastguard Worker        }
3486*58b9f456SAndroid Build Coastguard Worker    }
3487*58b9f456SAndroid Build Coastguard Worker    return __first;
3488*58b9f456SAndroid Build Coastguard Worker}
3489*58b9f456SAndroid Build Coastguard Worker
3490*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3491*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3492*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3493*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3494*58b9f456SAndroid Build Coastguard Worker                                                      _ForwardIterator __last)
3495*58b9f456SAndroid Build Coastguard Worker{
3496*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3497*58b9f456SAndroid Build Coastguard Worker    {
3498*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __temp = _VSTD::next(__first);
3499*58b9f456SAndroid Build Coastguard Worker        if (__temp != __last)
3500*58b9f456SAndroid Build Coastguard Worker        {
3501*58b9f456SAndroid Build Coastguard Worker            if (*__first == '\\')
3502*58b9f456SAndroid Build Coastguard Worker            {
3503*58b9f456SAndroid Build Coastguard Worker                switch (*__temp)
3504*58b9f456SAndroid Build Coastguard Worker                {
3505*58b9f456SAndroid Build Coastguard Worker                case '^':
3506*58b9f456SAndroid Build Coastguard Worker                case '.':
3507*58b9f456SAndroid Build Coastguard Worker                case '*':
3508*58b9f456SAndroid Build Coastguard Worker                case '[':
3509*58b9f456SAndroid Build Coastguard Worker                case '$':
3510*58b9f456SAndroid Build Coastguard Worker                case '\\':
3511*58b9f456SAndroid Build Coastguard Worker                case '(':
3512*58b9f456SAndroid Build Coastguard Worker                case ')':
3513*58b9f456SAndroid Build Coastguard Worker                case '|':
3514*58b9f456SAndroid Build Coastguard Worker                case '+':
3515*58b9f456SAndroid Build Coastguard Worker                case '?':
3516*58b9f456SAndroid Build Coastguard Worker                case '{':
3517*58b9f456SAndroid Build Coastguard Worker                case '}':
3518*58b9f456SAndroid Build Coastguard Worker                    __push_char(*__temp);
3519*58b9f456SAndroid Build Coastguard Worker                    __first = ++__temp;
3520*58b9f456SAndroid Build Coastguard Worker                    break;
3521*58b9f456SAndroid Build Coastguard Worker                default:
3522*58b9f456SAndroid Build Coastguard Worker                    if ((__flags_ & 0x1F0) == awk)
3523*58b9f456SAndroid Build Coastguard Worker                        __first = __parse_awk_escape(++__first, __last);
3524*58b9f456SAndroid Build Coastguard Worker                    break;
3525*58b9f456SAndroid Build Coastguard Worker                }
3526*58b9f456SAndroid Build Coastguard Worker            }
3527*58b9f456SAndroid Build Coastguard Worker        }
3528*58b9f456SAndroid Build Coastguard Worker    }
3529*58b9f456SAndroid Build Coastguard Worker    return __first;
3530*58b9f456SAndroid Build Coastguard Worker}
3531*58b9f456SAndroid Build Coastguard Worker
3532*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3533*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3534*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3535*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
3536*58b9f456SAndroid Build Coastguard Worker                                                     _ForwardIterator __last,
3537*58b9f456SAndroid Build Coastguard Worker                                                     __owns_one_state<_CharT>* __s,
3538*58b9f456SAndroid Build Coastguard Worker                                                     unsigned __mexp_begin,
3539*58b9f456SAndroid Build Coastguard Worker                                                     unsigned __mexp_end)
3540*58b9f456SAndroid Build Coastguard Worker{
3541*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3542*58b9f456SAndroid Build Coastguard Worker    {
3543*58b9f456SAndroid Build Coastguard Worker        if (*__first == '*')
3544*58b9f456SAndroid Build Coastguard Worker        {
3545*58b9f456SAndroid Build Coastguard Worker            __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3546*58b9f456SAndroid Build Coastguard Worker            ++__first;
3547*58b9f456SAndroid Build Coastguard Worker        }
3548*58b9f456SAndroid Build Coastguard Worker        else
3549*58b9f456SAndroid Build Coastguard Worker        {
3550*58b9f456SAndroid Build Coastguard Worker            _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3551*58b9f456SAndroid Build Coastguard Worker            if (__temp != __first)
3552*58b9f456SAndroid Build Coastguard Worker            {
3553*58b9f456SAndroid Build Coastguard Worker                int __min = 0;
3554*58b9f456SAndroid Build Coastguard Worker                __first = __temp;
3555*58b9f456SAndroid Build Coastguard Worker                __temp = __parse_DUP_COUNT(__first, __last, __min);
3556*58b9f456SAndroid Build Coastguard Worker                if (__temp == __first)
3557*58b9f456SAndroid Build Coastguard Worker                    __throw_regex_error<regex_constants::error_badbrace>();
3558*58b9f456SAndroid Build Coastguard Worker                __first = __temp;
3559*58b9f456SAndroid Build Coastguard Worker                if (__first == __last)
3560*58b9f456SAndroid Build Coastguard Worker                    __throw_regex_error<regex_constants::error_brace>();
3561*58b9f456SAndroid Build Coastguard Worker                if (*__first != ',')
3562*58b9f456SAndroid Build Coastguard Worker                {
3563*58b9f456SAndroid Build Coastguard Worker                    __temp = __parse_Back_close_brace(__first, __last);
3564*58b9f456SAndroid Build Coastguard Worker                    if (__temp == __first)
3565*58b9f456SAndroid Build Coastguard Worker                        __throw_regex_error<regex_constants::error_brace>();
3566*58b9f456SAndroid Build Coastguard Worker                    __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3567*58b9f456SAndroid Build Coastguard Worker                                    true);
3568*58b9f456SAndroid Build Coastguard Worker                    __first = __temp;
3569*58b9f456SAndroid Build Coastguard Worker                }
3570*58b9f456SAndroid Build Coastguard Worker                else
3571*58b9f456SAndroid Build Coastguard Worker                {
3572*58b9f456SAndroid Build Coastguard Worker                    ++__first;  // consume ','
3573*58b9f456SAndroid Build Coastguard Worker                    int __max = -1;
3574*58b9f456SAndroid Build Coastguard Worker                    __first = __parse_DUP_COUNT(__first, __last, __max);
3575*58b9f456SAndroid Build Coastguard Worker                    __temp = __parse_Back_close_brace(__first, __last);
3576*58b9f456SAndroid Build Coastguard Worker                    if (__temp == __first)
3577*58b9f456SAndroid Build Coastguard Worker                        __throw_regex_error<regex_constants::error_brace>();
3578*58b9f456SAndroid Build Coastguard Worker                    if (__max == -1)
3579*58b9f456SAndroid Build Coastguard Worker                        __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3580*58b9f456SAndroid Build Coastguard Worker                    else
3581*58b9f456SAndroid Build Coastguard Worker                    {
3582*58b9f456SAndroid Build Coastguard Worker                        if (__max < __min)
3583*58b9f456SAndroid Build Coastguard Worker                            __throw_regex_error<regex_constants::error_badbrace>();
3584*58b9f456SAndroid Build Coastguard Worker                        __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3585*58b9f456SAndroid Build Coastguard Worker                                    true);
3586*58b9f456SAndroid Build Coastguard Worker                    }
3587*58b9f456SAndroid Build Coastguard Worker                    __first = __temp;
3588*58b9f456SAndroid Build Coastguard Worker                }
3589*58b9f456SAndroid Build Coastguard Worker            }
3590*58b9f456SAndroid Build Coastguard Worker        }
3591*58b9f456SAndroid Build Coastguard Worker    }
3592*58b9f456SAndroid Build Coastguard Worker    return __first;
3593*58b9f456SAndroid Build Coastguard Worker}
3594*58b9f456SAndroid Build Coastguard Worker
3595*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3596*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3597*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3598*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
3599*58b9f456SAndroid Build Coastguard Worker                                                      _ForwardIterator __last,
3600*58b9f456SAndroid Build Coastguard Worker                                                      __owns_one_state<_CharT>* __s,
3601*58b9f456SAndroid Build Coastguard Worker                                                      unsigned __mexp_begin,
3602*58b9f456SAndroid Build Coastguard Worker                                                      unsigned __mexp_end)
3603*58b9f456SAndroid Build Coastguard Worker{
3604*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3605*58b9f456SAndroid Build Coastguard Worker    {
3606*58b9f456SAndroid Build Coastguard Worker        unsigned __grammar = __flags_ & 0x1F0;
3607*58b9f456SAndroid Build Coastguard Worker        switch (*__first)
3608*58b9f456SAndroid Build Coastguard Worker        {
3609*58b9f456SAndroid Build Coastguard Worker        case '*':
3610*58b9f456SAndroid Build Coastguard Worker            ++__first;
3611*58b9f456SAndroid Build Coastguard Worker            if (__grammar == ECMAScript && __first != __last && *__first == '?')
3612*58b9f456SAndroid Build Coastguard Worker            {
3613*58b9f456SAndroid Build Coastguard Worker                ++__first;
3614*58b9f456SAndroid Build Coastguard Worker                __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3615*58b9f456SAndroid Build Coastguard Worker            }
3616*58b9f456SAndroid Build Coastguard Worker            else
3617*58b9f456SAndroid Build Coastguard Worker                __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3618*58b9f456SAndroid Build Coastguard Worker            break;
3619*58b9f456SAndroid Build Coastguard Worker        case '+':
3620*58b9f456SAndroid Build Coastguard Worker            ++__first;
3621*58b9f456SAndroid Build Coastguard Worker            if (__grammar == ECMAScript && __first != __last && *__first == '?')
3622*58b9f456SAndroid Build Coastguard Worker            {
3623*58b9f456SAndroid Build Coastguard Worker                ++__first;
3624*58b9f456SAndroid Build Coastguard Worker                __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3625*58b9f456SAndroid Build Coastguard Worker            }
3626*58b9f456SAndroid Build Coastguard Worker            else
3627*58b9f456SAndroid Build Coastguard Worker                __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3628*58b9f456SAndroid Build Coastguard Worker            break;
3629*58b9f456SAndroid Build Coastguard Worker        case '?':
3630*58b9f456SAndroid Build Coastguard Worker            ++__first;
3631*58b9f456SAndroid Build Coastguard Worker            if (__grammar == ECMAScript && __first != __last && *__first == '?')
3632*58b9f456SAndroid Build Coastguard Worker            {
3633*58b9f456SAndroid Build Coastguard Worker                ++__first;
3634*58b9f456SAndroid Build Coastguard Worker                __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3635*58b9f456SAndroid Build Coastguard Worker            }
3636*58b9f456SAndroid Build Coastguard Worker            else
3637*58b9f456SAndroid Build Coastguard Worker                __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
3638*58b9f456SAndroid Build Coastguard Worker            break;
3639*58b9f456SAndroid Build Coastguard Worker        case '{':
3640*58b9f456SAndroid Build Coastguard Worker            {
3641*58b9f456SAndroid Build Coastguard Worker                int __min;
3642*58b9f456SAndroid Build Coastguard Worker                _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
3643*58b9f456SAndroid Build Coastguard Worker                if (__temp == __first)
3644*58b9f456SAndroid Build Coastguard Worker                    __throw_regex_error<regex_constants::error_badbrace>();
3645*58b9f456SAndroid Build Coastguard Worker                __first = __temp;
3646*58b9f456SAndroid Build Coastguard Worker                if (__first == __last)
3647*58b9f456SAndroid Build Coastguard Worker                    __throw_regex_error<regex_constants::error_brace>();
3648*58b9f456SAndroid Build Coastguard Worker                switch (*__first)
3649*58b9f456SAndroid Build Coastguard Worker                {
3650*58b9f456SAndroid Build Coastguard Worker                case '}':
3651*58b9f456SAndroid Build Coastguard Worker                    ++__first;
3652*58b9f456SAndroid Build Coastguard Worker                    if (__grammar == ECMAScript && __first != __last && *__first == '?')
3653*58b9f456SAndroid Build Coastguard Worker                    {
3654*58b9f456SAndroid Build Coastguard Worker                        ++__first;
3655*58b9f456SAndroid Build Coastguard Worker                        __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3656*58b9f456SAndroid Build Coastguard Worker                    }
3657*58b9f456SAndroid Build Coastguard Worker                    else
3658*58b9f456SAndroid Build Coastguard Worker                        __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
3659*58b9f456SAndroid Build Coastguard Worker                    break;
3660*58b9f456SAndroid Build Coastguard Worker                case ',':
3661*58b9f456SAndroid Build Coastguard Worker                    ++__first;
3662*58b9f456SAndroid Build Coastguard Worker                    if (__first == __last)
3663*58b9f456SAndroid Build Coastguard Worker                        __throw_regex_error<regex_constants::error_badbrace>();
3664*58b9f456SAndroid Build Coastguard Worker                    if (*__first == '}')
3665*58b9f456SAndroid Build Coastguard Worker                    {
3666*58b9f456SAndroid Build Coastguard Worker                        ++__first;
3667*58b9f456SAndroid Build Coastguard Worker                        if (__grammar == ECMAScript && __first != __last && *__first == '?')
3668*58b9f456SAndroid Build Coastguard Worker                        {
3669*58b9f456SAndroid Build Coastguard Worker                            ++__first;
3670*58b9f456SAndroid Build Coastguard Worker                            __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3671*58b9f456SAndroid Build Coastguard Worker                        }
3672*58b9f456SAndroid Build Coastguard Worker                        else
3673*58b9f456SAndroid Build Coastguard Worker                            __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3674*58b9f456SAndroid Build Coastguard Worker                    }
3675*58b9f456SAndroid Build Coastguard Worker                    else
3676*58b9f456SAndroid Build Coastguard Worker                    {
3677*58b9f456SAndroid Build Coastguard Worker                        int __max = -1;
3678*58b9f456SAndroid Build Coastguard Worker                        __temp = __parse_DUP_COUNT(__first, __last, __max);
3679*58b9f456SAndroid Build Coastguard Worker                        if (__temp == __first)
3680*58b9f456SAndroid Build Coastguard Worker                            __throw_regex_error<regex_constants::error_brace>();
3681*58b9f456SAndroid Build Coastguard Worker                        __first = __temp;
3682*58b9f456SAndroid Build Coastguard Worker                        if (__first == __last || *__first != '}')
3683*58b9f456SAndroid Build Coastguard Worker                            __throw_regex_error<regex_constants::error_brace>();
3684*58b9f456SAndroid Build Coastguard Worker                        ++__first;
3685*58b9f456SAndroid Build Coastguard Worker                        if (__max < __min)
3686*58b9f456SAndroid Build Coastguard Worker                            __throw_regex_error<regex_constants::error_badbrace>();
3687*58b9f456SAndroid Build Coastguard Worker                        if (__grammar == ECMAScript && __first != __last && *__first == '?')
3688*58b9f456SAndroid Build Coastguard Worker                        {
3689*58b9f456SAndroid Build Coastguard Worker                            ++__first;
3690*58b9f456SAndroid Build Coastguard Worker                            __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3691*58b9f456SAndroid Build Coastguard Worker                        }
3692*58b9f456SAndroid Build Coastguard Worker                        else
3693*58b9f456SAndroid Build Coastguard Worker                            __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
3694*58b9f456SAndroid Build Coastguard Worker                    }
3695*58b9f456SAndroid Build Coastguard Worker                    break;
3696*58b9f456SAndroid Build Coastguard Worker                default:
3697*58b9f456SAndroid Build Coastguard Worker                    __throw_regex_error<regex_constants::error_badbrace>();
3698*58b9f456SAndroid Build Coastguard Worker                }
3699*58b9f456SAndroid Build Coastguard Worker            }
3700*58b9f456SAndroid Build Coastguard Worker            break;
3701*58b9f456SAndroid Build Coastguard Worker        }
3702*58b9f456SAndroid Build Coastguard Worker    }
3703*58b9f456SAndroid Build Coastguard Worker    return __first;
3704*58b9f456SAndroid Build Coastguard Worker}
3705*58b9f456SAndroid Build Coastguard Worker
3706*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3707*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3708*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3709*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3710*58b9f456SAndroid Build Coastguard Worker                                                         _ForwardIterator __last)
3711*58b9f456SAndroid Build Coastguard Worker{
3712*58b9f456SAndroid Build Coastguard Worker    if (__first != __last && *__first == '[')
3713*58b9f456SAndroid Build Coastguard Worker    {
3714*58b9f456SAndroid Build Coastguard Worker        ++__first;
3715*58b9f456SAndroid Build Coastguard Worker        if (__first == __last)
3716*58b9f456SAndroid Build Coastguard Worker            __throw_regex_error<regex_constants::error_brack>();
3717*58b9f456SAndroid Build Coastguard Worker        bool __negate = false;
3718*58b9f456SAndroid Build Coastguard Worker        if (*__first == '^')
3719*58b9f456SAndroid Build Coastguard Worker        {
3720*58b9f456SAndroid Build Coastguard Worker            ++__first;
3721*58b9f456SAndroid Build Coastguard Worker            __negate = true;
3722*58b9f456SAndroid Build Coastguard Worker        }
3723*58b9f456SAndroid Build Coastguard Worker        __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3724*58b9f456SAndroid Build Coastguard Worker        // __ml owned by *this
3725*58b9f456SAndroid Build Coastguard Worker        if (__first == __last)
3726*58b9f456SAndroid Build Coastguard Worker            __throw_regex_error<regex_constants::error_brack>();
3727*58b9f456SAndroid Build Coastguard Worker        if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']')
3728*58b9f456SAndroid Build Coastguard Worker        {
3729*58b9f456SAndroid Build Coastguard Worker            __ml->__add_char(']');
3730*58b9f456SAndroid Build Coastguard Worker            ++__first;
3731*58b9f456SAndroid Build Coastguard Worker        }
3732*58b9f456SAndroid Build Coastguard Worker        __first = __parse_follow_list(__first, __last, __ml);
3733*58b9f456SAndroid Build Coastguard Worker        if (__first == __last)
3734*58b9f456SAndroid Build Coastguard Worker            __throw_regex_error<regex_constants::error_brack>();
3735*58b9f456SAndroid Build Coastguard Worker        if (*__first == '-')
3736*58b9f456SAndroid Build Coastguard Worker        {
3737*58b9f456SAndroid Build Coastguard Worker            __ml->__add_char('-');
3738*58b9f456SAndroid Build Coastguard Worker            ++__first;
3739*58b9f456SAndroid Build Coastguard Worker        }
3740*58b9f456SAndroid Build Coastguard Worker        if (__first == __last || *__first != ']')
3741*58b9f456SAndroid Build Coastguard Worker            __throw_regex_error<regex_constants::error_brack>();
3742*58b9f456SAndroid Build Coastguard Worker        ++__first;
3743*58b9f456SAndroid Build Coastguard Worker    }
3744*58b9f456SAndroid Build Coastguard Worker    return __first;
3745*58b9f456SAndroid Build Coastguard Worker}
3746*58b9f456SAndroid Build Coastguard Worker
3747*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3748*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3749*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3750*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
3751*58b9f456SAndroid Build Coastguard Worker                                    _ForwardIterator __last,
3752*58b9f456SAndroid Build Coastguard Worker                                    __bracket_expression<_CharT, _Traits>* __ml)
3753*58b9f456SAndroid Build Coastguard Worker{
3754*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
3755*58b9f456SAndroid Build Coastguard Worker    {
3756*58b9f456SAndroid Build Coastguard Worker        while (true)
3757*58b9f456SAndroid Build Coastguard Worker        {
3758*58b9f456SAndroid Build Coastguard Worker            _ForwardIterator __temp = __parse_expression_term(__first, __last,
3759*58b9f456SAndroid Build Coastguard Worker                                                              __ml);
3760*58b9f456SAndroid Build Coastguard Worker            if (__temp == __first)
3761*58b9f456SAndroid Build Coastguard Worker                break;
3762*58b9f456SAndroid Build Coastguard Worker            __first = __temp;
3763*58b9f456SAndroid Build Coastguard Worker        }
3764*58b9f456SAndroid Build Coastguard Worker    }
3765*58b9f456SAndroid Build Coastguard Worker    return __first;
3766*58b9f456SAndroid Build Coastguard Worker}
3767*58b9f456SAndroid Build Coastguard Worker
3768*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3769*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3770*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3771*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
3772*58b9f456SAndroid Build Coastguard Worker                                    _ForwardIterator __last,
3773*58b9f456SAndroid Build Coastguard Worker                                    __bracket_expression<_CharT, _Traits>* __ml)
3774*58b9f456SAndroid Build Coastguard Worker{
3775*58b9f456SAndroid Build Coastguard Worker    if (__first != __last && *__first != ']')
3776*58b9f456SAndroid Build Coastguard Worker    {
3777*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __temp = _VSTD::next(__first);
3778*58b9f456SAndroid Build Coastguard Worker        basic_string<_CharT> __start_range;
3779*58b9f456SAndroid Build Coastguard Worker        if (__temp != __last && *__first == '[')
3780*58b9f456SAndroid Build Coastguard Worker        {
3781*58b9f456SAndroid Build Coastguard Worker            if (*__temp == '=')
3782*58b9f456SAndroid Build Coastguard Worker                return __parse_equivalence_class(++__temp, __last, __ml);
3783*58b9f456SAndroid Build Coastguard Worker            else if (*__temp == ':')
3784*58b9f456SAndroid Build Coastguard Worker                return __parse_character_class(++__temp, __last, __ml);
3785*58b9f456SAndroid Build Coastguard Worker            else if (*__temp == '.')
3786*58b9f456SAndroid Build Coastguard Worker                __first = __parse_collating_symbol(++__temp, __last, __start_range);
3787*58b9f456SAndroid Build Coastguard Worker        }
3788*58b9f456SAndroid Build Coastguard Worker        unsigned __grammar = __flags_ & 0x1F0;
3789*58b9f456SAndroid Build Coastguard Worker        if (__start_range.empty())
3790*58b9f456SAndroid Build Coastguard Worker        {
3791*58b9f456SAndroid Build Coastguard Worker            if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3792*58b9f456SAndroid Build Coastguard Worker            {
3793*58b9f456SAndroid Build Coastguard Worker                if (__grammar == ECMAScript)
3794*58b9f456SAndroid Build Coastguard Worker                    __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3795*58b9f456SAndroid Build Coastguard Worker                else
3796*58b9f456SAndroid Build Coastguard Worker                    __first = __parse_awk_escape(++__first, __last, &__start_range);
3797*58b9f456SAndroid Build Coastguard Worker            }
3798*58b9f456SAndroid Build Coastguard Worker            else
3799*58b9f456SAndroid Build Coastguard Worker            {
3800*58b9f456SAndroid Build Coastguard Worker                __start_range = *__first;
3801*58b9f456SAndroid Build Coastguard Worker                ++__first;
3802*58b9f456SAndroid Build Coastguard Worker            }
3803*58b9f456SAndroid Build Coastguard Worker        }
3804*58b9f456SAndroid Build Coastguard Worker        if (__first != __last && *__first != ']')
3805*58b9f456SAndroid Build Coastguard Worker        {
3806*58b9f456SAndroid Build Coastguard Worker            __temp = _VSTD::next(__first);
3807*58b9f456SAndroid Build Coastguard Worker            if (__temp != __last && *__first == '-' && *__temp != ']')
3808*58b9f456SAndroid Build Coastguard Worker            {
3809*58b9f456SAndroid Build Coastguard Worker                // parse a range
3810*58b9f456SAndroid Build Coastguard Worker                basic_string<_CharT> __end_range;
3811*58b9f456SAndroid Build Coastguard Worker                __first = __temp;
3812*58b9f456SAndroid Build Coastguard Worker                ++__temp;
3813*58b9f456SAndroid Build Coastguard Worker                if (__temp != __last && *__first == '[' && *__temp == '.')
3814*58b9f456SAndroid Build Coastguard Worker                    __first = __parse_collating_symbol(++__temp, __last, __end_range);
3815*58b9f456SAndroid Build Coastguard Worker                else
3816*58b9f456SAndroid Build Coastguard Worker                {
3817*58b9f456SAndroid Build Coastguard Worker                    if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3818*58b9f456SAndroid Build Coastguard Worker                    {
3819*58b9f456SAndroid Build Coastguard Worker                        if (__grammar == ECMAScript)
3820*58b9f456SAndroid Build Coastguard Worker                            __first = __parse_class_escape(++__first, __last,
3821*58b9f456SAndroid Build Coastguard Worker                                                           __end_range, __ml);
3822*58b9f456SAndroid Build Coastguard Worker                        else
3823*58b9f456SAndroid Build Coastguard Worker                            __first = __parse_awk_escape(++__first, __last,
3824*58b9f456SAndroid Build Coastguard Worker                                                         &__end_range);
3825*58b9f456SAndroid Build Coastguard Worker                    }
3826*58b9f456SAndroid Build Coastguard Worker                    else
3827*58b9f456SAndroid Build Coastguard Worker                    {
3828*58b9f456SAndroid Build Coastguard Worker                        __end_range = *__first;
3829*58b9f456SAndroid Build Coastguard Worker                        ++__first;
3830*58b9f456SAndroid Build Coastguard Worker                    }
3831*58b9f456SAndroid Build Coastguard Worker                }
3832*58b9f456SAndroid Build Coastguard Worker                __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
3833*58b9f456SAndroid Build Coastguard Worker            }
3834*58b9f456SAndroid Build Coastguard Worker            else if (!__start_range.empty())
3835*58b9f456SAndroid Build Coastguard Worker            {
3836*58b9f456SAndroid Build Coastguard Worker                if (__start_range.size() == 1)
3837*58b9f456SAndroid Build Coastguard Worker                    __ml->__add_char(__start_range[0]);
3838*58b9f456SAndroid Build Coastguard Worker                else
3839*58b9f456SAndroid Build Coastguard Worker                    __ml->__add_digraph(__start_range[0], __start_range[1]);
3840*58b9f456SAndroid Build Coastguard Worker            }
3841*58b9f456SAndroid Build Coastguard Worker        }
3842*58b9f456SAndroid Build Coastguard Worker        else if (!__start_range.empty())
3843*58b9f456SAndroid Build Coastguard Worker        {
3844*58b9f456SAndroid Build Coastguard Worker            if (__start_range.size() == 1)
3845*58b9f456SAndroid Build Coastguard Worker                __ml->__add_char(__start_range[0]);
3846*58b9f456SAndroid Build Coastguard Worker            else
3847*58b9f456SAndroid Build Coastguard Worker                __ml->__add_digraph(__start_range[0], __start_range[1]);
3848*58b9f456SAndroid Build Coastguard Worker        }
3849*58b9f456SAndroid Build Coastguard Worker    }
3850*58b9f456SAndroid Build Coastguard Worker    return __first;
3851*58b9f456SAndroid Build Coastguard Worker}
3852*58b9f456SAndroid Build Coastguard Worker
3853*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3854*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3855*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3856*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
3857*58b9f456SAndroid Build Coastguard Worker                          _ForwardIterator __last,
3858*58b9f456SAndroid Build Coastguard Worker                          basic_string<_CharT>& __str,
3859*58b9f456SAndroid Build Coastguard Worker                          __bracket_expression<_CharT, _Traits>* __ml)
3860*58b9f456SAndroid Build Coastguard Worker{
3861*58b9f456SAndroid Build Coastguard Worker    if (__first == __last)
3862*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::error_escape>();
3863*58b9f456SAndroid Build Coastguard Worker    switch (*__first)
3864*58b9f456SAndroid Build Coastguard Worker    {
3865*58b9f456SAndroid Build Coastguard Worker    case 0:
3866*58b9f456SAndroid Build Coastguard Worker        __str = *__first;
3867*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3868*58b9f456SAndroid Build Coastguard Worker    case 'b':
3869*58b9f456SAndroid Build Coastguard Worker        __str = _CharT(8);
3870*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3871*58b9f456SAndroid Build Coastguard Worker    case 'd':
3872*58b9f456SAndroid Build Coastguard Worker        __ml->__add_class(ctype_base::digit);
3873*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3874*58b9f456SAndroid Build Coastguard Worker    case 'D':
3875*58b9f456SAndroid Build Coastguard Worker        __ml->__add_neg_class(ctype_base::digit);
3876*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3877*58b9f456SAndroid Build Coastguard Worker    case 's':
3878*58b9f456SAndroid Build Coastguard Worker        __ml->__add_class(ctype_base::space);
3879*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3880*58b9f456SAndroid Build Coastguard Worker    case 'S':
3881*58b9f456SAndroid Build Coastguard Worker        __ml->__add_neg_class(ctype_base::space);
3882*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3883*58b9f456SAndroid Build Coastguard Worker    case 'w':
3884*58b9f456SAndroid Build Coastguard Worker        __ml->__add_class(ctype_base::alnum);
3885*58b9f456SAndroid Build Coastguard Worker        __ml->__add_char('_');
3886*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3887*58b9f456SAndroid Build Coastguard Worker    case 'W':
3888*58b9f456SAndroid Build Coastguard Worker        __ml->__add_neg_class(ctype_base::alnum);
3889*58b9f456SAndroid Build Coastguard Worker        __ml->__add_neg_char('_');
3890*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3891*58b9f456SAndroid Build Coastguard Worker    }
3892*58b9f456SAndroid Build Coastguard Worker    __first = __parse_character_escape(__first, __last, &__str);
3893*58b9f456SAndroid Build Coastguard Worker    return __first;
3894*58b9f456SAndroid Build Coastguard Worker}
3895*58b9f456SAndroid Build Coastguard Worker
3896*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3897*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3898*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3899*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
3900*58b9f456SAndroid Build Coastguard Worker                          _ForwardIterator __last,
3901*58b9f456SAndroid Build Coastguard Worker                          basic_string<_CharT>* __str)
3902*58b9f456SAndroid Build Coastguard Worker{
3903*58b9f456SAndroid Build Coastguard Worker    if (__first == __last)
3904*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::error_escape>();
3905*58b9f456SAndroid Build Coastguard Worker    switch (*__first)
3906*58b9f456SAndroid Build Coastguard Worker    {
3907*58b9f456SAndroid Build Coastguard Worker    case '\\':
3908*58b9f456SAndroid Build Coastguard Worker    case '"':
3909*58b9f456SAndroid Build Coastguard Worker    case '/':
3910*58b9f456SAndroid Build Coastguard Worker        if (__str)
3911*58b9f456SAndroid Build Coastguard Worker            *__str = *__first;
3912*58b9f456SAndroid Build Coastguard Worker        else
3913*58b9f456SAndroid Build Coastguard Worker            __push_char(*__first);
3914*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3915*58b9f456SAndroid Build Coastguard Worker    case 'a':
3916*58b9f456SAndroid Build Coastguard Worker        if (__str)
3917*58b9f456SAndroid Build Coastguard Worker            *__str = _CharT(7);
3918*58b9f456SAndroid Build Coastguard Worker        else
3919*58b9f456SAndroid Build Coastguard Worker            __push_char(_CharT(7));
3920*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3921*58b9f456SAndroid Build Coastguard Worker    case 'b':
3922*58b9f456SAndroid Build Coastguard Worker        if (__str)
3923*58b9f456SAndroid Build Coastguard Worker            *__str = _CharT(8);
3924*58b9f456SAndroid Build Coastguard Worker        else
3925*58b9f456SAndroid Build Coastguard Worker            __push_char(_CharT(8));
3926*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3927*58b9f456SAndroid Build Coastguard Worker    case 'f':
3928*58b9f456SAndroid Build Coastguard Worker        if (__str)
3929*58b9f456SAndroid Build Coastguard Worker            *__str = _CharT(0xC);
3930*58b9f456SAndroid Build Coastguard Worker        else
3931*58b9f456SAndroid Build Coastguard Worker            __push_char(_CharT(0xC));
3932*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3933*58b9f456SAndroid Build Coastguard Worker    case 'n':
3934*58b9f456SAndroid Build Coastguard Worker        if (__str)
3935*58b9f456SAndroid Build Coastguard Worker            *__str = _CharT(0xA);
3936*58b9f456SAndroid Build Coastguard Worker        else
3937*58b9f456SAndroid Build Coastguard Worker            __push_char(_CharT(0xA));
3938*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3939*58b9f456SAndroid Build Coastguard Worker    case 'r':
3940*58b9f456SAndroid Build Coastguard Worker        if (__str)
3941*58b9f456SAndroid Build Coastguard Worker            *__str = _CharT(0xD);
3942*58b9f456SAndroid Build Coastguard Worker        else
3943*58b9f456SAndroid Build Coastguard Worker            __push_char(_CharT(0xD));
3944*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3945*58b9f456SAndroid Build Coastguard Worker    case 't':
3946*58b9f456SAndroid Build Coastguard Worker        if (__str)
3947*58b9f456SAndroid Build Coastguard Worker            *__str = _CharT(0x9);
3948*58b9f456SAndroid Build Coastguard Worker        else
3949*58b9f456SAndroid Build Coastguard Worker            __push_char(_CharT(0x9));
3950*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3951*58b9f456SAndroid Build Coastguard Worker    case 'v':
3952*58b9f456SAndroid Build Coastguard Worker        if (__str)
3953*58b9f456SAndroid Build Coastguard Worker            *__str = _CharT(0xB);
3954*58b9f456SAndroid Build Coastguard Worker        else
3955*58b9f456SAndroid Build Coastguard Worker            __push_char(_CharT(0xB));
3956*58b9f456SAndroid Build Coastguard Worker        return ++__first;
3957*58b9f456SAndroid Build Coastguard Worker    }
3958*58b9f456SAndroid Build Coastguard Worker    if ('0' <= *__first && *__first <= '7')
3959*58b9f456SAndroid Build Coastguard Worker    {
3960*58b9f456SAndroid Build Coastguard Worker        unsigned __val = *__first - '0';
3961*58b9f456SAndroid Build Coastguard Worker        if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3962*58b9f456SAndroid Build Coastguard Worker        {
3963*58b9f456SAndroid Build Coastguard Worker            __val = 8 * __val + *__first - '0';
3964*58b9f456SAndroid Build Coastguard Worker            if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3965*58b9f456SAndroid Build Coastguard Worker                __val = 8 * __val + *__first++ - '0';
3966*58b9f456SAndroid Build Coastguard Worker        }
3967*58b9f456SAndroid Build Coastguard Worker        if (__str)
3968*58b9f456SAndroid Build Coastguard Worker            *__str = _CharT(__val);
3969*58b9f456SAndroid Build Coastguard Worker        else
3970*58b9f456SAndroid Build Coastguard Worker            __push_char(_CharT(__val));
3971*58b9f456SAndroid Build Coastguard Worker    }
3972*58b9f456SAndroid Build Coastguard Worker    else
3973*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::error_escape>();
3974*58b9f456SAndroid Build Coastguard Worker    return __first;
3975*58b9f456SAndroid Build Coastguard Worker}
3976*58b9f456SAndroid Build Coastguard Worker
3977*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
3978*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
3979*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
3980*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
3981*58b9f456SAndroid Build Coastguard Worker                                    _ForwardIterator __last,
3982*58b9f456SAndroid Build Coastguard Worker                                    __bracket_expression<_CharT, _Traits>* __ml)
3983*58b9f456SAndroid Build Coastguard Worker{
3984*58b9f456SAndroid Build Coastguard Worker    // Found [=
3985*58b9f456SAndroid Build Coastguard Worker    //   This means =] must exist
3986*58b9f456SAndroid Build Coastguard Worker    value_type _Equal_close[2] = {'=', ']'};
3987*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
3988*58b9f456SAndroid Build Coastguard Worker                                                            _Equal_close+2);
3989*58b9f456SAndroid Build Coastguard Worker    if (__temp == __last)
3990*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::error_brack>();
3991*58b9f456SAndroid Build Coastguard Worker    // [__first, __temp) contains all text in [= ... =]
3992*58b9f456SAndroid Build Coastguard Worker    string_type __collate_name =
3993*58b9f456SAndroid Build Coastguard Worker        __traits_.lookup_collatename(__first, __temp);
3994*58b9f456SAndroid Build Coastguard Worker    if (__collate_name.empty())
3995*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::error_collate>();
3996*58b9f456SAndroid Build Coastguard Worker    string_type __equiv_name =
3997*58b9f456SAndroid Build Coastguard Worker        __traits_.transform_primary(__collate_name.begin(),
3998*58b9f456SAndroid Build Coastguard Worker                                    __collate_name.end());
3999*58b9f456SAndroid Build Coastguard Worker    if (!__equiv_name.empty())
4000*58b9f456SAndroid Build Coastguard Worker        __ml->__add_equivalence(__equiv_name);
4001*58b9f456SAndroid Build Coastguard Worker    else
4002*58b9f456SAndroid Build Coastguard Worker    {
4003*58b9f456SAndroid Build Coastguard Worker        switch (__collate_name.size())
4004*58b9f456SAndroid Build Coastguard Worker        {
4005*58b9f456SAndroid Build Coastguard Worker        case 1:
4006*58b9f456SAndroid Build Coastguard Worker            __ml->__add_char(__collate_name[0]);
4007*58b9f456SAndroid Build Coastguard Worker            break;
4008*58b9f456SAndroid Build Coastguard Worker        case 2:
4009*58b9f456SAndroid Build Coastguard Worker            __ml->__add_digraph(__collate_name[0], __collate_name[1]);
4010*58b9f456SAndroid Build Coastguard Worker            break;
4011*58b9f456SAndroid Build Coastguard Worker        default:
4012*58b9f456SAndroid Build Coastguard Worker            __throw_regex_error<regex_constants::error_collate>();
4013*58b9f456SAndroid Build Coastguard Worker        }
4014*58b9f456SAndroid Build Coastguard Worker    }
4015*58b9f456SAndroid Build Coastguard Worker    __first = _VSTD::next(__temp, 2);
4016*58b9f456SAndroid Build Coastguard Worker    return __first;
4017*58b9f456SAndroid Build Coastguard Worker}
4018*58b9f456SAndroid Build Coastguard Worker
4019*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4020*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4021*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4022*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
4023*58b9f456SAndroid Build Coastguard Worker                                    _ForwardIterator __last,
4024*58b9f456SAndroid Build Coastguard Worker                                    __bracket_expression<_CharT, _Traits>* __ml)
4025*58b9f456SAndroid Build Coastguard Worker{
4026*58b9f456SAndroid Build Coastguard Worker    // Found [:
4027*58b9f456SAndroid Build Coastguard Worker    //   This means :] must exist
4028*58b9f456SAndroid Build Coastguard Worker    value_type _Colon_close[2] = {':', ']'};
4029*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
4030*58b9f456SAndroid Build Coastguard Worker                                                            _Colon_close+2);
4031*58b9f456SAndroid Build Coastguard Worker    if (__temp == __last)
4032*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::error_brack>();
4033*58b9f456SAndroid Build Coastguard Worker    // [__first, __temp) contains all text in [: ... :]
4034*58b9f456SAndroid Build Coastguard Worker    typedef typename _Traits::char_class_type char_class_type;
4035*58b9f456SAndroid Build Coastguard Worker    char_class_type __class_type =
4036*58b9f456SAndroid Build Coastguard Worker        __traits_.lookup_classname(__first, __temp, __flags_ & icase);
4037*58b9f456SAndroid Build Coastguard Worker    if (__class_type == 0)
4038*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::error_ctype>();
4039*58b9f456SAndroid Build Coastguard Worker    __ml->__add_class(__class_type);
4040*58b9f456SAndroid Build Coastguard Worker    __first = _VSTD::next(__temp, 2);
4041*58b9f456SAndroid Build Coastguard Worker    return __first;
4042*58b9f456SAndroid Build Coastguard Worker}
4043*58b9f456SAndroid Build Coastguard Worker
4044*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4045*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4046*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4047*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
4048*58b9f456SAndroid Build Coastguard Worker                                                _ForwardIterator __last,
4049*58b9f456SAndroid Build Coastguard Worker                                                basic_string<_CharT>& __col_sym)
4050*58b9f456SAndroid Build Coastguard Worker{
4051*58b9f456SAndroid Build Coastguard Worker    // Found [.
4052*58b9f456SAndroid Build Coastguard Worker    //   This means .] must exist
4053*58b9f456SAndroid Build Coastguard Worker    value_type _Dot_close[2] = {'.', ']'};
4054*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
4055*58b9f456SAndroid Build Coastguard Worker                                                            _Dot_close+2);
4056*58b9f456SAndroid Build Coastguard Worker    if (__temp == __last)
4057*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::error_brack>();
4058*58b9f456SAndroid Build Coastguard Worker    // [__first, __temp) contains all text in [. ... .]
4059*58b9f456SAndroid Build Coastguard Worker    __col_sym = __traits_.lookup_collatename(__first, __temp);
4060*58b9f456SAndroid Build Coastguard Worker    switch (__col_sym.size())
4061*58b9f456SAndroid Build Coastguard Worker    {
4062*58b9f456SAndroid Build Coastguard Worker    case 1:
4063*58b9f456SAndroid Build Coastguard Worker    case 2:
4064*58b9f456SAndroid Build Coastguard Worker        break;
4065*58b9f456SAndroid Build Coastguard Worker    default:
4066*58b9f456SAndroid Build Coastguard Worker        __throw_regex_error<regex_constants::error_collate>();
4067*58b9f456SAndroid Build Coastguard Worker    }
4068*58b9f456SAndroid Build Coastguard Worker    __first = _VSTD::next(__temp, 2);
4069*58b9f456SAndroid Build Coastguard Worker    return __first;
4070*58b9f456SAndroid Build Coastguard Worker}
4071*58b9f456SAndroid Build Coastguard Worker
4072*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4073*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4074*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4075*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4076*58b9f456SAndroid Build Coastguard Worker                                                _ForwardIterator __last,
4077*58b9f456SAndroid Build Coastguard Worker                                                int& __c)
4078*58b9f456SAndroid Build Coastguard Worker{
4079*58b9f456SAndroid Build Coastguard Worker    if (__first != __last )
4080*58b9f456SAndroid Build Coastguard Worker    {
4081*58b9f456SAndroid Build Coastguard Worker        int __val = __traits_.value(*__first, 10);
4082*58b9f456SAndroid Build Coastguard Worker        if ( __val != -1 )
4083*58b9f456SAndroid Build Coastguard Worker        {
4084*58b9f456SAndroid Build Coastguard Worker            __c = __val;
4085*58b9f456SAndroid Build Coastguard Worker            for (++__first;
4086*58b9f456SAndroid Build Coastguard Worker                 __first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
4087*58b9f456SAndroid Build Coastguard Worker                 ++__first)
4088*58b9f456SAndroid Build Coastguard Worker            {
4089*58b9f456SAndroid Build Coastguard Worker                if (__c >= std::numeric_limits<int>::max() / 10)
4090*58b9f456SAndroid Build Coastguard Worker                    __throw_regex_error<regex_constants::error_badbrace>();
4091*58b9f456SAndroid Build Coastguard Worker                __c *= 10;
4092*58b9f456SAndroid Build Coastguard Worker                __c += __val;
4093*58b9f456SAndroid Build Coastguard Worker            }
4094*58b9f456SAndroid Build Coastguard Worker        }
4095*58b9f456SAndroid Build Coastguard Worker    }
4096*58b9f456SAndroid Build Coastguard Worker    return __first;
4097*58b9f456SAndroid Build Coastguard Worker}
4098*58b9f456SAndroid Build Coastguard Worker
4099*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4100*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4101*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4102*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4103*58b9f456SAndroid Build Coastguard Worker                                               _ForwardIterator __last)
4104*58b9f456SAndroid Build Coastguard Worker{
4105*58b9f456SAndroid Build Coastguard Worker    __owns_one_state<_CharT>* __sa = __end_;
4106*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __temp = __parse_alternative(__first, __last);
4107*58b9f456SAndroid Build Coastguard Worker    if (__temp == __first)
4108*58b9f456SAndroid Build Coastguard Worker        __push_empty();
4109*58b9f456SAndroid Build Coastguard Worker    __first = __temp;
4110*58b9f456SAndroid Build Coastguard Worker    while (__first != __last && *__first == '|')
4111*58b9f456SAndroid Build Coastguard Worker    {
4112*58b9f456SAndroid Build Coastguard Worker        __owns_one_state<_CharT>* __sb = __end_;
4113*58b9f456SAndroid Build Coastguard Worker        __temp = __parse_alternative(++__first, __last);
4114*58b9f456SAndroid Build Coastguard Worker        if (__temp == __first)
4115*58b9f456SAndroid Build Coastguard Worker            __push_empty();
4116*58b9f456SAndroid Build Coastguard Worker        __push_alternation(__sa, __sb);
4117*58b9f456SAndroid Build Coastguard Worker        __first = __temp;
4118*58b9f456SAndroid Build Coastguard Worker    }
4119*58b9f456SAndroid Build Coastguard Worker    return __first;
4120*58b9f456SAndroid Build Coastguard Worker}
4121*58b9f456SAndroid Build Coastguard Worker
4122*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4123*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4124*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4125*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4126*58b9f456SAndroid Build Coastguard Worker                                                  _ForwardIterator __last)
4127*58b9f456SAndroid Build Coastguard Worker{
4128*58b9f456SAndroid Build Coastguard Worker    while (true)
4129*58b9f456SAndroid Build Coastguard Worker    {
4130*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __temp = __parse_term(__first, __last);
4131*58b9f456SAndroid Build Coastguard Worker        if (__temp == __first)
4132*58b9f456SAndroid Build Coastguard Worker            break;
4133*58b9f456SAndroid Build Coastguard Worker        __first = __temp;
4134*58b9f456SAndroid Build Coastguard Worker    }
4135*58b9f456SAndroid Build Coastguard Worker    return __first;
4136*58b9f456SAndroid Build Coastguard Worker}
4137*58b9f456SAndroid Build Coastguard Worker
4138*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4139*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4140*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4141*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4142*58b9f456SAndroid Build Coastguard Worker                                           _ForwardIterator __last)
4143*58b9f456SAndroid Build Coastguard Worker{
4144*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __temp = __parse_assertion(__first, __last);
4145*58b9f456SAndroid Build Coastguard Worker    if (__temp == __first)
4146*58b9f456SAndroid Build Coastguard Worker    {
4147*58b9f456SAndroid Build Coastguard Worker        __owns_one_state<_CharT>* __e = __end_;
4148*58b9f456SAndroid Build Coastguard Worker        unsigned __mexp_begin = __marked_count_;
4149*58b9f456SAndroid Build Coastguard Worker        __temp = __parse_atom(__first, __last);
4150*58b9f456SAndroid Build Coastguard Worker        if (__temp != __first)
4151*58b9f456SAndroid Build Coastguard Worker            __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4152*58b9f456SAndroid Build Coastguard Worker                                              __mexp_begin+1, __marked_count_+1);
4153*58b9f456SAndroid Build Coastguard Worker    }
4154*58b9f456SAndroid Build Coastguard Worker    else
4155*58b9f456SAndroid Build Coastguard Worker        __first = __temp;
4156*58b9f456SAndroid Build Coastguard Worker    return __first;
4157*58b9f456SAndroid Build Coastguard Worker}
4158*58b9f456SAndroid Build Coastguard Worker
4159*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4160*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4161*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4162*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4163*58b9f456SAndroid Build Coastguard Worker                                                _ForwardIterator __last)
4164*58b9f456SAndroid Build Coastguard Worker{
4165*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
4166*58b9f456SAndroid Build Coastguard Worker    {
4167*58b9f456SAndroid Build Coastguard Worker        switch (*__first)
4168*58b9f456SAndroid Build Coastguard Worker        {
4169*58b9f456SAndroid Build Coastguard Worker        case '^':
4170*58b9f456SAndroid Build Coastguard Worker            __push_l_anchor();
4171*58b9f456SAndroid Build Coastguard Worker            ++__first;
4172*58b9f456SAndroid Build Coastguard Worker            break;
4173*58b9f456SAndroid Build Coastguard Worker        case '$':
4174*58b9f456SAndroid Build Coastguard Worker            __push_r_anchor();
4175*58b9f456SAndroid Build Coastguard Worker            ++__first;
4176*58b9f456SAndroid Build Coastguard Worker            break;
4177*58b9f456SAndroid Build Coastguard Worker        case '\\':
4178*58b9f456SAndroid Build Coastguard Worker            {
4179*58b9f456SAndroid Build Coastguard Worker                _ForwardIterator __temp = _VSTD::next(__first);
4180*58b9f456SAndroid Build Coastguard Worker                if (__temp != __last)
4181*58b9f456SAndroid Build Coastguard Worker                {
4182*58b9f456SAndroid Build Coastguard Worker                    if (*__temp == 'b')
4183*58b9f456SAndroid Build Coastguard Worker                    {
4184*58b9f456SAndroid Build Coastguard Worker                        __push_word_boundary(false);
4185*58b9f456SAndroid Build Coastguard Worker                        __first = ++__temp;
4186*58b9f456SAndroid Build Coastguard Worker                    }
4187*58b9f456SAndroid Build Coastguard Worker                    else if (*__temp == 'B')
4188*58b9f456SAndroid Build Coastguard Worker                    {
4189*58b9f456SAndroid Build Coastguard Worker                        __push_word_boundary(true);
4190*58b9f456SAndroid Build Coastguard Worker                        __first = ++__temp;
4191*58b9f456SAndroid Build Coastguard Worker                    }
4192*58b9f456SAndroid Build Coastguard Worker                }
4193*58b9f456SAndroid Build Coastguard Worker            }
4194*58b9f456SAndroid Build Coastguard Worker            break;
4195*58b9f456SAndroid Build Coastguard Worker        case '(':
4196*58b9f456SAndroid Build Coastguard Worker            {
4197*58b9f456SAndroid Build Coastguard Worker                _ForwardIterator __temp = _VSTD::next(__first);
4198*58b9f456SAndroid Build Coastguard Worker                if (__temp != __last && *__temp == '?')
4199*58b9f456SAndroid Build Coastguard Worker                {
4200*58b9f456SAndroid Build Coastguard Worker                    if (++__temp != __last)
4201*58b9f456SAndroid Build Coastguard Worker                    {
4202*58b9f456SAndroid Build Coastguard Worker                        switch (*__temp)
4203*58b9f456SAndroid Build Coastguard Worker                        {
4204*58b9f456SAndroid Build Coastguard Worker                        case '=':
4205*58b9f456SAndroid Build Coastguard Worker                            {
4206*58b9f456SAndroid Build Coastguard Worker                                basic_regex __exp;
4207*58b9f456SAndroid Build Coastguard Worker                                __exp.__flags_ = __flags_;
4208*58b9f456SAndroid Build Coastguard Worker                                __temp = __exp.__parse(++__temp, __last);
4209*58b9f456SAndroid Build Coastguard Worker                                unsigned __mexp = __exp.__marked_count_;
4210*58b9f456SAndroid Build Coastguard Worker                                __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
4211*58b9f456SAndroid Build Coastguard Worker                                __marked_count_ += __mexp;
4212*58b9f456SAndroid Build Coastguard Worker                                if (__temp == __last || *__temp != ')')
4213*58b9f456SAndroid Build Coastguard Worker                                    __throw_regex_error<regex_constants::error_paren>();
4214*58b9f456SAndroid Build Coastguard Worker                                __first = ++__temp;
4215*58b9f456SAndroid Build Coastguard Worker                            }
4216*58b9f456SAndroid Build Coastguard Worker                            break;
4217*58b9f456SAndroid Build Coastguard Worker                        case '!':
4218*58b9f456SAndroid Build Coastguard Worker                            {
4219*58b9f456SAndroid Build Coastguard Worker                                basic_regex __exp;
4220*58b9f456SAndroid Build Coastguard Worker                                __exp.__flags_ = __flags_;
4221*58b9f456SAndroid Build Coastguard Worker                                __temp = __exp.__parse(++__temp, __last);
4222*58b9f456SAndroid Build Coastguard Worker                                unsigned __mexp = __exp.__marked_count_;
4223*58b9f456SAndroid Build Coastguard Worker                                __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
4224*58b9f456SAndroid Build Coastguard Worker                                __marked_count_ += __mexp;
4225*58b9f456SAndroid Build Coastguard Worker                                if (__temp == __last || *__temp != ')')
4226*58b9f456SAndroid Build Coastguard Worker                                    __throw_regex_error<regex_constants::error_paren>();
4227*58b9f456SAndroid Build Coastguard Worker                                __first = ++__temp;
4228*58b9f456SAndroid Build Coastguard Worker                            }
4229*58b9f456SAndroid Build Coastguard Worker                            break;
4230*58b9f456SAndroid Build Coastguard Worker                        }
4231*58b9f456SAndroid Build Coastguard Worker                    }
4232*58b9f456SAndroid Build Coastguard Worker                }
4233*58b9f456SAndroid Build Coastguard Worker            }
4234*58b9f456SAndroid Build Coastguard Worker            break;
4235*58b9f456SAndroid Build Coastguard Worker        }
4236*58b9f456SAndroid Build Coastguard Worker    }
4237*58b9f456SAndroid Build Coastguard Worker    return __first;
4238*58b9f456SAndroid Build Coastguard Worker}
4239*58b9f456SAndroid Build Coastguard Worker
4240*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4241*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4242*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4243*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4244*58b9f456SAndroid Build Coastguard Worker                                           _ForwardIterator __last)
4245*58b9f456SAndroid Build Coastguard Worker{
4246*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
4247*58b9f456SAndroid Build Coastguard Worker    {
4248*58b9f456SAndroid Build Coastguard Worker        switch (*__first)
4249*58b9f456SAndroid Build Coastguard Worker        {
4250*58b9f456SAndroid Build Coastguard Worker        case '.':
4251*58b9f456SAndroid Build Coastguard Worker            __push_match_any_but_newline();
4252*58b9f456SAndroid Build Coastguard Worker            ++__first;
4253*58b9f456SAndroid Build Coastguard Worker            break;
4254*58b9f456SAndroid Build Coastguard Worker        case '\\':
4255*58b9f456SAndroid Build Coastguard Worker            __first = __parse_atom_escape(__first, __last);
4256*58b9f456SAndroid Build Coastguard Worker            break;
4257*58b9f456SAndroid Build Coastguard Worker        case '[':
4258*58b9f456SAndroid Build Coastguard Worker            __first = __parse_bracket_expression(__first, __last);
4259*58b9f456SAndroid Build Coastguard Worker            break;
4260*58b9f456SAndroid Build Coastguard Worker        case '(':
4261*58b9f456SAndroid Build Coastguard Worker            {
4262*58b9f456SAndroid Build Coastguard Worker                ++__first;
4263*58b9f456SAndroid Build Coastguard Worker                if (__first == __last)
4264*58b9f456SAndroid Build Coastguard Worker                    __throw_regex_error<regex_constants::error_paren>();
4265*58b9f456SAndroid Build Coastguard Worker                _ForwardIterator __temp = _VSTD::next(__first);
4266*58b9f456SAndroid Build Coastguard Worker                if (__temp != __last && *__first == '?' && *__temp == ':')
4267*58b9f456SAndroid Build Coastguard Worker                {
4268*58b9f456SAndroid Build Coastguard Worker                    ++__open_count_;
4269*58b9f456SAndroid Build Coastguard Worker                    __first = __parse_ecma_exp(++__temp, __last);
4270*58b9f456SAndroid Build Coastguard Worker                    if (__first == __last || *__first != ')')
4271*58b9f456SAndroid Build Coastguard Worker                        __throw_regex_error<regex_constants::error_paren>();
4272*58b9f456SAndroid Build Coastguard Worker                    --__open_count_;
4273*58b9f456SAndroid Build Coastguard Worker                    ++__first;
4274*58b9f456SAndroid Build Coastguard Worker                }
4275*58b9f456SAndroid Build Coastguard Worker                else
4276*58b9f456SAndroid Build Coastguard Worker                {
4277*58b9f456SAndroid Build Coastguard Worker                    __push_begin_marked_subexpression();
4278*58b9f456SAndroid Build Coastguard Worker                    unsigned __temp_count = __marked_count_;
4279*58b9f456SAndroid Build Coastguard Worker                    ++__open_count_;
4280*58b9f456SAndroid Build Coastguard Worker                    __first = __parse_ecma_exp(__first, __last);
4281*58b9f456SAndroid Build Coastguard Worker                    if (__first == __last || *__first != ')')
4282*58b9f456SAndroid Build Coastguard Worker                        __throw_regex_error<regex_constants::error_paren>();
4283*58b9f456SAndroid Build Coastguard Worker                    __push_end_marked_subexpression(__temp_count);
4284*58b9f456SAndroid Build Coastguard Worker                    --__open_count_;
4285*58b9f456SAndroid Build Coastguard Worker                    ++__first;
4286*58b9f456SAndroid Build Coastguard Worker                }
4287*58b9f456SAndroid Build Coastguard Worker            }
4288*58b9f456SAndroid Build Coastguard Worker            break;
4289*58b9f456SAndroid Build Coastguard Worker        case '*':
4290*58b9f456SAndroid Build Coastguard Worker        case '+':
4291*58b9f456SAndroid Build Coastguard Worker        case '?':
4292*58b9f456SAndroid Build Coastguard Worker        case '{':
4293*58b9f456SAndroid Build Coastguard Worker            __throw_regex_error<regex_constants::error_badrepeat>();
4294*58b9f456SAndroid Build Coastguard Worker            break;
4295*58b9f456SAndroid Build Coastguard Worker        default:
4296*58b9f456SAndroid Build Coastguard Worker            __first = __parse_pattern_character(__first, __last);
4297*58b9f456SAndroid Build Coastguard Worker            break;
4298*58b9f456SAndroid Build Coastguard Worker        }
4299*58b9f456SAndroid Build Coastguard Worker    }
4300*58b9f456SAndroid Build Coastguard Worker    return __first;
4301*58b9f456SAndroid Build Coastguard Worker}
4302*58b9f456SAndroid Build Coastguard Worker
4303*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4304*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4305*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4306*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4307*58b9f456SAndroid Build Coastguard Worker                                                  _ForwardIterator __last)
4308*58b9f456SAndroid Build Coastguard Worker{
4309*58b9f456SAndroid Build Coastguard Worker    if (__first != __last && *__first == '\\')
4310*58b9f456SAndroid Build Coastguard Worker    {
4311*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __t1 = _VSTD::next(__first);
4312*58b9f456SAndroid Build Coastguard Worker        if (__t1 == __last)
4313*58b9f456SAndroid Build Coastguard Worker            __throw_regex_error<regex_constants::error_escape>();
4314*58b9f456SAndroid Build Coastguard Worker
4315*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4316*58b9f456SAndroid Build Coastguard Worker        if (__t2 != __t1)
4317*58b9f456SAndroid Build Coastguard Worker            __first = __t2;
4318*58b9f456SAndroid Build Coastguard Worker        else
4319*58b9f456SAndroid Build Coastguard Worker        {
4320*58b9f456SAndroid Build Coastguard Worker            __t2 = __parse_character_class_escape(__t1, __last);
4321*58b9f456SAndroid Build Coastguard Worker            if (__t2 != __t1)
4322*58b9f456SAndroid Build Coastguard Worker                __first = __t2;
4323*58b9f456SAndroid Build Coastguard Worker            else
4324*58b9f456SAndroid Build Coastguard Worker            {
4325*58b9f456SAndroid Build Coastguard Worker                __t2 = __parse_character_escape(__t1, __last);
4326*58b9f456SAndroid Build Coastguard Worker                if (__t2 != __t1)
4327*58b9f456SAndroid Build Coastguard Worker                    __first = __t2;
4328*58b9f456SAndroid Build Coastguard Worker            }
4329*58b9f456SAndroid Build Coastguard Worker        }
4330*58b9f456SAndroid Build Coastguard Worker    }
4331*58b9f456SAndroid Build Coastguard Worker    return __first;
4332*58b9f456SAndroid Build Coastguard Worker}
4333*58b9f456SAndroid Build Coastguard Worker
4334*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4335*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4336*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4337*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4338*58b9f456SAndroid Build Coastguard Worker                                                     _ForwardIterator __last)
4339*58b9f456SAndroid Build Coastguard Worker{
4340*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
4341*58b9f456SAndroid Build Coastguard Worker    {
4342*58b9f456SAndroid Build Coastguard Worker        if (*__first == '0')
4343*58b9f456SAndroid Build Coastguard Worker        {
4344*58b9f456SAndroid Build Coastguard Worker            __push_char(_CharT());
4345*58b9f456SAndroid Build Coastguard Worker            ++__first;
4346*58b9f456SAndroid Build Coastguard Worker        }
4347*58b9f456SAndroid Build Coastguard Worker        else if ('1' <= *__first && *__first <= '9')
4348*58b9f456SAndroid Build Coastguard Worker        {
4349*58b9f456SAndroid Build Coastguard Worker            unsigned __v = *__first - '0';
4350*58b9f456SAndroid Build Coastguard Worker            for (++__first;
4351*58b9f456SAndroid Build Coastguard Worker                    __first != __last && '0' <= *__first && *__first <= '9'; ++__first)
4352*58b9f456SAndroid Build Coastguard Worker                {
4353*58b9f456SAndroid Build Coastguard Worker                if (__v >= std::numeric_limits<unsigned>::max() / 10)
4354*58b9f456SAndroid Build Coastguard Worker                    __throw_regex_error<regex_constants::error_backref>();
4355*58b9f456SAndroid Build Coastguard Worker                __v = 10 * __v + *__first - '0';
4356*58b9f456SAndroid Build Coastguard Worker                }
4357*58b9f456SAndroid Build Coastguard Worker            if (__v == 0 || __v > mark_count())
4358*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_backref>();
4359*58b9f456SAndroid Build Coastguard Worker            __push_back_ref(__v);
4360*58b9f456SAndroid Build Coastguard Worker        }
4361*58b9f456SAndroid Build Coastguard Worker    }
4362*58b9f456SAndroid Build Coastguard Worker    return __first;
4363*58b9f456SAndroid Build Coastguard Worker}
4364*58b9f456SAndroid Build Coastguard Worker
4365*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4366*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4367*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4368*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4369*58b9f456SAndroid Build Coastguard Worker                                                             _ForwardIterator __last)
4370*58b9f456SAndroid Build Coastguard Worker{
4371*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
4372*58b9f456SAndroid Build Coastguard Worker    {
4373*58b9f456SAndroid Build Coastguard Worker        __bracket_expression<_CharT, _Traits>* __ml;
4374*58b9f456SAndroid Build Coastguard Worker        switch (*__first)
4375*58b9f456SAndroid Build Coastguard Worker        {
4376*58b9f456SAndroid Build Coastguard Worker        case 'd':
4377*58b9f456SAndroid Build Coastguard Worker            __ml = __start_matching_list(false);
4378*58b9f456SAndroid Build Coastguard Worker            __ml->__add_class(ctype_base::digit);
4379*58b9f456SAndroid Build Coastguard Worker            ++__first;
4380*58b9f456SAndroid Build Coastguard Worker            break;
4381*58b9f456SAndroid Build Coastguard Worker        case 'D':
4382*58b9f456SAndroid Build Coastguard Worker            __ml = __start_matching_list(true);
4383*58b9f456SAndroid Build Coastguard Worker            __ml->__add_class(ctype_base::digit);
4384*58b9f456SAndroid Build Coastguard Worker            ++__first;
4385*58b9f456SAndroid Build Coastguard Worker            break;
4386*58b9f456SAndroid Build Coastguard Worker        case 's':
4387*58b9f456SAndroid Build Coastguard Worker            __ml = __start_matching_list(false);
4388*58b9f456SAndroid Build Coastguard Worker            __ml->__add_class(ctype_base::space);
4389*58b9f456SAndroid Build Coastguard Worker            ++__first;
4390*58b9f456SAndroid Build Coastguard Worker            break;
4391*58b9f456SAndroid Build Coastguard Worker        case 'S':
4392*58b9f456SAndroid Build Coastguard Worker            __ml = __start_matching_list(true);
4393*58b9f456SAndroid Build Coastguard Worker            __ml->__add_class(ctype_base::space);
4394*58b9f456SAndroid Build Coastguard Worker            ++__first;
4395*58b9f456SAndroid Build Coastguard Worker            break;
4396*58b9f456SAndroid Build Coastguard Worker        case 'w':
4397*58b9f456SAndroid Build Coastguard Worker            __ml = __start_matching_list(false);
4398*58b9f456SAndroid Build Coastguard Worker            __ml->__add_class(ctype_base::alnum);
4399*58b9f456SAndroid Build Coastguard Worker            __ml->__add_char('_');
4400*58b9f456SAndroid Build Coastguard Worker            ++__first;
4401*58b9f456SAndroid Build Coastguard Worker            break;
4402*58b9f456SAndroid Build Coastguard Worker        case 'W':
4403*58b9f456SAndroid Build Coastguard Worker            __ml = __start_matching_list(true);
4404*58b9f456SAndroid Build Coastguard Worker            __ml->__add_class(ctype_base::alnum);
4405*58b9f456SAndroid Build Coastguard Worker            __ml->__add_char('_');
4406*58b9f456SAndroid Build Coastguard Worker            ++__first;
4407*58b9f456SAndroid Build Coastguard Worker            break;
4408*58b9f456SAndroid Build Coastguard Worker        }
4409*58b9f456SAndroid Build Coastguard Worker    }
4410*58b9f456SAndroid Build Coastguard Worker    return __first;
4411*58b9f456SAndroid Build Coastguard Worker}
4412*58b9f456SAndroid Build Coastguard Worker
4413*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4414*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4415*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4416*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
4417*58b9f456SAndroid Build Coastguard Worker                                                    _ForwardIterator __last,
4418*58b9f456SAndroid Build Coastguard Worker                                                    basic_string<_CharT>* __str)
4419*58b9f456SAndroid Build Coastguard Worker{
4420*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
4421*58b9f456SAndroid Build Coastguard Worker    {
4422*58b9f456SAndroid Build Coastguard Worker        _ForwardIterator __t;
4423*58b9f456SAndroid Build Coastguard Worker        unsigned __sum = 0;
4424*58b9f456SAndroid Build Coastguard Worker        int __hd;
4425*58b9f456SAndroid Build Coastguard Worker        switch (*__first)
4426*58b9f456SAndroid Build Coastguard Worker        {
4427*58b9f456SAndroid Build Coastguard Worker        case 'f':
4428*58b9f456SAndroid Build Coastguard Worker            if (__str)
4429*58b9f456SAndroid Build Coastguard Worker                *__str = _CharT(0xC);
4430*58b9f456SAndroid Build Coastguard Worker            else
4431*58b9f456SAndroid Build Coastguard Worker                __push_char(_CharT(0xC));
4432*58b9f456SAndroid Build Coastguard Worker            ++__first;
4433*58b9f456SAndroid Build Coastguard Worker            break;
4434*58b9f456SAndroid Build Coastguard Worker        case 'n':
4435*58b9f456SAndroid Build Coastguard Worker            if (__str)
4436*58b9f456SAndroid Build Coastguard Worker                *__str = _CharT(0xA);
4437*58b9f456SAndroid Build Coastguard Worker            else
4438*58b9f456SAndroid Build Coastguard Worker                __push_char(_CharT(0xA));
4439*58b9f456SAndroid Build Coastguard Worker            ++__first;
4440*58b9f456SAndroid Build Coastguard Worker            break;
4441*58b9f456SAndroid Build Coastguard Worker        case 'r':
4442*58b9f456SAndroid Build Coastguard Worker            if (__str)
4443*58b9f456SAndroid Build Coastguard Worker                *__str = _CharT(0xD);
4444*58b9f456SAndroid Build Coastguard Worker            else
4445*58b9f456SAndroid Build Coastguard Worker                __push_char(_CharT(0xD));
4446*58b9f456SAndroid Build Coastguard Worker            ++__first;
4447*58b9f456SAndroid Build Coastguard Worker            break;
4448*58b9f456SAndroid Build Coastguard Worker        case 't':
4449*58b9f456SAndroid Build Coastguard Worker            if (__str)
4450*58b9f456SAndroid Build Coastguard Worker                *__str = _CharT(0x9);
4451*58b9f456SAndroid Build Coastguard Worker            else
4452*58b9f456SAndroid Build Coastguard Worker                __push_char(_CharT(0x9));
4453*58b9f456SAndroid Build Coastguard Worker            ++__first;
4454*58b9f456SAndroid Build Coastguard Worker            break;
4455*58b9f456SAndroid Build Coastguard Worker        case 'v':
4456*58b9f456SAndroid Build Coastguard Worker            if (__str)
4457*58b9f456SAndroid Build Coastguard Worker                *__str = _CharT(0xB);
4458*58b9f456SAndroid Build Coastguard Worker            else
4459*58b9f456SAndroid Build Coastguard Worker                __push_char(_CharT(0xB));
4460*58b9f456SAndroid Build Coastguard Worker            ++__first;
4461*58b9f456SAndroid Build Coastguard Worker            break;
4462*58b9f456SAndroid Build Coastguard Worker        case 'c':
4463*58b9f456SAndroid Build Coastguard Worker            if ((__t = _VSTD::next(__first)) != __last)
4464*58b9f456SAndroid Build Coastguard Worker            {
4465*58b9f456SAndroid Build Coastguard Worker                if (('A' <= *__t && *__t <= 'Z') ||
4466*58b9f456SAndroid Build Coastguard Worker                    ('a' <= *__t && *__t <= 'z'))
4467*58b9f456SAndroid Build Coastguard Worker                {
4468*58b9f456SAndroid Build Coastguard Worker                    if (__str)
4469*58b9f456SAndroid Build Coastguard Worker                        *__str = _CharT(*__t % 32);
4470*58b9f456SAndroid Build Coastguard Worker                    else
4471*58b9f456SAndroid Build Coastguard Worker                        __push_char(_CharT(*__t % 32));
4472*58b9f456SAndroid Build Coastguard Worker                    __first = ++__t;
4473*58b9f456SAndroid Build Coastguard Worker                }
4474*58b9f456SAndroid Build Coastguard Worker                else
4475*58b9f456SAndroid Build Coastguard Worker                    __throw_regex_error<regex_constants::error_escape>();
4476*58b9f456SAndroid Build Coastguard Worker            }
4477*58b9f456SAndroid Build Coastguard Worker            else
4478*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_escape>();
4479*58b9f456SAndroid Build Coastguard Worker            break;
4480*58b9f456SAndroid Build Coastguard Worker        case 'u':
4481*58b9f456SAndroid Build Coastguard Worker            ++__first;
4482*58b9f456SAndroid Build Coastguard Worker            if (__first == __last)
4483*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_escape>();
4484*58b9f456SAndroid Build Coastguard Worker            __hd = __traits_.value(*__first, 16);
4485*58b9f456SAndroid Build Coastguard Worker            if (__hd == -1)
4486*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_escape>();
4487*58b9f456SAndroid Build Coastguard Worker            __sum = 16 * __sum + static_cast<unsigned>(__hd);
4488*58b9f456SAndroid Build Coastguard Worker            ++__first;
4489*58b9f456SAndroid Build Coastguard Worker            if (__first == __last)
4490*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_escape>();
4491*58b9f456SAndroid Build Coastguard Worker            __hd = __traits_.value(*__first, 16);
4492*58b9f456SAndroid Build Coastguard Worker            if (__hd == -1)
4493*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_escape>();
4494*58b9f456SAndroid Build Coastguard Worker            __sum = 16 * __sum + static_cast<unsigned>(__hd);
4495*58b9f456SAndroid Build Coastguard Worker            // drop through
4496*58b9f456SAndroid Build Coastguard Worker        case 'x':
4497*58b9f456SAndroid Build Coastguard Worker            ++__first;
4498*58b9f456SAndroid Build Coastguard Worker            if (__first == __last)
4499*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_escape>();
4500*58b9f456SAndroid Build Coastguard Worker            __hd = __traits_.value(*__first, 16);
4501*58b9f456SAndroid Build Coastguard Worker            if (__hd == -1)
4502*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_escape>();
4503*58b9f456SAndroid Build Coastguard Worker            __sum = 16 * __sum + static_cast<unsigned>(__hd);
4504*58b9f456SAndroid Build Coastguard Worker            ++__first;
4505*58b9f456SAndroid Build Coastguard Worker            if (__first == __last)
4506*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_escape>();
4507*58b9f456SAndroid Build Coastguard Worker            __hd = __traits_.value(*__first, 16);
4508*58b9f456SAndroid Build Coastguard Worker            if (__hd == -1)
4509*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_escape>();
4510*58b9f456SAndroid Build Coastguard Worker            __sum = 16 * __sum + static_cast<unsigned>(__hd);
4511*58b9f456SAndroid Build Coastguard Worker            if (__str)
4512*58b9f456SAndroid Build Coastguard Worker                *__str = _CharT(__sum);
4513*58b9f456SAndroid Build Coastguard Worker            else
4514*58b9f456SAndroid Build Coastguard Worker                __push_char(_CharT(__sum));
4515*58b9f456SAndroid Build Coastguard Worker            ++__first;
4516*58b9f456SAndroid Build Coastguard Worker            break;
4517*58b9f456SAndroid Build Coastguard Worker        case '0':
4518*58b9f456SAndroid Build Coastguard Worker            if (__str)
4519*58b9f456SAndroid Build Coastguard Worker                *__str = _CharT(0);
4520*58b9f456SAndroid Build Coastguard Worker            else
4521*58b9f456SAndroid Build Coastguard Worker                __push_char(_CharT(0));
4522*58b9f456SAndroid Build Coastguard Worker            ++__first;
4523*58b9f456SAndroid Build Coastguard Worker            break;
4524*58b9f456SAndroid Build Coastguard Worker        default:
4525*58b9f456SAndroid Build Coastguard Worker            if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4526*58b9f456SAndroid Build Coastguard Worker            {
4527*58b9f456SAndroid Build Coastguard Worker                if (__str)
4528*58b9f456SAndroid Build Coastguard Worker                    *__str = *__first;
4529*58b9f456SAndroid Build Coastguard Worker                else
4530*58b9f456SAndroid Build Coastguard Worker                    __push_char(*__first);
4531*58b9f456SAndroid Build Coastguard Worker                ++__first;
4532*58b9f456SAndroid Build Coastguard Worker            }
4533*58b9f456SAndroid Build Coastguard Worker            else
4534*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::error_escape>();
4535*58b9f456SAndroid Build Coastguard Worker            break;
4536*58b9f456SAndroid Build Coastguard Worker        }
4537*58b9f456SAndroid Build Coastguard Worker    }
4538*58b9f456SAndroid Build Coastguard Worker    return __first;
4539*58b9f456SAndroid Build Coastguard Worker}
4540*58b9f456SAndroid Build Coastguard Worker
4541*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4542*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4543*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4544*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4545*58b9f456SAndroid Build Coastguard Worker                                                        _ForwardIterator __last)
4546*58b9f456SAndroid Build Coastguard Worker{
4547*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
4548*58b9f456SAndroid Build Coastguard Worker    {
4549*58b9f456SAndroid Build Coastguard Worker        switch (*__first)
4550*58b9f456SAndroid Build Coastguard Worker        {
4551*58b9f456SAndroid Build Coastguard Worker        case '^':
4552*58b9f456SAndroid Build Coastguard Worker        case '$':
4553*58b9f456SAndroid Build Coastguard Worker        case '\\':
4554*58b9f456SAndroid Build Coastguard Worker        case '.':
4555*58b9f456SAndroid Build Coastguard Worker        case '*':
4556*58b9f456SAndroid Build Coastguard Worker        case '+':
4557*58b9f456SAndroid Build Coastguard Worker        case '?':
4558*58b9f456SAndroid Build Coastguard Worker        case '(':
4559*58b9f456SAndroid Build Coastguard Worker        case ')':
4560*58b9f456SAndroid Build Coastguard Worker        case '[':
4561*58b9f456SAndroid Build Coastguard Worker        case ']':
4562*58b9f456SAndroid Build Coastguard Worker        case '{':
4563*58b9f456SAndroid Build Coastguard Worker        case '}':
4564*58b9f456SAndroid Build Coastguard Worker        case '|':
4565*58b9f456SAndroid Build Coastguard Worker            break;
4566*58b9f456SAndroid Build Coastguard Worker        default:
4567*58b9f456SAndroid Build Coastguard Worker            __push_char(*__first);
4568*58b9f456SAndroid Build Coastguard Worker            ++__first;
4569*58b9f456SAndroid Build Coastguard Worker            break;
4570*58b9f456SAndroid Build Coastguard Worker        }
4571*58b9f456SAndroid Build Coastguard Worker    }
4572*58b9f456SAndroid Build Coastguard Worker    return __first;
4573*58b9f456SAndroid Build Coastguard Worker}
4574*58b9f456SAndroid Build Coastguard Worker
4575*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4576*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4577*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4578*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4579*58b9f456SAndroid Build Coastguard Worker                                           _ForwardIterator __last)
4580*58b9f456SAndroid Build Coastguard Worker{
4581*58b9f456SAndroid Build Coastguard Worker    __owns_one_state<_CharT>* __sa = __end_;
4582*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4583*58b9f456SAndroid Build Coastguard Worker    if (__t1 != __first)
4584*58b9f456SAndroid Build Coastguard Worker        __parse_basic_reg_exp(__first, __t1);
4585*58b9f456SAndroid Build Coastguard Worker    else
4586*58b9f456SAndroid Build Coastguard Worker        __push_empty();
4587*58b9f456SAndroid Build Coastguard Worker    __first = __t1;
4588*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
4589*58b9f456SAndroid Build Coastguard Worker        ++__first;
4590*58b9f456SAndroid Build Coastguard Worker    while (__first != __last)
4591*58b9f456SAndroid Build Coastguard Worker    {
4592*58b9f456SAndroid Build Coastguard Worker        __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4593*58b9f456SAndroid Build Coastguard Worker        __owns_one_state<_CharT>* __sb = __end_;
4594*58b9f456SAndroid Build Coastguard Worker        if (__t1 != __first)
4595*58b9f456SAndroid Build Coastguard Worker            __parse_basic_reg_exp(__first, __t1);
4596*58b9f456SAndroid Build Coastguard Worker        else
4597*58b9f456SAndroid Build Coastguard Worker            __push_empty();
4598*58b9f456SAndroid Build Coastguard Worker        __push_alternation(__sa, __sb);
4599*58b9f456SAndroid Build Coastguard Worker        __first = __t1;
4600*58b9f456SAndroid Build Coastguard Worker        if (__first != __last)
4601*58b9f456SAndroid Build Coastguard Worker            ++__first;
4602*58b9f456SAndroid Build Coastguard Worker    }
4603*58b9f456SAndroid Build Coastguard Worker    return __first;
4604*58b9f456SAndroid Build Coastguard Worker}
4605*58b9f456SAndroid Build Coastguard Worker
4606*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4607*58b9f456SAndroid Build Coastguard Workertemplate <class _ForwardIterator>
4608*58b9f456SAndroid Build Coastguard Worker_ForwardIterator
4609*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4610*58b9f456SAndroid Build Coastguard Worker                                            _ForwardIterator __last)
4611*58b9f456SAndroid Build Coastguard Worker{
4612*58b9f456SAndroid Build Coastguard Worker    __owns_one_state<_CharT>* __sa = __end_;
4613*58b9f456SAndroid Build Coastguard Worker    _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4614*58b9f456SAndroid Build Coastguard Worker    if (__t1 != __first)
4615*58b9f456SAndroid Build Coastguard Worker        __parse_extended_reg_exp(__first, __t1);
4616*58b9f456SAndroid Build Coastguard Worker    else
4617*58b9f456SAndroid Build Coastguard Worker        __push_empty();
4618*58b9f456SAndroid Build Coastguard Worker    __first = __t1;
4619*58b9f456SAndroid Build Coastguard Worker    if (__first != __last)
4620*58b9f456SAndroid Build Coastguard Worker        ++__first;
4621*58b9f456SAndroid Build Coastguard Worker    while (__first != __last)
4622*58b9f456SAndroid Build Coastguard Worker    {
4623*58b9f456SAndroid Build Coastguard Worker        __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4624*58b9f456SAndroid Build Coastguard Worker        __owns_one_state<_CharT>* __sb = __end_;
4625*58b9f456SAndroid Build Coastguard Worker        if (__t1 != __first)
4626*58b9f456SAndroid Build Coastguard Worker            __parse_extended_reg_exp(__first, __t1);
4627*58b9f456SAndroid Build Coastguard Worker        else
4628*58b9f456SAndroid Build Coastguard Worker            __push_empty();
4629*58b9f456SAndroid Build Coastguard Worker        __push_alternation(__sa, __sb);
4630*58b9f456SAndroid Build Coastguard Worker        __first = __t1;
4631*58b9f456SAndroid Build Coastguard Worker        if (__first != __last)
4632*58b9f456SAndroid Build Coastguard Worker            ++__first;
4633*58b9f456SAndroid Build Coastguard Worker    }
4634*58b9f456SAndroid Build Coastguard Worker    return __first;
4635*58b9f456SAndroid Build Coastguard Worker}
4636*58b9f456SAndroid Build Coastguard Worker
4637*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4638*58b9f456SAndroid Build Coastguard Workervoid
4639*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4640*58b9f456SAndroid Build Coastguard Worker        __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4641*58b9f456SAndroid Build Coastguard Worker        bool __greedy)
4642*58b9f456SAndroid Build Coastguard Worker{
4643*58b9f456SAndroid Build Coastguard Worker    unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4644*58b9f456SAndroid Build Coastguard Worker    __end_->first() = nullptr;
4645*58b9f456SAndroid Build Coastguard Worker    unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4646*58b9f456SAndroid Build Coastguard Worker                __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4647*58b9f456SAndroid Build Coastguard Worker                __min, __max));
4648*58b9f456SAndroid Build Coastguard Worker    __s->first() = nullptr;
4649*58b9f456SAndroid Build Coastguard Worker    __e1.release();
4650*58b9f456SAndroid Build Coastguard Worker    __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
4651*58b9f456SAndroid Build Coastguard Worker    __end_ = __e2->second();
4652*58b9f456SAndroid Build Coastguard Worker    __s->first() = __e2.release();
4653*58b9f456SAndroid Build Coastguard Worker    ++__loop_count_;
4654*58b9f456SAndroid Build Coastguard Worker}
4655*58b9f456SAndroid Build Coastguard Worker
4656*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4657*58b9f456SAndroid Build Coastguard Workervoid
4658*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_char(value_type __c)
4659*58b9f456SAndroid Build Coastguard Worker{
4660*58b9f456SAndroid Build Coastguard Worker    if (flags() & icase)
4661*58b9f456SAndroid Build Coastguard Worker        __end_->first() = new __match_char_icase<_CharT, _Traits>
4662*58b9f456SAndroid Build Coastguard Worker                                              (__traits_, __c, __end_->first());
4663*58b9f456SAndroid Build Coastguard Worker    else if (flags() & collate)
4664*58b9f456SAndroid Build Coastguard Worker        __end_->first() = new __match_char_collate<_CharT, _Traits>
4665*58b9f456SAndroid Build Coastguard Worker                                              (__traits_, __c, __end_->first());
4666*58b9f456SAndroid Build Coastguard Worker    else
4667*58b9f456SAndroid Build Coastguard Worker        __end_->first() = new __match_char<_CharT>(__c, __end_->first());
4668*58b9f456SAndroid Build Coastguard Worker    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4669*58b9f456SAndroid Build Coastguard Worker}
4670*58b9f456SAndroid Build Coastguard Worker
4671*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4672*58b9f456SAndroid Build Coastguard Workervoid
4673*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4674*58b9f456SAndroid Build Coastguard Worker{
4675*58b9f456SAndroid Build Coastguard Worker    if (!(__flags_ & nosubs))
4676*58b9f456SAndroid Build Coastguard Worker    {
4677*58b9f456SAndroid Build Coastguard Worker        __end_->first() =
4678*58b9f456SAndroid Build Coastguard Worker                new __begin_marked_subexpression<_CharT>(++__marked_count_,
4679*58b9f456SAndroid Build Coastguard Worker                                                         __end_->first());
4680*58b9f456SAndroid Build Coastguard Worker        __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4681*58b9f456SAndroid Build Coastguard Worker    }
4682*58b9f456SAndroid Build Coastguard Worker}
4683*58b9f456SAndroid Build Coastguard Worker
4684*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4685*58b9f456SAndroid Build Coastguard Workervoid
4686*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4687*58b9f456SAndroid Build Coastguard Worker{
4688*58b9f456SAndroid Build Coastguard Worker    if (!(__flags_ & nosubs))
4689*58b9f456SAndroid Build Coastguard Worker    {
4690*58b9f456SAndroid Build Coastguard Worker        __end_->first() =
4691*58b9f456SAndroid Build Coastguard Worker                new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4692*58b9f456SAndroid Build Coastguard Worker        __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4693*58b9f456SAndroid Build Coastguard Worker    }
4694*58b9f456SAndroid Build Coastguard Worker}
4695*58b9f456SAndroid Build Coastguard Worker
4696*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4697*58b9f456SAndroid Build Coastguard Workervoid
4698*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_l_anchor()
4699*58b9f456SAndroid Build Coastguard Worker{
4700*58b9f456SAndroid Build Coastguard Worker    __end_->first() = new __l_anchor<_CharT>(__end_->first());
4701*58b9f456SAndroid Build Coastguard Worker    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4702*58b9f456SAndroid Build Coastguard Worker}
4703*58b9f456SAndroid Build Coastguard Worker
4704*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4705*58b9f456SAndroid Build Coastguard Workervoid
4706*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_r_anchor()
4707*58b9f456SAndroid Build Coastguard Worker{
4708*58b9f456SAndroid Build Coastguard Worker    __end_->first() = new __r_anchor<_CharT>(__end_->first());
4709*58b9f456SAndroid Build Coastguard Worker    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4710*58b9f456SAndroid Build Coastguard Worker}
4711*58b9f456SAndroid Build Coastguard Worker
4712*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4713*58b9f456SAndroid Build Coastguard Workervoid
4714*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_match_any()
4715*58b9f456SAndroid Build Coastguard Worker{
4716*58b9f456SAndroid Build Coastguard Worker    __end_->first() = new __match_any<_CharT>(__end_->first());
4717*58b9f456SAndroid Build Coastguard Worker    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4718*58b9f456SAndroid Build Coastguard Worker}
4719*58b9f456SAndroid Build Coastguard Worker
4720*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4721*58b9f456SAndroid Build Coastguard Workervoid
4722*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4723*58b9f456SAndroid Build Coastguard Worker{
4724*58b9f456SAndroid Build Coastguard Worker    __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4725*58b9f456SAndroid Build Coastguard Worker    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4726*58b9f456SAndroid Build Coastguard Worker}
4727*58b9f456SAndroid Build Coastguard Worker
4728*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4729*58b9f456SAndroid Build Coastguard Workervoid
4730*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_empty()
4731*58b9f456SAndroid Build Coastguard Worker{
4732*58b9f456SAndroid Build Coastguard Worker    __end_->first() = new __empty_state<_CharT>(__end_->first());
4733*58b9f456SAndroid Build Coastguard Worker    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4734*58b9f456SAndroid Build Coastguard Worker}
4735*58b9f456SAndroid Build Coastguard Worker
4736*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4737*58b9f456SAndroid Build Coastguard Workervoid
4738*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4739*58b9f456SAndroid Build Coastguard Worker{
4740*58b9f456SAndroid Build Coastguard Worker    __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4741*58b9f456SAndroid Build Coastguard Worker                                                           __end_->first());
4742*58b9f456SAndroid Build Coastguard Worker    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4743*58b9f456SAndroid Build Coastguard Worker}
4744*58b9f456SAndroid Build Coastguard Worker
4745*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4746*58b9f456SAndroid Build Coastguard Workervoid
4747*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4748*58b9f456SAndroid Build Coastguard Worker{
4749*58b9f456SAndroid Build Coastguard Worker    if (flags() & icase)
4750*58b9f456SAndroid Build Coastguard Worker        __end_->first() = new __back_ref_icase<_CharT, _Traits>
4751*58b9f456SAndroid Build Coastguard Worker                                              (__traits_, __i, __end_->first());
4752*58b9f456SAndroid Build Coastguard Worker    else if (flags() & collate)
4753*58b9f456SAndroid Build Coastguard Worker        __end_->first() = new __back_ref_collate<_CharT, _Traits>
4754*58b9f456SAndroid Build Coastguard Worker                                              (__traits_, __i, __end_->first());
4755*58b9f456SAndroid Build Coastguard Worker    else
4756*58b9f456SAndroid Build Coastguard Worker        __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
4757*58b9f456SAndroid Build Coastguard Worker    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4758*58b9f456SAndroid Build Coastguard Worker}
4759*58b9f456SAndroid Build Coastguard Worker
4760*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4761*58b9f456SAndroid Build Coastguard Workervoid
4762*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4763*58b9f456SAndroid Build Coastguard Worker                                                 __owns_one_state<_CharT>* __ea)
4764*58b9f456SAndroid Build Coastguard Worker{
4765*58b9f456SAndroid Build Coastguard Worker    __sa->first() = new __alternate<_CharT>(
4766*58b9f456SAndroid Build Coastguard Worker                         static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4767*58b9f456SAndroid Build Coastguard Worker                         static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4768*58b9f456SAndroid Build Coastguard Worker    __ea->first() = nullptr;
4769*58b9f456SAndroid Build Coastguard Worker    __ea->first() = new __empty_state<_CharT>(__end_->first());
4770*58b9f456SAndroid Build Coastguard Worker    __end_->first() = nullptr;
4771*58b9f456SAndroid Build Coastguard Worker    __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4772*58b9f456SAndroid Build Coastguard Worker    __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4773*58b9f456SAndroid Build Coastguard Worker}
4774*58b9f456SAndroid Build Coastguard Worker
4775*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4776*58b9f456SAndroid Build Coastguard Worker__bracket_expression<_CharT, _Traits>*
4777*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4778*58b9f456SAndroid Build Coastguard Worker{
4779*58b9f456SAndroid Build Coastguard Worker    __bracket_expression<_CharT, _Traits>* __r =
4780*58b9f456SAndroid Build Coastguard Worker        new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4781*58b9f456SAndroid Build Coastguard Worker                                                  __negate, __flags_ & icase,
4782*58b9f456SAndroid Build Coastguard Worker                                                  __flags_ & collate);
4783*58b9f456SAndroid Build Coastguard Worker    __end_->first() = __r;
4784*58b9f456SAndroid Build Coastguard Worker    __end_ = __r;
4785*58b9f456SAndroid Build Coastguard Worker    return __r;
4786*58b9f456SAndroid Build Coastguard Worker}
4787*58b9f456SAndroid Build Coastguard Worker
4788*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
4789*58b9f456SAndroid Build Coastguard Workervoid
4790*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
4791*58b9f456SAndroid Build Coastguard Worker                                               bool __invert,
4792*58b9f456SAndroid Build Coastguard Worker                                               unsigned __mexp)
4793*58b9f456SAndroid Build Coastguard Worker{
4794*58b9f456SAndroid Build Coastguard Worker    __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
4795*58b9f456SAndroid Build Coastguard Worker                                                           __end_->first(), __mexp);
4796*58b9f456SAndroid Build Coastguard Worker    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4797*58b9f456SAndroid Build Coastguard Worker}
4798*58b9f456SAndroid Build Coastguard Worker
4799*58b9f456SAndroid Build Coastguard Workertypedef basic_regex<char>    regex;
4800*58b9f456SAndroid Build Coastguard Workertypedef basic_regex<wchar_t> wregex;
4801*58b9f456SAndroid Build Coastguard Worker
4802*58b9f456SAndroid Build Coastguard Worker// sub_match
4803*58b9f456SAndroid Build Coastguard Worker
4804*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator>
4805*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS sub_match
4806*58b9f456SAndroid Build Coastguard Worker    : public pair<_BidirectionalIterator, _BidirectionalIterator>
4807*58b9f456SAndroid Build Coastguard Worker{
4808*58b9f456SAndroid Build Coastguard Workerpublic:
4809*58b9f456SAndroid Build Coastguard Worker    typedef _BidirectionalIterator                              iterator;
4810*58b9f456SAndroid Build Coastguard Worker    typedef typename iterator_traits<iterator>::value_type      value_type;
4811*58b9f456SAndroid Build Coastguard Worker    typedef typename iterator_traits<iterator>::difference_type difference_type;
4812*58b9f456SAndroid Build Coastguard Worker    typedef basic_string<value_type>                            string_type;
4813*58b9f456SAndroid Build Coastguard Worker
4814*58b9f456SAndroid Build Coastguard Worker    bool matched;
4815*58b9f456SAndroid Build Coastguard Worker
4816*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
4817*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_CONSTEXPR sub_match() : matched() {}
4818*58b9f456SAndroid Build Coastguard Worker
4819*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
4820*58b9f456SAndroid Build Coastguard Worker    difference_type length() const
4821*58b9f456SAndroid Build Coastguard Worker        {return matched ? _VSTD::distance(this->first, this->second) : 0;}
4822*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
4823*58b9f456SAndroid Build Coastguard Worker    string_type str() const
4824*58b9f456SAndroid Build Coastguard Worker        {return matched ? string_type(this->first, this->second) : string_type();}
4825*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
4826*58b9f456SAndroid Build Coastguard Worker    operator string_type() const
4827*58b9f456SAndroid Build Coastguard Worker        {return str();}
4828*58b9f456SAndroid Build Coastguard Worker
4829*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
4830*58b9f456SAndroid Build Coastguard Worker    int compare(const sub_match& __s) const
4831*58b9f456SAndroid Build Coastguard Worker        {return str().compare(__s.str());}
4832*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
4833*58b9f456SAndroid Build Coastguard Worker    int compare(const string_type& __s) const
4834*58b9f456SAndroid Build Coastguard Worker        {return str().compare(__s);}
4835*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
4836*58b9f456SAndroid Build Coastguard Worker    int compare(const value_type* __s) const
4837*58b9f456SAndroid Build Coastguard Worker        {return str().compare(__s);}
4838*58b9f456SAndroid Build Coastguard Worker};
4839*58b9f456SAndroid Build Coastguard Worker
4840*58b9f456SAndroid Build Coastguard Workertypedef sub_match<const char*>             csub_match;
4841*58b9f456SAndroid Build Coastguard Workertypedef sub_match<const wchar_t*>          wcsub_match;
4842*58b9f456SAndroid Build Coastguard Workertypedef sub_match<string::const_iterator>  ssub_match;
4843*58b9f456SAndroid Build Coastguard Workertypedef sub_match<wstring::const_iterator> wssub_match;
4844*58b9f456SAndroid Build Coastguard Worker
4845*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
4846*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4847*58b9f456SAndroid Build Coastguard Workerbool
4848*58b9f456SAndroid Build Coastguard Workeroperator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4849*58b9f456SAndroid Build Coastguard Worker{
4850*58b9f456SAndroid Build Coastguard Worker    return __x.compare(__y) == 0;
4851*58b9f456SAndroid Build Coastguard Worker}
4852*58b9f456SAndroid Build Coastguard Worker
4853*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
4854*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4855*58b9f456SAndroid Build Coastguard Workerbool
4856*58b9f456SAndroid Build Coastguard Workeroperator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4857*58b9f456SAndroid Build Coastguard Worker{
4858*58b9f456SAndroid Build Coastguard Worker    return !(__x == __y);
4859*58b9f456SAndroid Build Coastguard Worker}
4860*58b9f456SAndroid Build Coastguard Worker
4861*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
4862*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4863*58b9f456SAndroid Build Coastguard Workerbool
4864*58b9f456SAndroid Build Coastguard Workeroperator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4865*58b9f456SAndroid Build Coastguard Worker{
4866*58b9f456SAndroid Build Coastguard Worker    return __x.compare(__y) < 0;
4867*58b9f456SAndroid Build Coastguard Worker}
4868*58b9f456SAndroid Build Coastguard Worker
4869*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
4870*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4871*58b9f456SAndroid Build Coastguard Workerbool
4872*58b9f456SAndroid Build Coastguard Workeroperator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4873*58b9f456SAndroid Build Coastguard Worker{
4874*58b9f456SAndroid Build Coastguard Worker    return !(__y < __x);
4875*58b9f456SAndroid Build Coastguard Worker}
4876*58b9f456SAndroid Build Coastguard Worker
4877*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
4878*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4879*58b9f456SAndroid Build Coastguard Workerbool
4880*58b9f456SAndroid Build Coastguard Workeroperator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4881*58b9f456SAndroid Build Coastguard Worker{
4882*58b9f456SAndroid Build Coastguard Worker    return !(__x < __y);
4883*58b9f456SAndroid Build Coastguard Worker}
4884*58b9f456SAndroid Build Coastguard Worker
4885*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
4886*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4887*58b9f456SAndroid Build Coastguard Workerbool
4888*58b9f456SAndroid Build Coastguard Workeroperator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4889*58b9f456SAndroid Build Coastguard Worker{
4890*58b9f456SAndroid Build Coastguard Worker    return __y < __x;
4891*58b9f456SAndroid Build Coastguard Worker}
4892*58b9f456SAndroid Build Coastguard Worker
4893*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter, class _ST, class _SA>
4894*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4895*58b9f456SAndroid Build Coastguard Workerbool
4896*58b9f456SAndroid Build Coastguard Workeroperator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4897*58b9f456SAndroid Build Coastguard Worker           const sub_match<_BiIter>& __y)
4898*58b9f456SAndroid Build Coastguard Worker{
4899*58b9f456SAndroid Build Coastguard Worker    return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
4900*58b9f456SAndroid Build Coastguard Worker}
4901*58b9f456SAndroid Build Coastguard Worker
4902*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter, class _ST, class _SA>
4903*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4904*58b9f456SAndroid Build Coastguard Workerbool
4905*58b9f456SAndroid Build Coastguard Workeroperator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4906*58b9f456SAndroid Build Coastguard Worker           const sub_match<_BiIter>& __y)
4907*58b9f456SAndroid Build Coastguard Worker{
4908*58b9f456SAndroid Build Coastguard Worker    return !(__x == __y);
4909*58b9f456SAndroid Build Coastguard Worker}
4910*58b9f456SAndroid Build Coastguard Worker
4911*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter, class _ST, class _SA>
4912*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4913*58b9f456SAndroid Build Coastguard Workerbool
4914*58b9f456SAndroid Build Coastguard Workeroperator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4915*58b9f456SAndroid Build Coastguard Worker          const sub_match<_BiIter>& __y)
4916*58b9f456SAndroid Build Coastguard Worker{
4917*58b9f456SAndroid Build Coastguard Worker    return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
4918*58b9f456SAndroid Build Coastguard Worker}
4919*58b9f456SAndroid Build Coastguard Worker
4920*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter, class _ST, class _SA>
4921*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4922*58b9f456SAndroid Build Coastguard Workerbool
4923*58b9f456SAndroid Build Coastguard Workeroperator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4924*58b9f456SAndroid Build Coastguard Worker          const sub_match<_BiIter>& __y)
4925*58b9f456SAndroid Build Coastguard Worker{
4926*58b9f456SAndroid Build Coastguard Worker    return __y < __x;
4927*58b9f456SAndroid Build Coastguard Worker}
4928*58b9f456SAndroid Build Coastguard Worker
4929*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter, class _ST, class _SA>
4930*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4931*58b9f456SAndroid Build Coastguard Workerbool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4932*58b9f456SAndroid Build Coastguard Worker                const sub_match<_BiIter>& __y)
4933*58b9f456SAndroid Build Coastguard Worker{
4934*58b9f456SAndroid Build Coastguard Worker    return !(__x < __y);
4935*58b9f456SAndroid Build Coastguard Worker}
4936*58b9f456SAndroid Build Coastguard Worker
4937*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter, class _ST, class _SA>
4938*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4939*58b9f456SAndroid Build Coastguard Workerbool
4940*58b9f456SAndroid Build Coastguard Workeroperator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4941*58b9f456SAndroid Build Coastguard Worker           const sub_match<_BiIter>& __y)
4942*58b9f456SAndroid Build Coastguard Worker{
4943*58b9f456SAndroid Build Coastguard Worker    return !(__y < __x);
4944*58b9f456SAndroid Build Coastguard Worker}
4945*58b9f456SAndroid Build Coastguard Worker
4946*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter, class _ST, class _SA>
4947*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4948*58b9f456SAndroid Build Coastguard Workerbool
4949*58b9f456SAndroid Build Coastguard Workeroperator==(const sub_match<_BiIter>& __x,
4950*58b9f456SAndroid Build Coastguard Worker           const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4951*58b9f456SAndroid Build Coastguard Worker{
4952*58b9f456SAndroid Build Coastguard Worker    return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
4953*58b9f456SAndroid Build Coastguard Worker}
4954*58b9f456SAndroid Build Coastguard Worker
4955*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter, class _ST, class _SA>
4956*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4957*58b9f456SAndroid Build Coastguard Workerbool
4958*58b9f456SAndroid Build Coastguard Workeroperator!=(const sub_match<_BiIter>& __x,
4959*58b9f456SAndroid Build Coastguard Worker           const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4960*58b9f456SAndroid Build Coastguard Worker{
4961*58b9f456SAndroid Build Coastguard Worker    return !(__x == __y);
4962*58b9f456SAndroid Build Coastguard Worker}
4963*58b9f456SAndroid Build Coastguard Worker
4964*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter, class _ST, class _SA>
4965*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4966*58b9f456SAndroid Build Coastguard Workerbool
4967*58b9f456SAndroid Build Coastguard Workeroperator<(const sub_match<_BiIter>& __x,
4968*58b9f456SAndroid Build Coastguard Worker          const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4969*58b9f456SAndroid Build Coastguard Worker{
4970*58b9f456SAndroid Build Coastguard Worker    return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
4971*58b9f456SAndroid Build Coastguard Worker}
4972*58b9f456SAndroid Build Coastguard Worker
4973*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter, class _ST, class _SA>
4974*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4975*58b9f456SAndroid Build Coastguard Workerbool operator>(const sub_match<_BiIter>& __x,
4976*58b9f456SAndroid Build Coastguard Worker               const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4977*58b9f456SAndroid Build Coastguard Worker{
4978*58b9f456SAndroid Build Coastguard Worker    return __y < __x;
4979*58b9f456SAndroid Build Coastguard Worker}
4980*58b9f456SAndroid Build Coastguard Worker
4981*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter, class _ST, class _SA>
4982*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4983*58b9f456SAndroid Build Coastguard Workerbool
4984*58b9f456SAndroid Build Coastguard Workeroperator>=(const sub_match<_BiIter>& __x,
4985*58b9f456SAndroid Build Coastguard Worker           const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4986*58b9f456SAndroid Build Coastguard Worker{
4987*58b9f456SAndroid Build Coastguard Worker    return !(__x < __y);
4988*58b9f456SAndroid Build Coastguard Worker}
4989*58b9f456SAndroid Build Coastguard Worker
4990*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter, class _ST, class _SA>
4991*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
4992*58b9f456SAndroid Build Coastguard Workerbool
4993*58b9f456SAndroid Build Coastguard Workeroperator<=(const sub_match<_BiIter>& __x,
4994*58b9f456SAndroid Build Coastguard Worker           const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4995*58b9f456SAndroid Build Coastguard Worker{
4996*58b9f456SAndroid Build Coastguard Worker    return !(__y < __x);
4997*58b9f456SAndroid Build Coastguard Worker}
4998*58b9f456SAndroid Build Coastguard Worker
4999*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5000*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5001*58b9f456SAndroid Build Coastguard Workerbool
5002*58b9f456SAndroid Build Coastguard Workeroperator==(typename iterator_traits<_BiIter>::value_type const* __x,
5003*58b9f456SAndroid Build Coastguard Worker           const sub_match<_BiIter>& __y)
5004*58b9f456SAndroid Build Coastguard Worker{
5005*58b9f456SAndroid Build Coastguard Worker    return __y.compare(__x) == 0;
5006*58b9f456SAndroid Build Coastguard Worker}
5007*58b9f456SAndroid Build Coastguard Worker
5008*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5009*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5010*58b9f456SAndroid Build Coastguard Workerbool
5011*58b9f456SAndroid Build Coastguard Workeroperator!=(typename iterator_traits<_BiIter>::value_type const* __x,
5012*58b9f456SAndroid Build Coastguard Worker           const sub_match<_BiIter>& __y)
5013*58b9f456SAndroid Build Coastguard Worker{
5014*58b9f456SAndroid Build Coastguard Worker    return !(__x == __y);
5015*58b9f456SAndroid Build Coastguard Worker}
5016*58b9f456SAndroid Build Coastguard Worker
5017*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5018*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5019*58b9f456SAndroid Build Coastguard Workerbool
5020*58b9f456SAndroid Build Coastguard Workeroperator<(typename iterator_traits<_BiIter>::value_type const* __x,
5021*58b9f456SAndroid Build Coastguard Worker          const sub_match<_BiIter>& __y)
5022*58b9f456SAndroid Build Coastguard Worker{
5023*58b9f456SAndroid Build Coastguard Worker    return __y.compare(__x) > 0;
5024*58b9f456SAndroid Build Coastguard Worker}
5025*58b9f456SAndroid Build Coastguard Worker
5026*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5027*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5028*58b9f456SAndroid Build Coastguard Workerbool
5029*58b9f456SAndroid Build Coastguard Workeroperator>(typename iterator_traits<_BiIter>::value_type const* __x,
5030*58b9f456SAndroid Build Coastguard Worker          const sub_match<_BiIter>& __y)
5031*58b9f456SAndroid Build Coastguard Worker{
5032*58b9f456SAndroid Build Coastguard Worker    return __y < __x;
5033*58b9f456SAndroid Build Coastguard Worker}
5034*58b9f456SAndroid Build Coastguard Worker
5035*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5036*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5037*58b9f456SAndroid Build Coastguard Workerbool
5038*58b9f456SAndroid Build Coastguard Workeroperator>=(typename iterator_traits<_BiIter>::value_type const* __x,
5039*58b9f456SAndroid Build Coastguard Worker           const sub_match<_BiIter>& __y)
5040*58b9f456SAndroid Build Coastguard Worker{
5041*58b9f456SAndroid Build Coastguard Worker    return !(__x < __y);
5042*58b9f456SAndroid Build Coastguard Worker}
5043*58b9f456SAndroid Build Coastguard Worker
5044*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5045*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5046*58b9f456SAndroid Build Coastguard Workerbool
5047*58b9f456SAndroid Build Coastguard Workeroperator<=(typename iterator_traits<_BiIter>::value_type const* __x,
5048*58b9f456SAndroid Build Coastguard Worker           const sub_match<_BiIter>& __y)
5049*58b9f456SAndroid Build Coastguard Worker{
5050*58b9f456SAndroid Build Coastguard Worker    return !(__y < __x);
5051*58b9f456SAndroid Build Coastguard Worker}
5052*58b9f456SAndroid Build Coastguard Worker
5053*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5054*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5055*58b9f456SAndroid Build Coastguard Workerbool
5056*58b9f456SAndroid Build Coastguard Workeroperator==(const sub_match<_BiIter>& __x,
5057*58b9f456SAndroid Build Coastguard Worker           typename iterator_traits<_BiIter>::value_type const* __y)
5058*58b9f456SAndroid Build Coastguard Worker{
5059*58b9f456SAndroid Build Coastguard Worker    return __x.compare(__y) == 0;
5060*58b9f456SAndroid Build Coastguard Worker}
5061*58b9f456SAndroid Build Coastguard Worker
5062*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5063*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5064*58b9f456SAndroid Build Coastguard Workerbool
5065*58b9f456SAndroid Build Coastguard Workeroperator!=(const sub_match<_BiIter>& __x,
5066*58b9f456SAndroid Build Coastguard Worker           typename iterator_traits<_BiIter>::value_type const* __y)
5067*58b9f456SAndroid Build Coastguard Worker{
5068*58b9f456SAndroid Build Coastguard Worker    return !(__x == __y);
5069*58b9f456SAndroid Build Coastguard Worker}
5070*58b9f456SAndroid Build Coastguard Worker
5071*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5072*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5073*58b9f456SAndroid Build Coastguard Workerbool
5074*58b9f456SAndroid Build Coastguard Workeroperator<(const sub_match<_BiIter>& __x,
5075*58b9f456SAndroid Build Coastguard Worker          typename iterator_traits<_BiIter>::value_type const* __y)
5076*58b9f456SAndroid Build Coastguard Worker{
5077*58b9f456SAndroid Build Coastguard Worker    return __x.compare(__y) < 0;
5078*58b9f456SAndroid Build Coastguard Worker}
5079*58b9f456SAndroid Build Coastguard Worker
5080*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5081*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5082*58b9f456SAndroid Build Coastguard Workerbool
5083*58b9f456SAndroid Build Coastguard Workeroperator>(const sub_match<_BiIter>& __x,
5084*58b9f456SAndroid Build Coastguard Worker          typename iterator_traits<_BiIter>::value_type const* __y)
5085*58b9f456SAndroid Build Coastguard Worker{
5086*58b9f456SAndroid Build Coastguard Worker    return __y < __x;
5087*58b9f456SAndroid Build Coastguard Worker}
5088*58b9f456SAndroid Build Coastguard Worker
5089*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5090*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5091*58b9f456SAndroid Build Coastguard Workerbool
5092*58b9f456SAndroid Build Coastguard Workeroperator>=(const sub_match<_BiIter>& __x,
5093*58b9f456SAndroid Build Coastguard Worker           typename iterator_traits<_BiIter>::value_type const* __y)
5094*58b9f456SAndroid Build Coastguard Worker{
5095*58b9f456SAndroid Build Coastguard Worker    return !(__x < __y);
5096*58b9f456SAndroid Build Coastguard Worker}
5097*58b9f456SAndroid Build Coastguard Worker
5098*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5099*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5100*58b9f456SAndroid Build Coastguard Workerbool
5101*58b9f456SAndroid Build Coastguard Workeroperator<=(const sub_match<_BiIter>& __x,
5102*58b9f456SAndroid Build Coastguard Worker           typename iterator_traits<_BiIter>::value_type const* __y)
5103*58b9f456SAndroid Build Coastguard Worker{
5104*58b9f456SAndroid Build Coastguard Worker    return !(__y < __x);
5105*58b9f456SAndroid Build Coastguard Worker}
5106*58b9f456SAndroid Build Coastguard Worker
5107*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5108*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5109*58b9f456SAndroid Build Coastguard Workerbool
5110*58b9f456SAndroid Build Coastguard Workeroperator==(typename iterator_traits<_BiIter>::value_type const& __x,
5111*58b9f456SAndroid Build Coastguard Worker           const sub_match<_BiIter>& __y)
5112*58b9f456SAndroid Build Coastguard Worker{
5113*58b9f456SAndroid Build Coastguard Worker    typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5114*58b9f456SAndroid Build Coastguard Worker    return __y.compare(string_type(1, __x)) == 0;
5115*58b9f456SAndroid Build Coastguard Worker}
5116*58b9f456SAndroid Build Coastguard Worker
5117*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5118*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5119*58b9f456SAndroid Build Coastguard Workerbool
5120*58b9f456SAndroid Build Coastguard Workeroperator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5121*58b9f456SAndroid Build Coastguard Worker           const sub_match<_BiIter>& __y)
5122*58b9f456SAndroid Build Coastguard Worker{
5123*58b9f456SAndroid Build Coastguard Worker    return !(__x == __y);
5124*58b9f456SAndroid Build Coastguard Worker}
5125*58b9f456SAndroid Build Coastguard Worker
5126*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5127*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5128*58b9f456SAndroid Build Coastguard Workerbool
5129*58b9f456SAndroid Build Coastguard Workeroperator<(typename iterator_traits<_BiIter>::value_type const& __x,
5130*58b9f456SAndroid Build Coastguard Worker          const sub_match<_BiIter>& __y)
5131*58b9f456SAndroid Build Coastguard Worker{
5132*58b9f456SAndroid Build Coastguard Worker    typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5133*58b9f456SAndroid Build Coastguard Worker    return __y.compare(string_type(1, __x)) > 0;
5134*58b9f456SAndroid Build Coastguard Worker}
5135*58b9f456SAndroid Build Coastguard Worker
5136*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5137*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5138*58b9f456SAndroid Build Coastguard Workerbool
5139*58b9f456SAndroid Build Coastguard Workeroperator>(typename iterator_traits<_BiIter>::value_type const& __x,
5140*58b9f456SAndroid Build Coastguard Worker          const sub_match<_BiIter>& __y)
5141*58b9f456SAndroid Build Coastguard Worker{
5142*58b9f456SAndroid Build Coastguard Worker    return __y < __x;
5143*58b9f456SAndroid Build Coastguard Worker}
5144*58b9f456SAndroid Build Coastguard Worker
5145*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5146*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5147*58b9f456SAndroid Build Coastguard Workerbool
5148*58b9f456SAndroid Build Coastguard Workeroperator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5149*58b9f456SAndroid Build Coastguard Worker           const sub_match<_BiIter>& __y)
5150*58b9f456SAndroid Build Coastguard Worker{
5151*58b9f456SAndroid Build Coastguard Worker    return !(__x < __y);
5152*58b9f456SAndroid Build Coastguard Worker}
5153*58b9f456SAndroid Build Coastguard Worker
5154*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5155*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5156*58b9f456SAndroid Build Coastguard Workerbool
5157*58b9f456SAndroid Build Coastguard Workeroperator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5158*58b9f456SAndroid Build Coastguard Worker           const sub_match<_BiIter>& __y)
5159*58b9f456SAndroid Build Coastguard Worker{
5160*58b9f456SAndroid Build Coastguard Worker    return !(__y < __x);
5161*58b9f456SAndroid Build Coastguard Worker}
5162*58b9f456SAndroid Build Coastguard Worker
5163*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5164*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5165*58b9f456SAndroid Build Coastguard Workerbool
5166*58b9f456SAndroid Build Coastguard Workeroperator==(const sub_match<_BiIter>& __x,
5167*58b9f456SAndroid Build Coastguard Worker           typename iterator_traits<_BiIter>::value_type const& __y)
5168*58b9f456SAndroid Build Coastguard Worker{
5169*58b9f456SAndroid Build Coastguard Worker    typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5170*58b9f456SAndroid Build Coastguard Worker    return __x.compare(string_type(1, __y)) == 0;
5171*58b9f456SAndroid Build Coastguard Worker}
5172*58b9f456SAndroid Build Coastguard Worker
5173*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5174*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5175*58b9f456SAndroid Build Coastguard Workerbool
5176*58b9f456SAndroid Build Coastguard Workeroperator!=(const sub_match<_BiIter>& __x,
5177*58b9f456SAndroid Build Coastguard Worker           typename iterator_traits<_BiIter>::value_type const& __y)
5178*58b9f456SAndroid Build Coastguard Worker{
5179*58b9f456SAndroid Build Coastguard Worker    return !(__x == __y);
5180*58b9f456SAndroid Build Coastguard Worker}
5181*58b9f456SAndroid Build Coastguard Worker
5182*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5183*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5184*58b9f456SAndroid Build Coastguard Workerbool
5185*58b9f456SAndroid Build Coastguard Workeroperator<(const sub_match<_BiIter>& __x,
5186*58b9f456SAndroid Build Coastguard Worker          typename iterator_traits<_BiIter>::value_type const& __y)
5187*58b9f456SAndroid Build Coastguard Worker{
5188*58b9f456SAndroid Build Coastguard Worker    typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5189*58b9f456SAndroid Build Coastguard Worker    return __x.compare(string_type(1, __y)) < 0;
5190*58b9f456SAndroid Build Coastguard Worker}
5191*58b9f456SAndroid Build Coastguard Worker
5192*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5193*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5194*58b9f456SAndroid Build Coastguard Workerbool
5195*58b9f456SAndroid Build Coastguard Workeroperator>(const sub_match<_BiIter>& __x,
5196*58b9f456SAndroid Build Coastguard Worker          typename iterator_traits<_BiIter>::value_type const& __y)
5197*58b9f456SAndroid Build Coastguard Worker{
5198*58b9f456SAndroid Build Coastguard Worker    return __y < __x;
5199*58b9f456SAndroid Build Coastguard Worker}
5200*58b9f456SAndroid Build Coastguard Worker
5201*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5202*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5203*58b9f456SAndroid Build Coastguard Workerbool
5204*58b9f456SAndroid Build Coastguard Workeroperator>=(const sub_match<_BiIter>& __x,
5205*58b9f456SAndroid Build Coastguard Worker           typename iterator_traits<_BiIter>::value_type const& __y)
5206*58b9f456SAndroid Build Coastguard Worker{
5207*58b9f456SAndroid Build Coastguard Worker    return !(__x < __y);
5208*58b9f456SAndroid Build Coastguard Worker}
5209*58b9f456SAndroid Build Coastguard Worker
5210*58b9f456SAndroid Build Coastguard Workertemplate <class _BiIter>
5211*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5212*58b9f456SAndroid Build Coastguard Workerbool
5213*58b9f456SAndroid Build Coastguard Workeroperator<=(const sub_match<_BiIter>& __x,
5214*58b9f456SAndroid Build Coastguard Worker           typename iterator_traits<_BiIter>::value_type const& __y)
5215*58b9f456SAndroid Build Coastguard Worker{
5216*58b9f456SAndroid Build Coastguard Worker    return !(__y < __x);
5217*58b9f456SAndroid Build Coastguard Worker}
5218*58b9f456SAndroid Build Coastguard Worker
5219*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _ST, class _BiIter>
5220*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5221*58b9f456SAndroid Build Coastguard Workerbasic_ostream<_CharT, _ST>&
5222*58b9f456SAndroid Build Coastguard Workeroperator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5223*58b9f456SAndroid Build Coastguard Worker{
5224*58b9f456SAndroid Build Coastguard Worker    return __os << __m.str();
5225*58b9f456SAndroid Build Coastguard Worker}
5226*58b9f456SAndroid Build Coastguard Worker
5227*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _Allocator>
5228*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS match_results
5229*58b9f456SAndroid Build Coastguard Worker{
5230*58b9f456SAndroid Build Coastguard Workerpublic:
5231*58b9f456SAndroid Build Coastguard Worker    typedef _Allocator                                        allocator_type;
5232*58b9f456SAndroid Build Coastguard Worker    typedef sub_match<_BidirectionalIterator>                 value_type;
5233*58b9f456SAndroid Build Coastguard Workerprivate:
5234*58b9f456SAndroid Build Coastguard Worker    typedef vector<value_type, allocator_type>                __container_type;
5235*58b9f456SAndroid Build Coastguard Worker
5236*58b9f456SAndroid Build Coastguard Worker    __container_type  __matches_;
5237*58b9f456SAndroid Build Coastguard Worker    value_type __unmatched_;
5238*58b9f456SAndroid Build Coastguard Worker    value_type __prefix_;
5239*58b9f456SAndroid Build Coastguard Worker    value_type __suffix_;
5240*58b9f456SAndroid Build Coastguard Worker    bool       __ready_;
5241*58b9f456SAndroid Build Coastguard Workerpublic:
5242*58b9f456SAndroid Build Coastguard Worker    _BidirectionalIterator __position_start_;
5243*58b9f456SAndroid Build Coastguard Worker    typedef const value_type&                                 const_reference;
5244*58b9f456SAndroid Build Coastguard Worker    typedef value_type&                                       reference;
5245*58b9f456SAndroid Build Coastguard Worker    typedef typename __container_type::const_iterator         const_iterator;
5246*58b9f456SAndroid Build Coastguard Worker    typedef const_iterator                                    iterator;
5247*58b9f456SAndroid Build Coastguard Worker    typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5248*58b9f456SAndroid Build Coastguard Worker    typedef typename allocator_traits<allocator_type>::size_type size_type;
5249*58b9f456SAndroid Build Coastguard Worker    typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5250*58b9f456SAndroid Build Coastguard Worker    typedef basic_string<char_type>                           string_type;
5251*58b9f456SAndroid Build Coastguard Worker
5252*58b9f456SAndroid Build Coastguard Worker    // construct/copy/destroy:
5253*58b9f456SAndroid Build Coastguard Worker    explicit match_results(const allocator_type& __a = allocator_type());
5254*58b9f456SAndroid Build Coastguard Worker//    match_results(const match_results&) = default;
5255*58b9f456SAndroid Build Coastguard Worker//    match_results& operator=(const match_results&) = default;
5256*58b9f456SAndroid Build Coastguard Worker//    match_results(match_results&& __m) = default;
5257*58b9f456SAndroid Build Coastguard Worker//    match_results& operator=(match_results&& __m) = default;
5258*58b9f456SAndroid Build Coastguard Worker//    ~match_results() = default;
5259*58b9f456SAndroid Build Coastguard Worker
5260*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5261*58b9f456SAndroid Build Coastguard Worker    bool ready() const {return __ready_;}
5262*58b9f456SAndroid Build Coastguard Worker
5263*58b9f456SAndroid Build Coastguard Worker    // size:
5264*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5265*58b9f456SAndroid Build Coastguard Worker    size_type size() const _NOEXCEPT {return __matches_.size();}
5266*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5267*58b9f456SAndroid Build Coastguard Worker    size_type max_size() const _NOEXCEPT {return __matches_.max_size();}
5268*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
5269*58b9f456SAndroid Build Coastguard Worker    bool empty() const _NOEXCEPT {return size() == 0;}
5270*58b9f456SAndroid Build Coastguard Worker
5271*58b9f456SAndroid Build Coastguard Worker    // element access:
5272*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5273*58b9f456SAndroid Build Coastguard Worker    difference_type length(size_type __sub = 0) const
5274*58b9f456SAndroid Build Coastguard Worker        {return (*this)[__sub].length();}
5275*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5276*58b9f456SAndroid Build Coastguard Worker    difference_type position(size_type __sub = 0) const
5277*58b9f456SAndroid Build Coastguard Worker        {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
5278*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5279*58b9f456SAndroid Build Coastguard Worker    string_type str(size_type __sub = 0) const
5280*58b9f456SAndroid Build Coastguard Worker        {return (*this)[__sub].str();}
5281*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5282*58b9f456SAndroid Build Coastguard Worker    const_reference operator[](size_type __n) const
5283*58b9f456SAndroid Build Coastguard Worker        {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
5284*58b9f456SAndroid Build Coastguard Worker
5285*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5286*58b9f456SAndroid Build Coastguard Worker    const_reference prefix() const {return __prefix_;}
5287*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5288*58b9f456SAndroid Build Coastguard Worker    const_reference suffix() const {return __suffix_;}
5289*58b9f456SAndroid Build Coastguard Worker
5290*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5291*58b9f456SAndroid Build Coastguard Worker    const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
5292*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5293*58b9f456SAndroid Build Coastguard Worker    const_iterator end() const {return __matches_.end();}
5294*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5295*58b9f456SAndroid Build Coastguard Worker    const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
5296*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5297*58b9f456SAndroid Build Coastguard Worker    const_iterator cend() const {return __matches_.end();}
5298*58b9f456SAndroid Build Coastguard Worker
5299*58b9f456SAndroid Build Coastguard Worker    // format:
5300*58b9f456SAndroid Build Coastguard Worker    template <class _OutputIter>
5301*58b9f456SAndroid Build Coastguard Worker        _OutputIter
5302*58b9f456SAndroid Build Coastguard Worker        format(_OutputIter __output_iter, const char_type* __fmt_first,
5303*58b9f456SAndroid Build Coastguard Worker               const char_type* __fmt_last,
5304*58b9f456SAndroid Build Coastguard Worker               regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5305*58b9f456SAndroid Build Coastguard Worker    template <class _OutputIter, class _ST, class _SA>
5306*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
5307*58b9f456SAndroid Build Coastguard Worker        _OutputIter
5308*58b9f456SAndroid Build Coastguard Worker        format(_OutputIter __output_iter, const basic_string<char_type, _ST, _SA>& __fmt,
5309*58b9f456SAndroid Build Coastguard Worker               regex_constants::match_flag_type __flags = regex_constants::format_default) const
5310*58b9f456SAndroid Build Coastguard Worker            {return format(__output_iter, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
5311*58b9f456SAndroid Build Coastguard Worker    template <class _ST, class _SA>
5312*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
5313*58b9f456SAndroid Build Coastguard Worker        basic_string<char_type, _ST, _SA>
5314*58b9f456SAndroid Build Coastguard Worker        format(const basic_string<char_type, _ST, _SA>& __fmt,
5315*58b9f456SAndroid Build Coastguard Worker               regex_constants::match_flag_type __flags = regex_constants::format_default) const
5316*58b9f456SAndroid Build Coastguard Worker        {
5317*58b9f456SAndroid Build Coastguard Worker            basic_string<char_type, _ST, _SA> __r;
5318*58b9f456SAndroid Build Coastguard Worker            format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5319*58b9f456SAndroid Build Coastguard Worker                   __flags);
5320*58b9f456SAndroid Build Coastguard Worker            return __r;
5321*58b9f456SAndroid Build Coastguard Worker        }
5322*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5323*58b9f456SAndroid Build Coastguard Worker    string_type
5324*58b9f456SAndroid Build Coastguard Worker        format(const char_type* __fmt,
5325*58b9f456SAndroid Build Coastguard Worker               regex_constants::match_flag_type __flags = regex_constants::format_default) const
5326*58b9f456SAndroid Build Coastguard Worker        {
5327*58b9f456SAndroid Build Coastguard Worker            string_type __r;
5328*58b9f456SAndroid Build Coastguard Worker            format(back_inserter(__r), __fmt,
5329*58b9f456SAndroid Build Coastguard Worker                   __fmt + char_traits<char_type>::length(__fmt), __flags);
5330*58b9f456SAndroid Build Coastguard Worker            return __r;
5331*58b9f456SAndroid Build Coastguard Worker        }
5332*58b9f456SAndroid Build Coastguard Worker
5333*58b9f456SAndroid Build Coastguard Worker    // allocator:
5334*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
5335*58b9f456SAndroid Build Coastguard Worker    allocator_type get_allocator() const {return __matches_.get_allocator();}
5336*58b9f456SAndroid Build Coastguard Worker
5337*58b9f456SAndroid Build Coastguard Worker    // swap:
5338*58b9f456SAndroid Build Coastguard Worker    void swap(match_results& __m);
5339*58b9f456SAndroid Build Coastguard Worker
5340*58b9f456SAndroid Build Coastguard Worker    template <class _Bp, class _Ap>
5341*58b9f456SAndroid Build Coastguard Worker        _LIBCPP_INLINE_VISIBILITY
5342*58b9f456SAndroid Build Coastguard Worker        void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
5343*58b9f456SAndroid Build Coastguard Worker                      const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
5344*58b9f456SAndroid Build Coastguard Worker    {
5345*58b9f456SAndroid Build Coastguard Worker        _Bp __mf = __m.prefix().first;
5346*58b9f456SAndroid Build Coastguard Worker        __matches_.resize(__m.size());
5347*58b9f456SAndroid Build Coastguard Worker        for (size_type __i = 0; __i < __matches_.size(); ++__i)
5348*58b9f456SAndroid Build Coastguard Worker        {
5349*58b9f456SAndroid Build Coastguard Worker            __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5350*58b9f456SAndroid Build Coastguard Worker            __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
5351*58b9f456SAndroid Build Coastguard Worker            __matches_[__i].matched = __m[__i].matched;
5352*58b9f456SAndroid Build Coastguard Worker        }
5353*58b9f456SAndroid Build Coastguard Worker        __unmatched_.first   = __l;
5354*58b9f456SAndroid Build Coastguard Worker        __unmatched_.second  = __l;
5355*58b9f456SAndroid Build Coastguard Worker        __unmatched_.matched = false;
5356*58b9f456SAndroid Build Coastguard Worker        __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5357*58b9f456SAndroid Build Coastguard Worker        __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
5358*58b9f456SAndroid Build Coastguard Worker        __prefix_.matched = __m.prefix().matched;
5359*58b9f456SAndroid Build Coastguard Worker        __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5360*58b9f456SAndroid Build Coastguard Worker        __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
5361*58b9f456SAndroid Build Coastguard Worker        __suffix_.matched = __m.suffix().matched;
5362*58b9f456SAndroid Build Coastguard Worker        if (!__no_update_pos)
5363*58b9f456SAndroid Build Coastguard Worker            __position_start_ = __prefix_.first;
5364*58b9f456SAndroid Build Coastguard Worker        __ready_ = __m.ready();
5365*58b9f456SAndroid Build Coastguard Worker    }
5366*58b9f456SAndroid Build Coastguard Worker
5367*58b9f456SAndroid Build Coastguard Workerprivate:
5368*58b9f456SAndroid Build Coastguard Worker    void __init(unsigned __s,
5369*58b9f456SAndroid Build Coastguard Worker                _BidirectionalIterator __f, _BidirectionalIterator __l,
5370*58b9f456SAndroid Build Coastguard Worker                bool __no_update_pos = false);
5371*58b9f456SAndroid Build Coastguard Worker
5372*58b9f456SAndroid Build Coastguard Worker    template <class, class> friend class basic_regex;
5373*58b9f456SAndroid Build Coastguard Worker
5374*58b9f456SAndroid Build Coastguard Worker    template <class _Bp, class _Ap, class _Cp, class _Tp>
5375*58b9f456SAndroid Build Coastguard Worker    friend
5376*58b9f456SAndroid Build Coastguard Worker    bool
5377*58b9f456SAndroid Build Coastguard Worker    regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
5378*58b9f456SAndroid Build Coastguard Worker                regex_constants::match_flag_type);
5379*58b9f456SAndroid Build Coastguard Worker
5380*58b9f456SAndroid Build Coastguard Worker    template <class _Bp, class _Ap>
5381*58b9f456SAndroid Build Coastguard Worker    friend
5382*58b9f456SAndroid Build Coastguard Worker    bool
5383*58b9f456SAndroid Build Coastguard Worker    operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
5384*58b9f456SAndroid Build Coastguard Worker
5385*58b9f456SAndroid Build Coastguard Worker    template <class, class> friend class __lookahead;
5386*58b9f456SAndroid Build Coastguard Worker};
5387*58b9f456SAndroid Build Coastguard Worker
5388*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _Allocator>
5389*58b9f456SAndroid Build Coastguard Workermatch_results<_BidirectionalIterator, _Allocator>::match_results(
5390*58b9f456SAndroid Build Coastguard Worker        const allocator_type& __a)
5391*58b9f456SAndroid Build Coastguard Worker    : __matches_(__a),
5392*58b9f456SAndroid Build Coastguard Worker      __unmatched_(),
5393*58b9f456SAndroid Build Coastguard Worker      __prefix_(),
5394*58b9f456SAndroid Build Coastguard Worker      __suffix_(),
5395*58b9f456SAndroid Build Coastguard Worker      __ready_(false),
5396*58b9f456SAndroid Build Coastguard Worker      __position_start_()
5397*58b9f456SAndroid Build Coastguard Worker{
5398*58b9f456SAndroid Build Coastguard Worker}
5399*58b9f456SAndroid Build Coastguard Worker
5400*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _Allocator>
5401*58b9f456SAndroid Build Coastguard Workervoid
5402*58b9f456SAndroid Build Coastguard Workermatch_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
5403*58b9f456SAndroid Build Coastguard Worker                         _BidirectionalIterator __f, _BidirectionalIterator __l,
5404*58b9f456SAndroid Build Coastguard Worker                         bool __no_update_pos)
5405*58b9f456SAndroid Build Coastguard Worker{
5406*58b9f456SAndroid Build Coastguard Worker    __unmatched_.first   = __l;
5407*58b9f456SAndroid Build Coastguard Worker    __unmatched_.second  = __l;
5408*58b9f456SAndroid Build Coastguard Worker    __unmatched_.matched = false;
5409*58b9f456SAndroid Build Coastguard Worker    __matches_.assign(__s, __unmatched_);
5410*58b9f456SAndroid Build Coastguard Worker    __prefix_.first      = __f;
5411*58b9f456SAndroid Build Coastguard Worker    __prefix_.second     = __f;
5412*58b9f456SAndroid Build Coastguard Worker    __prefix_.matched    = false;
5413*58b9f456SAndroid Build Coastguard Worker    __suffix_ = __unmatched_;
5414*58b9f456SAndroid Build Coastguard Worker    if (!__no_update_pos)
5415*58b9f456SAndroid Build Coastguard Worker        __position_start_ = __prefix_.first;
5416*58b9f456SAndroid Build Coastguard Worker    __ready_ = true;
5417*58b9f456SAndroid Build Coastguard Worker}
5418*58b9f456SAndroid Build Coastguard Worker
5419*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _Allocator>
5420*58b9f456SAndroid Build Coastguard Workertemplate <class _OutputIter>
5421*58b9f456SAndroid Build Coastguard Worker_OutputIter
5422*58b9f456SAndroid Build Coastguard Workermatch_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __output_iter,
5423*58b9f456SAndroid Build Coastguard Worker        const char_type* __fmt_first, const char_type* __fmt_last,
5424*58b9f456SAndroid Build Coastguard Worker        regex_constants::match_flag_type __flags) const
5425*58b9f456SAndroid Build Coastguard Worker{
5426*58b9f456SAndroid Build Coastguard Worker    if (__flags & regex_constants::format_sed)
5427*58b9f456SAndroid Build Coastguard Worker    {
5428*58b9f456SAndroid Build Coastguard Worker        for (; __fmt_first != __fmt_last; ++__fmt_first)
5429*58b9f456SAndroid Build Coastguard Worker        {
5430*58b9f456SAndroid Build Coastguard Worker            if (*__fmt_first == '&')
5431*58b9f456SAndroid Build Coastguard Worker                __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5432*58b9f456SAndroid Build Coastguard Worker                                   __output_iter);
5433*58b9f456SAndroid Build Coastguard Worker            else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5434*58b9f456SAndroid Build Coastguard Worker            {
5435*58b9f456SAndroid Build Coastguard Worker                ++__fmt_first;
5436*58b9f456SAndroid Build Coastguard Worker                if ('0' <= *__fmt_first && *__fmt_first <= '9')
5437*58b9f456SAndroid Build Coastguard Worker                {
5438*58b9f456SAndroid Build Coastguard Worker                    size_t __i = *__fmt_first - '0';
5439*58b9f456SAndroid Build Coastguard Worker                    __output_iter = _VSTD::copy((*this)[__i].first,
5440*58b9f456SAndroid Build Coastguard Worker                                        (*this)[__i].second, __output_iter);
5441*58b9f456SAndroid Build Coastguard Worker                }
5442*58b9f456SAndroid Build Coastguard Worker                else
5443*58b9f456SAndroid Build Coastguard Worker                {
5444*58b9f456SAndroid Build Coastguard Worker                    *__output_iter = *__fmt_first;
5445*58b9f456SAndroid Build Coastguard Worker                    ++__output_iter;
5446*58b9f456SAndroid Build Coastguard Worker                }
5447*58b9f456SAndroid Build Coastguard Worker            }
5448*58b9f456SAndroid Build Coastguard Worker            else
5449*58b9f456SAndroid Build Coastguard Worker            {
5450*58b9f456SAndroid Build Coastguard Worker                *__output_iter = *__fmt_first;
5451*58b9f456SAndroid Build Coastguard Worker                ++__output_iter;
5452*58b9f456SAndroid Build Coastguard Worker            }
5453*58b9f456SAndroid Build Coastguard Worker        }
5454*58b9f456SAndroid Build Coastguard Worker    }
5455*58b9f456SAndroid Build Coastguard Worker    else
5456*58b9f456SAndroid Build Coastguard Worker    {
5457*58b9f456SAndroid Build Coastguard Worker        for (; __fmt_first != __fmt_last; ++__fmt_first)
5458*58b9f456SAndroid Build Coastguard Worker        {
5459*58b9f456SAndroid Build Coastguard Worker            if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5460*58b9f456SAndroid Build Coastguard Worker            {
5461*58b9f456SAndroid Build Coastguard Worker                switch (__fmt_first[1])
5462*58b9f456SAndroid Build Coastguard Worker                {
5463*58b9f456SAndroid Build Coastguard Worker                case '$':
5464*58b9f456SAndroid Build Coastguard Worker                    *__output_iter = *++__fmt_first;
5465*58b9f456SAndroid Build Coastguard Worker                    ++__output_iter;
5466*58b9f456SAndroid Build Coastguard Worker                    break;
5467*58b9f456SAndroid Build Coastguard Worker                case '&':
5468*58b9f456SAndroid Build Coastguard Worker                    ++__fmt_first;
5469*58b9f456SAndroid Build Coastguard Worker                    __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5470*58b9f456SAndroid Build Coastguard Worker                                       __output_iter);
5471*58b9f456SAndroid Build Coastguard Worker                    break;
5472*58b9f456SAndroid Build Coastguard Worker                case '`':
5473*58b9f456SAndroid Build Coastguard Worker                    ++__fmt_first;
5474*58b9f456SAndroid Build Coastguard Worker                    __output_iter = _VSTD::copy(__prefix_.first, __prefix_.second, __output_iter);
5475*58b9f456SAndroid Build Coastguard Worker                    break;
5476*58b9f456SAndroid Build Coastguard Worker                case '\'':
5477*58b9f456SAndroid Build Coastguard Worker                    ++__fmt_first;
5478*58b9f456SAndroid Build Coastguard Worker                    __output_iter = _VSTD::copy(__suffix_.first, __suffix_.second, __output_iter);
5479*58b9f456SAndroid Build Coastguard Worker                    break;
5480*58b9f456SAndroid Build Coastguard Worker                default:
5481*58b9f456SAndroid Build Coastguard Worker                    if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5482*58b9f456SAndroid Build Coastguard Worker                    {
5483*58b9f456SAndroid Build Coastguard Worker                        ++__fmt_first;
5484*58b9f456SAndroid Build Coastguard Worker                        size_t __idx = *__fmt_first - '0';
5485*58b9f456SAndroid Build Coastguard Worker                        if (__fmt_first + 1 != __fmt_last &&
5486*58b9f456SAndroid Build Coastguard Worker                            '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5487*58b9f456SAndroid Build Coastguard Worker                        {
5488*58b9f456SAndroid Build Coastguard Worker                            ++__fmt_first;
5489*58b9f456SAndroid Build Coastguard Worker                            if (__idx >= std::numeric_limits<size_t>::max() / 10)
5490*58b9f456SAndroid Build Coastguard Worker                                __throw_regex_error<regex_constants::error_escape>();
5491*58b9f456SAndroid Build Coastguard Worker                            __idx = 10 * __idx + *__fmt_first - '0';
5492*58b9f456SAndroid Build Coastguard Worker                        }
5493*58b9f456SAndroid Build Coastguard Worker                        __output_iter = _VSTD::copy((*this)[__idx].first,
5494*58b9f456SAndroid Build Coastguard Worker                                            (*this)[__idx].second, __output_iter);
5495*58b9f456SAndroid Build Coastguard Worker                    }
5496*58b9f456SAndroid Build Coastguard Worker                    else
5497*58b9f456SAndroid Build Coastguard Worker                    {
5498*58b9f456SAndroid Build Coastguard Worker                        *__output_iter = *__fmt_first;
5499*58b9f456SAndroid Build Coastguard Worker                        ++__output_iter;
5500*58b9f456SAndroid Build Coastguard Worker                    }
5501*58b9f456SAndroid Build Coastguard Worker                    break;
5502*58b9f456SAndroid Build Coastguard Worker                }
5503*58b9f456SAndroid Build Coastguard Worker            }
5504*58b9f456SAndroid Build Coastguard Worker            else
5505*58b9f456SAndroid Build Coastguard Worker            {
5506*58b9f456SAndroid Build Coastguard Worker                *__output_iter = *__fmt_first;
5507*58b9f456SAndroid Build Coastguard Worker                ++__output_iter;
5508*58b9f456SAndroid Build Coastguard Worker            }
5509*58b9f456SAndroid Build Coastguard Worker        }
5510*58b9f456SAndroid Build Coastguard Worker    }
5511*58b9f456SAndroid Build Coastguard Worker    return __output_iter;
5512*58b9f456SAndroid Build Coastguard Worker}
5513*58b9f456SAndroid Build Coastguard Worker
5514*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _Allocator>
5515*58b9f456SAndroid Build Coastguard Workervoid
5516*58b9f456SAndroid Build Coastguard Workermatch_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5517*58b9f456SAndroid Build Coastguard Worker{
5518*58b9f456SAndroid Build Coastguard Worker    using _VSTD::swap;
5519*58b9f456SAndroid Build Coastguard Worker    swap(__matches_, __m.__matches_);
5520*58b9f456SAndroid Build Coastguard Worker    swap(__unmatched_, __m.__unmatched_);
5521*58b9f456SAndroid Build Coastguard Worker    swap(__prefix_, __m.__prefix_);
5522*58b9f456SAndroid Build Coastguard Worker    swap(__suffix_, __m.__suffix_);
5523*58b9f456SAndroid Build Coastguard Worker    swap(__position_start_, __m.__position_start_);
5524*58b9f456SAndroid Build Coastguard Worker    swap(__ready_, __m.__ready_);
5525*58b9f456SAndroid Build Coastguard Worker}
5526*58b9f456SAndroid Build Coastguard Worker
5527*58b9f456SAndroid Build Coastguard Workertypedef match_results<const char*>             cmatch;
5528*58b9f456SAndroid Build Coastguard Workertypedef match_results<const wchar_t*>          wcmatch;
5529*58b9f456SAndroid Build Coastguard Workertypedef match_results<string::const_iterator>  smatch;
5530*58b9f456SAndroid Build Coastguard Workertypedef match_results<wstring::const_iterator> wsmatch;
5531*58b9f456SAndroid Build Coastguard Worker
5532*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _Allocator>
5533*58b9f456SAndroid Build Coastguard Workerbool
5534*58b9f456SAndroid Build Coastguard Workeroperator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5535*58b9f456SAndroid Build Coastguard Worker           const match_results<_BidirectionalIterator, _Allocator>& __y)
5536*58b9f456SAndroid Build Coastguard Worker{
5537*58b9f456SAndroid Build Coastguard Worker    if (__x.__ready_ != __y.__ready_)
5538*58b9f456SAndroid Build Coastguard Worker        return false;
5539*58b9f456SAndroid Build Coastguard Worker    if (!__x.__ready_)
5540*58b9f456SAndroid Build Coastguard Worker        return true;
5541*58b9f456SAndroid Build Coastguard Worker    return __x.__matches_ == __y.__matches_ &&
5542*58b9f456SAndroid Build Coastguard Worker           __x.__prefix_ == __y.__prefix_ &&
5543*58b9f456SAndroid Build Coastguard Worker           __x.__suffix_ == __y.__suffix_;
5544*58b9f456SAndroid Build Coastguard Worker}
5545*58b9f456SAndroid Build Coastguard Worker
5546*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _Allocator>
5547*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5548*58b9f456SAndroid Build Coastguard Workerbool
5549*58b9f456SAndroid Build Coastguard Workeroperator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5550*58b9f456SAndroid Build Coastguard Worker           const match_results<_BidirectionalIterator, _Allocator>& __y)
5551*58b9f456SAndroid Build Coastguard Worker{
5552*58b9f456SAndroid Build Coastguard Worker    return !(__x == __y);
5553*58b9f456SAndroid Build Coastguard Worker}
5554*58b9f456SAndroid Build Coastguard Worker
5555*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _Allocator>
5556*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5557*58b9f456SAndroid Build Coastguard Workervoid
5558*58b9f456SAndroid Build Coastguard Workerswap(match_results<_BidirectionalIterator, _Allocator>& __x,
5559*58b9f456SAndroid Build Coastguard Worker     match_results<_BidirectionalIterator, _Allocator>& __y)
5560*58b9f456SAndroid Build Coastguard Worker{
5561*58b9f456SAndroid Build Coastguard Worker    __x.swap(__y);
5562*58b9f456SAndroid Build Coastguard Worker}
5563*58b9f456SAndroid Build Coastguard Worker
5564*58b9f456SAndroid Build Coastguard Worker// regex_search
5565*58b9f456SAndroid Build Coastguard Worker
5566*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
5567*58b9f456SAndroid Build Coastguard Workertemplate <class _Allocator>
5568*58b9f456SAndroid Build Coastguard Workerbool
5569*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__match_at_start_ecma(
5570*58b9f456SAndroid Build Coastguard Worker        const _CharT* __first, const _CharT* __last,
5571*58b9f456SAndroid Build Coastguard Worker        match_results<const _CharT*, _Allocator>& __m,
5572*58b9f456SAndroid Build Coastguard Worker        regex_constants::match_flag_type __flags, bool __at_first) const
5573*58b9f456SAndroid Build Coastguard Worker{
5574*58b9f456SAndroid Build Coastguard Worker    vector<__state> __states;
5575*58b9f456SAndroid Build Coastguard Worker    __node* __st = __start_.get();
5576*58b9f456SAndroid Build Coastguard Worker    if (__st)
5577*58b9f456SAndroid Build Coastguard Worker    {
5578*58b9f456SAndroid Build Coastguard Worker        sub_match<const _CharT*> __unmatched;
5579*58b9f456SAndroid Build Coastguard Worker        __unmatched.first   = __last;
5580*58b9f456SAndroid Build Coastguard Worker        __unmatched.second  = __last;
5581*58b9f456SAndroid Build Coastguard Worker        __unmatched.matched = false;
5582*58b9f456SAndroid Build Coastguard Worker
5583*58b9f456SAndroid Build Coastguard Worker        __states.push_back(__state());
5584*58b9f456SAndroid Build Coastguard Worker        __states.back().__do_ = 0;
5585*58b9f456SAndroid Build Coastguard Worker        __states.back().__first_ = __first;
5586*58b9f456SAndroid Build Coastguard Worker        __states.back().__current_ = __first;
5587*58b9f456SAndroid Build Coastguard Worker        __states.back().__last_ = __last;
5588*58b9f456SAndroid Build Coastguard Worker        __states.back().__sub_matches_.resize(mark_count(), __unmatched);
5589*58b9f456SAndroid Build Coastguard Worker        __states.back().__loop_data_.resize(__loop_count());
5590*58b9f456SAndroid Build Coastguard Worker        __states.back().__node_ = __st;
5591*58b9f456SAndroid Build Coastguard Worker        __states.back().__flags_ = __flags;
5592*58b9f456SAndroid Build Coastguard Worker        __states.back().__at_first_ = __at_first;
5593*58b9f456SAndroid Build Coastguard Worker        int __counter = 0;
5594*58b9f456SAndroid Build Coastguard Worker        int __length = __last - __first;
5595*58b9f456SAndroid Build Coastguard Worker        do
5596*58b9f456SAndroid Build Coastguard Worker        {
5597*58b9f456SAndroid Build Coastguard Worker            ++__counter;
5598*58b9f456SAndroid Build Coastguard Worker            if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5599*58b9f456SAndroid Build Coastguard Worker                __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5600*58b9f456SAndroid Build Coastguard Worker              __throw_regex_error<regex_constants::error_complexity>();
5601*58b9f456SAndroid Build Coastguard Worker            __state& __s = __states.back();
5602*58b9f456SAndroid Build Coastguard Worker            if (__s.__node_)
5603*58b9f456SAndroid Build Coastguard Worker                __s.__node_->__exec(__s);
5604*58b9f456SAndroid Build Coastguard Worker            switch (__s.__do_)
5605*58b9f456SAndroid Build Coastguard Worker            {
5606*58b9f456SAndroid Build Coastguard Worker            case __state::__end_state:
5607*58b9f456SAndroid Build Coastguard Worker                if ((__flags & regex_constants::match_not_null) &&
5608*58b9f456SAndroid Build Coastguard Worker                    __s.__current_ == __first)
5609*58b9f456SAndroid Build Coastguard Worker                {
5610*58b9f456SAndroid Build Coastguard Worker                  __states.pop_back();
5611*58b9f456SAndroid Build Coastguard Worker                  break;
5612*58b9f456SAndroid Build Coastguard Worker                }
5613*58b9f456SAndroid Build Coastguard Worker                if ((__flags & regex_constants::__full_match) &&
5614*58b9f456SAndroid Build Coastguard Worker                    __s.__current_ != __last)
5615*58b9f456SAndroid Build Coastguard Worker                {
5616*58b9f456SAndroid Build Coastguard Worker                  __states.pop_back();
5617*58b9f456SAndroid Build Coastguard Worker                  break;
5618*58b9f456SAndroid Build Coastguard Worker                }
5619*58b9f456SAndroid Build Coastguard Worker                __m.__matches_[0].first = __first;
5620*58b9f456SAndroid Build Coastguard Worker                __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
5621*58b9f456SAndroid Build Coastguard Worker                __m.__matches_[0].matched = true;
5622*58b9f456SAndroid Build Coastguard Worker                for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5623*58b9f456SAndroid Build Coastguard Worker                    __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5624*58b9f456SAndroid Build Coastguard Worker                return true;
5625*58b9f456SAndroid Build Coastguard Worker            case __state::__accept_and_consume:
5626*58b9f456SAndroid Build Coastguard Worker            case __state::__repeat:
5627*58b9f456SAndroid Build Coastguard Worker            case __state::__accept_but_not_consume:
5628*58b9f456SAndroid Build Coastguard Worker                break;
5629*58b9f456SAndroid Build Coastguard Worker            case __state::__split:
5630*58b9f456SAndroid Build Coastguard Worker                {
5631*58b9f456SAndroid Build Coastguard Worker                __state __snext = __s;
5632*58b9f456SAndroid Build Coastguard Worker                __s.__node_->__exec_split(true, __s);
5633*58b9f456SAndroid Build Coastguard Worker                __snext.__node_->__exec_split(false, __snext);
5634*58b9f456SAndroid Build Coastguard Worker                __states.push_back(_VSTD::move(__snext));
5635*58b9f456SAndroid Build Coastguard Worker                }
5636*58b9f456SAndroid Build Coastguard Worker                break;
5637*58b9f456SAndroid Build Coastguard Worker            case __state::__reject:
5638*58b9f456SAndroid Build Coastguard Worker                __states.pop_back();
5639*58b9f456SAndroid Build Coastguard Worker                break;
5640*58b9f456SAndroid Build Coastguard Worker            default:
5641*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::__re_err_unknown>();
5642*58b9f456SAndroid Build Coastguard Worker                break;
5643*58b9f456SAndroid Build Coastguard Worker
5644*58b9f456SAndroid Build Coastguard Worker            }
5645*58b9f456SAndroid Build Coastguard Worker        } while (!__states.empty());
5646*58b9f456SAndroid Build Coastguard Worker    }
5647*58b9f456SAndroid Build Coastguard Worker    return false;
5648*58b9f456SAndroid Build Coastguard Worker}
5649*58b9f456SAndroid Build Coastguard Worker
5650*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
5651*58b9f456SAndroid Build Coastguard Workertemplate <class _Allocator>
5652*58b9f456SAndroid Build Coastguard Workerbool
5653*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5654*58b9f456SAndroid Build Coastguard Worker        const _CharT* __first, const _CharT* __last,
5655*58b9f456SAndroid Build Coastguard Worker        match_results<const _CharT*, _Allocator>& __m,
5656*58b9f456SAndroid Build Coastguard Worker        regex_constants::match_flag_type __flags, bool __at_first) const
5657*58b9f456SAndroid Build Coastguard Worker{
5658*58b9f456SAndroid Build Coastguard Worker    deque<__state> __states;
5659*58b9f456SAndroid Build Coastguard Worker    ptrdiff_t __highest_j = 0;
5660*58b9f456SAndroid Build Coastguard Worker    ptrdiff_t _Np = _VSTD::distance(__first, __last);
5661*58b9f456SAndroid Build Coastguard Worker    __node* __st = __start_.get();
5662*58b9f456SAndroid Build Coastguard Worker    if (__st)
5663*58b9f456SAndroid Build Coastguard Worker    {
5664*58b9f456SAndroid Build Coastguard Worker        __states.push_back(__state());
5665*58b9f456SAndroid Build Coastguard Worker        __states.back().__do_ = 0;
5666*58b9f456SAndroid Build Coastguard Worker        __states.back().__first_ = __first;
5667*58b9f456SAndroid Build Coastguard Worker        __states.back().__current_ = __first;
5668*58b9f456SAndroid Build Coastguard Worker        __states.back().__last_ = __last;
5669*58b9f456SAndroid Build Coastguard Worker        __states.back().__loop_data_.resize(__loop_count());
5670*58b9f456SAndroid Build Coastguard Worker        __states.back().__node_ = __st;
5671*58b9f456SAndroid Build Coastguard Worker        __states.back().__flags_ = __flags;
5672*58b9f456SAndroid Build Coastguard Worker        __states.back().__at_first_ = __at_first;
5673*58b9f456SAndroid Build Coastguard Worker        bool __matched = false;
5674*58b9f456SAndroid Build Coastguard Worker        int __counter = 0;
5675*58b9f456SAndroid Build Coastguard Worker        int __length = __last - __first;
5676*58b9f456SAndroid Build Coastguard Worker        do
5677*58b9f456SAndroid Build Coastguard Worker        {
5678*58b9f456SAndroid Build Coastguard Worker            ++__counter;
5679*58b9f456SAndroid Build Coastguard Worker            if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5680*58b9f456SAndroid Build Coastguard Worker                __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5681*58b9f456SAndroid Build Coastguard Worker              __throw_regex_error<regex_constants::error_complexity>();
5682*58b9f456SAndroid Build Coastguard Worker            __state& __s = __states.back();
5683*58b9f456SAndroid Build Coastguard Worker            if (__s.__node_)
5684*58b9f456SAndroid Build Coastguard Worker                __s.__node_->__exec(__s);
5685*58b9f456SAndroid Build Coastguard Worker            switch (__s.__do_)
5686*58b9f456SAndroid Build Coastguard Worker            {
5687*58b9f456SAndroid Build Coastguard Worker            case __state::__end_state:
5688*58b9f456SAndroid Build Coastguard Worker                if ((__flags & regex_constants::match_not_null) &&
5689*58b9f456SAndroid Build Coastguard Worker                    __s.__current_ == __first)
5690*58b9f456SAndroid Build Coastguard Worker                {
5691*58b9f456SAndroid Build Coastguard Worker                  __states.pop_back();
5692*58b9f456SAndroid Build Coastguard Worker                  break;
5693*58b9f456SAndroid Build Coastguard Worker                }
5694*58b9f456SAndroid Build Coastguard Worker                if ((__flags & regex_constants::__full_match) &&
5695*58b9f456SAndroid Build Coastguard Worker                    __s.__current_ != __last)
5696*58b9f456SAndroid Build Coastguard Worker                {
5697*58b9f456SAndroid Build Coastguard Worker                  __states.pop_back();
5698*58b9f456SAndroid Build Coastguard Worker                  break;
5699*58b9f456SAndroid Build Coastguard Worker                }
5700*58b9f456SAndroid Build Coastguard Worker                if (!__matched || __highest_j < __s.__current_ - __s.__first_)
5701*58b9f456SAndroid Build Coastguard Worker                    __highest_j = __s.__current_ - __s.__first_;
5702*58b9f456SAndroid Build Coastguard Worker                __matched = true;
5703*58b9f456SAndroid Build Coastguard Worker                if (__highest_j == _Np)
5704*58b9f456SAndroid Build Coastguard Worker                    __states.clear();
5705*58b9f456SAndroid Build Coastguard Worker                else
5706*58b9f456SAndroid Build Coastguard Worker                    __states.pop_back();
5707*58b9f456SAndroid Build Coastguard Worker                break;
5708*58b9f456SAndroid Build Coastguard Worker            case __state::__consume_input:
5709*58b9f456SAndroid Build Coastguard Worker                break;
5710*58b9f456SAndroid Build Coastguard Worker            case __state::__accept_and_consume:
5711*58b9f456SAndroid Build Coastguard Worker                __states.push_front(_VSTD::move(__s));
5712*58b9f456SAndroid Build Coastguard Worker                __states.pop_back();
5713*58b9f456SAndroid Build Coastguard Worker                break;
5714*58b9f456SAndroid Build Coastguard Worker            case __state::__repeat:
5715*58b9f456SAndroid Build Coastguard Worker            case __state::__accept_but_not_consume:
5716*58b9f456SAndroid Build Coastguard Worker                break;
5717*58b9f456SAndroid Build Coastguard Worker            case __state::__split:
5718*58b9f456SAndroid Build Coastguard Worker                {
5719*58b9f456SAndroid Build Coastguard Worker                __state __snext = __s;
5720*58b9f456SAndroid Build Coastguard Worker                __s.__node_->__exec_split(true, __s);
5721*58b9f456SAndroid Build Coastguard Worker                __snext.__node_->__exec_split(false, __snext);
5722*58b9f456SAndroid Build Coastguard Worker                __states.push_back(_VSTD::move(__snext));
5723*58b9f456SAndroid Build Coastguard Worker                }
5724*58b9f456SAndroid Build Coastguard Worker                break;
5725*58b9f456SAndroid Build Coastguard Worker            case __state::__reject:
5726*58b9f456SAndroid Build Coastguard Worker                __states.pop_back();
5727*58b9f456SAndroid Build Coastguard Worker                break;
5728*58b9f456SAndroid Build Coastguard Worker            default:
5729*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::__re_err_unknown>();
5730*58b9f456SAndroid Build Coastguard Worker                break;
5731*58b9f456SAndroid Build Coastguard Worker            }
5732*58b9f456SAndroid Build Coastguard Worker        } while (!__states.empty());
5733*58b9f456SAndroid Build Coastguard Worker        if (__matched)
5734*58b9f456SAndroid Build Coastguard Worker        {
5735*58b9f456SAndroid Build Coastguard Worker            __m.__matches_[0].first = __first;
5736*58b9f456SAndroid Build Coastguard Worker            __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
5737*58b9f456SAndroid Build Coastguard Worker            __m.__matches_[0].matched = true;
5738*58b9f456SAndroid Build Coastguard Worker            return true;
5739*58b9f456SAndroid Build Coastguard Worker        }
5740*58b9f456SAndroid Build Coastguard Worker    }
5741*58b9f456SAndroid Build Coastguard Worker    return false;
5742*58b9f456SAndroid Build Coastguard Worker}
5743*58b9f456SAndroid Build Coastguard Worker
5744*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
5745*58b9f456SAndroid Build Coastguard Workertemplate <class _Allocator>
5746*58b9f456SAndroid Build Coastguard Workerbool
5747*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
5748*58b9f456SAndroid Build Coastguard Worker        const _CharT* __first, const _CharT* __last,
5749*58b9f456SAndroid Build Coastguard Worker        match_results<const _CharT*, _Allocator>& __m,
5750*58b9f456SAndroid Build Coastguard Worker        regex_constants::match_flag_type __flags, bool __at_first) const
5751*58b9f456SAndroid Build Coastguard Worker{
5752*58b9f456SAndroid Build Coastguard Worker    vector<__state> __states;
5753*58b9f456SAndroid Build Coastguard Worker    __state __best_state;
5754*58b9f456SAndroid Build Coastguard Worker    ptrdiff_t __j = 0;
5755*58b9f456SAndroid Build Coastguard Worker    ptrdiff_t __highest_j = 0;
5756*58b9f456SAndroid Build Coastguard Worker    ptrdiff_t _Np = _VSTD::distance(__first, __last);
5757*58b9f456SAndroid Build Coastguard Worker    __node* __st = __start_.get();
5758*58b9f456SAndroid Build Coastguard Worker    if (__st)
5759*58b9f456SAndroid Build Coastguard Worker    {
5760*58b9f456SAndroid Build Coastguard Worker        sub_match<const _CharT*> __unmatched;
5761*58b9f456SAndroid Build Coastguard Worker        __unmatched.first   = __last;
5762*58b9f456SAndroid Build Coastguard Worker        __unmatched.second  = __last;
5763*58b9f456SAndroid Build Coastguard Worker        __unmatched.matched = false;
5764*58b9f456SAndroid Build Coastguard Worker
5765*58b9f456SAndroid Build Coastguard Worker        __states.push_back(__state());
5766*58b9f456SAndroid Build Coastguard Worker        __states.back().__do_ = 0;
5767*58b9f456SAndroid Build Coastguard Worker        __states.back().__first_ = __first;
5768*58b9f456SAndroid Build Coastguard Worker        __states.back().__current_ = __first;
5769*58b9f456SAndroid Build Coastguard Worker        __states.back().__last_ = __last;
5770*58b9f456SAndroid Build Coastguard Worker        __states.back().__sub_matches_.resize(mark_count(), __unmatched);
5771*58b9f456SAndroid Build Coastguard Worker        __states.back().__loop_data_.resize(__loop_count());
5772*58b9f456SAndroid Build Coastguard Worker        __states.back().__node_ = __st;
5773*58b9f456SAndroid Build Coastguard Worker        __states.back().__flags_ = __flags;
5774*58b9f456SAndroid Build Coastguard Worker        __states.back().__at_first_ = __at_first;
5775*58b9f456SAndroid Build Coastguard Worker        const _CharT* __current = __first;
5776*58b9f456SAndroid Build Coastguard Worker        bool __matched = false;
5777*58b9f456SAndroid Build Coastguard Worker        int __counter = 0;
5778*58b9f456SAndroid Build Coastguard Worker        int __length = __last - __first;
5779*58b9f456SAndroid Build Coastguard Worker        do
5780*58b9f456SAndroid Build Coastguard Worker        {
5781*58b9f456SAndroid Build Coastguard Worker            ++__counter;
5782*58b9f456SAndroid Build Coastguard Worker            if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5783*58b9f456SAndroid Build Coastguard Worker                __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5784*58b9f456SAndroid Build Coastguard Worker              __throw_regex_error<regex_constants::error_complexity>();
5785*58b9f456SAndroid Build Coastguard Worker            __state& __s = __states.back();
5786*58b9f456SAndroid Build Coastguard Worker            if (__s.__node_)
5787*58b9f456SAndroid Build Coastguard Worker                __s.__node_->__exec(__s);
5788*58b9f456SAndroid Build Coastguard Worker            switch (__s.__do_)
5789*58b9f456SAndroid Build Coastguard Worker            {
5790*58b9f456SAndroid Build Coastguard Worker            case __state::__end_state:
5791*58b9f456SAndroid Build Coastguard Worker                if ((__flags & regex_constants::match_not_null) &&
5792*58b9f456SAndroid Build Coastguard Worker                    __s.__current_ == __first)
5793*58b9f456SAndroid Build Coastguard Worker                {
5794*58b9f456SAndroid Build Coastguard Worker                  __states.pop_back();
5795*58b9f456SAndroid Build Coastguard Worker                  break;
5796*58b9f456SAndroid Build Coastguard Worker                }
5797*58b9f456SAndroid Build Coastguard Worker                if ((__flags & regex_constants::__full_match) &&
5798*58b9f456SAndroid Build Coastguard Worker                    __s.__current_ != __last)
5799*58b9f456SAndroid Build Coastguard Worker                {
5800*58b9f456SAndroid Build Coastguard Worker                  __states.pop_back();
5801*58b9f456SAndroid Build Coastguard Worker                  break;
5802*58b9f456SAndroid Build Coastguard Worker                }
5803*58b9f456SAndroid Build Coastguard Worker                if (!__matched || __highest_j < __s.__current_ - __s.__first_)
5804*58b9f456SAndroid Build Coastguard Worker                {
5805*58b9f456SAndroid Build Coastguard Worker                    __highest_j = __s.__current_ - __s.__first_;
5806*58b9f456SAndroid Build Coastguard Worker                    __best_state = __s;
5807*58b9f456SAndroid Build Coastguard Worker                }
5808*58b9f456SAndroid Build Coastguard Worker                __matched = true;
5809*58b9f456SAndroid Build Coastguard Worker                if (__highest_j == _Np)
5810*58b9f456SAndroid Build Coastguard Worker                    __states.clear();
5811*58b9f456SAndroid Build Coastguard Worker                else
5812*58b9f456SAndroid Build Coastguard Worker                    __states.pop_back();
5813*58b9f456SAndroid Build Coastguard Worker                break;
5814*58b9f456SAndroid Build Coastguard Worker            case __state::__accept_and_consume:
5815*58b9f456SAndroid Build Coastguard Worker                __j += __s.__current_ - __current;
5816*58b9f456SAndroid Build Coastguard Worker                __current = __s.__current_;
5817*58b9f456SAndroid Build Coastguard Worker                break;
5818*58b9f456SAndroid Build Coastguard Worker            case __state::__repeat:
5819*58b9f456SAndroid Build Coastguard Worker            case __state::__accept_but_not_consume:
5820*58b9f456SAndroid Build Coastguard Worker                break;
5821*58b9f456SAndroid Build Coastguard Worker            case __state::__split:
5822*58b9f456SAndroid Build Coastguard Worker                {
5823*58b9f456SAndroid Build Coastguard Worker                __state __snext = __s;
5824*58b9f456SAndroid Build Coastguard Worker                __s.__node_->__exec_split(true, __s);
5825*58b9f456SAndroid Build Coastguard Worker                __snext.__node_->__exec_split(false, __snext);
5826*58b9f456SAndroid Build Coastguard Worker                __states.push_back(_VSTD::move(__snext));
5827*58b9f456SAndroid Build Coastguard Worker                }
5828*58b9f456SAndroid Build Coastguard Worker                break;
5829*58b9f456SAndroid Build Coastguard Worker            case __state::__reject:
5830*58b9f456SAndroid Build Coastguard Worker                __states.pop_back();
5831*58b9f456SAndroid Build Coastguard Worker                break;
5832*58b9f456SAndroid Build Coastguard Worker            default:
5833*58b9f456SAndroid Build Coastguard Worker                __throw_regex_error<regex_constants::__re_err_unknown>();
5834*58b9f456SAndroid Build Coastguard Worker                break;
5835*58b9f456SAndroid Build Coastguard Worker            }
5836*58b9f456SAndroid Build Coastguard Worker        } while (!__states.empty());
5837*58b9f456SAndroid Build Coastguard Worker        if (__matched)
5838*58b9f456SAndroid Build Coastguard Worker        {
5839*58b9f456SAndroid Build Coastguard Worker            __m.__matches_[0].first = __first;
5840*58b9f456SAndroid Build Coastguard Worker            __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
5841*58b9f456SAndroid Build Coastguard Worker            __m.__matches_[0].matched = true;
5842*58b9f456SAndroid Build Coastguard Worker            for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
5843*58b9f456SAndroid Build Coastguard Worker                __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
5844*58b9f456SAndroid Build Coastguard Worker            return true;
5845*58b9f456SAndroid Build Coastguard Worker        }
5846*58b9f456SAndroid Build Coastguard Worker    }
5847*58b9f456SAndroid Build Coastguard Worker    return false;
5848*58b9f456SAndroid Build Coastguard Worker}
5849*58b9f456SAndroid Build Coastguard Worker
5850*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
5851*58b9f456SAndroid Build Coastguard Workertemplate <class _Allocator>
5852*58b9f456SAndroid Build Coastguard Workerbool
5853*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__match_at_start(
5854*58b9f456SAndroid Build Coastguard Worker        const _CharT* __first, const _CharT* __last,
5855*58b9f456SAndroid Build Coastguard Worker        match_results<const _CharT*, _Allocator>& __m,
5856*58b9f456SAndroid Build Coastguard Worker        regex_constants::match_flag_type __flags, bool __at_first) const
5857*58b9f456SAndroid Build Coastguard Worker{
5858*58b9f456SAndroid Build Coastguard Worker    if ((__flags_ & 0x1F0) == ECMAScript)
5859*58b9f456SAndroid Build Coastguard Worker        return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
5860*58b9f456SAndroid Build Coastguard Worker    if (mark_count() == 0)
5861*58b9f456SAndroid Build Coastguard Worker        return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
5862*58b9f456SAndroid Build Coastguard Worker    return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
5863*58b9f456SAndroid Build Coastguard Worker}
5864*58b9f456SAndroid Build Coastguard Worker
5865*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
5866*58b9f456SAndroid Build Coastguard Workertemplate <class _Allocator>
5867*58b9f456SAndroid Build Coastguard Workerbool
5868*58b9f456SAndroid Build Coastguard Workerbasic_regex<_CharT, _Traits>::__search(
5869*58b9f456SAndroid Build Coastguard Worker        const _CharT* __first, const _CharT* __last,
5870*58b9f456SAndroid Build Coastguard Worker        match_results<const _CharT*, _Allocator>& __m,
5871*58b9f456SAndroid Build Coastguard Worker        regex_constants::match_flag_type __flags) const
5872*58b9f456SAndroid Build Coastguard Worker{
5873*58b9f456SAndroid Build Coastguard Worker    __m.__init(1 + mark_count(), __first, __last,
5874*58b9f456SAndroid Build Coastguard Worker                                    __flags & regex_constants::__no_update_pos);
5875*58b9f456SAndroid Build Coastguard Worker    if (__match_at_start(__first, __last, __m, __flags,
5876*58b9f456SAndroid Build Coastguard Worker                                    !(__flags & regex_constants::__no_update_pos)))
5877*58b9f456SAndroid Build Coastguard Worker    {
5878*58b9f456SAndroid Build Coastguard Worker        __m.__prefix_.second = __m[0].first;
5879*58b9f456SAndroid Build Coastguard Worker        __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5880*58b9f456SAndroid Build Coastguard Worker        __m.__suffix_.first = __m[0].second;
5881*58b9f456SAndroid Build Coastguard Worker        __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5882*58b9f456SAndroid Build Coastguard Worker        return true;
5883*58b9f456SAndroid Build Coastguard Worker    }
5884*58b9f456SAndroid Build Coastguard Worker    if (__first != __last && !(__flags & regex_constants::match_continuous))
5885*58b9f456SAndroid Build Coastguard Worker    {
5886*58b9f456SAndroid Build Coastguard Worker        __flags |= regex_constants::match_prev_avail;
5887*58b9f456SAndroid Build Coastguard Worker        for (++__first; __first != __last; ++__first)
5888*58b9f456SAndroid Build Coastguard Worker        {
5889*58b9f456SAndroid Build Coastguard Worker            __m.__matches_.assign(__m.size(), __m.__unmatched_);
5890*58b9f456SAndroid Build Coastguard Worker            if (__match_at_start(__first, __last, __m, __flags, false))
5891*58b9f456SAndroid Build Coastguard Worker            {
5892*58b9f456SAndroid Build Coastguard Worker                __m.__prefix_.second = __m[0].first;
5893*58b9f456SAndroid Build Coastguard Worker                __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5894*58b9f456SAndroid Build Coastguard Worker                __m.__suffix_.first = __m[0].second;
5895*58b9f456SAndroid Build Coastguard Worker                __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5896*58b9f456SAndroid Build Coastguard Worker                return true;
5897*58b9f456SAndroid Build Coastguard Worker            }
5898*58b9f456SAndroid Build Coastguard Worker            __m.__matches_.assign(__m.size(), __m.__unmatched_);
5899*58b9f456SAndroid Build Coastguard Worker        }
5900*58b9f456SAndroid Build Coastguard Worker    }
5901*58b9f456SAndroid Build Coastguard Worker    __m.__matches_.clear();
5902*58b9f456SAndroid Build Coastguard Worker    return false;
5903*58b9f456SAndroid Build Coastguard Worker}
5904*58b9f456SAndroid Build Coastguard Worker
5905*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
5906*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5907*58b9f456SAndroid Build Coastguard Workerbool
5908*58b9f456SAndroid Build Coastguard Workerregex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5909*58b9f456SAndroid Build Coastguard Worker             match_results<_BidirectionalIterator, _Allocator>& __m,
5910*58b9f456SAndroid Build Coastguard Worker             const basic_regex<_CharT, _Traits>& __e,
5911*58b9f456SAndroid Build Coastguard Worker             regex_constants::match_flag_type __flags = regex_constants::match_default)
5912*58b9f456SAndroid Build Coastguard Worker{
5913*58b9f456SAndroid Build Coastguard Worker    int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
5914*58b9f456SAndroid Build Coastguard Worker    basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
5915*58b9f456SAndroid Build Coastguard Worker    match_results<const _CharT*> __mc;
5916*58b9f456SAndroid Build Coastguard Worker    bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
5917*58b9f456SAndroid Build Coastguard Worker    __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
5918*58b9f456SAndroid Build Coastguard Worker    return __r;
5919*58b9f456SAndroid Build Coastguard Worker}
5920*58b9f456SAndroid Build Coastguard Worker
5921*58b9f456SAndroid Build Coastguard Workertemplate <class _Iter, class _Allocator, class _CharT, class _Traits>
5922*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5923*58b9f456SAndroid Build Coastguard Workerbool
5924*58b9f456SAndroid Build Coastguard Workerregex_search(__wrap_iter<_Iter> __first,
5925*58b9f456SAndroid Build Coastguard Worker             __wrap_iter<_Iter> __last,
5926*58b9f456SAndroid Build Coastguard Worker             match_results<__wrap_iter<_Iter>, _Allocator>& __m,
5927*58b9f456SAndroid Build Coastguard Worker             const basic_regex<_CharT, _Traits>& __e,
5928*58b9f456SAndroid Build Coastguard Worker             regex_constants::match_flag_type __flags = regex_constants::match_default)
5929*58b9f456SAndroid Build Coastguard Worker{
5930*58b9f456SAndroid Build Coastguard Worker    match_results<const _CharT*> __mc;
5931*58b9f456SAndroid Build Coastguard Worker    bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
5932*58b9f456SAndroid Build Coastguard Worker    __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
5933*58b9f456SAndroid Build Coastguard Worker    return __r;
5934*58b9f456SAndroid Build Coastguard Worker}
5935*58b9f456SAndroid Build Coastguard Worker
5936*58b9f456SAndroid Build Coastguard Workertemplate <class _Allocator, class _CharT, class _Traits>
5937*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5938*58b9f456SAndroid Build Coastguard Workerbool
5939*58b9f456SAndroid Build Coastguard Workerregex_search(const _CharT* __first, const _CharT* __last,
5940*58b9f456SAndroid Build Coastguard Worker             match_results<const _CharT*, _Allocator>& __m,
5941*58b9f456SAndroid Build Coastguard Worker             const basic_regex<_CharT, _Traits>& __e,
5942*58b9f456SAndroid Build Coastguard Worker             regex_constants::match_flag_type __flags = regex_constants::match_default)
5943*58b9f456SAndroid Build Coastguard Worker{
5944*58b9f456SAndroid Build Coastguard Worker    return __e.__search(__first, __last, __m, __flags);
5945*58b9f456SAndroid Build Coastguard Worker}
5946*58b9f456SAndroid Build Coastguard Worker
5947*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
5948*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5949*58b9f456SAndroid Build Coastguard Workerbool
5950*58b9f456SAndroid Build Coastguard Workerregex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5951*58b9f456SAndroid Build Coastguard Worker             const basic_regex<_CharT, _Traits>& __e,
5952*58b9f456SAndroid Build Coastguard Worker             regex_constants::match_flag_type __flags = regex_constants::match_default)
5953*58b9f456SAndroid Build Coastguard Worker{
5954*58b9f456SAndroid Build Coastguard Worker    basic_string<_CharT> __s(__first, __last);
5955*58b9f456SAndroid Build Coastguard Worker    match_results<const _CharT*> __mc;
5956*58b9f456SAndroid Build Coastguard Worker    return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5957*58b9f456SAndroid Build Coastguard Worker}
5958*58b9f456SAndroid Build Coastguard Worker
5959*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
5960*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5961*58b9f456SAndroid Build Coastguard Workerbool
5962*58b9f456SAndroid Build Coastguard Workerregex_search(const _CharT* __first, const _CharT* __last,
5963*58b9f456SAndroid Build Coastguard Worker             const basic_regex<_CharT, _Traits>& __e,
5964*58b9f456SAndroid Build Coastguard Worker             regex_constants::match_flag_type __flags = regex_constants::match_default)
5965*58b9f456SAndroid Build Coastguard Worker{
5966*58b9f456SAndroid Build Coastguard Worker    match_results<const _CharT*> __mc;
5967*58b9f456SAndroid Build Coastguard Worker    return __e.__search(__first, __last, __mc, __flags);
5968*58b9f456SAndroid Build Coastguard Worker}
5969*58b9f456SAndroid Build Coastguard Worker
5970*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Allocator, class _Traits>
5971*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5972*58b9f456SAndroid Build Coastguard Workerbool
5973*58b9f456SAndroid Build Coastguard Workerregex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5974*58b9f456SAndroid Build Coastguard Worker             const basic_regex<_CharT, _Traits>& __e,
5975*58b9f456SAndroid Build Coastguard Worker             regex_constants::match_flag_type __flags = regex_constants::match_default)
5976*58b9f456SAndroid Build Coastguard Worker{
5977*58b9f456SAndroid Build Coastguard Worker    return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
5978*58b9f456SAndroid Build Coastguard Worker}
5979*58b9f456SAndroid Build Coastguard Worker
5980*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
5981*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5982*58b9f456SAndroid Build Coastguard Workerbool
5983*58b9f456SAndroid Build Coastguard Workerregex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5984*58b9f456SAndroid Build Coastguard Worker             regex_constants::match_flag_type __flags = regex_constants::match_default)
5985*58b9f456SAndroid Build Coastguard Worker{
5986*58b9f456SAndroid Build Coastguard Worker    match_results<const _CharT*> __m;
5987*58b9f456SAndroid Build Coastguard Worker    return _VSTD::regex_search(__str, __m, __e, __flags);
5988*58b9f456SAndroid Build Coastguard Worker}
5989*58b9f456SAndroid Build Coastguard Worker
5990*58b9f456SAndroid Build Coastguard Workertemplate <class _ST, class _SA, class _CharT, class _Traits>
5991*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
5992*58b9f456SAndroid Build Coastguard Workerbool
5993*58b9f456SAndroid Build Coastguard Workerregex_search(const basic_string<_CharT, _ST, _SA>& __s,
5994*58b9f456SAndroid Build Coastguard Worker             const basic_regex<_CharT, _Traits>& __e,
5995*58b9f456SAndroid Build Coastguard Worker             regex_constants::match_flag_type __flags = regex_constants::match_default)
5996*58b9f456SAndroid Build Coastguard Worker{
5997*58b9f456SAndroid Build Coastguard Worker    match_results<const _CharT*> __mc;
5998*58b9f456SAndroid Build Coastguard Worker    return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5999*58b9f456SAndroid Build Coastguard Worker}
6000*58b9f456SAndroid Build Coastguard Worker
6001*58b9f456SAndroid Build Coastguard Workertemplate <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6002*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
6003*58b9f456SAndroid Build Coastguard Workerbool
6004*58b9f456SAndroid Build Coastguard Workerregex_search(const basic_string<_CharT, _ST, _SA>& __s,
6005*58b9f456SAndroid Build Coastguard Worker             match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6006*58b9f456SAndroid Build Coastguard Worker             const basic_regex<_CharT, _Traits>& __e,
6007*58b9f456SAndroid Build Coastguard Worker             regex_constants::match_flag_type __flags = regex_constants::match_default)
6008*58b9f456SAndroid Build Coastguard Worker{
6009*58b9f456SAndroid Build Coastguard Worker    match_results<const _CharT*> __mc;
6010*58b9f456SAndroid Build Coastguard Worker    bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
6011*58b9f456SAndroid Build Coastguard Worker    __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
6012*58b9f456SAndroid Build Coastguard Worker    return __r;
6013*58b9f456SAndroid Build Coastguard Worker}
6014*58b9f456SAndroid Build Coastguard Worker
6015*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
6016*58b9f456SAndroid Build Coastguard Workertemplate <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
6017*58b9f456SAndroid Build Coastguard Workerbool
6018*58b9f456SAndroid Build Coastguard Workerregex_search(const basic_string<_Cp, _ST, _SA>&& __s,
6019*58b9f456SAndroid Build Coastguard Worker             match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
6020*58b9f456SAndroid Build Coastguard Worker             const basic_regex<_Cp, _Tp>& __e,
6021*58b9f456SAndroid Build Coastguard Worker             regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6022*58b9f456SAndroid Build Coastguard Worker#endif
6023*58b9f456SAndroid Build Coastguard Worker
6024*58b9f456SAndroid Build Coastguard Worker// regex_match
6025*58b9f456SAndroid Build Coastguard Worker
6026*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
6027*58b9f456SAndroid Build Coastguard Workerbool
6028*58b9f456SAndroid Build Coastguard Workerregex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6029*58b9f456SAndroid Build Coastguard Worker            match_results<_BidirectionalIterator, _Allocator>& __m,
6030*58b9f456SAndroid Build Coastguard Worker            const basic_regex<_CharT, _Traits>& __e,
6031*58b9f456SAndroid Build Coastguard Worker            regex_constants::match_flag_type __flags = regex_constants::match_default)
6032*58b9f456SAndroid Build Coastguard Worker{
6033*58b9f456SAndroid Build Coastguard Worker    bool __r = _VSTD::regex_search(
6034*58b9f456SAndroid Build Coastguard Worker        __first, __last, __m, __e,
6035*58b9f456SAndroid Build Coastguard Worker        __flags | regex_constants::match_continuous |
6036*58b9f456SAndroid Build Coastguard Worker        regex_constants::__full_match);
6037*58b9f456SAndroid Build Coastguard Worker    if (__r)
6038*58b9f456SAndroid Build Coastguard Worker    {
6039*58b9f456SAndroid Build Coastguard Worker        __r = !__m.suffix().matched;
6040*58b9f456SAndroid Build Coastguard Worker        if (!__r)
6041*58b9f456SAndroid Build Coastguard Worker            __m.__matches_.clear();
6042*58b9f456SAndroid Build Coastguard Worker    }
6043*58b9f456SAndroid Build Coastguard Worker    return __r;
6044*58b9f456SAndroid Build Coastguard Worker}
6045*58b9f456SAndroid Build Coastguard Worker
6046*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6047*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
6048*58b9f456SAndroid Build Coastguard Workerbool
6049*58b9f456SAndroid Build Coastguard Workerregex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6050*58b9f456SAndroid Build Coastguard Worker            const basic_regex<_CharT, _Traits>& __e,
6051*58b9f456SAndroid Build Coastguard Worker            regex_constants::match_flag_type __flags = regex_constants::match_default)
6052*58b9f456SAndroid Build Coastguard Worker{
6053*58b9f456SAndroid Build Coastguard Worker    match_results<_BidirectionalIterator> __m;
6054*58b9f456SAndroid Build Coastguard Worker    return _VSTD::regex_match(__first, __last, __m, __e, __flags);
6055*58b9f456SAndroid Build Coastguard Worker}
6056*58b9f456SAndroid Build Coastguard Worker
6057*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Allocator, class _Traits>
6058*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
6059*58b9f456SAndroid Build Coastguard Workerbool
6060*58b9f456SAndroid Build Coastguard Workerregex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6061*58b9f456SAndroid Build Coastguard Worker            const basic_regex<_CharT, _Traits>& __e,
6062*58b9f456SAndroid Build Coastguard Worker            regex_constants::match_flag_type __flags = regex_constants::match_default)
6063*58b9f456SAndroid Build Coastguard Worker{
6064*58b9f456SAndroid Build Coastguard Worker    return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
6065*58b9f456SAndroid Build Coastguard Worker}
6066*58b9f456SAndroid Build Coastguard Worker
6067*58b9f456SAndroid Build Coastguard Workertemplate <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6068*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
6069*58b9f456SAndroid Build Coastguard Workerbool
6070*58b9f456SAndroid Build Coastguard Workerregex_match(const basic_string<_CharT, _ST, _SA>& __s,
6071*58b9f456SAndroid Build Coastguard Worker            match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6072*58b9f456SAndroid Build Coastguard Worker            const basic_regex<_CharT, _Traits>& __e,
6073*58b9f456SAndroid Build Coastguard Worker            regex_constants::match_flag_type __flags = regex_constants::match_default)
6074*58b9f456SAndroid Build Coastguard Worker{
6075*58b9f456SAndroid Build Coastguard Worker    return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
6076*58b9f456SAndroid Build Coastguard Worker}
6077*58b9f456SAndroid Build Coastguard Worker
6078*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
6079*58b9f456SAndroid Build Coastguard Workertemplate <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6080*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
6081*58b9f456SAndroid Build Coastguard Workerbool
6082*58b9f456SAndroid Build Coastguard Workerregex_match(const basic_string<_CharT, _ST, _SA>&& __s,
6083*58b9f456SAndroid Build Coastguard Worker            match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6084*58b9f456SAndroid Build Coastguard Worker            const basic_regex<_CharT, _Traits>& __e,
6085*58b9f456SAndroid Build Coastguard Worker            regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6086*58b9f456SAndroid Build Coastguard Worker#endif
6087*58b9f456SAndroid Build Coastguard Worker
6088*58b9f456SAndroid Build Coastguard Workertemplate <class _CharT, class _Traits>
6089*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
6090*58b9f456SAndroid Build Coastguard Workerbool
6091*58b9f456SAndroid Build Coastguard Workerregex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6092*58b9f456SAndroid Build Coastguard Worker            regex_constants::match_flag_type __flags = regex_constants::match_default)
6093*58b9f456SAndroid Build Coastguard Worker{
6094*58b9f456SAndroid Build Coastguard Worker    return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
6095*58b9f456SAndroid Build Coastguard Worker}
6096*58b9f456SAndroid Build Coastguard Worker
6097*58b9f456SAndroid Build Coastguard Workertemplate <class _ST, class _SA, class _CharT, class _Traits>
6098*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
6099*58b9f456SAndroid Build Coastguard Workerbool
6100*58b9f456SAndroid Build Coastguard Workerregex_match(const basic_string<_CharT, _ST, _SA>& __s,
6101*58b9f456SAndroid Build Coastguard Worker            const basic_regex<_CharT, _Traits>& __e,
6102*58b9f456SAndroid Build Coastguard Worker            regex_constants::match_flag_type __flags = regex_constants::match_default)
6103*58b9f456SAndroid Build Coastguard Worker{
6104*58b9f456SAndroid Build Coastguard Worker    return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
6105*58b9f456SAndroid Build Coastguard Worker}
6106*58b9f456SAndroid Build Coastguard Worker
6107*58b9f456SAndroid Build Coastguard Worker// regex_iterator
6108*58b9f456SAndroid Build Coastguard Worker
6109*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator,
6110*58b9f456SAndroid Build Coastguard Worker          class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6111*58b9f456SAndroid Build Coastguard Worker          class _Traits = regex_traits<_CharT> >
6112*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS regex_iterator
6113*58b9f456SAndroid Build Coastguard Worker{
6114*58b9f456SAndroid Build Coastguard Workerpublic:
6115*58b9f456SAndroid Build Coastguard Worker    typedef basic_regex<_CharT, _Traits>          regex_type;
6116*58b9f456SAndroid Build Coastguard Worker    typedef match_results<_BidirectionalIterator> value_type;
6117*58b9f456SAndroid Build Coastguard Worker    typedef ptrdiff_t                             difference_type;
6118*58b9f456SAndroid Build Coastguard Worker    typedef const value_type*                     pointer;
6119*58b9f456SAndroid Build Coastguard Worker    typedef const value_type&                     reference;
6120*58b9f456SAndroid Build Coastguard Worker    typedef forward_iterator_tag                  iterator_category;
6121*58b9f456SAndroid Build Coastguard Worker
6122*58b9f456SAndroid Build Coastguard Workerprivate:
6123*58b9f456SAndroid Build Coastguard Worker    _BidirectionalIterator           __begin_;
6124*58b9f456SAndroid Build Coastguard Worker    _BidirectionalIterator           __end_;
6125*58b9f456SAndroid Build Coastguard Worker    const regex_type*                __pregex_;
6126*58b9f456SAndroid Build Coastguard Worker    regex_constants::match_flag_type __flags_;
6127*58b9f456SAndroid Build Coastguard Worker    value_type                       __match_;
6128*58b9f456SAndroid Build Coastguard Worker
6129*58b9f456SAndroid Build Coastguard Workerpublic:
6130*58b9f456SAndroid Build Coastguard Worker    regex_iterator();
6131*58b9f456SAndroid Build Coastguard Worker    regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6132*58b9f456SAndroid Build Coastguard Worker                   const regex_type& __re,
6133*58b9f456SAndroid Build Coastguard Worker                   regex_constants::match_flag_type __m
6134*58b9f456SAndroid Build Coastguard Worker                                              = regex_constants::match_default);
6135*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
6136*58b9f456SAndroid Build Coastguard Worker    regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6137*58b9f456SAndroid Build Coastguard Worker                   const regex_type&& __re,
6138*58b9f456SAndroid Build Coastguard Worker                   regex_constants::match_flag_type __m
6139*58b9f456SAndroid Build Coastguard Worker                                     = regex_constants::match_default) = delete;
6140*58b9f456SAndroid Build Coastguard Worker#endif
6141*58b9f456SAndroid Build Coastguard Worker
6142*58b9f456SAndroid Build Coastguard Worker    bool operator==(const regex_iterator& __x) const;
6143*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
6144*58b9f456SAndroid Build Coastguard Worker    bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
6145*58b9f456SAndroid Build Coastguard Worker
6146*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
6147*58b9f456SAndroid Build Coastguard Worker    reference operator*() const {return  __match_;}
6148*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
6149*58b9f456SAndroid Build Coastguard Worker    pointer operator->() const  {return &__match_;}
6150*58b9f456SAndroid Build Coastguard Worker
6151*58b9f456SAndroid Build Coastguard Worker    regex_iterator& operator++();
6152*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
6153*58b9f456SAndroid Build Coastguard Worker    regex_iterator operator++(int)
6154*58b9f456SAndroid Build Coastguard Worker    {
6155*58b9f456SAndroid Build Coastguard Worker        regex_iterator __t(*this);
6156*58b9f456SAndroid Build Coastguard Worker        ++(*this);
6157*58b9f456SAndroid Build Coastguard Worker        return __t;
6158*58b9f456SAndroid Build Coastguard Worker    }
6159*58b9f456SAndroid Build Coastguard Worker};
6160*58b9f456SAndroid Build Coastguard Worker
6161*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6162*58b9f456SAndroid Build Coastguard Workerregex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
6163*58b9f456SAndroid Build Coastguard Worker    : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
6164*58b9f456SAndroid Build Coastguard Worker{
6165*58b9f456SAndroid Build Coastguard Worker}
6166*58b9f456SAndroid Build Coastguard Worker
6167*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6168*58b9f456SAndroid Build Coastguard Workerregex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6169*58b9f456SAndroid Build Coastguard Worker    regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6170*58b9f456SAndroid Build Coastguard Worker                   const regex_type& __re, regex_constants::match_flag_type __m)
6171*58b9f456SAndroid Build Coastguard Worker    : __begin_(__a),
6172*58b9f456SAndroid Build Coastguard Worker      __end_(__b),
6173*58b9f456SAndroid Build Coastguard Worker      __pregex_(&__re),
6174*58b9f456SAndroid Build Coastguard Worker      __flags_(__m)
6175*58b9f456SAndroid Build Coastguard Worker{
6176*58b9f456SAndroid Build Coastguard Worker    _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
6177*58b9f456SAndroid Build Coastguard Worker}
6178*58b9f456SAndroid Build Coastguard Worker
6179*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6180*58b9f456SAndroid Build Coastguard Workerbool
6181*58b9f456SAndroid Build Coastguard Workerregex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6182*58b9f456SAndroid Build Coastguard Worker    operator==(const regex_iterator& __x) const
6183*58b9f456SAndroid Build Coastguard Worker{
6184*58b9f456SAndroid Build Coastguard Worker    if (__match_.empty() && __x.__match_.empty())
6185*58b9f456SAndroid Build Coastguard Worker        return true;
6186*58b9f456SAndroid Build Coastguard Worker    if (__match_.empty() || __x.__match_.empty())
6187*58b9f456SAndroid Build Coastguard Worker        return false;
6188*58b9f456SAndroid Build Coastguard Worker    return __begin_ == __x.__begin_       &&
6189*58b9f456SAndroid Build Coastguard Worker           __end_ == __x.__end_           &&
6190*58b9f456SAndroid Build Coastguard Worker           __pregex_ == __x.__pregex_     &&
6191*58b9f456SAndroid Build Coastguard Worker           __flags_ == __x.__flags_       &&
6192*58b9f456SAndroid Build Coastguard Worker           __match_[0] == __x.__match_[0];
6193*58b9f456SAndroid Build Coastguard Worker}
6194*58b9f456SAndroid Build Coastguard Worker
6195*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6196*58b9f456SAndroid Build Coastguard Workerregex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6197*58b9f456SAndroid Build Coastguard Workerregex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6198*58b9f456SAndroid Build Coastguard Worker{
6199*58b9f456SAndroid Build Coastguard Worker    __flags_ |= regex_constants::__no_update_pos;
6200*58b9f456SAndroid Build Coastguard Worker    _BidirectionalIterator __start = __match_[0].second;
6201*58b9f456SAndroid Build Coastguard Worker    if (__match_[0].first == __match_[0].second)
6202*58b9f456SAndroid Build Coastguard Worker    {
6203*58b9f456SAndroid Build Coastguard Worker        if (__start == __end_)
6204*58b9f456SAndroid Build Coastguard Worker        {
6205*58b9f456SAndroid Build Coastguard Worker            __match_ = value_type();
6206*58b9f456SAndroid Build Coastguard Worker            return *this;
6207*58b9f456SAndroid Build Coastguard Worker        }
6208*58b9f456SAndroid Build Coastguard Worker        else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
6209*58b9f456SAndroid Build Coastguard Worker                                    __flags_ | regex_constants::match_not_null |
6210*58b9f456SAndroid Build Coastguard Worker                                    regex_constants::match_continuous))
6211*58b9f456SAndroid Build Coastguard Worker            return *this;
6212*58b9f456SAndroid Build Coastguard Worker        else
6213*58b9f456SAndroid Build Coastguard Worker            ++__start;
6214*58b9f456SAndroid Build Coastguard Worker    }
6215*58b9f456SAndroid Build Coastguard Worker    __flags_ |= regex_constants::match_prev_avail;
6216*58b9f456SAndroid Build Coastguard Worker    if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
6217*58b9f456SAndroid Build Coastguard Worker        __match_ = value_type();
6218*58b9f456SAndroid Build Coastguard Worker    return *this;
6219*58b9f456SAndroid Build Coastguard Worker}
6220*58b9f456SAndroid Build Coastguard Worker
6221*58b9f456SAndroid Build Coastguard Workertypedef regex_iterator<const char*>             cregex_iterator;
6222*58b9f456SAndroid Build Coastguard Workertypedef regex_iterator<const wchar_t*>          wcregex_iterator;
6223*58b9f456SAndroid Build Coastguard Workertypedef regex_iterator<string::const_iterator>  sregex_iterator;
6224*58b9f456SAndroid Build Coastguard Workertypedef regex_iterator<wstring::const_iterator> wsregex_iterator;
6225*58b9f456SAndroid Build Coastguard Worker
6226*58b9f456SAndroid Build Coastguard Worker// regex_token_iterator
6227*58b9f456SAndroid Build Coastguard Worker
6228*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator,
6229*58b9f456SAndroid Build Coastguard Worker          class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6230*58b9f456SAndroid Build Coastguard Worker          class _Traits = regex_traits<_CharT> >
6231*58b9f456SAndroid Build Coastguard Workerclass _LIBCPP_TEMPLATE_VIS regex_token_iterator
6232*58b9f456SAndroid Build Coastguard Worker{
6233*58b9f456SAndroid Build Coastguard Workerpublic:
6234*58b9f456SAndroid Build Coastguard Worker    typedef basic_regex<_CharT, _Traits>      regex_type;
6235*58b9f456SAndroid Build Coastguard Worker    typedef sub_match<_BidirectionalIterator> value_type;
6236*58b9f456SAndroid Build Coastguard Worker    typedef ptrdiff_t                         difference_type;
6237*58b9f456SAndroid Build Coastguard Worker    typedef const value_type*                 pointer;
6238*58b9f456SAndroid Build Coastguard Worker    typedef const value_type&                 reference;
6239*58b9f456SAndroid Build Coastguard Worker    typedef forward_iterator_tag              iterator_category;
6240*58b9f456SAndroid Build Coastguard Worker
6241*58b9f456SAndroid Build Coastguard Workerprivate:
6242*58b9f456SAndroid Build Coastguard Worker    typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6243*58b9f456SAndroid Build Coastguard Worker
6244*58b9f456SAndroid Build Coastguard Worker    _Position         __position_;
6245*58b9f456SAndroid Build Coastguard Worker    const value_type* __result_;
6246*58b9f456SAndroid Build Coastguard Worker    value_type        __suffix_;
6247*58b9f456SAndroid Build Coastguard Worker    ptrdiff_t         __n_;
6248*58b9f456SAndroid Build Coastguard Worker    vector<int>       __subs_;
6249*58b9f456SAndroid Build Coastguard Worker
6250*58b9f456SAndroid Build Coastguard Workerpublic:
6251*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator();
6252*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6253*58b9f456SAndroid Build Coastguard Worker                         const regex_type& __re, int __submatch = 0,
6254*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type __m =
6255*58b9f456SAndroid Build Coastguard Worker                                                regex_constants::match_default);
6256*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
6257*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6258*58b9f456SAndroid Build Coastguard Worker                         const regex_type&& __re, int __submatch = 0,
6259*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type __m =
6260*58b9f456SAndroid Build Coastguard Worker                                       regex_constants::match_default) = delete;
6261*58b9f456SAndroid Build Coastguard Worker#endif
6262*58b9f456SAndroid Build Coastguard Worker
6263*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6264*58b9f456SAndroid Build Coastguard Worker                         const regex_type& __re, const vector<int>& __submatches,
6265*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type __m =
6266*58b9f456SAndroid Build Coastguard Worker                                                regex_constants::match_default);
6267*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
6268*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6269*58b9f456SAndroid Build Coastguard Worker                         const regex_type&& __re, const vector<int>& __submatches,
6270*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type __m =
6271*58b9f456SAndroid Build Coastguard Worker                                     regex_constants::match_default) = delete;
6272*58b9f456SAndroid Build Coastguard Worker#endif
6273*58b9f456SAndroid Build Coastguard Worker
6274*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
6275*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6276*58b9f456SAndroid Build Coastguard Worker                         const regex_type& __re,
6277*58b9f456SAndroid Build Coastguard Worker                         initializer_list<int> __submatches,
6278*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type __m =
6279*58b9f456SAndroid Build Coastguard Worker                                                regex_constants::match_default);
6280*58b9f456SAndroid Build Coastguard Worker
6281*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
6282*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6283*58b9f456SAndroid Build Coastguard Worker                         const regex_type&& __re,
6284*58b9f456SAndroid Build Coastguard Worker                         initializer_list<int> __submatches,
6285*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type __m =
6286*58b9f456SAndroid Build Coastguard Worker                                       regex_constants::match_default) = delete;
6287*58b9f456SAndroid Build Coastguard Worker#endif
6288*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_CXX03_LANG
6289*58b9f456SAndroid Build Coastguard Worker    template <size_t _Np>
6290*58b9f456SAndroid Build Coastguard Worker        regex_token_iterator(_BidirectionalIterator __a,
6291*58b9f456SAndroid Build Coastguard Worker                             _BidirectionalIterator __b,
6292*58b9f456SAndroid Build Coastguard Worker                             const regex_type& __re,
6293*58b9f456SAndroid Build Coastguard Worker                             const int (&__submatches)[_Np],
6294*58b9f456SAndroid Build Coastguard Worker                             regex_constants::match_flag_type __m =
6295*58b9f456SAndroid Build Coastguard Worker                                                regex_constants::match_default);
6296*58b9f456SAndroid Build Coastguard Worker#if _LIBCPP_STD_VER > 11
6297*58b9f456SAndroid Build Coastguard Worker    template <std::size_t _Np>
6298*58b9f456SAndroid Build Coastguard Worker        regex_token_iterator(_BidirectionalIterator __a,
6299*58b9f456SAndroid Build Coastguard Worker                             _BidirectionalIterator __b,
6300*58b9f456SAndroid Build Coastguard Worker                             const regex_type&& __re,
6301*58b9f456SAndroid Build Coastguard Worker                             const int (&__submatches)[_Np],
6302*58b9f456SAndroid Build Coastguard Worker                             regex_constants::match_flag_type __m =
6303*58b9f456SAndroid Build Coastguard Worker                                      regex_constants::match_default) = delete;
6304*58b9f456SAndroid Build Coastguard Worker#endif
6305*58b9f456SAndroid Build Coastguard Worker
6306*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(const regex_token_iterator&);
6307*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator& operator=(const regex_token_iterator&);
6308*58b9f456SAndroid Build Coastguard Worker
6309*58b9f456SAndroid Build Coastguard Worker    bool operator==(const regex_token_iterator& __x) const;
6310*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
6311*58b9f456SAndroid Build Coastguard Worker    bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
6312*58b9f456SAndroid Build Coastguard Worker
6313*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
6314*58b9f456SAndroid Build Coastguard Worker    const value_type& operator*() const {return *__result_;}
6315*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
6316*58b9f456SAndroid Build Coastguard Worker    const value_type* operator->() const {return __result_;}
6317*58b9f456SAndroid Build Coastguard Worker
6318*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator& operator++();
6319*58b9f456SAndroid Build Coastguard Worker    _LIBCPP_INLINE_VISIBILITY
6320*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator operator++(int)
6321*58b9f456SAndroid Build Coastguard Worker    {
6322*58b9f456SAndroid Build Coastguard Worker        regex_token_iterator __t(*this);
6323*58b9f456SAndroid Build Coastguard Worker        ++(*this);
6324*58b9f456SAndroid Build Coastguard Worker        return __t;
6325*58b9f456SAndroid Build Coastguard Worker    }
6326*58b9f456SAndroid Build Coastguard Worker
6327*58b9f456SAndroid Build Coastguard Workerprivate:
6328*58b9f456SAndroid Build Coastguard Worker    void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
6329*58b9f456SAndroid Build Coastguard Worker    void __establish_result () {
6330*58b9f456SAndroid Build Coastguard Worker        if (__subs_[__n_] == -1)
6331*58b9f456SAndroid Build Coastguard Worker            __result_ = &__position_->prefix();
6332*58b9f456SAndroid Build Coastguard Worker        else
6333*58b9f456SAndroid Build Coastguard Worker            __result_ = &(*__position_)[__subs_[__n_]];
6334*58b9f456SAndroid Build Coastguard Worker        }
6335*58b9f456SAndroid Build Coastguard Worker};
6336*58b9f456SAndroid Build Coastguard Worker
6337*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6338*58b9f456SAndroid Build Coastguard Workerregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6339*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator()
6340*58b9f456SAndroid Build Coastguard Worker    : __result_(nullptr),
6341*58b9f456SAndroid Build Coastguard Worker      __suffix_(),
6342*58b9f456SAndroid Build Coastguard Worker      __n_(0)
6343*58b9f456SAndroid Build Coastguard Worker{
6344*58b9f456SAndroid Build Coastguard Worker}
6345*58b9f456SAndroid Build Coastguard Worker
6346*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6347*58b9f456SAndroid Build Coastguard Workervoid
6348*58b9f456SAndroid Build Coastguard Workerregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6349*58b9f456SAndroid Build Coastguard Worker    __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6350*58b9f456SAndroid Build Coastguard Worker{
6351*58b9f456SAndroid Build Coastguard Worker    if (__position_ != _Position())
6352*58b9f456SAndroid Build Coastguard Worker        __establish_result ();
6353*58b9f456SAndroid Build Coastguard Worker    else if (__subs_[__n_] == -1)
6354*58b9f456SAndroid Build Coastguard Worker    {
6355*58b9f456SAndroid Build Coastguard Worker        __suffix_.matched = true;
6356*58b9f456SAndroid Build Coastguard Worker        __suffix_.first = __a;
6357*58b9f456SAndroid Build Coastguard Worker        __suffix_.second = __b;
6358*58b9f456SAndroid Build Coastguard Worker        __result_ = &__suffix_;
6359*58b9f456SAndroid Build Coastguard Worker    }
6360*58b9f456SAndroid Build Coastguard Worker    else
6361*58b9f456SAndroid Build Coastguard Worker        __result_ = nullptr;
6362*58b9f456SAndroid Build Coastguard Worker}
6363*58b9f456SAndroid Build Coastguard Worker
6364*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6365*58b9f456SAndroid Build Coastguard Workerregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6366*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6367*58b9f456SAndroid Build Coastguard Worker                         const regex_type& __re, int __submatch,
6368*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type __m)
6369*58b9f456SAndroid Build Coastguard Worker    : __position_(__a, __b, __re, __m),
6370*58b9f456SAndroid Build Coastguard Worker      __n_(0),
6371*58b9f456SAndroid Build Coastguard Worker      __subs_(1, __submatch)
6372*58b9f456SAndroid Build Coastguard Worker{
6373*58b9f456SAndroid Build Coastguard Worker    __init(__a, __b);
6374*58b9f456SAndroid Build Coastguard Worker}
6375*58b9f456SAndroid Build Coastguard Worker
6376*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6377*58b9f456SAndroid Build Coastguard Workerregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6378*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6379*58b9f456SAndroid Build Coastguard Worker                         const regex_type& __re, const vector<int>& __submatches,
6380*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type __m)
6381*58b9f456SAndroid Build Coastguard Worker    : __position_(__a, __b, __re, __m),
6382*58b9f456SAndroid Build Coastguard Worker      __n_(0),
6383*58b9f456SAndroid Build Coastguard Worker      __subs_(__submatches)
6384*58b9f456SAndroid Build Coastguard Worker{
6385*58b9f456SAndroid Build Coastguard Worker    __init(__a, __b);
6386*58b9f456SAndroid Build Coastguard Worker}
6387*58b9f456SAndroid Build Coastguard Worker
6388*58b9f456SAndroid Build Coastguard Worker#ifndef _LIBCPP_CXX03_LANG
6389*58b9f456SAndroid Build Coastguard Worker
6390*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6391*58b9f456SAndroid Build Coastguard Workerregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6392*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6393*58b9f456SAndroid Build Coastguard Worker                         const regex_type& __re,
6394*58b9f456SAndroid Build Coastguard Worker                         initializer_list<int> __submatches,
6395*58b9f456SAndroid Build Coastguard Worker                         regex_constants::match_flag_type __m)
6396*58b9f456SAndroid Build Coastguard Worker    : __position_(__a, __b, __re, __m),
6397*58b9f456SAndroid Build Coastguard Worker      __n_(0),
6398*58b9f456SAndroid Build Coastguard Worker      __subs_(__submatches)
6399*58b9f456SAndroid Build Coastguard Worker{
6400*58b9f456SAndroid Build Coastguard Worker    __init(__a, __b);
6401*58b9f456SAndroid Build Coastguard Worker}
6402*58b9f456SAndroid Build Coastguard Worker
6403*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_CXX03_LANG
6404*58b9f456SAndroid Build Coastguard Worker
6405*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6406*58b9f456SAndroid Build Coastguard Workertemplate <size_t _Np>
6407*58b9f456SAndroid Build Coastguard Workerregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6408*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6409*58b9f456SAndroid Build Coastguard Worker                             const regex_type& __re,
6410*58b9f456SAndroid Build Coastguard Worker                             const int (&__submatches)[_Np],
6411*58b9f456SAndroid Build Coastguard Worker                             regex_constants::match_flag_type __m)
6412*58b9f456SAndroid Build Coastguard Worker    : __position_(__a, __b, __re, __m),
6413*58b9f456SAndroid Build Coastguard Worker      __n_(0),
6414*58b9f456SAndroid Build Coastguard Worker      __subs_(__submatches, __submatches + _Np)
6415*58b9f456SAndroid Build Coastguard Worker{
6416*58b9f456SAndroid Build Coastguard Worker    __init(__a, __b);
6417*58b9f456SAndroid Build Coastguard Worker}
6418*58b9f456SAndroid Build Coastguard Worker
6419*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6420*58b9f456SAndroid Build Coastguard Workerregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6421*58b9f456SAndroid Build Coastguard Worker    regex_token_iterator(const regex_token_iterator& __x)
6422*58b9f456SAndroid Build Coastguard Worker    : __position_(__x.__position_),
6423*58b9f456SAndroid Build Coastguard Worker      __result_(__x.__result_),
6424*58b9f456SAndroid Build Coastguard Worker      __suffix_(__x.__suffix_),
6425*58b9f456SAndroid Build Coastguard Worker      __n_(__x.__n_),
6426*58b9f456SAndroid Build Coastguard Worker      __subs_(__x.__subs_)
6427*58b9f456SAndroid Build Coastguard Worker{
6428*58b9f456SAndroid Build Coastguard Worker    if (__x.__result_ == &__x.__suffix_)
6429*58b9f456SAndroid Build Coastguard Worker        __result_ = &__suffix_;
6430*58b9f456SAndroid Build Coastguard Worker    else if ( __result_ != nullptr )
6431*58b9f456SAndroid Build Coastguard Worker        __establish_result ();
6432*58b9f456SAndroid Build Coastguard Worker}
6433*58b9f456SAndroid Build Coastguard Worker
6434*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6435*58b9f456SAndroid Build Coastguard Workerregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6436*58b9f456SAndroid Build Coastguard Workerregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6437*58b9f456SAndroid Build Coastguard Worker    operator=(const regex_token_iterator& __x)
6438*58b9f456SAndroid Build Coastguard Worker{
6439*58b9f456SAndroid Build Coastguard Worker    if (this != &__x)
6440*58b9f456SAndroid Build Coastguard Worker    {
6441*58b9f456SAndroid Build Coastguard Worker        __position_ = __x.__position_;
6442*58b9f456SAndroid Build Coastguard Worker        if (__x.__result_ == &__x.__suffix_)
6443*58b9f456SAndroid Build Coastguard Worker            __result_ = &__suffix_;
6444*58b9f456SAndroid Build Coastguard Worker        else
6445*58b9f456SAndroid Build Coastguard Worker            __result_ = __x.__result_;
6446*58b9f456SAndroid Build Coastguard Worker        __suffix_ = __x.__suffix_;
6447*58b9f456SAndroid Build Coastguard Worker        __n_ = __x.__n_;
6448*58b9f456SAndroid Build Coastguard Worker        __subs_ = __x.__subs_;
6449*58b9f456SAndroid Build Coastguard Worker
6450*58b9f456SAndroid Build Coastguard Worker        if ( __result_ != nullptr && __result_ != &__suffix_ )
6451*58b9f456SAndroid Build Coastguard Worker            __establish_result();
6452*58b9f456SAndroid Build Coastguard Worker    }
6453*58b9f456SAndroid Build Coastguard Worker    return *this;
6454*58b9f456SAndroid Build Coastguard Worker}
6455*58b9f456SAndroid Build Coastguard Worker
6456*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6457*58b9f456SAndroid Build Coastguard Workerbool
6458*58b9f456SAndroid Build Coastguard Workerregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6459*58b9f456SAndroid Build Coastguard Worker    operator==(const regex_token_iterator& __x) const
6460*58b9f456SAndroid Build Coastguard Worker{
6461*58b9f456SAndroid Build Coastguard Worker    if (__result_ == nullptr && __x.__result_ == nullptr)
6462*58b9f456SAndroid Build Coastguard Worker        return true;
6463*58b9f456SAndroid Build Coastguard Worker    if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6464*58b9f456SAndroid Build Coastguard Worker            __suffix_ == __x.__suffix_)
6465*58b9f456SAndroid Build Coastguard Worker        return true;
6466*58b9f456SAndroid Build Coastguard Worker    if (__result_ == nullptr || __x.__result_ == nullptr)
6467*58b9f456SAndroid Build Coastguard Worker        return false;
6468*58b9f456SAndroid Build Coastguard Worker    if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6469*58b9f456SAndroid Build Coastguard Worker        return false;
6470*58b9f456SAndroid Build Coastguard Worker    return __position_ == __x.__position_ && __n_ == __x.__n_ &&
6471*58b9f456SAndroid Build Coastguard Worker           __subs_ == __x.__subs_;
6472*58b9f456SAndroid Build Coastguard Worker}
6473*58b9f456SAndroid Build Coastguard Worker
6474*58b9f456SAndroid Build Coastguard Workertemplate <class _BidirectionalIterator, class _CharT, class _Traits>
6475*58b9f456SAndroid Build Coastguard Workerregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6476*58b9f456SAndroid Build Coastguard Workerregex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6477*58b9f456SAndroid Build Coastguard Worker{
6478*58b9f456SAndroid Build Coastguard Worker    _Position __prev = __position_;
6479*58b9f456SAndroid Build Coastguard Worker    if (__result_ == &__suffix_)
6480*58b9f456SAndroid Build Coastguard Worker        __result_ = nullptr;
6481*58b9f456SAndroid Build Coastguard Worker    else if (static_cast<size_t>(__n_ + 1) < __subs_.size())
6482*58b9f456SAndroid Build Coastguard Worker    {
6483*58b9f456SAndroid Build Coastguard Worker        ++__n_;
6484*58b9f456SAndroid Build Coastguard Worker        __establish_result();
6485*58b9f456SAndroid Build Coastguard Worker    }
6486*58b9f456SAndroid Build Coastguard Worker    else
6487*58b9f456SAndroid Build Coastguard Worker    {
6488*58b9f456SAndroid Build Coastguard Worker        __n_ = 0;
6489*58b9f456SAndroid Build Coastguard Worker        ++__position_;
6490*58b9f456SAndroid Build Coastguard Worker        if (__position_ != _Position())
6491*58b9f456SAndroid Build Coastguard Worker            __establish_result();
6492*58b9f456SAndroid Build Coastguard Worker        else
6493*58b9f456SAndroid Build Coastguard Worker        {
6494*58b9f456SAndroid Build Coastguard Worker            if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
6495*58b9f456SAndroid Build Coastguard Worker                && __prev->suffix().length() != 0)
6496*58b9f456SAndroid Build Coastguard Worker            {
6497*58b9f456SAndroid Build Coastguard Worker                __suffix_.matched = true;
6498*58b9f456SAndroid Build Coastguard Worker                __suffix_.first = __prev->suffix().first;
6499*58b9f456SAndroid Build Coastguard Worker                __suffix_.second = __prev->suffix().second;
6500*58b9f456SAndroid Build Coastguard Worker                __result_ = &__suffix_;
6501*58b9f456SAndroid Build Coastguard Worker            }
6502*58b9f456SAndroid Build Coastguard Worker            else
6503*58b9f456SAndroid Build Coastguard Worker                __result_ = nullptr;
6504*58b9f456SAndroid Build Coastguard Worker        }
6505*58b9f456SAndroid Build Coastguard Worker    }
6506*58b9f456SAndroid Build Coastguard Worker    return *this;
6507*58b9f456SAndroid Build Coastguard Worker}
6508*58b9f456SAndroid Build Coastguard Worker
6509*58b9f456SAndroid Build Coastguard Workertypedef regex_token_iterator<const char*>             cregex_token_iterator;
6510*58b9f456SAndroid Build Coastguard Workertypedef regex_token_iterator<const wchar_t*>          wcregex_token_iterator;
6511*58b9f456SAndroid Build Coastguard Workertypedef regex_token_iterator<string::const_iterator>  sregex_token_iterator;
6512*58b9f456SAndroid Build Coastguard Workertypedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
6513*58b9f456SAndroid Build Coastguard Worker
6514*58b9f456SAndroid Build Coastguard Worker// regex_replace
6515*58b9f456SAndroid Build Coastguard Worker
6516*58b9f456SAndroid Build Coastguard Workertemplate <class _OutputIterator, class _BidirectionalIterator,
6517*58b9f456SAndroid Build Coastguard Worker          class _Traits, class _CharT>
6518*58b9f456SAndroid Build Coastguard Worker_OutputIterator
6519*58b9f456SAndroid Build Coastguard Workerregex_replace(_OutputIterator __output_iter,
6520*58b9f456SAndroid Build Coastguard Worker              _BidirectionalIterator __first, _BidirectionalIterator __last,
6521*58b9f456SAndroid Build Coastguard Worker              const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6522*58b9f456SAndroid Build Coastguard Worker              regex_constants::match_flag_type __flags = regex_constants::match_default)
6523*58b9f456SAndroid Build Coastguard Worker{
6524*58b9f456SAndroid Build Coastguard Worker    typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6525*58b9f456SAndroid Build Coastguard Worker    _Iter __i(__first, __last, __e, __flags);
6526*58b9f456SAndroid Build Coastguard Worker    _Iter __eof;
6527*58b9f456SAndroid Build Coastguard Worker    if (__i == __eof)
6528*58b9f456SAndroid Build Coastguard Worker    {
6529*58b9f456SAndroid Build Coastguard Worker        if (!(__flags & regex_constants::format_no_copy))
6530*58b9f456SAndroid Build Coastguard Worker            __output_iter = _VSTD::copy(__first, __last, __output_iter);
6531*58b9f456SAndroid Build Coastguard Worker    }
6532*58b9f456SAndroid Build Coastguard Worker    else
6533*58b9f456SAndroid Build Coastguard Worker    {
6534*58b9f456SAndroid Build Coastguard Worker        sub_match<_BidirectionalIterator> __lm;
6535*58b9f456SAndroid Build Coastguard Worker        for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6536*58b9f456SAndroid Build Coastguard Worker        {
6537*58b9f456SAndroid Build Coastguard Worker            if (!(__flags & regex_constants::format_no_copy))
6538*58b9f456SAndroid Build Coastguard Worker                __output_iter = _VSTD::copy(__i->prefix().first, __i->prefix().second, __output_iter);
6539*58b9f456SAndroid Build Coastguard Worker            __output_iter = __i->format(__output_iter, __fmt, __fmt + __len, __flags);
6540*58b9f456SAndroid Build Coastguard Worker            __lm = __i->suffix();
6541*58b9f456SAndroid Build Coastguard Worker            if (__flags & regex_constants::format_first_only)
6542*58b9f456SAndroid Build Coastguard Worker                break;
6543*58b9f456SAndroid Build Coastguard Worker        }
6544*58b9f456SAndroid Build Coastguard Worker        if (!(__flags & regex_constants::format_no_copy))
6545*58b9f456SAndroid Build Coastguard Worker            __output_iter = _VSTD::copy(__lm.first, __lm.second, __output_iter);
6546*58b9f456SAndroid Build Coastguard Worker    }
6547*58b9f456SAndroid Build Coastguard Worker    return __output_iter;
6548*58b9f456SAndroid Build Coastguard Worker}
6549*58b9f456SAndroid Build Coastguard Worker
6550*58b9f456SAndroid Build Coastguard Workertemplate <class _OutputIterator, class _BidirectionalIterator,
6551*58b9f456SAndroid Build Coastguard Worker          class _Traits, class _CharT, class _ST, class _SA>
6552*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
6553*58b9f456SAndroid Build Coastguard Worker_OutputIterator
6554*58b9f456SAndroid Build Coastguard Workerregex_replace(_OutputIterator __output_iter,
6555*58b9f456SAndroid Build Coastguard Worker              _BidirectionalIterator __first, _BidirectionalIterator __last,
6556*58b9f456SAndroid Build Coastguard Worker              const basic_regex<_CharT, _Traits>& __e,
6557*58b9f456SAndroid Build Coastguard Worker              const basic_string<_CharT, _ST, _SA>& __fmt,
6558*58b9f456SAndroid Build Coastguard Worker              regex_constants::match_flag_type __flags = regex_constants::match_default)
6559*58b9f456SAndroid Build Coastguard Worker{
6560*58b9f456SAndroid Build Coastguard Worker    return _VSTD::regex_replace(__output_iter, __first, __last, __e, __fmt.c_str(), __flags);
6561*58b9f456SAndroid Build Coastguard Worker}
6562*58b9f456SAndroid Build Coastguard Worker
6563*58b9f456SAndroid Build Coastguard Workertemplate <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6564*58b9f456SAndroid Build Coastguard Worker          class _FSA>
6565*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
6566*58b9f456SAndroid Build Coastguard Workerbasic_string<_CharT, _ST, _SA>
6567*58b9f456SAndroid Build Coastguard Workerregex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6568*58b9f456SAndroid Build Coastguard Worker              const basic_regex<_CharT, _Traits>& __e,
6569*58b9f456SAndroid Build Coastguard Worker              const basic_string<_CharT, _FST, _FSA>& __fmt,
6570*58b9f456SAndroid Build Coastguard Worker              regex_constants::match_flag_type __flags = regex_constants::match_default)
6571*58b9f456SAndroid Build Coastguard Worker{
6572*58b9f456SAndroid Build Coastguard Worker    basic_string<_CharT, _ST, _SA> __r;
6573*58b9f456SAndroid Build Coastguard Worker    _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
6574*58b9f456SAndroid Build Coastguard Worker                        __fmt.c_str(), __flags);
6575*58b9f456SAndroid Build Coastguard Worker    return __r;
6576*58b9f456SAndroid Build Coastguard Worker}
6577*58b9f456SAndroid Build Coastguard Worker
6578*58b9f456SAndroid Build Coastguard Workertemplate <class _Traits, class _CharT, class _ST, class _SA>
6579*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
6580*58b9f456SAndroid Build Coastguard Workerbasic_string<_CharT, _ST, _SA>
6581*58b9f456SAndroid Build Coastguard Workerregex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6582*58b9f456SAndroid Build Coastguard Worker              const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6583*58b9f456SAndroid Build Coastguard Worker              regex_constants::match_flag_type __flags = regex_constants::match_default)
6584*58b9f456SAndroid Build Coastguard Worker{
6585*58b9f456SAndroid Build Coastguard Worker    basic_string<_CharT, _ST, _SA> __r;
6586*58b9f456SAndroid Build Coastguard Worker    _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
6587*58b9f456SAndroid Build Coastguard Worker                        __fmt, __flags);
6588*58b9f456SAndroid Build Coastguard Worker    return __r;
6589*58b9f456SAndroid Build Coastguard Worker}
6590*58b9f456SAndroid Build Coastguard Worker
6591*58b9f456SAndroid Build Coastguard Workertemplate <class _Traits, class _CharT, class _ST, class _SA>
6592*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
6593*58b9f456SAndroid Build Coastguard Workerbasic_string<_CharT>
6594*58b9f456SAndroid Build Coastguard Workerregex_replace(const _CharT* __s,
6595*58b9f456SAndroid Build Coastguard Worker              const basic_regex<_CharT, _Traits>& __e,
6596*58b9f456SAndroid Build Coastguard Worker              const basic_string<_CharT, _ST, _SA>& __fmt,
6597*58b9f456SAndroid Build Coastguard Worker              regex_constants::match_flag_type __flags = regex_constants::match_default)
6598*58b9f456SAndroid Build Coastguard Worker{
6599*58b9f456SAndroid Build Coastguard Worker    basic_string<_CharT> __r;
6600*58b9f456SAndroid Build Coastguard Worker    _VSTD::regex_replace(back_inserter(__r), __s,
6601*58b9f456SAndroid Build Coastguard Worker                        __s + char_traits<_CharT>::length(__s), __e,
6602*58b9f456SAndroid Build Coastguard Worker                        __fmt.c_str(), __flags);
6603*58b9f456SAndroid Build Coastguard Worker    return __r;
6604*58b9f456SAndroid Build Coastguard Worker}
6605*58b9f456SAndroid Build Coastguard Worker
6606*58b9f456SAndroid Build Coastguard Workertemplate <class _Traits, class _CharT>
6607*58b9f456SAndroid Build Coastguard Workerinline _LIBCPP_INLINE_VISIBILITY
6608*58b9f456SAndroid Build Coastguard Workerbasic_string<_CharT>
6609*58b9f456SAndroid Build Coastguard Workerregex_replace(const _CharT* __s,
6610*58b9f456SAndroid Build Coastguard Worker              const basic_regex<_CharT, _Traits>& __e,
6611*58b9f456SAndroid Build Coastguard Worker              const _CharT* __fmt,
6612*58b9f456SAndroid Build Coastguard Worker              regex_constants::match_flag_type __flags = regex_constants::match_default)
6613*58b9f456SAndroid Build Coastguard Worker{
6614*58b9f456SAndroid Build Coastguard Worker    basic_string<_CharT> __r;
6615*58b9f456SAndroid Build Coastguard Worker    _VSTD::regex_replace(back_inserter(__r), __s,
6616*58b9f456SAndroid Build Coastguard Worker                        __s + char_traits<_CharT>::length(__s), __e,
6617*58b9f456SAndroid Build Coastguard Worker                        __fmt, __flags);
6618*58b9f456SAndroid Build Coastguard Worker    return __r;
6619*58b9f456SAndroid Build Coastguard Worker}
6620*58b9f456SAndroid Build Coastguard Worker
6621*58b9f456SAndroid Build Coastguard Worker_LIBCPP_END_NAMESPACE_STD
6622*58b9f456SAndroid Build Coastguard Worker
6623*58b9f456SAndroid Build Coastguard Worker_LIBCPP_POP_MACROS
6624*58b9f456SAndroid Build Coastguard Worker
6625*58b9f456SAndroid Build Coastguard Worker#endif  // _LIBCPP_REGEX
6626