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