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