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