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