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