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