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