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