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