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