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