1 // class template regex -*- C++ -*- 2 3 // Copyright (C) 2010-2014 Free Software Foundation, Inc. 4 // 5 // This file is part of the GNU ISO C++ Library. This library is free 6 // software; you can redistribute it and/or modify it under the 7 // terms of the GNU General Public License as published by the 8 // Free Software Foundation; either version 3, or (at your option) 9 // any later version. 10 11 // This library is distributed in the hope that it will be useful, 12 // but WITHOUT ANY WARRANTY; without even the implied warranty of 13 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 // GNU General Public License for more details. 15 16 // Under Section 7 of GPL version 3, you are granted additional 17 // permissions described in the GCC Runtime Library Exception, version 18 // 3.1, as published by the Free Software Foundation. 19 20 // You should have received a copy of the GNU General Public License and 21 // a copy of the GCC Runtime Library Exception along with this program; 22 // see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 23 // <http://www.gnu.org/licenses/>. 24 25 /** 26 * @file bits/regex.h 27 * This is an internal header file, included by other library headers. 28 * Do not attempt to use it directly. @headername{regex} 29 */ 30 31 namespace std _GLIBCXX_VISIBILITY(default) 32 { 33 _GLIBCXX_BEGIN_NAMESPACE_VERSION 34 template<typename, typename> 35 class basic_regex; 36 37 template<typename, typename> 38 class match_results; 39 40 _GLIBCXX_END_NAMESPACE_VERSION 41 42 namespace __detail 43 { 44 _GLIBCXX_BEGIN_NAMESPACE_VERSION 45 46 enum class _RegexExecutorPolicy : int 47 { _S_auto, _S_alternate }; 48 49 template<typename _BiIter, typename _Alloc, 50 typename _CharT, typename _TraitsT, 51 _RegexExecutorPolicy __policy, 52 bool __match_mode> 53 bool 54 __regex_algo_impl(_BiIter __s, 55 _BiIter __e, 56 match_results<_BiIter, _Alloc>& __m, 57 const basic_regex<_CharT, _TraitsT>& __re, 58 regex_constants::match_flag_type __flags); 59 60 template<typename, typename, typename, bool> 61 class _Executor; 62 63 template<typename _TraitsT> 64 inline std::shared_ptr<_NFA<_TraitsT>> 65 __compile_nfa(const typename _TraitsT::char_type* __first, 66 const typename _TraitsT::char_type* __last, 67 const _TraitsT& __traits, 68 regex_constants::syntax_option_type __flags); 69 70 _GLIBCXX_END_NAMESPACE_VERSION 71 } 72 73 _GLIBCXX_BEGIN_NAMESPACE_VERSION 74 75 /** 76 * @addtogroup regex 77 * @{ 78 */ 79 80 /** 81 * @brief Describes aspects of a regular expression. 82 * 83 * A regular expression traits class that satisfies the requirements of 84 * section [28.7]. 85 * 86 * The class %regex is parameterized around a set of related types and 87 * functions used to complete the definition of its semantics. This class 88 * satisfies the requirements of such a traits class. 89 */ 90 template<typename _Ch_type> 91 struct regex_traits 92 { 93 public: 94 typedef _Ch_type char_type; 95 typedef std::basic_string<char_type> string_type; 96 typedef std::locale locale_type; 97 private: 98 struct _RegexMask 99 { 100 typedef typename std::ctype<char_type>::mask _BaseType; 101 _BaseType _M_base; 102 unsigned char _M_extended; 103 static constexpr unsigned char _S_under = 1 << 0; 104 // FIXME: _S_blank should be removed in the future, 105 // when locale's complete. 106 static constexpr unsigned char _S_blank = 1 << 1; 107 static constexpr unsigned char _S_valid_mask = 0x3; 108 109 constexpr _RegexMask(_BaseType __base = 0, 110 unsigned char __extended = 0) 111 : _M_base(__base), _M_extended(__extended) 112 { } 113 114 constexpr _RegexMask 115 operator&(_RegexMask __other) const 116 { 117 return _RegexMask(_M_base & __other._M_base, 118 _M_extended & __other._M_extended); 119 } 120 121 constexpr _RegexMask 122 operator|(_RegexMask __other) const 123 { 124 return _RegexMask(_M_base | __other._M_base, 125 _M_extended | __other._M_extended); 126 } 127 128 constexpr _RegexMask 129 operator^(_RegexMask __other) const 130 { 131 return _RegexMask(_M_base ^ __other._M_base, 132 _M_extended ^ __other._M_extended); 133 } 134 135 constexpr _RegexMask 136 operator~() const 137 { return _RegexMask(~_M_base, ~_M_extended); } 138 139 _RegexMask& 140 operator&=(_RegexMask __other) 141 { return *this = (*this) & __other; } 142 143 _RegexMask& 144 operator|=(_RegexMask __other) 145 { return *this = (*this) | __other; } 146 147 _RegexMask& 148 operator^=(_RegexMask __other) 149 { return *this = (*this) ^ __other; } 150 151 constexpr bool 152 operator==(_RegexMask __other) const 153 { 154 return (_M_extended & _S_valid_mask) 155 == (__other._M_extended & _S_valid_mask) 156 && _M_base == __other._M_base; 157 } 158 159 constexpr bool 160 operator!=(_RegexMask __other) const 161 { return !((*this) == __other); } 162 163 }; 164 public: 165 typedef _RegexMask char_class_type; 166 167 public: 168 /** 169 * @brief Constructs a default traits object. 170 */ 171 regex_traits() { } 172 173 /** 174 * @brief Gives the length of a C-style string starting at @p __p. 175 * 176 * @param __p a pointer to the start of a character sequence. 177 * 178 * @returns the number of characters between @p *__p and the first 179 * default-initialized value of type @p char_type. In other words, uses 180 * the C-string algorithm for determining the length of a sequence of 181 * characters. 182 */ 183 static std::size_t 184 length(const char_type* __p) 185 { return string_type::traits_type::length(__p); } 186 187 /** 188 * @brief Performs the identity translation. 189 * 190 * @param __c A character to the locale-specific character set. 191 * 192 * @returns __c. 193 */ 194 char_type 195 translate(char_type __c) const 196 { return __c; } 197 198 /** 199 * @brief Translates a character into a case-insensitive equivalent. 200 * 201 * @param __c A character to the locale-specific character set. 202 * 203 * @returns the locale-specific lower-case equivalent of __c. 204 * @throws std::bad_cast if the imbued locale does not support the ctype 205 * facet. 206 */ 207 char_type 208 translate_nocase(char_type __c) const 209 { 210 typedef std::ctype<char_type> __ctype_type; 211 const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale)); 212 return __fctyp.tolower(__c); 213 } 214 215 /** 216 * @brief Gets a sort key for a character sequence. 217 * 218 * @param __first beginning of the character sequence. 219 * @param __last one-past-the-end of the character sequence. 220 * 221 * Returns a sort key for the character sequence designated by the 222 * iterator range [F1, F2) such that if the character sequence [G1, G2) 223 * sorts before the character sequence [H1, H2) then 224 * v.transform(G1, G2) < v.transform(H1, H2). 225 * 226 * What this really does is provide a more efficient way to compare a 227 * string to multiple other strings in locales with fancy collation 228 * rules and equivalence classes. 229 * 230 * @returns a locale-specific sort key equivalent to the input range. 231 * 232 * @throws std::bad_cast if the current locale does not have a collate 233 * facet. 234 */ 235 template<typename _Fwd_iter> 236 string_type 237 transform(_Fwd_iter __first, _Fwd_iter __last) const 238 { 239 typedef std::collate<char_type> __collate_type; 240 const __collate_type& __fclt(use_facet<__collate_type>(_M_locale)); 241 string_type __s(__first, __last); 242 return __fclt.transform(__s.data(), __s.data() + __s.size()); 243 } 244 245 /** 246 * @brief Gets a sort key for a character sequence, independent of case. 247 * 248 * @param __first beginning of the character sequence. 249 * @param __last one-past-the-end of the character sequence. 250 * 251 * Effects: if typeid(use_facet<collate<_Ch_type> >) == 252 * typeid(collate_byname<_Ch_type>) and the form of the sort key 253 * returned by collate_byname<_Ch_type>::transform(__first, __last) 254 * is known and can be converted into a primary sort key 255 * then returns that key, otherwise returns an empty string. 256 * 257 * @todo Implement this function correctly. 258 */ 259 template<typename _Fwd_iter> 260 string_type 261 transform_primary(_Fwd_iter __first, _Fwd_iter __last) const 262 { 263 // TODO : this is not entirely correct. 264 // This function requires extra support from the platform. 265 // 266 // Read http://gcc.gnu.org/ml/libstdc++/2013-09/msg00117.html and 267 // http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2003/n1429.htm 268 // for details. 269 typedef std::ctype<char_type> __ctype_type; 270 const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale)); 271 std::vector<char_type> __s(__first, __last); 272 __fctyp.tolower(__s.data(), __s.data() + __s.size()); 273 return this->transform(__s.data(), __s.data() + __s.size()); 274 } 275 276 /** 277 * @brief Gets a collation element by name. 278 * 279 * @param __first beginning of the collation element name. 280 * @param __last one-past-the-end of the collation element name. 281 * 282 * @returns a sequence of one or more characters that represents the 283 * collating element consisting of the character sequence designated by 284 * the iterator range [__first, __last). Returns an empty string if the 285 * character sequence is not a valid collating element. 286 */ 287 template<typename _Fwd_iter> 288 string_type 289 lookup_collatename(_Fwd_iter __first, _Fwd_iter __last) const; 290 291 /** 292 * @brief Maps one or more characters to a named character 293 * classification. 294 * 295 * @param __first beginning of the character sequence. 296 * @param __last one-past-the-end of the character sequence. 297 * @param __icase ignores the case of the classification name. 298 * 299 * @returns an unspecified value that represents the character 300 * classification named by the character sequence designated by 301 * the iterator range [__first, __last). If @p icase is true, 302 * the returned mask identifies the classification regardless of 303 * the case of the characters to be matched (for example, 304 * [[:lower:]] is the same as [[:alpha:]]), otherwise a 305 * case-dependent classification is returned. The value 306 * returned shall be independent of the case of the characters 307 * in the character sequence. If the name is not recognized then 308 * returns a value that compares equal to 0. 309 * 310 * At least the following names (or their wide-character equivalent) are 311 * supported. 312 * - d 313 * - w 314 * - s 315 * - alnum 316 * - alpha 317 * - blank 318 * - cntrl 319 * - digit 320 * - graph 321 * - lower 322 * - print 323 * - punct 324 * - space 325 * - upper 326 * - xdigit 327 */ 328 template<typename _Fwd_iter> 329 char_class_type 330 lookup_classname(_Fwd_iter __first, _Fwd_iter __last, 331 bool __icase = false) const; 332 333 /** 334 * @brief Determines if @p c is a member of an identified class. 335 * 336 * @param __c a character. 337 * @param __f a class type (as returned from lookup_classname). 338 * 339 * @returns true if the character @p __c is a member of the classification 340 * represented by @p __f, false otherwise. 341 * 342 * @throws std::bad_cast if the current locale does not have a ctype 343 * facet. 344 */ 345 bool 346 isctype(_Ch_type __c, char_class_type __f) const; 347 348 /** 349 * @brief Converts a digit to an int. 350 * 351 * @param __ch a character representing a digit. 352 * @param __radix the radix if the numeric conversion (limited to 8, 10, 353 * or 16). 354 * 355 * @returns the value represented by the digit __ch in base radix if the 356 * character __ch is a valid digit in base radix; otherwise returns -1. 357 */ 358 int 359 value(_Ch_type __ch, int __radix) const; 360 361 /** 362 * @brief Imbues the regex_traits object with a copy of a new locale. 363 * 364 * @param __loc A locale. 365 * 366 * @returns a copy of the previous locale in use by the regex_traits 367 * object. 368 * 369 * @note Calling imbue with a different locale than the one currently in 370 * use invalidates all cached data held by *this. 371 */ 372 locale_type 373 imbue(locale_type __loc) 374 { 375 std::swap(_M_locale, __loc); 376 return __loc; 377 } 378 379 /** 380 * @brief Gets a copy of the current locale in use by the regex_traits 381 * object. 382 */ 383 locale_type 384 getloc() const 385 { return _M_locale; } 386 387 protected: 388 locale_type _M_locale; 389 }; 390 391 // [7.8] Class basic_regex 392 /** 393 * Objects of specializations of this class represent regular expressions 394 * constructed from sequences of character type @p _Ch_type. 395 * 396 * Storage for the regular expression is allocated and deallocated as 397 * necessary by the member functions of this class. 398 */ 399 template<typename _Ch_type, typename _Rx_traits = regex_traits<_Ch_type>> 400 class basic_regex 401 { 402 public: 403 static_assert(is_same<_Ch_type, typename _Rx_traits::char_type>::value, 404 "regex traits class must have the same char_type"); 405 406 // types: 407 typedef _Ch_type value_type; 408 typedef _Rx_traits traits_type; 409 typedef typename traits_type::string_type string_type; 410 typedef regex_constants::syntax_option_type flag_type; 411 typedef typename traits_type::locale_type locale_type; 412 413 /** 414 * @name Constants 415 * std [28.8.1](1) 416 */ 417 //@{ 418 static constexpr flag_type icase = regex_constants::icase; 419 static constexpr flag_type nosubs = regex_constants::nosubs; 420 static constexpr flag_type optimize = regex_constants::optimize; 421 static constexpr flag_type collate = regex_constants::collate; 422 static constexpr flag_type ECMAScript = regex_constants::ECMAScript; 423 static constexpr flag_type basic = regex_constants::basic; 424 static constexpr flag_type extended = regex_constants::extended; 425 static constexpr flag_type awk = regex_constants::awk; 426 static constexpr flag_type grep = regex_constants::grep; 427 static constexpr flag_type egrep = regex_constants::egrep; 428 //@} 429 430 // [7.8.2] construct/copy/destroy 431 /** 432 * Constructs a basic regular expression that does not match any 433 * character sequence. 434 */ 435 basic_regex() 436 : _M_flags(ECMAScript), _M_automaton(nullptr) 437 { } 438 439 /** 440 * @brief Constructs a basic regular expression from the 441 * sequence [__p, __p + char_traits<_Ch_type>::length(__p)) 442 * interpreted according to the flags in @p __f. 443 * 444 * @param __p A pointer to the start of a C-style null-terminated string 445 * containing a regular expression. 446 * @param __f Flags indicating the syntax rules and options. 447 * 448 * @throws regex_error if @p __p is not a valid regular expression. 449 */ 450 explicit 451 basic_regex(const _Ch_type* __p, flag_type __f = ECMAScript) 452 : basic_regex(__p, __p + _Rx_traits::length(__p), __f) 453 { } 454 455 /** 456 * @brief Constructs a basic regular expression from the sequence 457 * [p, p + len) interpreted according to the flags in @p f. 458 * 459 * @param __p A pointer to the start of a string containing a regular 460 * expression. 461 * @param __len The length of the string containing the regular 462 * expression. 463 * @param __f Flags indicating the syntax rules and options. 464 * 465 * @throws regex_error if @p __p is not a valid regular expression. 466 */ 467 basic_regex(const _Ch_type* __p, std::size_t __len, 468 flag_type __f = ECMAScript) 469 : basic_regex(__p, __p + __len, __f) 470 { } 471 472 /** 473 * @brief Copy-constructs a basic regular expression. 474 * 475 * @param __rhs A @p regex object. 476 */ 477 basic_regex(const basic_regex& __rhs) 478 : _M_flags(__rhs._M_flags), _M_original_str(__rhs._M_original_str) 479 { 480 _M_traits.imbue(__rhs.getloc()); 481 this->assign(_M_original_str, _M_flags); 482 } 483 484 /** 485 * @brief Move-constructs a basic regular expression. 486 * 487 * @param __rhs A @p regex object. 488 * 489 * The implementation is a workaround concerning ABI compatibility. See: 490 * https://gcc.gnu.org/ml/libstdc++/2014-09/msg00067.html 491 */ 492 basic_regex(basic_regex&& __rhs) 493 : _M_flags(__rhs._M_flags), 494 _M_original_str(std::move(__rhs._M_original_str)) 495 { 496 _M_traits.imbue(__rhs.getloc()); 497 this->assign(_M_original_str, _M_flags); 498 __rhs._M_automaton.reset(); 499 } 500 501 /** 502 * @brief Constructs a basic regular expression from the string 503 * @p s interpreted according to the flags in @p f. 504 * 505 * @param __s A string containing a regular expression. 506 * @param __f Flags indicating the syntax rules and options. 507 * 508 * @throws regex_error if @p __s is not a valid regular expression. 509 */ 510 template<typename _Ch_traits, typename _Ch_alloc> 511 explicit 512 basic_regex(const std::basic_string<_Ch_type, _Ch_traits, 513 _Ch_alloc>& __s, 514 flag_type __f = ECMAScript) 515 : basic_regex(__s.begin(), __s.end(), __f) 516 { } 517 518 /** 519 * @brief Constructs a basic regular expression from the range 520 * [first, last) interpreted according to the flags in @p f. 521 * 522 * @param __first The start of a range containing a valid regular 523 * expression. 524 * @param __last The end of a range containing a valid regular 525 * expression. 526 * @param __f The format flags of the regular expression. 527 * 528 * @throws regex_error if @p [__first, __last) is not a valid regular 529 * expression. 530 */ 531 template<typename _FwdIter> 532 basic_regex(_FwdIter __first, _FwdIter __last, 533 flag_type __f = ECMAScript) 534 : _M_flags(__f), 535 _M_original_str(__first, __last), 536 _M_automaton(__detail::__compile_nfa(_M_original_str.c_str(), 537 _M_original_str.c_str() 538 + _M_original_str.size(), 539 _M_traits, 540 _M_flags)) 541 { } 542 543 /** 544 * @brief Constructs a basic regular expression from an initializer list. 545 * 546 * @param __l The initializer list. 547 * @param __f The format flags of the regular expression. 548 * 549 * @throws regex_error if @p __l is not a valid regular expression. 550 */ 551 basic_regex(initializer_list<_Ch_type> __l, flag_type __f = ECMAScript) 552 : basic_regex(__l.begin(), __l.end(), __f) 553 { } 554 555 /** 556 * @brief Destroys a basic regular expression. 557 */ 558 ~basic_regex() 559 { } 560 561 /** 562 * @brief Assigns one regular expression to another. 563 */ 564 basic_regex& 565 operator=(const basic_regex& __rhs) 566 { return this->assign(__rhs); } 567 568 /** 569 * @brief Move-assigns one regular expression to another. 570 * 571 * The implementation is a workaround concerning ABI compatibility. See: 572 * https://gcc.gnu.org/ml/libstdc++/2014-09/msg00067.html 573 */ 574 basic_regex& 575 operator=(basic_regex&& __rhs) 576 { return this->assign(std::move(__rhs)); } 577 578 /** 579 * @brief Replaces a regular expression with a new one constructed from 580 * a C-style null-terminated string. 581 * 582 * @param __p A pointer to the start of a null-terminated C-style string 583 * containing a regular expression. 584 */ 585 basic_regex& 586 operator=(const _Ch_type* __p) 587 { return this->assign(__p, flags()); } 588 589 /** 590 * @brief Replaces a regular expression with a new one constructed from 591 * a string. 592 * 593 * @param __s A pointer to a string containing a regular expression. 594 */ 595 template<typename _Ch_typeraits, typename _Alloc> 596 basic_regex& 597 operator=(const basic_string<_Ch_type, _Ch_typeraits, _Alloc>& __s) 598 { return this->assign(__s, flags()); } 599 600 // [7.8.3] assign 601 /** 602 * @brief the real assignment operator. 603 * 604 * @param __rhs Another regular expression object. 605 */ 606 basic_regex& 607 assign(const basic_regex& __rhs) 608 { 609 _M_flags = __rhs._M_flags; 610 _M_original_str = __rhs._M_original_str; 611 _M_traits.imbue(__rhs.getloc()); 612 this->assign(_M_original_str, _M_flags); 613 return *this; 614 } 615 616 /** 617 * @brief The move-assignment operator. 618 * 619 * @param __rhs Another regular expression object. 620 * 621 * The implementation is a workaround concerning ABI compatibility. See: 622 * https://gcc.gnu.org/ml/libstdc++/2014-09/msg00067.html 623 */ 624 basic_regex& 625 assign(basic_regex&& __rhs) 626 { 627 _M_flags = __rhs._M_flags; 628 _M_original_str = std::move(__rhs._M_original_str); 629 __rhs._M_automaton.reset(); 630 _M_traits.imbue(__rhs.getloc()); 631 this->assign(_M_original_str, _M_flags); 632 return *this; 633 } 634 635 /** 636 * @brief Assigns a new regular expression to a regex object from a 637 * C-style null-terminated string containing a regular expression 638 * pattern. 639 * 640 * @param __p A pointer to a C-style null-terminated string containing 641 * a regular expression pattern. 642 * @param __flags Syntax option flags. 643 * 644 * @throws regex_error if __p does not contain a valid regular 645 * expression pattern interpreted according to @p __flags. If 646 * regex_error is thrown, *this remains unchanged. 647 */ 648 basic_regex& 649 assign(const _Ch_type* __p, flag_type __flags = ECMAScript) 650 { return this->assign(string_type(__p), __flags); } 651 652 /** 653 * @brief Assigns a new regular expression to a regex object from a 654 * C-style string containing a regular expression pattern. 655 * 656 * @param __p A pointer to a C-style string containing a 657 * regular expression pattern. 658 * @param __len The length of the regular expression pattern string. 659 * @param __flags Syntax option flags. 660 * 661 * @throws regex_error if p does not contain a valid regular 662 * expression pattern interpreted according to @p __flags. If 663 * regex_error is thrown, *this remains unchanged. 664 */ 665 basic_regex& 666 assign(const _Ch_type* __p, std::size_t __len, flag_type __flags) 667 { return this->assign(string_type(__p, __len), __flags); } 668 669 /** 670 * @brief Assigns a new regular expression to a regex object from a 671 * string containing a regular expression pattern. 672 * 673 * @param __s A string containing a regular expression pattern. 674 * @param __flags Syntax option flags. 675 * 676 * @throws regex_error if __s does not contain a valid regular 677 * expression pattern interpreted according to @p __flags. If 678 * regex_error is thrown, *this remains unchanged. 679 */ 680 template<typename _Ch_typeraits, typename _Alloc> 681 basic_regex& 682 assign(const basic_string<_Ch_type, _Ch_typeraits, _Alloc>& __s, 683 flag_type __flags = ECMAScript) 684 { 685 _M_automaton = __detail::__compile_nfa( 686 __s.data(), __s.data() + __s.size(), _M_traits, __flags); 687 _M_original_str = __s; 688 _M_flags = __flags; 689 return *this; 690 } 691 692 /** 693 * @brief Assigns a new regular expression to a regex object. 694 * 695 * @param __first The start of a range containing a valid regular 696 * expression. 697 * @param __last The end of a range containing a valid regular 698 * expression. 699 * @param __flags Syntax option flags. 700 * 701 * @throws regex_error if p does not contain a valid regular 702 * expression pattern interpreted according to @p __flags. If 703 * regex_error is thrown, the object remains unchanged. 704 */ 705 template<typename _InputIterator> 706 basic_regex& 707 assign(_InputIterator __first, _InputIterator __last, 708 flag_type __flags = ECMAScript) 709 { return this->assign(string_type(__first, __last), __flags); } 710 711 /** 712 * @brief Assigns a new regular expression to a regex object. 713 * 714 * @param __l An initializer list representing a regular expression. 715 * @param __flags Syntax option flags. 716 * 717 * @throws regex_error if @p __l does not contain a valid 718 * regular expression pattern interpreted according to @p 719 * __flags. If regex_error is thrown, the object remains 720 * unchanged. 721 */ 722 basic_regex& 723 assign(initializer_list<_Ch_type> __l, flag_type __flags = ECMAScript) 724 { return this->assign(__l.begin(), __l.end(), __flags); } 725 726 // [7.8.4] const operations 727 /** 728 * @brief Gets the number of marked subexpressions within the regular 729 * expression. 730 */ 731 unsigned int 732 mark_count() const 733 { 734 if (_M_automaton) 735 return _M_automaton->_M_sub_count() - 1; 736 return 0; 737 } 738 739 /** 740 * @brief Gets the flags used to construct the regular expression 741 * or in the last call to assign(). 742 */ 743 flag_type 744 flags() const 745 { return _M_flags; } 746 747 // [7.8.5] locale 748 /** 749 * @brief Imbues the regular expression object with the given locale. 750 * 751 * @param __loc A locale. 752 */ 753 locale_type 754 imbue(locale_type __loc) 755 { 756 _M_automaton = nullptr; 757 return _M_traits.imbue(__loc); 758 } 759 760 /** 761 * @brief Gets the locale currently imbued in the regular expression 762 * object. 763 */ 764 locale_type 765 getloc() const 766 { return _M_traits.getloc(); } 767 768 // [7.8.6] swap 769 /** 770 * @brief Swaps the contents of two regular expression objects. 771 * 772 * @param __rhs Another regular expression object. 773 */ 774 void 775 swap(basic_regex& __rhs) 776 { 777 std::swap(_M_flags, __rhs._M_flags); 778 std::swap(_M_traits, __rhs._M_traits); 779 auto __tmp = std::move(_M_original_str); 780 this->assign(__rhs._M_original_str, _M_flags); 781 __rhs.assign(__tmp, __rhs._M_flags); 782 } 783 784 #ifdef _GLIBCXX_DEBUG 785 void 786 _M_dot(std::ostream& __ostr) 787 { _M_automaton->_M_dot(__ostr); } 788 #endif 789 790 private: 791 typedef std::shared_ptr<__detail::_NFA<_Rx_traits>> _AutomatonPtr; 792 793 template<typename _Bp, typename _Ap, typename _Cp, typename _Rp, 794 __detail::_RegexExecutorPolicy, bool> 795 friend bool 796 __detail::__regex_algo_impl(_Bp, _Bp, match_results<_Bp, _Ap>&, 797 const basic_regex<_Cp, _Rp>&, 798 regex_constants::match_flag_type); 799 800 template<typename, typename, typename, bool> 801 friend class __detail::_Executor; 802 803 flag_type _M_flags; 804 _Rx_traits _M_traits; 805 basic_string<_Ch_type> _M_original_str; 806 _AutomatonPtr _M_automaton; 807 }; 808 809 /** @brief Standard regular expressions. */ 810 typedef basic_regex<char> regex; 811 812 #ifdef _GLIBCXX_USE_WCHAR_T 813 /** @brief Standard wide-character regular expressions. */ 814 typedef basic_regex<wchar_t> wregex; 815 #endif 816 817 818 // [7.8.6] basic_regex swap 819 /** 820 * @brief Swaps the contents of two regular expression objects. 821 * @param __lhs First regular expression. 822 * @param __rhs Second regular expression. 823 */ 824 template<typename _Ch_type, typename _Rx_traits> 825 inline void 826 swap(basic_regex<_Ch_type, _Rx_traits>& __lhs, 827 basic_regex<_Ch_type, _Rx_traits>& __rhs) 828 { __lhs.swap(__rhs); } 829 830 831 // [7.9] Class template sub_match 832 /** 833 * A sequence of characters matched by a particular marked sub-expression. 834 * 835 * An object of this class is essentially a pair of iterators marking a 836 * matched subexpression within a regular expression pattern match. Such 837 * objects can be converted to and compared with std::basic_string objects 838 * of a similar base character type as the pattern matched by the regular 839 * expression. 840 * 841 * The iterators that make up the pair are the usual half-open interval 842 * referencing the actual original pattern matched. 843 */ 844 template<typename _BiIter> 845 class sub_match : public std::pair<_BiIter, _BiIter> 846 { 847 typedef iterator_traits<_BiIter> __iter_traits; 848 849 public: 850 typedef typename __iter_traits::value_type value_type; 851 typedef typename __iter_traits::difference_type difference_type; 852 typedef _BiIter iterator; 853 typedef std::basic_string<value_type> string_type; 854 855 bool matched; 856 857 constexpr sub_match() : matched() { } 858 859 /** 860 * Gets the length of the matching sequence. 861 */ 862 difference_type 863 length() const 864 { return this->matched ? std::distance(this->first, this->second) : 0; } 865 866 /** 867 * @brief Gets the matching sequence as a string. 868 * 869 * @returns the matching sequence as a string. 870 * 871 * This is the implicit conversion operator. It is identical to the 872 * str() member function except that it will want to pop up in 873 * unexpected places and cause a great deal of confusion and cursing 874 * from the unwary. 875 */ 876 operator string_type() const 877 { 878 return this->matched 879 ? string_type(this->first, this->second) 880 : string_type(); 881 } 882 883 /** 884 * @brief Gets the matching sequence as a string. 885 * 886 * @returns the matching sequence as a string. 887 */ 888 string_type 889 str() const 890 { 891 return this->matched 892 ? string_type(this->first, this->second) 893 : string_type(); 894 } 895 896 /** 897 * @brief Compares this and another matched sequence. 898 * 899 * @param __s Another matched sequence to compare to this one. 900 * 901 * @retval <0 this matched sequence will collate before @p __s. 902 * @retval =0 this matched sequence is equivalent to @p __s. 903 * @retval <0 this matched sequence will collate after @p __s. 904 */ 905 int 906 compare(const sub_match& __s) const 907 { return this->str().compare(__s.str()); } 908 909 /** 910 * @brief Compares this sub_match to a string. 911 * 912 * @param __s A string to compare to this sub_match. 913 * 914 * @retval <0 this matched sequence will collate before @p __s. 915 * @retval =0 this matched sequence is equivalent to @p __s. 916 * @retval <0 this matched sequence will collate after @p __s. 917 */ 918 int 919 compare(const string_type& __s) const 920 { return this->str().compare(__s); } 921 922 /** 923 * @brief Compares this sub_match to a C-style string. 924 * 925 * @param __s A C-style string to compare to this sub_match. 926 * 927 * @retval <0 this matched sequence will collate before @p __s. 928 * @retval =0 this matched sequence is equivalent to @p __s. 929 * @retval <0 this matched sequence will collate after @p __s. 930 */ 931 int 932 compare(const value_type* __s) const 933 { return this->str().compare(__s); } 934 }; 935 936 937 /** @brief Standard regex submatch over a C-style null-terminated string. */ 938 typedef sub_match<const char*> csub_match; 939 940 /** @brief Standard regex submatch over a standard string. */ 941 typedef sub_match<string::const_iterator> ssub_match; 942 943 #ifdef _GLIBCXX_USE_WCHAR_T 944 /** @brief Regex submatch over a C-style null-terminated wide string. */ 945 typedef sub_match<const wchar_t*> wcsub_match; 946 947 /** @brief Regex submatch over a standard wide string. */ 948 typedef sub_match<wstring::const_iterator> wssub_match; 949 #endif 950 951 // [7.9.2] sub_match non-member operators 952 953 /** 954 * @brief Tests the equivalence of two regular expression submatches. 955 * @param __lhs First regular expression submatch. 956 * @param __rhs Second regular expression submatch. 957 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 958 */ 959 template<typename _BiIter> 960 inline bool 961 operator==(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs) 962 { return __lhs.compare(__rhs) == 0; } 963 964 /** 965 * @brief Tests the inequivalence of two regular expression submatches. 966 * @param __lhs First regular expression submatch. 967 * @param __rhs Second regular expression submatch. 968 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 969 */ 970 template<typename _BiIter> 971 inline bool 972 operator!=(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs) 973 { return __lhs.compare(__rhs) != 0; } 974 975 /** 976 * @brief Tests the ordering of two regular expression submatches. 977 * @param __lhs First regular expression submatch. 978 * @param __rhs Second regular expression submatch. 979 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 980 */ 981 template<typename _BiIter> 982 inline bool 983 operator<(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs) 984 { return __lhs.compare(__rhs) < 0; } 985 986 /** 987 * @brief Tests the ordering of two regular expression submatches. 988 * @param __lhs First regular expression submatch. 989 * @param __rhs Second regular expression submatch. 990 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 991 */ 992 template<typename _BiIter> 993 inline bool 994 operator<=(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs) 995 { return __lhs.compare(__rhs) <= 0; } 996 997 /** 998 * @brief Tests the ordering of two regular expression submatches. 999 * @param __lhs First regular expression submatch. 1000 * @param __rhs Second regular expression submatch. 1001 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1002 */ 1003 template<typename _BiIter> 1004 inline bool 1005 operator>=(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs) 1006 { return __lhs.compare(__rhs) >= 0; } 1007 1008 /** 1009 * @brief Tests the ordering of two regular expression submatches. 1010 * @param __lhs First regular expression submatch. 1011 * @param __rhs Second regular expression submatch. 1012 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1013 */ 1014 template<typename _BiIter> 1015 inline bool 1016 operator>(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs) 1017 { return __lhs.compare(__rhs) > 0; } 1018 1019 // Alias for sub_match'd string. 1020 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1021 using __sub_match_string = basic_string< 1022 typename iterator_traits<_Bi_iter>::value_type, 1023 _Ch_traits, _Ch_alloc>; 1024 1025 /** 1026 * @brief Tests the equivalence of a string and a regular expression 1027 * submatch. 1028 * @param __lhs A string. 1029 * @param __rhs A regular expression submatch. 1030 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1031 */ 1032 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1033 inline bool 1034 operator==(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, 1035 const sub_match<_Bi_iter>& __rhs) 1036 { return __rhs.compare(__lhs.c_str()) == 0; } 1037 1038 /** 1039 * @brief Tests the inequivalence of a string and a regular expression 1040 * submatch. 1041 * @param __lhs A string. 1042 * @param __rhs A regular expression submatch. 1043 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1044 */ 1045 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1046 inline bool 1047 operator!=(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, 1048 const sub_match<_Bi_iter>& __rhs) 1049 { return !(__lhs == __rhs); } 1050 1051 /** 1052 * @brief Tests the ordering of a string and a regular expression submatch. 1053 * @param __lhs A string. 1054 * @param __rhs A regular expression submatch. 1055 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1056 */ 1057 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1058 inline bool 1059 operator<(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, 1060 const sub_match<_Bi_iter>& __rhs) 1061 { return __rhs.compare(__lhs.c_str()) > 0; } 1062 1063 /** 1064 * @brief Tests the ordering of a string and a regular expression submatch. 1065 * @param __lhs A string. 1066 * @param __rhs A regular expression submatch. 1067 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1068 */ 1069 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1070 inline bool 1071 operator>(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, 1072 const sub_match<_Bi_iter>& __rhs) 1073 { return __rhs < __lhs; } 1074 1075 /** 1076 * @brief Tests the ordering of a string and a regular expression submatch. 1077 * @param __lhs A string. 1078 * @param __rhs A regular expression submatch. 1079 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1080 */ 1081 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1082 inline bool 1083 operator>=(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, 1084 const sub_match<_Bi_iter>& __rhs) 1085 { return !(__lhs < __rhs); } 1086 1087 /** 1088 * @brief Tests the ordering of a string and a regular expression submatch. 1089 * @param __lhs A string. 1090 * @param __rhs A regular expression submatch. 1091 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1092 */ 1093 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1094 inline bool 1095 operator<=(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs, 1096 const sub_match<_Bi_iter>& __rhs) 1097 { return !(__rhs < __lhs); } 1098 1099 /** 1100 * @brief Tests the equivalence of a regular expression submatch and a 1101 * string. 1102 * @param __lhs A regular expression submatch. 1103 * @param __rhs A string. 1104 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1105 */ 1106 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1107 inline bool 1108 operator==(const sub_match<_Bi_iter>& __lhs, 1109 const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) 1110 { return __lhs.compare(__rhs.c_str()) == 0; } 1111 1112 /** 1113 * @brief Tests the inequivalence of a regular expression submatch and a 1114 * string. 1115 * @param __lhs A regular expression submatch. 1116 * @param __rhs A string. 1117 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1118 */ 1119 template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc> 1120 inline bool 1121 operator!=(const sub_match<_Bi_iter>& __lhs, 1122 const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) 1123 { return !(__lhs == __rhs); } 1124 1125 /** 1126 * @brief Tests the ordering of a regular expression submatch and a string. 1127 * @param __lhs A regular expression submatch. 1128 * @param __rhs A string. 1129 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1130 */ 1131 template<typename _Bi_iter, class _Ch_traits, class _Ch_alloc> 1132 inline bool 1133 operator<(const sub_match<_Bi_iter>& __lhs, 1134 const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) 1135 { return __lhs.compare(__rhs.c_str()) < 0; } 1136 1137 /** 1138 * @brief Tests the ordering of a regular expression submatch and a string. 1139 * @param __lhs A regular expression submatch. 1140 * @param __rhs A string. 1141 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1142 */ 1143 template<typename _Bi_iter, class _Ch_traits, class _Ch_alloc> 1144 inline bool 1145 operator>(const sub_match<_Bi_iter>& __lhs, 1146 const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) 1147 { return __rhs < __lhs; } 1148 1149 /** 1150 * @brief Tests the ordering of a regular expression submatch and a string. 1151 * @param __lhs A regular expression submatch. 1152 * @param __rhs A string. 1153 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1154 */ 1155 template<typename _Bi_iter, class _Ch_traits, class _Ch_alloc> 1156 inline bool 1157 operator>=(const sub_match<_Bi_iter>& __lhs, 1158 const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) 1159 { return !(__lhs < __rhs); } 1160 1161 /** 1162 * @brief Tests the ordering of a regular expression submatch and a string. 1163 * @param __lhs A regular expression submatch. 1164 * @param __rhs A string. 1165 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1166 */ 1167 template<typename _Bi_iter, class _Ch_traits, class _Ch_alloc> 1168 inline bool 1169 operator<=(const sub_match<_Bi_iter>& __lhs, 1170 const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs) 1171 { return !(__rhs < __lhs); } 1172 1173 /** 1174 * @brief Tests the equivalence of a C string and a regular expression 1175 * submatch. 1176 * @param __lhs A C string. 1177 * @param __rhs A regular expression submatch. 1178 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1179 */ 1180 template<typename _Bi_iter> 1181 inline bool 1182 operator==(typename iterator_traits<_Bi_iter>::value_type const* __lhs, 1183 const sub_match<_Bi_iter>& __rhs) 1184 { return __rhs.compare(__lhs) == 0; } 1185 1186 /** 1187 * @brief Tests the inequivalence of an iterator value and a regular 1188 * expression submatch. 1189 * @param __lhs A regular expression submatch. 1190 * @param __rhs A string. 1191 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1192 */ 1193 template<typename _Bi_iter> 1194 inline bool 1195 operator!=(typename iterator_traits<_Bi_iter>::value_type const* __lhs, 1196 const sub_match<_Bi_iter>& __rhs) 1197 { return !(__lhs == __rhs); } 1198 1199 /** 1200 * @brief Tests the ordering of a string and a regular expression submatch. 1201 * @param __lhs A string. 1202 * @param __rhs A regular expression submatch. 1203 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1204 */ 1205 template<typename _Bi_iter> 1206 inline bool 1207 operator<(typename iterator_traits<_Bi_iter>::value_type const* __lhs, 1208 const sub_match<_Bi_iter>& __rhs) 1209 { return __rhs.compare(__lhs) > 0; } 1210 1211 /** 1212 * @brief Tests the ordering of a string and a regular expression submatch. 1213 * @param __lhs A string. 1214 * @param __rhs A regular expression submatch. 1215 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1216 */ 1217 template<typename _Bi_iter> 1218 inline bool 1219 operator>(typename iterator_traits<_Bi_iter>::value_type const* __lhs, 1220 const sub_match<_Bi_iter>& __rhs) 1221 { return __rhs < __lhs; } 1222 1223 /** 1224 * @brief Tests the ordering of a string and a regular expression submatch. 1225 * @param __lhs A string. 1226 * @param __rhs A regular expression submatch. 1227 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1228 */ 1229 template<typename _Bi_iter> 1230 inline bool 1231 operator>=(typename iterator_traits<_Bi_iter>::value_type const* __lhs, 1232 const sub_match<_Bi_iter>& __rhs) 1233 { return !(__lhs < __rhs); } 1234 1235 /** 1236 * @brief Tests the ordering of a string and a regular expression submatch. 1237 * @param __lhs A string. 1238 * @param __rhs A regular expression submatch. 1239 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1240 */ 1241 template<typename _Bi_iter> 1242 inline bool 1243 operator<=(typename iterator_traits<_Bi_iter>::value_type const* __lhs, 1244 const sub_match<_Bi_iter>& __rhs) 1245 { return !(__rhs < __lhs); } 1246 1247 /** 1248 * @brief Tests the equivalence of a regular expression submatch and a 1249 * string. 1250 * @param __lhs A regular expression submatch. 1251 * @param __rhs A pointer to a string? 1252 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1253 */ 1254 template<typename _Bi_iter> 1255 inline bool 1256 operator==(const sub_match<_Bi_iter>& __lhs, 1257 typename iterator_traits<_Bi_iter>::value_type const* __rhs) 1258 { return __lhs.compare(__rhs) == 0; } 1259 1260 /** 1261 * @brief Tests the inequivalence of a regular expression submatch and a 1262 * string. 1263 * @param __lhs A regular expression submatch. 1264 * @param __rhs A pointer to a string. 1265 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1266 */ 1267 template<typename _Bi_iter> 1268 inline bool 1269 operator!=(const sub_match<_Bi_iter>& __lhs, 1270 typename iterator_traits<_Bi_iter>::value_type const* __rhs) 1271 { return !(__lhs == __rhs); } 1272 1273 /** 1274 * @brief Tests the ordering of a regular expression submatch and a string. 1275 * @param __lhs A regular expression submatch. 1276 * @param __rhs A string. 1277 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1278 */ 1279 template<typename _Bi_iter> 1280 inline bool 1281 operator<(const sub_match<_Bi_iter>& __lhs, 1282 typename iterator_traits<_Bi_iter>::value_type const* __rhs) 1283 { return __lhs.compare(__rhs) < 0; } 1284 1285 /** 1286 * @brief Tests the ordering of a regular expression submatch and a string. 1287 * @param __lhs A regular expression submatch. 1288 * @param __rhs A string. 1289 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1290 */ 1291 template<typename _Bi_iter> 1292 inline bool 1293 operator>(const sub_match<_Bi_iter>& __lhs, 1294 typename iterator_traits<_Bi_iter>::value_type const* __rhs) 1295 { return __rhs < __lhs; } 1296 1297 /** 1298 * @brief Tests the ordering of a regular expression submatch and a string. 1299 * @param __lhs A regular expression submatch. 1300 * @param __rhs A string. 1301 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1302 */ 1303 template<typename _Bi_iter> 1304 inline bool 1305 operator>=(const sub_match<_Bi_iter>& __lhs, 1306 typename iterator_traits<_Bi_iter>::value_type const* __rhs) 1307 { return !(__lhs < __rhs); } 1308 1309 /** 1310 * @brief Tests the ordering of a regular expression submatch and a string. 1311 * @param __lhs A regular expression submatch. 1312 * @param __rhs A string. 1313 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1314 */ 1315 template<typename _Bi_iter> 1316 inline bool 1317 operator<=(const sub_match<_Bi_iter>& __lhs, 1318 typename iterator_traits<_Bi_iter>::value_type const* __rhs) 1319 { return !(__rhs < __lhs); } 1320 1321 /** 1322 * @brief Tests the equivalence of a string and a regular expression 1323 * submatch. 1324 * @param __lhs A string. 1325 * @param __rhs A regular expression submatch. 1326 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1327 */ 1328 template<typename _Bi_iter> 1329 inline bool 1330 operator==(typename iterator_traits<_Bi_iter>::value_type const& __lhs, 1331 const sub_match<_Bi_iter>& __rhs) 1332 { 1333 typedef typename sub_match<_Bi_iter>::string_type string_type; 1334 return __rhs.compare(string_type(1, __lhs)) == 0; 1335 } 1336 1337 /** 1338 * @brief Tests the inequivalence of a string and a regular expression 1339 * submatch. 1340 * @param __lhs A string. 1341 * @param __rhs A regular expression submatch. 1342 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1343 */ 1344 template<typename _Bi_iter> 1345 inline bool 1346 operator!=(typename iterator_traits<_Bi_iter>::value_type const& __lhs, 1347 const sub_match<_Bi_iter>& __rhs) 1348 { return !(__lhs == __rhs); } 1349 1350 /** 1351 * @brief Tests the ordering of a string and a regular expression submatch. 1352 * @param __lhs A string. 1353 * @param __rhs A regular expression submatch. 1354 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1355 */ 1356 template<typename _Bi_iter> 1357 inline bool 1358 operator<(typename iterator_traits<_Bi_iter>::value_type const& __lhs, 1359 const sub_match<_Bi_iter>& __rhs) 1360 { 1361 typedef typename sub_match<_Bi_iter>::string_type string_type; 1362 return __rhs.compare(string_type(1, __lhs)) > 0; 1363 } 1364 1365 /** 1366 * @brief Tests the ordering of a string and a regular expression submatch. 1367 * @param __lhs A string. 1368 * @param __rhs A regular expression submatch. 1369 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1370 */ 1371 template<typename _Bi_iter> 1372 inline bool 1373 operator>(typename iterator_traits<_Bi_iter>::value_type const& __lhs, 1374 const sub_match<_Bi_iter>& __rhs) 1375 { return __rhs < __lhs; } 1376 1377 /** 1378 * @brief Tests the ordering of a string and a regular expression submatch. 1379 * @param __lhs A string. 1380 * @param __rhs A regular expression submatch. 1381 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1382 */ 1383 template<typename _Bi_iter> 1384 inline bool 1385 operator>=(typename iterator_traits<_Bi_iter>::value_type const& __lhs, 1386 const sub_match<_Bi_iter>& __rhs) 1387 { return !(__lhs < __rhs); } 1388 1389 /** 1390 * @brief Tests the ordering of a string and a regular expression submatch. 1391 * @param __lhs A string. 1392 * @param __rhs A regular expression submatch. 1393 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1394 */ 1395 template<typename _Bi_iter> 1396 inline bool 1397 operator<=(typename iterator_traits<_Bi_iter>::value_type const& __lhs, 1398 const sub_match<_Bi_iter>& __rhs) 1399 { return !(__rhs < __lhs); } 1400 1401 /** 1402 * @brief Tests the equivalence of a regular expression submatch and a 1403 * string. 1404 * @param __lhs A regular expression submatch. 1405 * @param __rhs A const string reference. 1406 * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise. 1407 */ 1408 template<typename _Bi_iter> 1409 inline bool 1410 operator==(const sub_match<_Bi_iter>& __lhs, 1411 typename iterator_traits<_Bi_iter>::value_type const& __rhs) 1412 { 1413 typedef typename sub_match<_Bi_iter>::string_type string_type; 1414 return __lhs.compare(string_type(1, __rhs)) == 0; 1415 } 1416 1417 /** 1418 * @brief Tests the inequivalence of a regular expression submatch and a 1419 * string. 1420 * @param __lhs A regular expression submatch. 1421 * @param __rhs A const string reference. 1422 * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise. 1423 */ 1424 template<typename _Bi_iter> 1425 inline bool 1426 operator!=(const sub_match<_Bi_iter>& __lhs, 1427 typename iterator_traits<_Bi_iter>::value_type const& __rhs) 1428 { return !(__lhs == __rhs); } 1429 1430 /** 1431 * @brief Tests the ordering of a regular expression submatch and a string. 1432 * @param __lhs A regular expression submatch. 1433 * @param __rhs A const string reference. 1434 * @returns true if @a __lhs precedes @a __rhs, false otherwise. 1435 */ 1436 template<typename _Bi_iter> 1437 inline bool 1438 operator<(const sub_match<_Bi_iter>& __lhs, 1439 typename iterator_traits<_Bi_iter>::value_type const& __rhs) 1440 { 1441 typedef typename sub_match<_Bi_iter>::string_type string_type; 1442 return __lhs.compare(string_type(1, __rhs)) < 0; 1443 } 1444 1445 /** 1446 * @brief Tests the ordering of a regular expression submatch and a string. 1447 * @param __lhs A regular expression submatch. 1448 * @param __rhs A const string reference. 1449 * @returns true if @a __lhs succeeds @a __rhs, false otherwise. 1450 */ 1451 template<typename _Bi_iter> 1452 inline bool 1453 operator>(const sub_match<_Bi_iter>& __lhs, 1454 typename iterator_traits<_Bi_iter>::value_type const& __rhs) 1455 { return __rhs < __lhs; } 1456 1457 /** 1458 * @brief Tests the ordering of a regular expression submatch and a string. 1459 * @param __lhs A regular expression submatch. 1460 * @param __rhs A const string reference. 1461 * @returns true if @a __lhs does not precede @a __rhs, false otherwise. 1462 */ 1463 template<typename _Bi_iter> 1464 inline bool 1465 operator>=(const sub_match<_Bi_iter>& __lhs, 1466 typename iterator_traits<_Bi_iter>::value_type const& __rhs) 1467 { return !(__lhs < __rhs); } 1468 1469 /** 1470 * @brief Tests the ordering of a regular expression submatch and a string. 1471 * @param __lhs A regular expression submatch. 1472 * @param __rhs A const string reference. 1473 * @returns true if @a __lhs does not succeed @a __rhs, false otherwise. 1474 */ 1475 template<typename _Bi_iter> 1476 inline bool 1477 operator<=(const sub_match<_Bi_iter>& __lhs, 1478 typename iterator_traits<_Bi_iter>::value_type const& __rhs) 1479 { return !(__rhs < __lhs); } 1480 1481 /** 1482 * @brief Inserts a matched string into an output stream. 1483 * 1484 * @param __os The output stream. 1485 * @param __m A submatch string. 1486 * 1487 * @returns the output stream with the submatch string inserted. 1488 */ 1489 template<typename _Ch_type, typename _Ch_traits, typename _Bi_iter> 1490 inline 1491 basic_ostream<_Ch_type, _Ch_traits>& 1492 operator<<(basic_ostream<_Ch_type, _Ch_traits>& __os, 1493 const sub_match<_Bi_iter>& __m) 1494 { return __os << __m.str(); } 1495 1496 // [7.10] Class template match_results 1497 1498 /* 1499 * Special sub_match object representing an unmatched sub-expression. 1500 */ 1501 template<typename _Bi_iter> 1502 inline const sub_match<_Bi_iter>& 1503 __unmatched_sub() 1504 { 1505 static const sub_match<_Bi_iter> __unmatched = sub_match<_Bi_iter>(); 1506 return __unmatched; 1507 } 1508 1509 /** 1510 * @brief The results of a match or search operation. 1511 * 1512 * A collection of character sequences representing the result of a regular 1513 * expression match. Storage for the collection is allocated and freed as 1514 * necessary by the member functions of class template match_results. 1515 * 1516 * This class satisfies the Sequence requirements, with the exception that 1517 * only the operations defined for a const-qualified Sequence are supported. 1518 * 1519 * The sub_match object stored at index 0 represents sub-expression 0, i.e. 1520 * the whole match. In this case the %sub_match member matched is always true. 1521 * The sub_match object stored at index n denotes what matched the marked 1522 * sub-expression n within the matched expression. If the sub-expression n 1523 * participated in a regular expression match then the %sub_match member 1524 * matched evaluates to true, and members first and second denote the range 1525 * of characters [first, second) which formed that match. Otherwise matched 1526 * is false, and members first and second point to the end of the sequence 1527 * that was searched. 1528 * 1529 * @nosubgrouping 1530 */ 1531 template<typename _Bi_iter, 1532 typename _Alloc = allocator<sub_match<_Bi_iter> > > 1533 class match_results 1534 : private std::vector<sub_match<_Bi_iter>, _Alloc> 1535 { 1536 private: 1537 /* 1538 * The vector base is empty if this does not represent a successful match. 1539 * Otherwise it contains n+3 elements where n is the number of marked 1540 * sub-expressions: 1541 * [0] entire match 1542 * [1] 1st marked subexpression 1543 * ... 1544 * [n] nth marked subexpression 1545 * [n+1] prefix 1546 * [n+2] suffix 1547 */ 1548 typedef std::vector<sub_match<_Bi_iter>, _Alloc> _Base_type; 1549 typedef std::iterator_traits<_Bi_iter> __iter_traits; 1550 typedef regex_constants::match_flag_type match_flag_type; 1551 1552 public: 1553 /** 1554 * @name 10.? Public Types 1555 */ 1556 //@{ 1557 typedef sub_match<_Bi_iter> value_type; 1558 typedef const value_type& const_reference; 1559 typedef const_reference reference; 1560 typedef typename _Base_type::const_iterator const_iterator; 1561 typedef const_iterator iterator; 1562 typedef typename __iter_traits::difference_type difference_type; 1563 typedef typename allocator_traits<_Alloc>::size_type size_type; 1564 typedef _Alloc allocator_type; 1565 typedef typename __iter_traits::value_type char_type; 1566 typedef std::basic_string<char_type> string_type; 1567 //@} 1568 1569 public: 1570 /** 1571 * @name 28.10.1 Construction, Copying, and Destruction 1572 */ 1573 //@{ 1574 1575 /** 1576 * @brief Constructs a default %match_results container. 1577 * @post size() returns 0 and str() returns an empty string. 1578 */ 1579 explicit 1580 match_results(const _Alloc& __a = _Alloc()) 1581 : _Base_type(__a) 1582 { } 1583 1584 /** 1585 * @brief Copy constructs a %match_results. 1586 */ 1587 match_results(const match_results& __rhs) = default; 1588 1589 /** 1590 * @brief Move constructs a %match_results. 1591 */ 1592 match_results(match_results&& __rhs) noexcept = default; 1593 1594 /** 1595 * @brief Assigns rhs to *this. 1596 */ 1597 match_results& 1598 operator=(const match_results& __rhs) = default; 1599 1600 /** 1601 * @brief Move-assigns rhs to *this. 1602 */ 1603 match_results& 1604 operator=(match_results&& __rhs) = default; 1605 1606 /** 1607 * @brief Destroys a %match_results object. 1608 */ 1609 ~match_results() 1610 { } 1611 1612 //@} 1613 1614 // 28.10.2, state: 1615 /** 1616 * @brief Indicates if the %match_results is ready. 1617 * @retval true The object has a fully-established result state. 1618 * @retval false The object is not ready. 1619 */ 1620 bool ready() const { return !_Base_type::empty(); } 1621 1622 /** 1623 * @name 28.10.2 Size 1624 */ 1625 //@{ 1626 1627 /** 1628 * @brief Gets the number of matches and submatches. 1629 * 1630 * The number of matches for a given regular expression will be either 0 1631 * if there was no match or mark_count() + 1 if a match was successful. 1632 * Some matches may be empty. 1633 * 1634 * @returns the number of matches found. 1635 */ 1636 size_type 1637 size() const 1638 { 1639 size_type __size = _Base_type::size(); 1640 return (__size && _Base_type::operator[](0).matched) ? __size - 2 : 0; 1641 } 1642 1643 size_type 1644 max_size() const 1645 { return _Base_type::max_size(); } 1646 1647 /** 1648 * @brief Indicates if the %match_results contains no results. 1649 * @retval true The %match_results object is empty. 1650 * @retval false The %match_results object is not empty. 1651 */ 1652 bool 1653 empty() const 1654 { return size() == 0; } 1655 1656 //@} 1657 1658 /** 1659 * @name 10.3 Element Access 1660 */ 1661 //@{ 1662 1663 /** 1664 * @brief Gets the length of the indicated submatch. 1665 * @param __sub indicates the submatch. 1666 * @pre ready() == true 1667 * 1668 * This function returns the length of the indicated submatch, or the 1669 * length of the entire match if @p __sub is zero (the default). 1670 */ 1671 difference_type 1672 length(size_type __sub = 0) const 1673 { return (*this)[__sub].length(); } 1674 1675 /** 1676 * @brief Gets the offset of the beginning of the indicated submatch. 1677 * @param __sub indicates the submatch. 1678 * @pre ready() == true 1679 * 1680 * This function returns the offset from the beginning of the target 1681 * sequence to the beginning of the submatch, unless the value of @p __sub 1682 * is zero (the default), in which case this function returns the offset 1683 * from the beginning of the target sequence to the beginning of the 1684 * match. 1685 * 1686 * Returns -1 if @p __sub is out of range. 1687 */ 1688 difference_type 1689 position(size_type __sub = 0) const 1690 { 1691 return __sub < size() ? std::distance(_M_begin, 1692 (*this)[__sub].first) : -1; 1693 } 1694 1695 /** 1696 * @brief Gets the match or submatch converted to a string type. 1697 * @param __sub indicates the submatch. 1698 * @pre ready() == true 1699 * 1700 * This function gets the submatch (or match, if @p __sub is 1701 * zero) extracted from the target range and converted to the 1702 * associated string type. 1703 */ 1704 string_type 1705 str(size_type __sub = 0) const 1706 { return (*this)[__sub].str(); } 1707 1708 /** 1709 * @brief Gets a %sub_match reference for the match or submatch. 1710 * @param __sub indicates the submatch. 1711 * @pre ready() == true 1712 * 1713 * This function gets a reference to the indicated submatch, or 1714 * the entire match if @p __sub is zero. 1715 * 1716 * If @p __sub >= size() then this function returns a %sub_match with a 1717 * special value indicating no submatch. 1718 */ 1719 const_reference 1720 operator[](size_type __sub) const 1721 { 1722 _GLIBCXX_DEBUG_ASSERT( ready() ); 1723 return __sub < size() 1724 ? _Base_type::operator[](__sub) 1725 : __unmatched_sub<_Bi_iter>(); 1726 } 1727 1728 /** 1729 * @brief Gets a %sub_match representing the match prefix. 1730 * @pre ready() == true 1731 * 1732 * This function gets a reference to a %sub_match object representing the 1733 * part of the target range between the start of the target range and the 1734 * start of the match. 1735 */ 1736 const_reference 1737 prefix() const 1738 { 1739 _GLIBCXX_DEBUG_ASSERT( ready() ); 1740 return !empty() 1741 ? _Base_type::operator[](_Base_type::size() - 2) 1742 : __unmatched_sub<_Bi_iter>(); 1743 } 1744 1745 /** 1746 * @brief Gets a %sub_match representing the match suffix. 1747 * @pre ready() == true 1748 * 1749 * This function gets a reference to a %sub_match object representing the 1750 * part of the target range between the end of the match and the end of 1751 * the target range. 1752 */ 1753 const_reference 1754 suffix() const 1755 { 1756 _GLIBCXX_DEBUG_ASSERT( ready() ); 1757 return !empty() 1758 ? _Base_type::operator[](_Base_type::size() - 1) 1759 : __unmatched_sub<_Bi_iter>(); 1760 } 1761 1762 /** 1763 * @brief Gets an iterator to the start of the %sub_match collection. 1764 */ 1765 const_iterator 1766 begin() const 1767 { return _Base_type::begin(); } 1768 1769 /** 1770 * @brief Gets an iterator to the start of the %sub_match collection. 1771 */ 1772 const_iterator 1773 cbegin() const 1774 { return this->begin(); } 1775 1776 /** 1777 * @brief Gets an iterator to one-past-the-end of the collection. 1778 */ 1779 const_iterator 1780 end() const 1781 { return _Base_type::end() - 2; } 1782 1783 /** 1784 * @brief Gets an iterator to one-past-the-end of the collection. 1785 */ 1786 const_iterator 1787 cend() const 1788 { return this->end(); } 1789 1790 //@} 1791 1792 /** 1793 * @name 10.4 Formatting 1794 * 1795 * These functions perform formatted substitution of the matched 1796 * character sequences into their target. The format specifiers and 1797 * escape sequences accepted by these functions are determined by 1798 * their @p flags parameter as documented above. 1799 */ 1800 //@{ 1801 1802 /** 1803 * @pre ready() == true 1804 */ 1805 template<typename _Out_iter> 1806 _Out_iter 1807 format(_Out_iter __out, const char_type* __fmt_first, 1808 const char_type* __fmt_last, 1809 match_flag_type __flags = regex_constants::format_default) const; 1810 1811 /** 1812 * @pre ready() == true 1813 */ 1814 template<typename _Out_iter, typename _St, typename _Sa> 1815 _Out_iter 1816 format(_Out_iter __out, const basic_string<char_type, _St, _Sa>& __fmt, 1817 match_flag_type __flags = regex_constants::format_default) const 1818 { 1819 return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), 1820 __flags); 1821 } 1822 1823 /** 1824 * @pre ready() == true 1825 */ 1826 template<typename _St, typename _Sa> 1827 basic_string<char_type, _St, _Sa> 1828 format(const basic_string<char_type, _St, _Sa>& __fmt, 1829 match_flag_type __flags = regex_constants::format_default) const 1830 { 1831 basic_string<char_type, _St, _Sa> __result; 1832 format(std::back_inserter(__result), __fmt, __flags); 1833 return __result; 1834 } 1835 1836 /** 1837 * @pre ready() == true 1838 */ 1839 string_type 1840 format(const char_type* __fmt, 1841 match_flag_type __flags = regex_constants::format_default) const 1842 { 1843 string_type __result; 1844 format(std::back_inserter(__result), 1845 __fmt, 1846 __fmt + char_traits<char_type>::length(__fmt), 1847 __flags); 1848 return __result; 1849 } 1850 1851 //@} 1852 1853 /** 1854 * @name 10.5 Allocator 1855 */ 1856 //@{ 1857 1858 /** 1859 * @brief Gets a copy of the allocator. 1860 */ 1861 allocator_type 1862 get_allocator() const 1863 { return _Base_type::get_allocator(); } 1864 1865 //@} 1866 1867 /** 1868 * @name 10.6 Swap 1869 */ 1870 //@{ 1871 1872 /** 1873 * @brief Swaps the contents of two match_results. 1874 */ 1875 void 1876 swap(match_results& __that) 1877 { 1878 using std::swap; 1879 _Base_type::swap(__that); 1880 swap(_M_begin, __that._M_begin); 1881 } 1882 //@} 1883 1884 private: 1885 template<typename, typename, typename, bool> 1886 friend class __detail::_Executor; 1887 1888 template<typename, typename, typename> 1889 friend class regex_iterator; 1890 1891 template<typename _Bp, typename _Ap, typename _Cp, typename _Rp, 1892 __detail::_RegexExecutorPolicy, bool> 1893 friend bool 1894 __detail::__regex_algo_impl(_Bp, _Bp, match_results<_Bp, _Ap>&, 1895 const basic_regex<_Cp, _Rp>&, 1896 regex_constants::match_flag_type); 1897 1898 _Bi_iter _M_begin; 1899 bool _M_in_iterator; 1900 }; 1901 1902 typedef match_results<const char*> cmatch; 1903 typedef match_results<string::const_iterator> smatch; 1904 #ifdef _GLIBCXX_USE_WCHAR_T 1905 typedef match_results<const wchar_t*> wcmatch; 1906 typedef match_results<wstring::const_iterator> wsmatch; 1907 #endif 1908 1909 // match_results comparisons 1910 /** 1911 * @brief Compares two match_results for equality. 1912 * @returns true if the two objects refer to the same match, 1913 * false otherwise. 1914 */ 1915 template<typename _Bi_iter, typename _Alloc> 1916 inline bool 1917 operator==(const match_results<_Bi_iter, _Alloc>& __m1, 1918 const match_results<_Bi_iter, _Alloc>& __m2) 1919 { 1920 if (__m1.ready() != __m2.ready()) 1921 return false; 1922 if (!__m1.ready()) // both are not ready 1923 return true; 1924 if (__m1.empty() != __m2.empty()) 1925 return false; 1926 if (__m1.empty()) // both are empty 1927 return true; 1928 return __m1.prefix() == __m2.prefix() 1929 && __m1.size() == __m2.size() 1930 && std::equal(__m1.begin(), __m1.end(), __m2.begin()) 1931 && __m1.suffix() == __m2.suffix(); 1932 } 1933 1934 /** 1935 * @brief Compares two match_results for inequality. 1936 * @returns true if the two objects do not refer to the same match, 1937 * false otherwise. 1938 */ 1939 template<typename _Bi_iter, class _Alloc> 1940 inline bool 1941 operator!=(const match_results<_Bi_iter, _Alloc>& __m1, 1942 const match_results<_Bi_iter, _Alloc>& __m2) 1943 { return !(__m1 == __m2); } 1944 1945 // [7.10.6] match_results swap 1946 /** 1947 * @brief Swaps two match results. 1948 * @param __lhs A match result. 1949 * @param __rhs A match result. 1950 * 1951 * The contents of the two match_results objects are swapped. 1952 */ 1953 template<typename _Bi_iter, typename _Alloc> 1954 inline void 1955 swap(match_results<_Bi_iter, _Alloc>& __lhs, 1956 match_results<_Bi_iter, _Alloc>& __rhs) 1957 { __lhs.swap(__rhs); } 1958 1959 // [7.11.2] Function template regex_match 1960 /** 1961 * @name Matching, Searching, and Replacing 1962 */ 1963 //@{ 1964 1965 /** 1966 * @brief Determines if there is a match between the regular expression @p e 1967 * and all of the character sequence [first, last). 1968 * 1969 * @param __s Start of the character sequence to match. 1970 * @param __e One-past-the-end of the character sequence to match. 1971 * @param __m The match results. 1972 * @param __re The regular expression. 1973 * @param __flags Controls how the regular expression is matched. 1974 * 1975 * @retval true A match exists. 1976 * @retval false Otherwise. 1977 * 1978 * @throws an exception of type regex_error. 1979 */ 1980 template<typename _Bi_iter, typename _Alloc, 1981 typename _Ch_type, typename _Rx_traits> 1982 inline bool 1983 regex_match(_Bi_iter __s, 1984 _Bi_iter __e, 1985 match_results<_Bi_iter, _Alloc>& __m, 1986 const basic_regex<_Ch_type, _Rx_traits>& __re, 1987 regex_constants::match_flag_type __flags 1988 = regex_constants::match_default) 1989 { 1990 return __detail::__regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, 1991 __detail::_RegexExecutorPolicy::_S_auto, true> 1992 (__s, __e, __m, __re, __flags); 1993 } 1994 1995 /** 1996 * @brief Indicates if there is a match between the regular expression @p e 1997 * and all of the character sequence [first, last). 1998 * 1999 * @param __first Beginning of the character sequence to match. 2000 * @param __last One-past-the-end of the character sequence to match. 2001 * @param __re The regular expression. 2002 * @param __flags Controls how the regular expression is matched. 2003 * 2004 * @retval true A match exists. 2005 * @retval false Otherwise. 2006 * 2007 * @throws an exception of type regex_error. 2008 */ 2009 template<typename _Bi_iter, typename _Ch_type, typename _Rx_traits> 2010 inline bool 2011 regex_match(_Bi_iter __first, _Bi_iter __last, 2012 const basic_regex<_Ch_type, _Rx_traits>& __re, 2013 regex_constants::match_flag_type __flags 2014 = regex_constants::match_default) 2015 { 2016 match_results<_Bi_iter> __what; 2017 return regex_match(__first, __last, __what, __re, __flags); 2018 } 2019 2020 /** 2021 * @brief Determines if there is a match between the regular expression @p e 2022 * and a C-style null-terminated string. 2023 * 2024 * @param __s The C-style null-terminated string to match. 2025 * @param __m The match results. 2026 * @param __re The regular expression. 2027 * @param __f Controls how the regular expression is matched. 2028 * 2029 * @retval true A match exists. 2030 * @retval false Otherwise. 2031 * 2032 * @throws an exception of type regex_error. 2033 */ 2034 template<typename _Ch_type, typename _Alloc, typename _Rx_traits> 2035 inline bool 2036 regex_match(const _Ch_type* __s, 2037 match_results<const _Ch_type*, _Alloc>& __m, 2038 const basic_regex<_Ch_type, _Rx_traits>& __re, 2039 regex_constants::match_flag_type __f 2040 = regex_constants::match_default) 2041 { return regex_match(__s, __s + _Rx_traits::length(__s), __m, __re, __f); } 2042 2043 /** 2044 * @brief Determines if there is a match between the regular expression @p e 2045 * and a string. 2046 * 2047 * @param __s The string to match. 2048 * @param __m The match results. 2049 * @param __re The regular expression. 2050 * @param __flags Controls how the regular expression is matched. 2051 * 2052 * @retval true A match exists. 2053 * @retval false Otherwise. 2054 * 2055 * @throws an exception of type regex_error. 2056 */ 2057 template<typename _Ch_traits, typename _Ch_alloc, 2058 typename _Alloc, typename _Ch_type, typename _Rx_traits> 2059 inline bool 2060 regex_match(const basic_string<_Ch_type, _Ch_traits, _Ch_alloc>& __s, 2061 match_results<typename basic_string<_Ch_type, 2062 _Ch_traits, _Ch_alloc>::const_iterator, _Alloc>& __m, 2063 const basic_regex<_Ch_type, _Rx_traits>& __re, 2064 regex_constants::match_flag_type __flags 2065 = regex_constants::match_default) 2066 { return regex_match(__s.begin(), __s.end(), __m, __re, __flags); } 2067 2068 /** 2069 * @brief Indicates if there is a match between the regular expression @p e 2070 * and a C-style null-terminated string. 2071 * 2072 * @param __s The C-style null-terminated string to match. 2073 * @param __re The regular expression. 2074 * @param __f Controls how the regular expression is matched. 2075 * 2076 * @retval true A match exists. 2077 * @retval false Otherwise. 2078 * 2079 * @throws an exception of type regex_error. 2080 */ 2081 template<typename _Ch_type, class _Rx_traits> 2082 inline bool 2083 regex_match(const _Ch_type* __s, 2084 const basic_regex<_Ch_type, _Rx_traits>& __re, 2085 regex_constants::match_flag_type __f 2086 = regex_constants::match_default) 2087 { return regex_match(__s, __s + _Rx_traits::length(__s), __re, __f); } 2088 2089 /** 2090 * @brief Indicates if there is a match between the regular expression @p e 2091 * and a string. 2092 * 2093 * @param __s [IN] The string to match. 2094 * @param __re [IN] The regular expression. 2095 * @param __flags [IN] Controls how the regular expression is matched. 2096 * 2097 * @retval true A match exists. 2098 * @retval false Otherwise. 2099 * 2100 * @throws an exception of type regex_error. 2101 */ 2102 template<typename _Ch_traits, typename _Str_allocator, 2103 typename _Ch_type, typename _Rx_traits> 2104 inline bool 2105 regex_match(const basic_string<_Ch_type, _Ch_traits, _Str_allocator>& __s, 2106 const basic_regex<_Ch_type, _Rx_traits>& __re, 2107 regex_constants::match_flag_type __flags 2108 = regex_constants::match_default) 2109 { return regex_match(__s.begin(), __s.end(), __re, __flags); } 2110 2111 // [7.11.3] Function template regex_search 2112 /** 2113 * Searches for a regular expression within a range. 2114 * @param __s [IN] The start of the string to search. 2115 * @param __e [IN] One-past-the-end of the string to search. 2116 * @param __m [OUT] The match results. 2117 * @param __re [IN] The regular expression to search for. 2118 * @param __flags [IN] Search policy flags. 2119 * @retval true A match was found within the string. 2120 * @retval false No match was found within the string, the content of %m is 2121 * undefined. 2122 * 2123 * @throws an exception of type regex_error. 2124 */ 2125 template<typename _Bi_iter, typename _Alloc, 2126 typename _Ch_type, typename _Rx_traits> 2127 inline bool 2128 regex_search(_Bi_iter __s, _Bi_iter __e, 2129 match_results<_Bi_iter, _Alloc>& __m, 2130 const basic_regex<_Ch_type, _Rx_traits>& __re, 2131 regex_constants::match_flag_type __flags 2132 = regex_constants::match_default) 2133 { 2134 return __detail::__regex_algo_impl<_Bi_iter, _Alloc, _Ch_type, _Rx_traits, 2135 __detail::_RegexExecutorPolicy::_S_auto, false> 2136 (__s, __e, __m, __re, __flags); 2137 } 2138 2139 /** 2140 * Searches for a regular expression within a range. 2141 * @param __first [IN] The start of the string to search. 2142 * @param __last [IN] One-past-the-end of the string to search. 2143 * @param __re [IN] The regular expression to search for. 2144 * @param __flags [IN] Search policy flags. 2145 * @retval true A match was found within the string. 2146 * @retval false No match was found within the string. 2147 * 2148 * @throws an exception of type regex_error. 2149 */ 2150 template<typename _Bi_iter, typename _Ch_type, typename _Rx_traits> 2151 inline bool 2152 regex_search(_Bi_iter __first, _Bi_iter __last, 2153 const basic_regex<_Ch_type, _Rx_traits>& __re, 2154 regex_constants::match_flag_type __flags 2155 = regex_constants::match_default) 2156 { 2157 match_results<_Bi_iter> __what; 2158 return regex_search(__first, __last, __what, __re, __flags); 2159 } 2160 2161 /** 2162 * @brief Searches for a regular expression within a C-string. 2163 * @param __s [IN] A C-string to search for the regex. 2164 * @param __m [OUT] The set of regex matches. 2165 * @param __e [IN] The regex to search for in @p s. 2166 * @param __f [IN] The search flags. 2167 * @retval true A match was found within the string. 2168 * @retval false No match was found within the string, the content of %m is 2169 * undefined. 2170 * 2171 * @throws an exception of type regex_error. 2172 */ 2173 template<typename _Ch_type, class _Alloc, class _Rx_traits> 2174 inline bool 2175 regex_search(const _Ch_type* __s, 2176 match_results<const _Ch_type*, _Alloc>& __m, 2177 const basic_regex<_Ch_type, _Rx_traits>& __e, 2178 regex_constants::match_flag_type __f 2179 = regex_constants::match_default) 2180 { return regex_search(__s, __s + _Rx_traits::length(__s), __m, __e, __f); } 2181 2182 /** 2183 * @brief Searches for a regular expression within a C-string. 2184 * @param __s [IN] The C-string to search. 2185 * @param __e [IN] The regular expression to search for. 2186 * @param __f [IN] Search policy flags. 2187 * @retval true A match was found within the string. 2188 * @retval false No match was found within the string. 2189 * 2190 * @throws an exception of type regex_error. 2191 */ 2192 template<typename _Ch_type, typename _Rx_traits> 2193 inline bool 2194 regex_search(const _Ch_type* __s, 2195 const basic_regex<_Ch_type, _Rx_traits>& __e, 2196 regex_constants::match_flag_type __f 2197 = regex_constants::match_default) 2198 { return regex_search(__s, __s + _Rx_traits::length(__s), __e, __f); } 2199 2200 /** 2201 * @brief Searches for a regular expression within a string. 2202 * @param __s [IN] The string to search. 2203 * @param __e [IN] The regular expression to search for. 2204 * @param __flags [IN] Search policy flags. 2205 * @retval true A match was found within the string. 2206 * @retval false No match was found within the string. 2207 * 2208 * @throws an exception of type regex_error. 2209 */ 2210 template<typename _Ch_traits, typename _String_allocator, 2211 typename _Ch_type, typename _Rx_traits> 2212 inline bool 2213 regex_search(const basic_string<_Ch_type, _Ch_traits, 2214 _String_allocator>& __s, 2215 const basic_regex<_Ch_type, _Rx_traits>& __e, 2216 regex_constants::match_flag_type __flags 2217 = regex_constants::match_default) 2218 { return regex_search(__s.begin(), __s.end(), __e, __flags); } 2219 2220 /** 2221 * @brief Searches for a regular expression within a string. 2222 * @param __s [IN] A C++ string to search for the regex. 2223 * @param __m [OUT] The set of regex matches. 2224 * @param __e [IN] The regex to search for in @p s. 2225 * @param __f [IN] The search flags. 2226 * @retval true A match was found within the string. 2227 * @retval false No match was found within the string, the content of %m is 2228 * undefined. 2229 * 2230 * @throws an exception of type regex_error. 2231 */ 2232 template<typename _Ch_traits, typename _Ch_alloc, 2233 typename _Alloc, typename _Ch_type, 2234 typename _Rx_traits> 2235 inline bool 2236 regex_search(const basic_string<_Ch_type, _Ch_traits, _Ch_alloc>& __s, 2237 match_results<typename basic_string<_Ch_type, 2238 _Ch_traits, _Ch_alloc>::const_iterator, _Alloc>& __m, 2239 const basic_regex<_Ch_type, _Rx_traits>& __e, 2240 regex_constants::match_flag_type __f 2241 = regex_constants::match_default) 2242 { return regex_search(__s.begin(), __s.end(), __m, __e, __f); } 2243 2244 // std [28.11.4] Function template regex_replace 2245 /** 2246 * @brief Search for a regular expression within a range for multiple times, 2247 and replace the matched parts through filling a format string. 2248 * @param __out [OUT] The output iterator. 2249 * @param __first [IN] The start of the string to search. 2250 * @param __last [IN] One-past-the-end of the string to search. 2251 * @param __e [IN] The regular expression to search for. 2252 * @param __fmt [IN] The format string. 2253 * @param __flags [IN] Search and replace policy flags. 2254 * 2255 * @returns __out 2256 * @throws an exception of type regex_error. 2257 */ 2258 template<typename _Out_iter, typename _Bi_iter, 2259 typename _Rx_traits, typename _Ch_type, 2260 typename _St, typename _Sa> 2261 inline _Out_iter 2262 regex_replace(_Out_iter __out, _Bi_iter __first, _Bi_iter __last, 2263 const basic_regex<_Ch_type, _Rx_traits>& __e, 2264 const basic_string<_Ch_type, _St, _Sa>& __fmt, 2265 regex_constants::match_flag_type __flags 2266 = regex_constants::match_default) 2267 { 2268 return regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags); 2269 } 2270 2271 /** 2272 * @brief Search for a regular expression within a range for multiple times, 2273 and replace the matched parts through filling a format C-string. 2274 * @param __out [OUT] The output iterator. 2275 * @param __first [IN] The start of the string to search. 2276 * @param __last [IN] One-past-the-end of the string to search. 2277 * @param __e [IN] The regular expression to search for. 2278 * @param __fmt [IN] The format C-string. 2279 * @param __flags [IN] Search and replace policy flags. 2280 * 2281 * @returns __out 2282 * @throws an exception of type regex_error. 2283 */ 2284 template<typename _Out_iter, typename _Bi_iter, 2285 typename _Rx_traits, typename _Ch_type> 2286 _Out_iter 2287 regex_replace(_Out_iter __out, _Bi_iter __first, _Bi_iter __last, 2288 const basic_regex<_Ch_type, _Rx_traits>& __e, 2289 const _Ch_type* __fmt, 2290 regex_constants::match_flag_type __flags 2291 = regex_constants::match_default); 2292 2293 /** 2294 * @brief Search for a regular expression within a string for multiple times, 2295 and replace the matched parts through filling a format string. 2296 * @param __s [IN] The string to search and replace. 2297 * @param __e [IN] The regular expression to search for. 2298 * @param __fmt [IN] The format string. 2299 * @param __flags [IN] Search and replace policy flags. 2300 * 2301 * @returns The string after replacing. 2302 * @throws an exception of type regex_error. 2303 */ 2304 template<typename _Rx_traits, typename _Ch_type, 2305 typename _St, typename _Sa, typename _Fst, typename _Fsa> 2306 inline basic_string<_Ch_type, _St, _Sa> 2307 regex_replace(const basic_string<_Ch_type, _St, _Sa>& __s, 2308 const basic_regex<_Ch_type, _Rx_traits>& __e, 2309 const basic_string<_Ch_type, _Fst, _Fsa>& __fmt, 2310 regex_constants::match_flag_type __flags 2311 = regex_constants::match_default) 2312 { 2313 basic_string<_Ch_type, _St, _Sa> __result; 2314 regex_replace(std::back_inserter(__result), 2315 __s.begin(), __s.end(), __e, __fmt, __flags); 2316 return __result; 2317 } 2318 2319 /** 2320 * @brief Search for a regular expression within a string for multiple times, 2321 and replace the matched parts through filling a format C-string. 2322 * @param __s [IN] The string to search and replace. 2323 * @param __e [IN] The regular expression to search for. 2324 * @param __fmt [IN] The format C-string. 2325 * @param __flags [IN] Search and replace policy flags. 2326 * 2327 * @returns The string after replacing. 2328 * @throws an exception of type regex_error. 2329 */ 2330 template<typename _Rx_traits, typename _Ch_type, 2331 typename _St, typename _Sa> 2332 inline basic_string<_Ch_type, _St, _Sa> 2333 regex_replace(const basic_string<_Ch_type, _St, _Sa>& __s, 2334 const basic_regex<_Ch_type, _Rx_traits>& __e, 2335 const _Ch_type* __fmt, 2336 regex_constants::match_flag_type __flags 2337 = regex_constants::match_default) 2338 { 2339 basic_string<_Ch_type, _St, _Sa> __result; 2340 regex_replace(std::back_inserter(__result), 2341 __s.begin(), __s.end(), __e, __fmt, __flags); 2342 return __result; 2343 } 2344 2345 /** 2346 * @brief Search for a regular expression within a C-string for multiple 2347 times, and replace the matched parts through filling a format string. 2348 * @param __s [IN] The C-string to search and replace. 2349 * @param __e [IN] The regular expression to search for. 2350 * @param __fmt [IN] The format string. 2351 * @param __flags [IN] Search and replace policy flags. 2352 * 2353 * @returns The string after replacing. 2354 * @throws an exception of type regex_error. 2355 */ 2356 template<typename _Rx_traits, typename _Ch_type, 2357 typename _St, typename _Sa> 2358 inline basic_string<_Ch_type> 2359 regex_replace(const _Ch_type* __s, 2360 const basic_regex<_Ch_type, _Rx_traits>& __e, 2361 const basic_string<_Ch_type, _St, _Sa>& __fmt, 2362 regex_constants::match_flag_type __flags 2363 = regex_constants::match_default) 2364 { 2365 basic_string<_Ch_type> __result; 2366 regex_replace(std::back_inserter(__result), __s, 2367 __s + char_traits<_Ch_type>::length(__s), 2368 __e, __fmt, __flags); 2369 return __result; 2370 } 2371 2372 /** 2373 * @brief Search for a regular expression within a C-string for multiple 2374 times, and replace the matched parts through filling a format C-string. 2375 * @param __s [IN] The C-string to search and replace. 2376 * @param __e [IN] The regular expression to search for. 2377 * @param __fmt [IN] The format C-string. 2378 * @param __flags [IN] Search and replace policy flags. 2379 * 2380 * @returns The string after replacing. 2381 * @throws an exception of type regex_error. 2382 */ 2383 template<typename _Rx_traits, typename _Ch_type> 2384 inline basic_string<_Ch_type> 2385 regex_replace(const _Ch_type* __s, 2386 const basic_regex<_Ch_type, _Rx_traits>& __e, 2387 const _Ch_type* __fmt, 2388 regex_constants::match_flag_type __flags 2389 = regex_constants::match_default) 2390 { 2391 basic_string<_Ch_type> __result; 2392 regex_replace(std::back_inserter(__result), __s, 2393 __s + char_traits<_Ch_type>::length(__s), 2394 __e, __fmt, __flags); 2395 return __result; 2396 } 2397 2398 //@} 2399 2400 // std [28.12] Class template regex_iterator 2401 /** 2402 * An iterator adaptor that will provide repeated calls of regex_search over 2403 * a range until no more matches remain. 2404 */ 2405 template<typename _Bi_iter, 2406 typename _Ch_type = typename iterator_traits<_Bi_iter>::value_type, 2407 typename _Rx_traits = regex_traits<_Ch_type> > 2408 class regex_iterator 2409 { 2410 public: 2411 typedef basic_regex<_Ch_type, _Rx_traits> regex_type; 2412 typedef match_results<_Bi_iter> value_type; 2413 typedef std::ptrdiff_t difference_type; 2414 typedef const value_type* pointer; 2415 typedef const value_type& reference; 2416 typedef std::forward_iterator_tag iterator_category; 2417 2418 /** 2419 * @brief Provides a singular iterator, useful for indicating 2420 * one-past-the-end of a range. 2421 */ 2422 regex_iterator() 2423 : _M_match() 2424 { } 2425 2426 /** 2427 * Constructs a %regex_iterator... 2428 * @param __a [IN] The start of a text range to search. 2429 * @param __b [IN] One-past-the-end of the text range to search. 2430 * @param __re [IN] The regular expression to match. 2431 * @param __m [IN] Policy flags for match rules. 2432 */ 2433 regex_iterator(_Bi_iter __a, _Bi_iter __b, const regex_type& __re, 2434 regex_constants::match_flag_type __m 2435 = regex_constants::match_default) 2436 : _M_begin(__a), _M_end(__b), _M_pregex(&__re), _M_flags(__m), _M_match() 2437 { 2438 if (!regex_search(_M_begin, _M_end, _M_match, *_M_pregex, _M_flags)) 2439 *this = regex_iterator(); 2440 } 2441 2442 /** 2443 * Copy constructs a %regex_iterator. 2444 */ 2445 regex_iterator(const regex_iterator& __rhs) = default; 2446 2447 /** 2448 * @brief Assigns one %regex_iterator to another. 2449 */ 2450 regex_iterator& 2451 operator=(const regex_iterator& __rhs) = default; 2452 2453 /** 2454 * @brief Tests the equivalence of two regex iterators. 2455 */ 2456 bool 2457 operator==(const regex_iterator& __rhs) const; 2458 2459 /** 2460 * @brief Tests the inequivalence of two regex iterators. 2461 */ 2462 bool 2463 operator!=(const regex_iterator& __rhs) const 2464 { return !(*this == __rhs); } 2465 2466 /** 2467 * @brief Dereferences a %regex_iterator. 2468 */ 2469 const value_type& 2470 operator*() const 2471 { return _M_match; } 2472 2473 /** 2474 * @brief Selects a %regex_iterator member. 2475 */ 2476 const value_type* 2477 operator->() const 2478 { return &_M_match; } 2479 2480 /** 2481 * @brief Increments a %regex_iterator. 2482 */ 2483 regex_iterator& 2484 operator++(); 2485 2486 /** 2487 * @brief Postincrements a %regex_iterator. 2488 */ 2489 regex_iterator 2490 operator++(int) 2491 { 2492 auto __tmp = *this; 2493 ++(*this); 2494 return __tmp; 2495 } 2496 2497 private: 2498 _Bi_iter _M_begin; 2499 _Bi_iter _M_end; 2500 const regex_type* _M_pregex; 2501 regex_constants::match_flag_type _M_flags; 2502 match_results<_Bi_iter> _M_match; 2503 }; 2504 2505 typedef regex_iterator<const char*> cregex_iterator; 2506 typedef regex_iterator<string::const_iterator> sregex_iterator; 2507 #ifdef _GLIBCXX_USE_WCHAR_T 2508 typedef regex_iterator<const wchar_t*> wcregex_iterator; 2509 typedef regex_iterator<wstring::const_iterator> wsregex_iterator; 2510 #endif 2511 2512 // [7.12.2] Class template regex_token_iterator 2513 /** 2514 * Iterates over submatches in a range (or @a splits a text string). 2515 * 2516 * The purpose of this iterator is to enumerate all, or all specified, 2517 * matches of a regular expression within a text range. The dereferenced 2518 * value of an iterator of this class is a std::sub_match object. 2519 */ 2520 template<typename _Bi_iter, 2521 typename _Ch_type = typename iterator_traits<_Bi_iter>::value_type, 2522 typename _Rx_traits = regex_traits<_Ch_type> > 2523 class regex_token_iterator 2524 { 2525 public: 2526 typedef basic_regex<_Ch_type, _Rx_traits> regex_type; 2527 typedef sub_match<_Bi_iter> value_type; 2528 typedef std::ptrdiff_t difference_type; 2529 typedef const value_type* pointer; 2530 typedef const value_type& reference; 2531 typedef std::forward_iterator_tag iterator_category; 2532 2533 public: 2534 /** 2535 * @brief Default constructs a %regex_token_iterator. 2536 * 2537 * A default-constructed %regex_token_iterator is a singular iterator 2538 * that will compare equal to the one-past-the-end value for any 2539 * iterator of the same type. 2540 */ 2541 regex_token_iterator() 2542 : _M_position(), _M_subs(), _M_suffix(), _M_n(0), _M_result(nullptr), 2543 _M_has_m1(false) 2544 { } 2545 2546 /** 2547 * Constructs a %regex_token_iterator... 2548 * @param __a [IN] The start of the text to search. 2549 * @param __b [IN] One-past-the-end of the text to search. 2550 * @param __re [IN] The regular expression to search for. 2551 * @param __submatch [IN] Which submatch to return. There are some 2552 * special values for this parameter: 2553 * - -1 each enumerated subexpression does NOT 2554 * match the regular expression (aka field 2555 * splitting) 2556 * - 0 the entire string matching the 2557 * subexpression is returned for each match 2558 * within the text. 2559 * - >0 enumerates only the indicated 2560 * subexpression from a match within the text. 2561 * @param __m [IN] Policy flags for match rules. 2562 */ 2563 regex_token_iterator(_Bi_iter __a, _Bi_iter __b, const regex_type& __re, 2564 int __submatch = 0, 2565 regex_constants::match_flag_type __m 2566 = regex_constants::match_default) 2567 : _M_position(__a, __b, __re, __m), _M_subs(1, __submatch), _M_n(0) 2568 { _M_init(__a, __b); } 2569 2570 /** 2571 * Constructs a %regex_token_iterator... 2572 * @param __a [IN] The start of the text to search. 2573 * @param __b [IN] One-past-the-end of the text to search. 2574 * @param __re [IN] The regular expression to search for. 2575 * @param __submatches [IN] A list of subexpressions to return for each 2576 * regular expression match within the text. 2577 * @param __m [IN] Policy flags for match rules. 2578 */ 2579 regex_token_iterator(_Bi_iter __a, _Bi_iter __b, 2580 const regex_type& __re, 2581 const std::vector<int>& __submatches, 2582 regex_constants::match_flag_type __m 2583 = regex_constants::match_default) 2584 : _M_position(__a, __b, __re, __m), _M_subs(__submatches), _M_n(0) 2585 { _M_init(__a, __b); } 2586 2587 /** 2588 * Constructs a %regex_token_iterator... 2589 * @param __a [IN] The start of the text to search. 2590 * @param __b [IN] One-past-the-end of the text to search. 2591 * @param __re [IN] The regular expression to search for. 2592 * @param __submatches [IN] A list of subexpressions to return for each 2593 * regular expression match within the text. 2594 * @param __m [IN] Policy flags for match rules. 2595 */ 2596 regex_token_iterator(_Bi_iter __a, _Bi_iter __b, 2597 const regex_type& __re, 2598 initializer_list<int> __submatches, 2599 regex_constants::match_flag_type __m 2600 = regex_constants::match_default) 2601 : _M_position(__a, __b, __re, __m), _M_subs(__submatches), _M_n(0) 2602 { _M_init(__a, __b); } 2603 2604 /** 2605 * Constructs a %regex_token_iterator... 2606 * @param __a [IN] The start of the text to search. 2607 * @param __b [IN] One-past-the-end of the text to search. 2608 * @param __re [IN] The regular expression to search for. 2609 * @param __submatches [IN] A list of subexpressions to return for each 2610 * regular expression match within the text. 2611 * @param __m [IN] Policy flags for match rules. 2612 */ 2613 template<std::size_t _Nm> 2614 regex_token_iterator(_Bi_iter __a, _Bi_iter __b, 2615 const regex_type& __re, 2616 const int (&__submatches)[_Nm], 2617 regex_constants::match_flag_type __m 2618 = regex_constants::match_default) 2619 : _M_position(__a, __b, __re, __m), 2620 _M_subs(__submatches, __submatches + _Nm), _M_n(0) 2621 { _M_init(__a, __b); } 2622 2623 /** 2624 * @brief Copy constructs a %regex_token_iterator. 2625 * @param __rhs [IN] A %regex_token_iterator to copy. 2626 */ 2627 regex_token_iterator(const regex_token_iterator& __rhs) 2628 : _M_position(__rhs._M_position), _M_subs(__rhs._M_subs), 2629 _M_suffix(__rhs._M_suffix), _M_n(__rhs._M_n), _M_has_m1(__rhs._M_has_m1) 2630 { _M_normalize_result(); } 2631 2632 /** 2633 * @brief Assigns a %regex_token_iterator to another. 2634 * @param __rhs [IN] A %regex_token_iterator to copy. 2635 */ 2636 regex_token_iterator& 2637 operator=(const regex_token_iterator& __rhs); 2638 2639 /** 2640 * @brief Compares a %regex_token_iterator to another for equality. 2641 */ 2642 bool 2643 operator==(const regex_token_iterator& __rhs) const; 2644 2645 /** 2646 * @brief Compares a %regex_token_iterator to another for inequality. 2647 */ 2648 bool 2649 operator!=(const regex_token_iterator& __rhs) const 2650 { return !(*this == __rhs); } 2651 2652 /** 2653 * @brief Dereferences a %regex_token_iterator. 2654 */ 2655 const value_type& 2656 operator*() const 2657 { return *_M_result; } 2658 2659 /** 2660 * @brief Selects a %regex_token_iterator member. 2661 */ 2662 const value_type* 2663 operator->() const 2664 { return _M_result; } 2665 2666 /** 2667 * @brief Increments a %regex_token_iterator. 2668 */ 2669 regex_token_iterator& 2670 operator++(); 2671 2672 /** 2673 * @brief Postincrements a %regex_token_iterator. 2674 */ 2675 regex_token_iterator 2676 operator++(int) 2677 { 2678 auto __tmp = *this; 2679 ++(*this); 2680 return __tmp; 2681 } 2682 2683 private: 2684 typedef regex_iterator<_Bi_iter, _Ch_type, _Rx_traits> _Position; 2685 2686 void 2687 _M_init(_Bi_iter __a, _Bi_iter __b); 2688 2689 const value_type& 2690 _M_current_match() const 2691 { 2692 if (_M_subs[_M_n] == -1) 2693 return (*_M_position).prefix(); 2694 else 2695 return (*_M_position)[_M_subs[_M_n]]; 2696 } 2697 2698 constexpr bool 2699 _M_end_of_seq() const 2700 { return _M_result == nullptr; } 2701 2702 // [28.12.2.2.4] 2703 void 2704 _M_normalize_result() 2705 { 2706 if (_M_position != _Position()) 2707 _M_result = &_M_current_match(); 2708 else if (_M_has_m1) 2709 _M_result = &_M_suffix; 2710 else 2711 _M_result = nullptr; 2712 } 2713 2714 _Position _M_position; 2715 std::vector<int> _M_subs; 2716 value_type _M_suffix; 2717 std::size_t _M_n; 2718 const value_type* _M_result; 2719 2720 // Show whether _M_subs contains -1 2721 bool _M_has_m1; 2722 }; 2723 2724 /** @brief Token iterator for C-style NULL-terminated strings. */ 2725 typedef regex_token_iterator<const char*> cregex_token_iterator; 2726 2727 /** @brief Token iterator for standard strings. */ 2728 typedef regex_token_iterator<string::const_iterator> sregex_token_iterator; 2729 2730 #ifdef _GLIBCXX_USE_WCHAR_T 2731 /** @brief Token iterator for C-style NULL-terminated wide strings. */ 2732 typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator; 2733 2734 /** @brief Token iterator for standard wide-character strings. */ 2735 typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator; 2736 #endif 2737 2738 //@} // group regex 2739 _GLIBCXX_END_NAMESPACE_VERSION 2740 } // namespace 2741 2742 #include <bits/regex.tcc> 2743