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