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