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