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