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