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