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