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