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