2 //===----------------------------------------------------------------------===//
4 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5 // See https://llvm.org/LICENSE.txt for license information.
6 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8 //===----------------------------------------------------------------------===//
17 #include <initializer_list>
22 namespace regex_constants
25 enum syntax_option_type
29 optimize = unspecified,
30 collate = unspecified,
31 ECMAScript = unspecified,
33 extended = unspecified,
37 multiline = unspecified
40 constexpr syntax_option_type operator~(syntax_option_type f);
41 constexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs);
42 constexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs);
47 match_not_bol = unspecified,
48 match_not_eol = unspecified,
49 match_not_bow = unspecified,
50 match_not_eow = unspecified,
51 match_any = unspecified,
52 match_not_null = unspecified,
53 match_continuous = unspecified,
54 match_prev_avail = unspecified,
56 format_sed = unspecified,
57 format_no_copy = unspecified,
58 format_first_only = unspecified
61 constexpr match_flag_type operator~(match_flag_type f);
62 constexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs);
63 constexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs);
67 error_collate = unspecified,
68 error_ctype = unspecified,
69 error_escape = unspecified,
70 error_backref = unspecified,
71 error_brack = unspecified,
72 error_paren = unspecified,
73 error_brace = unspecified,
74 error_badbrace = unspecified,
75 error_range = unspecified,
76 error_space = unspecified,
77 error_badrepeat = unspecified,
78 error_complexity = unspecified,
79 error_stack = unspecified
85 : public runtime_error
88 explicit regex_error(regex_constants::error_type ecode);
89 regex_constants::error_type code() const;
92 template <class charT>
96 typedef charT char_type;
97 typedef basic_string<char_type> string_type;
98 typedef locale locale_type;
99 typedef /bitmask_type/ char_class_type;
103 static size_t length(const char_type* p);
104 charT translate(charT c) const;
105 charT translate_nocase(charT c) const;
106 template <class ForwardIterator>
108 transform(ForwardIterator first, ForwardIterator last) const;
109 template <class ForwardIterator>
111 transform_primary( ForwardIterator first, ForwardIterator last) const;
112 template <class ForwardIterator>
114 lookup_collatename(ForwardIterator first, ForwardIterator last) const;
115 template <class ForwardIterator>
117 lookup_classname(ForwardIterator first, ForwardIterator last,
118 bool icase = false) const;
119 bool isctype(charT c, char_class_type f) const;
120 int value(charT ch, int radix) const;
121 locale_type imbue(locale_type l);
122 locale_type getloc()const;
125 template <class charT, class traits = regex_traits<charT>>
130 typedef charT value_type;
131 typedef traits traits_type;
132 typedef typename traits::string_type string_type;
133 typedef regex_constants::syntax_option_type flag_type;
134 typedef typename traits::locale_type locale_type;
137 static constexpr regex_constants::syntax_option_type icase = regex_constants::icase;
138 static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
139 static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize;
140 static constexpr regex_constants::syntax_option_type collate = regex_constants::collate;
141 static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
142 static constexpr regex_constants::syntax_option_type basic = regex_constants::basic;
143 static constexpr regex_constants::syntax_option_type extended = regex_constants::extended;
144 static constexpr regex_constants::syntax_option_type awk = regex_constants::awk;
145 static constexpr regex_constants::syntax_option_type grep = regex_constants::grep;
146 static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep;
147 static constexpr regex_constants::syntax_option_type multiline = regex_constants::multiline;
149 // construct/copy/destroy:
151 explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
152 basic_regex(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
153 basic_regex(const basic_regex&);
154 basic_regex(basic_regex&&) noexcept;
155 template <class ST, class SA>
156 explicit basic_regex(const basic_string<charT, ST, SA>& p,
157 flag_type f = regex_constants::ECMAScript);
158 template <class ForwardIterator>
159 basic_regex(ForwardIterator first, ForwardIterator last,
160 flag_type f = regex_constants::ECMAScript);
161 basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
165 basic_regex& operator=(const basic_regex&);
166 basic_regex& operator=(basic_regex&&) noexcept;
167 basic_regex& operator=(const charT* ptr);
168 basic_regex& operator=(initializer_list<charT> il);
169 template <class ST, class SA>
170 basic_regex& operator=(const basic_string<charT, ST, SA>& p);
173 basic_regex& assign(const basic_regex& that);
174 basic_regex& assign(basic_regex&& that) noexcept;
175 basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);
176 basic_regex& assign(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
177 template <class string_traits, class A>
178 basic_regex& assign(const basic_string<charT, string_traits, A>& s,
179 flag_type f = regex_constants::ECMAScript);
180 template <class InputIterator>
181 basic_regex& assign(InputIterator first, InputIterator last,
182 flag_type f = regex_constants::ECMAScript);
183 basic_regex& assign(initializer_list<charT>, flag_type f = regex_constants::ECMAScript);
186 unsigned mark_count() const;
187 flag_type flags() const;
190 locale_type imbue(locale_type loc);
191 locale_type getloc() const;
194 void swap(basic_regex&);
197 template<class ForwardIterator>
198 basic_regex(ForwardIterator, ForwardIterator,
199 regex_constants::syntax_option_type = regex_constants::ECMAScript)
200 -> basic_regex<typename iterator_traits<ForwardIterator>::value_type>; // C++17
202 typedef basic_regex<char> regex;
203 typedef basic_regex<wchar_t> wregex;
205 template <class charT, class traits>
206 void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
208 template <class BidirectionalIterator>
210 : public pair<BidirectionalIterator, BidirectionalIterator>
213 typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
214 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
215 typedef BidirectionalIterator iterator;
216 typedef basic_string<value_type> string_type;
220 constexpr sub_match();
222 difference_type length() const;
223 operator string_type() const;
224 string_type str() const;
226 int compare(const sub_match& s) const;
227 int compare(const string_type& s) const;
228 int compare(const value_type* s) const;
230 void swap(sub_match& s) noexcept(see below);
233 typedef sub_match<const char*> csub_match;
234 typedef sub_match<const wchar_t*> wcsub_match;
235 typedef sub_match<string::const_iterator> ssub_match;
236 typedef sub_match<wstring::const_iterator> wssub_match;
238 template <class BiIter>
240 operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
242 template <class BiIter>
244 operator<=>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs); // Since C++20
246 template <class BiIter> // Removed in C++20
248 operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
250 template <class BiIter> // Removed in C++20
252 operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
254 template <class BiIter> // Removed in C++20
256 operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
258 template <class BiIter> // Removed in C++20
260 operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
262 template <class BiIter> // Removed in C++20
264 operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
266 template <class BiIter, class ST, class SA> // Removed in C++20
268 operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
269 const sub_match<BiIter>& rhs);
271 template <class BiIter, class ST, class SA> // Removed in C++20
273 operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
274 const sub_match<BiIter>& rhs);
276 template <class BiIter, class ST, class SA> // Removed in C++20
278 operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
279 const sub_match<BiIter>& rhs);
281 template <class BiIter, class ST, class SA> // Removed in C++20
283 operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
284 const sub_match<BiIter>& rhs);
286 template <class BiIter, class ST, class SA> // Removed in C++20
287 bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
288 const sub_match<BiIter>& rhs);
290 template <class BiIter, class ST, class SA> // Removed in C++20
292 operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
293 const sub_match<BiIter>& rhs);
295 template <class BiIter, class ST, class SA>
297 operator==(const sub_match<BiIter>& lhs,
298 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
300 template <class BiIter, class ST, class SA> // Since C++20
302 operator<=>(const sub_match<BiIter>& lhs,
303 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
305 template <class BiIter, class ST, class SA> // Removed in C++20
307 operator!=(const sub_match<BiIter>& lhs,
308 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
310 template <class BiIter, class ST, class SA> // Removed in C++20
312 operator<(const sub_match<BiIter>& lhs,
313 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
315 template <class BiIter, class ST, class SA> // Removed in C++20
317 operator>(const sub_match<BiIter>& lhs,
318 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
320 template <class BiIter, class ST, class SA> // Removed in C++20
322 operator>=(const sub_match<BiIter>& lhs,
323 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
325 template <class BiIter, class ST, class SA> // Removed in C++20
327 operator<=(const sub_match<BiIter>& lhs,
328 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
330 template <class BiIter> // Removed in C++20
332 operator==(typename iterator_traits<BiIter>::value_type const* lhs,
333 const sub_match<BiIter>& rhs);
335 template <class BiIter> // Removed in C++20
337 operator!=(typename iterator_traits<BiIter>::value_type const* lhs,
338 const sub_match<BiIter>& rhs);
340 template <class BiIter> // Removed in C++20
342 operator<(typename iterator_traits<BiIter>::value_type const* lhs,
343 const sub_match<BiIter>& rhs);
345 template <class BiIter> // Removed in C++20
347 operator>(typename iterator_traits<BiIter>::value_type const* lhs,
348 const sub_match<BiIter>& rhs);
350 template <class BiIter> // Removed in C++20
352 operator>=(typename iterator_traits<BiIter>::value_type const* lhs,
353 const sub_match<BiIter>& rhs);
355 template <class BiIter> // Removed in C++20
357 operator<=(typename iterator_traits<BiIter>::value_type const* lhs,
358 const sub_match<BiIter>& rhs);
360 template <class BiIter>
362 operator==(const sub_match<BiIter>& lhs,
363 typename iterator_traits<BiIter>::value_type const* rhs);
365 template <class BiIter> // Since C++20
367 operator<=>(const sub_match<BiIter>& lhs,
368 typename iterator_traits<BiIter>::value_type const* rhs);
370 template <class BiIter, class ST, class SA> // Removed in C++20
372 operator!=(const sub_match<BiIter>& lhs,
373 typename iterator_traits<BiIter>::value_type const* rhs);
375 template <class BiIter> // Removed in C++20
377 operator<(const sub_match<BiIter>& lhs,
378 typename iterator_traits<BiIter>::value_type const* rhs);
380 template <class BiIter> // Removed in C++20
382 operator>(const sub_match<BiIter>& lhs,
383 typename iterator_traits<BiIter>::value_type const* rhs);
385 template <class BiIter> // Removed in C++20
387 operator>=(const sub_match<BiIter>& lhs,
388 typename iterator_traits<BiIter>::value_type const* rhs);
390 template <class BiIter> // Removed in C++20
392 operator<=(const sub_match<BiIter>& lhs,
393 typename iterator_traits<BiIter>::value_type const* rhs);
395 template <class BiIter> // Removed in C++20
397 operator==(typename iterator_traits<BiIter>::value_type const& lhs,
398 const sub_match<BiIter>& rhs);
400 template <class BiIter> // Removed in C++20
402 operator!=(typename iterator_traits<BiIter>::value_type const& lhs,
403 const sub_match<BiIter>& rhs);
405 template <class BiIter> // Removed in C++20
407 operator<(typename iterator_traits<BiIter>::value_type const& lhs,
408 const sub_match<BiIter>& rhs);
410 template <class BiIter> // Removed in C++20
412 operator>(typename iterator_traits<BiIter>::value_type const& lhs,
413 const sub_match<BiIter>& rhs);
415 template <class BiIter> // Removed in C++20
417 operator>=(typename iterator_traits<BiIter>::value_type const& lhs,
418 const sub_match<BiIter>& rhs);
420 template <class BiIter> // Removed in C++20
422 operator<=(typename iterator_traits<BiIter>::value_type const& lhs,
423 const sub_match<BiIter>& rhs);
425 template <class BiIter>
427 operator==(const sub_match<BiIter>& lhs,
428 typename iterator_traits<BiIter>::value_type const& rhs);
430 template <class BiIter> // Since C++20
432 operator<=>(const sub_match<BiIter>& lhs,
433 typename iterator_traits<BiIter>::value_type const& rhs);
435 template <class BiIter> // Removed in C++20
437 operator!=(const sub_match<BiIter>& lhs,
438 typename iterator_traits<BiIter>::value_type const& rhs);
440 template <class BiIter> // Removed in C++20
442 operator<(const sub_match<BiIter>& lhs,
443 typename iterator_traits<BiIter>::value_type const& rhs);
445 template <class BiIter> // Removed in C++20
447 operator>(const sub_match<BiIter>& lhs,
448 typename iterator_traits<BiIter>::value_type const& rhs);
450 template <class BiIter> // Removed in C++20
452 operator>=(const sub_match<BiIter>& lhs,
453 typename iterator_traits<BiIter>::value_type const& rhs);
455 template <class BiIter> // Removed in C++20
457 operator<=(const sub_match<BiIter>& lhs,
458 typename iterator_traits<BiIter>::value_type const& rhs);
460 template <class charT, class ST, class BiIter>
461 basic_ostream<charT, ST>&
462 operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
464 template <class BidirectionalIterator,
465 class Allocator = allocator<sub_match<BidirectionalIterator>>>
469 typedef sub_match<BidirectionalIterator> value_type;
470 typedef const value_type& const_reference;
471 typedef value_type& reference;
472 typedef /implementation-defined/ const_iterator;
473 typedef const_iterator iterator;
474 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
475 typedef typename allocator_traits<Allocator>::size_type size_type;
476 typedef Allocator allocator_type;
477 typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
478 typedef basic_string<char_type> string_type;
480 // construct/copy/destroy:
481 explicit match_results(const Allocator& a = Allocator()); // before C++20
482 match_results() : match_results(Allocator()) {} // C++20
483 explicit match_results(const Allocator& a); // C++20
484 match_results(const match_results& m);
485 match_results(match_results&& m) noexcept;
486 match_results& operator=(const match_results& m);
487 match_results& operator=(match_results&& m);
493 size_type size() const;
494 size_type max_size() const;
498 difference_type length(size_type sub = 0) const;
499 difference_type position(size_type sub = 0) const;
500 string_type str(size_type sub = 0) const;
501 const_reference operator[](size_type n) const;
503 const_reference prefix() const;
504 const_reference suffix() const;
506 const_iterator begin() const;
507 const_iterator end() const;
508 const_iterator cbegin() const;
509 const_iterator cend() const;
512 template <class OutputIter>
514 format(OutputIter out, const char_type* fmt_first,
515 const char_type* fmt_last,
516 regex_constants::match_flag_type flags = regex_constants::format_default) const;
517 template <class OutputIter, class ST, class SA>
519 format(OutputIter out, const basic_string<char_type, ST, SA>& fmt,
520 regex_constants::match_flag_type flags = regex_constants::format_default) const;
521 template <class ST, class SA>
522 basic_string<char_type, ST, SA>
523 format(const basic_string<char_type, ST, SA>& fmt,
524 regex_constants::match_flag_type flags = regex_constants::format_default) const;
526 format(const char_type* fmt,
527 regex_constants::match_flag_type flags = regex_constants::format_default) const;
530 allocator_type get_allocator() const;
533 void swap(match_results& that);
536 typedef match_results<const char*> cmatch;
537 typedef match_results<const wchar_t*> wcmatch;
538 typedef match_results<string::const_iterator> smatch;
539 typedef match_results<wstring::const_iterator> wsmatch;
541 template <class BidirectionalIterator, class Allocator>
543 operator==(const match_results<BidirectionalIterator, Allocator>& m1,
544 const match_results<BidirectionalIterator, Allocator>& m2);
546 template <class BidirectionalIterator, class Allocator> // Removed in C++20
548 operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
549 const match_results<BidirectionalIterator, Allocator>& m2);
551 template <class BidirectionalIterator, class Allocator>
553 swap(match_results<BidirectionalIterator, Allocator>& m1,
554 match_results<BidirectionalIterator, Allocator>& m2);
556 template <class BidirectionalIterator, class Allocator, class charT, class traits>
558 regex_match(BidirectionalIterator first, BidirectionalIterator last,
559 match_results<BidirectionalIterator, Allocator>& m,
560 const basic_regex<charT, traits>& e,
561 regex_constants::match_flag_type flags = regex_constants::match_default);
563 template <class BidirectionalIterator, class charT, class traits>
565 regex_match(BidirectionalIterator first, BidirectionalIterator last,
566 const basic_regex<charT, traits>& e,
567 regex_constants::match_flag_type flags = regex_constants::match_default);
569 template <class charT, class Allocator, class traits>
571 regex_match(const charT* str, match_results<const charT*, Allocator>& m,
572 const basic_regex<charT, traits>& e,
573 regex_constants::match_flag_type flags = regex_constants::match_default);
575 template <class ST, class SA, class Allocator, class charT, class traits>
577 regex_match(const basic_string<charT, ST, SA>& s,
578 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
579 const basic_regex<charT, traits>& e,
580 regex_constants::match_flag_type flags = regex_constants::match_default);
582 template <class ST, class SA, class Allocator, class charT, class traits>
584 regex_match(const basic_string<charT, ST, SA>&& s,
585 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
586 const basic_regex<charT, traits>& e,
587 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
589 template <class charT, class traits>
591 regex_match(const charT* str, const basic_regex<charT, traits>& e,
592 regex_constants::match_flag_type flags = regex_constants::match_default);
594 template <class ST, class SA, class charT, class traits>
596 regex_match(const basic_string<charT, ST, SA>& s,
597 const basic_regex<charT, traits>& e,
598 regex_constants::match_flag_type flags = regex_constants::match_default);
600 template <class BidirectionalIterator, class Allocator, class charT, class traits>
602 regex_search(BidirectionalIterator first, BidirectionalIterator last,
603 match_results<BidirectionalIterator, Allocator>& m,
604 const basic_regex<charT, traits>& e,
605 regex_constants::match_flag_type flags = regex_constants::match_default);
607 template <class BidirectionalIterator, class charT, class traits>
609 regex_search(BidirectionalIterator first, BidirectionalIterator last,
610 const basic_regex<charT, traits>& e,
611 regex_constants::match_flag_type flags = regex_constants::match_default);
613 template <class charT, class Allocator, class traits>
615 regex_search(const charT* str, match_results<const charT*, Allocator>& m,
616 const basic_regex<charT, traits>& e,
617 regex_constants::match_flag_type flags = regex_constants::match_default);
619 template <class charT, class traits>
621 regex_search(const charT* str, const basic_regex<charT, traits>& e,
622 regex_constants::match_flag_type flags = regex_constants::match_default);
624 template <class ST, class SA, class charT, class traits>
626 regex_search(const basic_string<charT, ST, SA>& s,
627 const basic_regex<charT, traits>& e,
628 regex_constants::match_flag_type flags = regex_constants::match_default);
630 template <class ST, class SA, class Allocator, class charT, class traits>
632 regex_search(const basic_string<charT, ST, SA>& s,
633 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
634 const basic_regex<charT, traits>& e,
635 regex_constants::match_flag_type flags = regex_constants::match_default);
637 template <class ST, class SA, class Allocator, class charT, class traits>
639 regex_search(const basic_string<charT, ST, SA>&& s,
640 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
641 const basic_regex<charT, traits>& e,
642 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
644 template <class OutputIterator, class BidirectionalIterator,
645 class traits, class charT, class ST, class SA>
647 regex_replace(OutputIterator out,
648 BidirectionalIterator first, BidirectionalIterator last,
649 const basic_regex<charT, traits>& e,
650 const basic_string<charT, ST, SA>& fmt,
651 regex_constants::match_flag_type flags = regex_constants::match_default);
653 template <class OutputIterator, class BidirectionalIterator,
654 class traits, class charT>
656 regex_replace(OutputIterator out,
657 BidirectionalIterator first, BidirectionalIterator last,
658 const basic_regex<charT, traits>& e, const charT* fmt,
659 regex_constants::match_flag_type flags = regex_constants::match_default);
661 template <class traits, class charT, class ST, class SA, class FST, class FSA>
662 basic_string<charT, ST, SA>
663 regex_replace(const basic_string<charT, ST, SA>& s,
664 const basic_regex<charT, traits>& e,
665 const basic_string<charT, FST, FSA>& fmt,
666 regex_constants::match_flag_type flags = regex_constants::match_default);
668 template <class traits, class charT, class ST, class SA>
669 basic_string<charT, ST, SA>
670 regex_replace(const basic_string<charT, ST, SA>& s,
671 const basic_regex<charT, traits>& e, const charT* fmt,
672 regex_constants::match_flag_type flags = regex_constants::match_default);
674 template <class traits, class charT, class ST, class SA>
676 regex_replace(const charT* s,
677 const basic_regex<charT, traits>& e,
678 const basic_string<charT, ST, SA>& fmt,
679 regex_constants::match_flag_type flags = regex_constants::match_default);
681 template <class traits, class charT>
683 regex_replace(const charT* s,
684 const basic_regex<charT, traits>& e,
686 regex_constants::match_flag_type flags = regex_constants::match_default);
688 template <class BidirectionalIterator,
689 class charT = typename iterator_traits< BidirectionalIterator>::value_type,
690 class traits = regex_traits<charT>>
694 typedef basic_regex<charT, traits> regex_type;
695 typedef match_results<BidirectionalIterator> value_type;
696 typedef ptrdiff_t difference_type;
697 typedef const value_type* pointer;
698 typedef const value_type& reference;
699 typedef forward_iterator_tag iterator_category;
702 regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
703 const regex_type& re,
704 regex_constants::match_flag_type m = regex_constants::match_default);
705 regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
706 const regex_type&& re,
707 regex_constants::match_flag_type m
708 = regex_constants::match_default) = delete; // C++14
709 regex_iterator(const regex_iterator&);
710 regex_iterator& operator=(const regex_iterator&);
712 bool operator==(const regex_iterator&) const;
713 bool operator==(default_sentinel_t) const { return *this == regex_iterator(); } // since C++20
714 bool operator!=(const regex_iterator&) const; // Removed in C++20
716 const value_type& operator*() const;
717 const value_type* operator->() const;
719 regex_iterator& operator++();
720 regex_iterator operator++(int);
723 typedef regex_iterator<const char*> cregex_iterator;
724 typedef regex_iterator<const wchar_t*> wcregex_iterator;
725 typedef regex_iterator<string::const_iterator> sregex_iterator;
726 typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
728 template <class BidirectionalIterator,
729 class charT = typename iterator_traits<BidirectionalIterator>::value_type,
730 class traits = regex_traits<charT>>
731 class regex_token_iterator
734 typedef basic_regex<charT, traits> regex_type;
735 typedef sub_match<BidirectionalIterator> value_type;
736 typedef ptrdiff_t difference_type;
737 typedef const value_type* pointer;
738 typedef const value_type& reference;
739 typedef forward_iterator_tag iterator_category;
741 regex_token_iterator();
742 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
743 const regex_type& re, int submatch = 0,
744 regex_constants::match_flag_type m = regex_constants::match_default);
745 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
746 const regex_type&& re, int submatch = 0,
747 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
748 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
749 const regex_type& re, const vector<int>& submatches,
750 regex_constants::match_flag_type m = regex_constants::match_default);
751 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
752 const regex_type&& re, const vector<int>& submatches,
753 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
754 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
755 const regex_type& re, initializer_list<int> submatches,
756 regex_constants::match_flag_type m = regex_constants::match_default);
757 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
758 const regex_type&& re, initializer_list<int> submatches,
759 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
761 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
762 const regex_type& re, const int (&submatches)[N],
763 regex_constants::match_flag_type m = regex_constants::match_default);
765 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
766 const regex_type&& re, const int (&submatches)[N],
767 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
768 regex_token_iterator(const regex_token_iterator&);
769 regex_token_iterator& operator=(const regex_token_iterator&);
771 bool operator==(const regex_token_iterator&) const;
772 bool operator==(default_sentinel_t) const { return *this == regex_token_iterator(); } // since C++20
773 bool operator!=(const regex_token_iterator&) const; // Removed in C++20
775 const value_type& operator*() const;
776 const value_type* operator->() const;
778 regex_token_iterator& operator++();
779 regex_token_iterator operator++(int);
782 typedef regex_token_iterator<const char*> cregex_token_iterator;
783 typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
784 typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
785 typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
790 #include <__algorithm/find.h>
791 #include <__algorithm/search.h>
792 #include <__assert> // all public C++ headers provide the assertion handler
793 #include <__availability>
795 #include <__iterator/back_insert_iterator.h>
796 #include <__iterator/default_sentinel.h>
797 #include <__iterator/wrap_iter.h>
799 #include <__memory/shared_ptr.h>
800 #include <__memory_resource/polymorphic_allocator.h>
801 #include <__type_traits/is_swappable.h>
802 #include <__utility/move.h>
803 #include <__utility/pair.h>
804 #include <__utility/swap.h>
805 #include <__verbose_abort>
812 // standard-mandated includes
815 #include <__iterator/access.h>
816 #include <__iterator/data.h>
817 #include <__iterator/empty.h>
818 #include <__iterator/reverse_access.h>
819 #include <__iterator/size.h>
823 #include <initializer_list>
825 #if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
826 # pragma GCC system_header
830 #include <__undef_macros>
833 #define _LIBCPP_REGEX_COMPLEXITY_FACTOR 4096
835 _LIBCPP_BEGIN_NAMESPACE_STD
837 namespace regex_constants
840 // syntax_option_type
842 enum syntax_option_type
848 #ifdef _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO
858 // 1 << 9 may be used by ECMAScript
862 _LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR
863 syntax_option_type __get_grammar(syntax_option_type __g)
865 #ifdef _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO
866 return static_cast<syntax_option_type>(__g & 0x3F0);
868 return static_cast<syntax_option_type>(__g & 0x1F0);
872 inline _LIBCPP_INLINE_VISIBILITY
875 operator~(syntax_option_type __x)
877 return syntax_option_type(~int(__x) & 0x1FF);
880 inline _LIBCPP_INLINE_VISIBILITY
883 operator&(syntax_option_type __x, syntax_option_type __y)
885 return syntax_option_type(int(__x) & int(__y));
888 inline _LIBCPP_INLINE_VISIBILITY
891 operator|(syntax_option_type __x, syntax_option_type __y)
893 return syntax_option_type(int(__x) | int(__y));
896 inline _LIBCPP_INLINE_VISIBILITY
899 operator^(syntax_option_type __x, syntax_option_type __y)
901 return syntax_option_type(int(__x) ^ int(__y));
904 inline _LIBCPP_INLINE_VISIBILITY
906 operator&=(syntax_option_type& __x, syntax_option_type __y)
912 inline _LIBCPP_INLINE_VISIBILITY
914 operator|=(syntax_option_type& __x, syntax_option_type __y)
920 inline _LIBCPP_INLINE_VISIBILITY
922 operator^=(syntax_option_type& __x, syntax_option_type __y)
933 match_not_bol = 1 << 0,
934 match_not_eol = 1 << 1,
935 match_not_bow = 1 << 2,
936 match_not_eow = 1 << 3,
938 match_not_null = 1 << 5,
939 match_continuous = 1 << 6,
940 match_prev_avail = 1 << 7,
943 format_no_copy = 1 << 9,
944 format_first_only = 1 << 10,
945 __no_update_pos = 1 << 11,
946 __full_match = 1 << 12
949 inline _LIBCPP_INLINE_VISIBILITY
952 operator~(match_flag_type __x)
954 return match_flag_type(~int(__x) & 0x0FFF);
957 inline _LIBCPP_INLINE_VISIBILITY
960 operator&(match_flag_type __x, match_flag_type __y)
962 return match_flag_type(int(__x) & int(__y));
965 inline _LIBCPP_INLINE_VISIBILITY
968 operator|(match_flag_type __x, match_flag_type __y)
970 return match_flag_type(int(__x) | int(__y));
973 inline _LIBCPP_INLINE_VISIBILITY
976 operator^(match_flag_type __x, match_flag_type __y)
978 return match_flag_type(int(__x) ^ int(__y));
981 inline _LIBCPP_INLINE_VISIBILITY
983 operator&=(match_flag_type& __x, match_flag_type __y)
989 inline _LIBCPP_INLINE_VISIBILITY
991 operator|=(match_flag_type& __x, match_flag_type __y)
997 inline _LIBCPP_INLINE_VISIBILITY
999 operator^=(match_flag_type& __x, match_flag_type __y)
1026 } // namespace regex_constants
1028 class _LIBCPP_EXPORTED_FROM_ABI regex_error
1029 : public runtime_error
1031 regex_constants::error_type __code_;
1033 explicit regex_error(regex_constants::error_type __ecode);
1034 _LIBCPP_HIDE_FROM_ABI regex_error(const regex_error&) _NOEXCEPT = default;
1035 ~regex_error() _NOEXCEPT override;
1036 _LIBCPP_INLINE_VISIBILITY
1037 regex_constants::error_type code() const {return __code_;}
1040 template <regex_constants::error_type _Ev>
1041 _LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
1042 void __throw_regex_error()
1044 #ifndef _LIBCPP_HAS_NO_EXCEPTIONS
1045 throw regex_error(_Ev);
1047 _LIBCPP_VERBOSE_ABORT("regex_error was thrown in -fno-exceptions mode");
1051 template <class _CharT>
1052 struct _LIBCPP_TEMPLATE_VIS regex_traits
1055 typedef _CharT char_type;
1056 typedef basic_string<char_type> string_type;
1057 typedef locale locale_type;
1058 #if defined(__BIONIC__) || defined(_NEWLIB_VERSION)
1059 // Originally bionic's ctype_base used its own ctype masks because the
1060 // builtin ctype implementation wasn't in libc++ yet. Bionic's ctype mask
1061 // was only 8 bits wide and already saturated, so it used a wider type here
1062 // to make room for __regex_word (then a part of this class rather than
1063 // ctype_base). Bionic has since moved to the builtin ctype_base
1064 // implementation, but this was not updated to match. Since then Android has
1065 // needed to maintain a stable libc++ ABI, and this can't be changed without
1067 // We also need this workaround for newlib since _NEWLIB_VERSION is not
1068 // defined yet inside __config, so we can't set the
1069 // _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE macro. Additionally, newlib is
1070 // often used for space constrained environments, so it makes sense not to
1071 // duplicate the ctype table.
1072 typedef uint16_t char_class_type;
1074 typedef ctype_base::mask char_class_type;
1077 static const char_class_type __regex_word = ctype_base::__regex_word;
1080 const ctype<char_type>* __ct_;
1081 const collate<char_type>* __col_;
1086 _LIBCPP_INLINE_VISIBILITY
1087 static size_t length(const char_type* __p)
1088 {return char_traits<char_type>::length(__p);}
1089 _LIBCPP_INLINE_VISIBILITY
1090 char_type translate(char_type __c) const {return __c;}
1091 char_type translate_nocase(char_type __c) const;
1092 template <class _ForwardIterator>
1094 transform(_ForwardIterator __f, _ForwardIterator __l) const;
1095 template <class _ForwardIterator>
1096 _LIBCPP_INLINE_VISIBILITY
1098 transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
1099 {return __transform_primary(__f, __l, char_type());}
1100 template <class _ForwardIterator>
1101 _LIBCPP_INLINE_VISIBILITY
1103 lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
1104 {return __lookup_collatename(__f, __l, char_type());}
1105 template <class _ForwardIterator>
1106 _LIBCPP_INLINE_VISIBILITY
1108 lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1109 bool __icase = false) const
1110 {return __lookup_classname(__f, __l, __icase, char_type());}
1111 bool isctype(char_type __c, char_class_type __m) const;
1112 _LIBCPP_INLINE_VISIBILITY
1113 int value(char_type __ch, int __radix) const
1114 {return __regex_traits_value(__ch, __radix);}
1115 locale_type imbue(locale_type __l);
1116 _LIBCPP_INLINE_VISIBILITY
1117 locale_type getloc()const {return __loc_;}
1122 template <class _ForwardIterator>
1124 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
1125 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
1126 template <class _ForwardIterator>
1128 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
1130 template <class _ForwardIterator>
1132 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
1133 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
1134 template <class _ForwardIterator>
1136 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
1138 template <class _ForwardIterator>
1140 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1141 bool __icase, char) const;
1142 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
1143 template <class _ForwardIterator>
1145 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1146 bool __icase, wchar_t) const;
1149 static int __regex_traits_value(unsigned char __ch, int __radix);
1150 _LIBCPP_INLINE_VISIBILITY
1151 int __regex_traits_value(char __ch, int __radix) const
1152 {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
1153 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
1154 _LIBCPP_INLINE_VISIBILITY
1155 int __regex_traits_value(wchar_t __ch, int __radix) const;
1159 template <class _CharT>
1160 const typename regex_traits<_CharT>::char_class_type
1161 regex_traits<_CharT>::__regex_word;
1163 template <class _CharT>
1164 regex_traits<_CharT>::regex_traits()
1169 template <class _CharT>
1170 typename regex_traits<_CharT>::char_type
1171 regex_traits<_CharT>::translate_nocase(char_type __c) const
1173 return __ct_->tolower(__c);
1176 template <class _CharT>
1177 template <class _ForwardIterator>
1178 typename regex_traits<_CharT>::string_type
1179 regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
1181 string_type __s(__f, __l);
1182 return __col_->transform(__s.data(), __s.data() + __s.size());
1185 template <class _CharT>
1187 regex_traits<_CharT>::__init()
1189 __ct_ = &std::use_facet<ctype<char_type> >(__loc_);
1190 __col_ = &std::use_facet<collate<char_type> >(__loc_);
1193 template <class _CharT>
1194 typename regex_traits<_CharT>::locale_type
1195 regex_traits<_CharT>::imbue(locale_type __l)
1197 locale __r = __loc_;
1203 // transform_primary is very FreeBSD-specific
1205 template <class _CharT>
1206 template <class _ForwardIterator>
1207 typename regex_traits<_CharT>::string_type
1208 regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1209 _ForwardIterator __l, char) const
1211 const string_type __s(__f, __l);
1212 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1227 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
1228 template <class _CharT>
1229 template <class _ForwardIterator>
1230 typename regex_traits<_CharT>::string_type
1231 regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1232 _ForwardIterator __l, wchar_t) const
1234 const string_type __s(__f, __l);
1235 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1251 // lookup_collatename is very FreeBSD-specific
1253 _LIBCPP_EXPORTED_FROM_ABI string __get_collation_name(const char* __s);
1255 template <class _CharT>
1256 template <class _ForwardIterator>
1257 typename regex_traits<_CharT>::string_type
1258 regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1259 _ForwardIterator __l, char) const
1261 string_type __s(__f, __l);
1265 __r = std::__get_collation_name(__s.c_str());
1266 if (__r.empty() && __s.size() <= 2)
1268 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1269 if (__r.size() == 1 || __r.size() == 12)
1278 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
1279 template <class _CharT>
1280 template <class _ForwardIterator>
1281 typename regex_traits<_CharT>::string_type
1282 regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1283 _ForwardIterator __l, wchar_t) const
1285 string_type __s(__f, __l);
1287 __n.reserve(__s.size());
1288 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1291 if (static_cast<unsigned>(*__i) >= 127)
1292 return string_type();
1293 __n.push_back(char(*__i));
1298 __n = __get_collation_name(__n.c_str());
1300 __r.assign(__n.begin(), __n.end());
1301 else if (__s.size() <= 2)
1303 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1304 if (__r.size() == 1 || __r.size() == 3)
1312 #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
1316 regex_traits<char>::char_class_type _LIBCPP_EXPORTED_FROM_ABI __get_classname(const char* __s, bool __icase);
1318 template <class _CharT>
1319 template <class _ForwardIterator>
1320 typename regex_traits<_CharT>::char_class_type
1321 regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1322 _ForwardIterator __l,
1323 bool __icase, char) const
1325 string_type __s(__f, __l);
1326 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1327 return std::__get_classname(__s.c_str(), __icase);
1330 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
1331 template <class _CharT>
1332 template <class _ForwardIterator>
1333 typename regex_traits<_CharT>::char_class_type
1334 regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1335 _ForwardIterator __l,
1336 bool __icase, wchar_t) const
1338 string_type __s(__f, __l);
1339 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1341 __n.reserve(__s.size());
1342 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1345 if (static_cast<unsigned>(*__i) >= 127)
1346 return char_class_type();
1347 __n.push_back(char(*__i));
1349 return __get_classname(__n.c_str(), __icase);
1351 #endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
1353 template <class _CharT>
1355 regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
1357 if (__ct_->is(__m, __c))
1359 return (__c == '_' && (__m & __regex_word));
1362 inline _LIBCPP_INLINE_VISIBILITY
1363 bool __is_07(unsigned char __c)
1365 return (__c & 0xF8u) ==
1366 #if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
1373 inline _LIBCPP_INLINE_VISIBILITY
1374 bool __is_89(unsigned char __c)
1376 return (__c & 0xFEu) ==
1377 #if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
1384 inline _LIBCPP_INLINE_VISIBILITY
1385 unsigned char __to_lower(unsigned char __c)
1387 #if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
1394 template <class _CharT>
1396 regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
1398 if (__is_07(__ch)) // '0' <= __ch && __ch <= '7'
1402 if (__is_89(__ch)) // '8' <= __ch && __ch <= '9'
1406 __ch = __to_lower(__ch); // tolower
1407 if ('a' <= __ch && __ch <= 'f')
1408 return __ch - ('a' - 10);
1414 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
1415 template <class _CharT>
1418 regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
1420 return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
1424 template <class _CharT> class __node;
1426 template <class _BidirectionalIterator> class _LIBCPP_TEMPLATE_VIS sub_match;
1428 template <class _BidirectionalIterator,
1429 class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
1430 class _LIBCPP_TEMPLATE_VIS match_results;
1432 template <class _CharT>
1437 __end_state = -1000,
1438 __consume_input, // -999
1439 __begin_marked_expr, // -998
1440 __end_marked_expr, // -997
1441 __pop_state, // -996
1442 __accept_and_consume, // -995
1443 __accept_but_not_consume, // -994
1450 const _CharT* __first_;
1451 const _CharT* __current_;
1452 const _CharT* __last_;
1453 vector<sub_match<const _CharT*> > __sub_matches_;
1454 vector<pair<size_t, const _CharT*> > __loop_data_;
1455 const __node<_CharT>* __node_;
1456 regex_constants::match_flag_type __flags_;
1459 _LIBCPP_INLINE_VISIBILITY
1461 : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
1462 __node_(nullptr), __flags_(), __at_first_(false) {}
1467 template <class _CharT>
1470 __node(const __node&);
1471 __node& operator=(const __node&);
1473 typedef _VSTD::__state<_CharT> __state;
1475 _LIBCPP_INLINE_VISIBILITY
1477 _LIBCPP_HIDE_FROM_ABI_VIRTUAL
1478 virtual ~__node() {}
1480 _LIBCPP_HIDE_FROM_ABI_VIRTUAL
1481 virtual void __exec(__state&) const {}
1482 _LIBCPP_HIDE_FROM_ABI_VIRTUAL
1483 virtual void __exec_split(bool, __state&) const {}
1488 template <class _CharT>
1490 : public __node<_CharT>
1493 typedef _VSTD::__state<_CharT> __state;
1495 _LIBCPP_INLINE_VISIBILITY
1498 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
1501 template <class _CharT>
1503 __end_state<_CharT>::__exec(__state& __s) const
1505 __s.__do_ = __state::__end_state;
1510 template <class _CharT>
1511 class __has_one_state
1512 : public __node<_CharT>
1514 __node<_CharT>* __first_;
1517 _LIBCPP_INLINE_VISIBILITY
1518 explicit __has_one_state(__node<_CharT>* __s)
1521 _LIBCPP_INLINE_VISIBILITY
1522 __node<_CharT>* first() const {return __first_;}
1523 _LIBCPP_INLINE_VISIBILITY
1524 __node<_CharT>*& first() {return __first_;}
1529 template <class _CharT>
1530 class __owns_one_state
1531 : public __has_one_state<_CharT>
1533 typedef __has_one_state<_CharT> base;
1536 _LIBCPP_INLINE_VISIBILITY
1537 explicit __owns_one_state(__node<_CharT>* __s)
1540 ~__owns_one_state() override;
1543 template <class _CharT>
1544 __owns_one_state<_CharT>::~__owns_one_state()
1546 delete this->first();
1551 template <class _CharT>
1553 : public __owns_one_state<_CharT>
1555 typedef __owns_one_state<_CharT> base;
1558 typedef _VSTD::__state<_CharT> __state;
1560 _LIBCPP_INLINE_VISIBILITY
1561 explicit __empty_state(__node<_CharT>* __s)
1564 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
1567 template <class _CharT>
1569 __empty_state<_CharT>::__exec(__state& __s) const
1571 __s.__do_ = __state::__accept_but_not_consume;
1572 __s.__node_ = this->first();
1575 // __empty_non_own_state
1577 template <class _CharT>
1578 class __empty_non_own_state
1579 : public __has_one_state<_CharT>
1581 typedef __has_one_state<_CharT> base;
1584 typedef _VSTD::__state<_CharT> __state;
1586 _LIBCPP_INLINE_VISIBILITY
1587 explicit __empty_non_own_state(__node<_CharT>* __s)
1590 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
1593 template <class _CharT>
1595 __empty_non_own_state<_CharT>::__exec(__state& __s) const
1597 __s.__do_ = __state::__accept_but_not_consume;
1598 __s.__node_ = this->first();
1601 // __repeat_one_loop
1603 template <class _CharT>
1604 class __repeat_one_loop
1605 : public __has_one_state<_CharT>
1607 typedef __has_one_state<_CharT> base;
1610 typedef _VSTD::__state<_CharT> __state;
1612 _LIBCPP_INLINE_VISIBILITY
1613 explicit __repeat_one_loop(__node<_CharT>* __s)
1616 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
1619 template <class _CharT>
1621 __repeat_one_loop<_CharT>::__exec(__state& __s) const
1623 __s.__do_ = __state::__repeat;
1624 __s.__node_ = this->first();
1627 // __owns_two_states
1629 template <class _CharT>
1630 class __owns_two_states
1631 : public __owns_one_state<_CharT>
1633 typedef __owns_one_state<_CharT> base;
1638 _LIBCPP_INLINE_VISIBILITY
1639 explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
1640 : base(__s1), __second_(__s2) {}
1642 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual ~__owns_two_states();
1644 _LIBCPP_INLINE_VISIBILITY
1645 base* second() const {return __second_;}
1646 _LIBCPP_INLINE_VISIBILITY
1647 base*& second() {return __second_;}
1650 template <class _CharT>
1651 __owns_two_states<_CharT>::~__owns_two_states()
1658 template <class _CharT>
1660 : public __owns_two_states<_CharT>
1662 typedef __owns_two_states<_CharT> base;
1666 unsigned __loop_id_;
1667 unsigned __mexp_begin_;
1668 unsigned __mexp_end_;
1672 typedef _VSTD::__state<_CharT> __state;
1674 _LIBCPP_INLINE_VISIBILITY
1675 explicit __loop(unsigned __loop_id,
1676 __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
1677 unsigned __mexp_begin, unsigned __mexp_end,
1678 bool __greedy = true,
1680 size_t __max = numeric_limits<size_t>::max())
1681 : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
1682 __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
1683 __greedy_(__greedy) {}
1685 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state& __s) const;
1686 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec_split(bool __second, __state& __s) const;
1689 _LIBCPP_INLINE_VISIBILITY
1690 void __init_repeat(__state& __s) const
1692 __s.__loop_data_[__loop_id_].second = __s.__current_;
1693 for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
1695 __s.__sub_matches_[__i].first = __s.__last_;
1696 __s.__sub_matches_[__i].second = __s.__last_;
1697 __s.__sub_matches_[__i].matched = false;
1702 template <class _CharT>
1704 __loop<_CharT>::__exec(__state& __s) const
1706 if (__s.__do_ == __state::__repeat)
1708 bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
1709 bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
1710 if (__do_repeat && __do_alt &&
1711 __s.__loop_data_[__loop_id_].second == __s.__current_)
1712 __do_repeat = false;
1713 if (__do_repeat && __do_alt)
1714 __s.__do_ = __state::__split;
1715 else if (__do_repeat)
1717 __s.__do_ = __state::__accept_but_not_consume;
1718 __s.__node_ = this->first();
1723 __s.__do_ = __state::__accept_but_not_consume;
1724 __s.__node_ = this->second();
1729 __s.__loop_data_[__loop_id_].first = 0;
1730 bool __do_repeat = 0 < __max_;
1731 bool __do_alt = 0 >= __min_;
1732 if (__do_repeat && __do_alt)
1733 __s.__do_ = __state::__split;
1734 else if (__do_repeat)
1736 __s.__do_ = __state::__accept_but_not_consume;
1737 __s.__node_ = this->first();
1742 __s.__do_ = __state::__accept_but_not_consume;
1743 __s.__node_ = this->second();
1748 template <class _CharT>
1750 __loop<_CharT>::__exec_split(bool __second, __state& __s) const
1752 __s.__do_ = __state::__accept_but_not_consume;
1753 if (__greedy_ != __second)
1755 __s.__node_ = this->first();
1759 __s.__node_ = this->second();
1764 template <class _CharT>
1766 : public __owns_two_states<_CharT>
1768 typedef __owns_two_states<_CharT> base;
1771 typedef _VSTD::__state<_CharT> __state;
1773 _LIBCPP_INLINE_VISIBILITY
1774 explicit __alternate(__owns_one_state<_CharT>* __s1,
1775 __owns_one_state<_CharT>* __s2)
1776 : base(__s1, __s2) {}
1778 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state& __s) const;
1779 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec_split(bool __second, __state& __s) const;
1782 template <class _CharT>
1784 __alternate<_CharT>::__exec(__state& __s) const
1786 __s.__do_ = __state::__split;
1789 template <class _CharT>
1791 __alternate<_CharT>::__exec_split(bool __second, __state& __s) const
1793 __s.__do_ = __state::__accept_but_not_consume;
1795 __s.__node_ = this->second();
1797 __s.__node_ = this->first();
1800 // __begin_marked_subexpression
1802 template <class _CharT>
1803 class __begin_marked_subexpression
1804 : public __owns_one_state<_CharT>
1806 typedef __owns_one_state<_CharT> base;
1810 typedef _VSTD::__state<_CharT> __state;
1812 _LIBCPP_INLINE_VISIBILITY
1813 explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
1814 : base(__s), __mexp_(__mexp) {}
1816 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
1819 template <class _CharT>
1821 __begin_marked_subexpression<_CharT>::__exec(__state& __s) const
1823 __s.__do_ = __state::__accept_but_not_consume;
1824 __s.__sub_matches_[__mexp_-1].first = __s.__current_;
1825 __s.__node_ = this->first();
1828 // __end_marked_subexpression
1830 template <class _CharT>
1831 class __end_marked_subexpression
1832 : public __owns_one_state<_CharT>
1834 typedef __owns_one_state<_CharT> base;
1838 typedef _VSTD::__state<_CharT> __state;
1840 _LIBCPP_INLINE_VISIBILITY
1841 explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
1842 : base(__s), __mexp_(__mexp) {}
1844 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
1847 template <class _CharT>
1849 __end_marked_subexpression<_CharT>::__exec(__state& __s) const
1851 __s.__do_ = __state::__accept_but_not_consume;
1852 __s.__sub_matches_[__mexp_-1].second = __s.__current_;
1853 __s.__sub_matches_[__mexp_-1].matched = true;
1854 __s.__node_ = this->first();
1859 template <class _CharT>
1861 : public __owns_one_state<_CharT>
1863 typedef __owns_one_state<_CharT> base;
1867 typedef _VSTD::__state<_CharT> __state;
1869 _LIBCPP_INLINE_VISIBILITY
1870 explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
1871 : base(__s), __mexp_(__mexp) {}
1873 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
1876 template <class _CharT>
1878 __back_ref<_CharT>::__exec(__state& __s) const
1880 if (__mexp_ > __s.__sub_matches_.size())
1881 __throw_regex_error<regex_constants::error_backref>();
1882 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1885 ptrdiff_t __len = __sm.second - __sm.first;
1886 if (__s.__last_ - __s.__current_ >= __len &&
1887 _VSTD::equal(__sm.first, __sm.second, __s.__current_))
1889 __s.__do_ = __state::__accept_but_not_consume;
1890 __s.__current_ += __len;
1891 __s.__node_ = this->first();
1895 __s.__do_ = __state::__reject;
1896 __s.__node_ = nullptr;
1901 __s.__do_ = __state::__reject;
1902 __s.__node_ = nullptr;
1908 template <class _CharT, class _Traits>
1909 class __back_ref_icase
1910 : public __owns_one_state<_CharT>
1912 typedef __owns_one_state<_CharT> base;
1917 typedef _VSTD::__state<_CharT> __state;
1919 _LIBCPP_INLINE_VISIBILITY
1920 explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
1921 __node<_CharT>* __s)
1922 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1924 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
1927 template <class _CharT, class _Traits>
1929 __back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
1931 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1934 ptrdiff_t __len = __sm.second - __sm.first;
1935 if (__s.__last_ - __s.__current_ >= __len)
1937 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1939 if (__traits_.translate_nocase(__sm.first[__i]) !=
1940 __traits_.translate_nocase(__s.__current_[__i]))
1943 __s.__do_ = __state::__accept_but_not_consume;
1944 __s.__current_ += __len;
1945 __s.__node_ = this->first();
1949 __s.__do_ = __state::__reject;
1950 __s.__node_ = nullptr;
1956 __s.__do_ = __state::__reject;
1957 __s.__node_ = nullptr;
1961 // __back_ref_collate
1963 template <class _CharT, class _Traits>
1964 class __back_ref_collate
1965 : public __owns_one_state<_CharT>
1967 typedef __owns_one_state<_CharT> base;
1972 typedef _VSTD::__state<_CharT> __state;
1974 _LIBCPP_INLINE_VISIBILITY
1975 explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
1976 __node<_CharT>* __s)
1977 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1979 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
1982 template <class _CharT, class _Traits>
1984 __back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
1986 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1989 ptrdiff_t __len = __sm.second - __sm.first;
1990 if (__s.__last_ - __s.__current_ >= __len)
1992 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1994 if (__traits_.translate(__sm.first[__i]) !=
1995 __traits_.translate(__s.__current_[__i]))
1998 __s.__do_ = __state::__accept_but_not_consume;
1999 __s.__current_ += __len;
2000 __s.__node_ = this->first();
2004 __s.__do_ = __state::__reject;
2005 __s.__node_ = nullptr;
2011 __s.__do_ = __state::__reject;
2012 __s.__node_ = nullptr;
2018 template <class _CharT, class _Traits>
2019 class __word_boundary
2020 : public __owns_one_state<_CharT>
2022 typedef __owns_one_state<_CharT> base;
2027 typedef _VSTD::__state<_CharT> __state;
2029 _LIBCPP_INLINE_VISIBILITY
2030 explicit __word_boundary(const _Traits& __traits, bool __invert,
2031 __node<_CharT>* __s)
2032 : base(__s), __traits_(__traits), __invert_(__invert) {}
2034 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
2037 template <class _CharT, class _Traits>
2039 __word_boundary<_CharT, _Traits>::__exec(__state& __s) const
2041 bool __is_word_b = false;
2042 if (__s.__first_ != __s.__last_)
2044 if (__s.__current_ == __s.__last_)
2046 if (!(__s.__flags_ & regex_constants::match_not_eow))
2048 _CharT __c = __s.__current_[-1];
2049 __is_word_b = __c == '_' ||
2050 __traits_.isctype(__c, ctype_base::alnum);
2053 else if (__s.__current_ == __s.__first_ &&
2054 !(__s.__flags_ & regex_constants::match_prev_avail))
2056 if (!(__s.__flags_ & regex_constants::match_not_bow))
2058 _CharT __c = *__s.__current_;
2059 __is_word_b = __c == '_' ||
2060 __traits_.isctype(__c, ctype_base::alnum);
2065 _CharT __c1 = __s.__current_[-1];
2066 _CharT __c2 = *__s.__current_;
2067 bool __is_c1_b = __c1 == '_' ||
2068 __traits_.isctype(__c1, ctype_base::alnum);
2069 bool __is_c2_b = __c2 == '_' ||
2070 __traits_.isctype(__c2, ctype_base::alnum);
2071 __is_word_b = __is_c1_b != __is_c2_b;
2074 if (__is_word_b != __invert_)
2076 __s.__do_ = __state::__accept_but_not_consume;
2077 __s.__node_ = this->first();
2081 __s.__do_ = __state::__reject;
2082 __s.__node_ = nullptr;
2088 template <class _CharT>
2089 _LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
2090 bool __is_eol(_CharT __c)
2092 return __c == '\r' || __c == '\n';
2095 template <class _CharT>
2096 class __l_anchor_multiline
2097 : public __owns_one_state<_CharT>
2099 typedef __owns_one_state<_CharT> base;
2104 typedef _VSTD::__state<_CharT> __state;
2106 _LIBCPP_INLINE_VISIBILITY
2107 __l_anchor_multiline(bool __multiline, __node<_CharT>* __s)
2108 : base(__s), __multiline_(__multiline) {}
2110 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
2113 template <class _CharT>
2115 __l_anchor_multiline<_CharT>::__exec(__state& __s) const
2117 if (__s.__at_first_ && __s.__current_ == __s.__first_ &&
2118 !(__s.__flags_ & regex_constants::match_not_bol))
2120 __s.__do_ = __state::__accept_but_not_consume;
2121 __s.__node_ = this->first();
2123 else if (__multiline_ &&
2125 std::__is_eol(*_VSTD::prev(__s.__current_)))
2127 __s.__do_ = __state::__accept_but_not_consume;
2128 __s.__node_ = this->first();
2132 __s.__do_ = __state::__reject;
2133 __s.__node_ = nullptr;
2139 template <class _CharT>
2140 class __r_anchor_multiline
2141 : public __owns_one_state<_CharT>
2143 typedef __owns_one_state<_CharT> base;
2148 typedef _VSTD::__state<_CharT> __state;
2150 _LIBCPP_INLINE_VISIBILITY
2151 __r_anchor_multiline(bool __multiline, __node<_CharT>* __s)
2152 : base(__s), __multiline_(__multiline) {}
2154 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
2157 template <class _CharT>
2159 __r_anchor_multiline<_CharT>::__exec(__state& __s) const
2161 if (__s.__current_ == __s.__last_ &&
2162 !(__s.__flags_ & regex_constants::match_not_eol))
2164 __s.__do_ = __state::__accept_but_not_consume;
2165 __s.__node_ = this->first();
2167 else if (__multiline_ && std::__is_eol(*__s.__current_))
2169 __s.__do_ = __state::__accept_but_not_consume;
2170 __s.__node_ = this->first();
2174 __s.__do_ = __state::__reject;
2175 __s.__node_ = nullptr;
2181 template <class _CharT>
2183 : public __owns_one_state<_CharT>
2185 typedef __owns_one_state<_CharT> base;
2188 typedef _VSTD::__state<_CharT> __state;
2190 _LIBCPP_INLINE_VISIBILITY
2191 __match_any(__node<_CharT>* __s)
2194 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
2197 template <class _CharT>
2199 __match_any<_CharT>::__exec(__state& __s) const
2201 if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
2203 __s.__do_ = __state::__accept_and_consume;
2205 __s.__node_ = this->first();
2209 __s.__do_ = __state::__reject;
2210 __s.__node_ = nullptr;
2214 // __match_any_but_newline
2216 template <class _CharT>
2217 class __match_any_but_newline
2218 : public __owns_one_state<_CharT>
2220 typedef __owns_one_state<_CharT> base;
2223 typedef _VSTD::__state<_CharT> __state;
2225 _LIBCPP_INLINE_VISIBILITY
2226 __match_any_but_newline(__node<_CharT>* __s)
2229 void __exec(__state&) const override;
2232 template <> _LIBCPP_EXPORTED_FROM_ABI void __match_any_but_newline<char>::__exec(__state&) const;
2233 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
2234 template <> _LIBCPP_EXPORTED_FROM_ABI void __match_any_but_newline<wchar_t>::__exec(__state&) const;
2239 template <class _CharT>
2241 : public __owns_one_state<_CharT>
2243 typedef __owns_one_state<_CharT> base;
2247 __match_char(const __match_char&);
2248 __match_char& operator=(const __match_char&);
2250 typedef _VSTD::__state<_CharT> __state;
2252 _LIBCPP_INLINE_VISIBILITY
2253 __match_char(_CharT __c, __node<_CharT>* __s)
2254 : base(__s), __c_(__c) {}
2256 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
2259 template <class _CharT>
2261 __match_char<_CharT>::__exec(__state& __s) const
2263 if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2265 __s.__do_ = __state::__accept_and_consume;
2267 __s.__node_ = this->first();
2271 __s.__do_ = __state::__reject;
2272 __s.__node_ = nullptr;
2276 // __match_char_icase
2278 template <class _CharT, class _Traits>
2279 class __match_char_icase
2280 : public __owns_one_state<_CharT>
2282 typedef __owns_one_state<_CharT> base;
2287 __match_char_icase(const __match_char_icase&);
2288 __match_char_icase& operator=(const __match_char_icase&);
2290 typedef _VSTD::__state<_CharT> __state;
2292 _LIBCPP_INLINE_VISIBILITY
2293 __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2294 : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2296 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
2299 template <class _CharT, class _Traits>
2301 __match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2303 if (__s.__current_ != __s.__last_ &&
2304 __traits_.translate_nocase(*__s.__current_) == __c_)
2306 __s.__do_ = __state::__accept_and_consume;
2308 __s.__node_ = this->first();
2312 __s.__do_ = __state::__reject;
2313 __s.__node_ = nullptr;
2317 // __match_char_collate
2319 template <class _CharT, class _Traits>
2320 class __match_char_collate
2321 : public __owns_one_state<_CharT>
2323 typedef __owns_one_state<_CharT> base;
2328 __match_char_collate(const __match_char_collate&);
2329 __match_char_collate& operator=(const __match_char_collate&);
2331 typedef _VSTD::__state<_CharT> __state;
2333 _LIBCPP_INLINE_VISIBILITY
2334 __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2335 : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2337 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
2340 template <class _CharT, class _Traits>
2342 __match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2344 if (__s.__current_ != __s.__last_ &&
2345 __traits_.translate(*__s.__current_) == __c_)
2347 __s.__do_ = __state::__accept_and_consume;
2349 __s.__node_ = this->first();
2353 __s.__do_ = __state::__reject;
2354 __s.__node_ = nullptr;
2358 // __bracket_expression
2360 template <class _CharT, class _Traits>
2361 class __bracket_expression
2362 : public __owns_one_state<_CharT>
2364 typedef __owns_one_state<_CharT> base;
2365 typedef typename _Traits::string_type string_type;
2368 vector<_CharT> __chars_;
2369 vector<_CharT> __neg_chars_;
2370 vector<pair<string_type, string_type> > __ranges_;
2371 vector<pair<_CharT, _CharT> > __digraphs_;
2372 vector<string_type> __equivalences_;
2373 typename regex_traits<_CharT>::char_class_type __mask_;
2374 typename regex_traits<_CharT>::char_class_type __neg_mask_;
2378 bool __might_have_digraph_;
2380 __bracket_expression(const __bracket_expression&);
2381 __bracket_expression& operator=(const __bracket_expression&);
2383 typedef _VSTD::__state<_CharT> __state;
2385 _LIBCPP_INLINE_VISIBILITY
2386 __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2387 bool __negate, bool __icase, bool __collate)
2388 : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2389 __negate_(__negate), __icase_(__icase), __collate_(__collate),
2390 __might_have_digraph_(__traits_.getloc().name() != "C") {}
2392 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
2394 _LIBCPP_INLINE_VISIBILITY
2395 bool __negated() const {return __negate_;}
2397 _LIBCPP_INLINE_VISIBILITY
2398 void __add_char(_CharT __c)
2401 __chars_.push_back(__traits_.translate_nocase(__c));
2402 else if (__collate_)
2403 __chars_.push_back(__traits_.translate(__c));
2405 __chars_.push_back(__c);
2407 _LIBCPP_INLINE_VISIBILITY
2408 void __add_neg_char(_CharT __c)
2411 __neg_chars_.push_back(__traits_.translate_nocase(__c));
2412 else if (__collate_)
2413 __neg_chars_.push_back(__traits_.translate(__c));
2415 __neg_chars_.push_back(__c);
2417 _LIBCPP_INLINE_VISIBILITY
2418 void __add_range(string_type __b, string_type __e)
2424 for (size_t __i = 0; __i < __b.size(); ++__i)
2425 __b[__i] = __traits_.translate_nocase(__b[__i]);
2426 for (size_t __i = 0; __i < __e.size(); ++__i)
2427 __e[__i] = __traits_.translate_nocase(__e[__i]);
2431 for (size_t __i = 0; __i < __b.size(); ++__i)
2432 __b[__i] = __traits_.translate(__b[__i]);
2433 for (size_t __i = 0; __i < __e.size(); ++__i)
2434 __e[__i] = __traits_.translate(__e[__i]);
2436 __ranges_.push_back(std::make_pair(
2437 __traits_.transform(__b.begin(), __b.end()),
2438 __traits_.transform(__e.begin(), __e.end())));
2442 if (__b.size() != 1 || __e.size() != 1)
2443 __throw_regex_error<regex_constants::error_range>();
2446 __b[0] = __traits_.translate_nocase(__b[0]);
2447 __e[0] = __traits_.translate_nocase(__e[0]);
2449 __ranges_.push_back(std::make_pair(_VSTD::move(__b), _VSTD::move(__e)));
2452 _LIBCPP_INLINE_VISIBILITY
2453 void __add_digraph(_CharT __c1, _CharT __c2)
2456 __digraphs_.push_back(std::make_pair(__traits_.translate_nocase(__c1),
2457 __traits_.translate_nocase(__c2)));
2458 else if (__collate_)
2459 __digraphs_.push_back(std::make_pair(__traits_.translate(__c1),
2460 __traits_.translate(__c2)));
2462 __digraphs_.push_back(std::make_pair(__c1, __c2));
2464 _LIBCPP_INLINE_VISIBILITY
2465 void __add_equivalence(const string_type& __s)
2466 {__equivalences_.push_back(__s);}
2467 _LIBCPP_INLINE_VISIBILITY
2468 void __add_class(typename regex_traits<_CharT>::char_class_type __mask)
2469 {__mask_ |= __mask;}
2470 _LIBCPP_INLINE_VISIBILITY
2471 void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask)
2472 {__neg_mask_ |= __mask;}
2475 template <class _CharT, class _Traits>
2477 __bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2479 bool __found = false;
2480 unsigned __consumed = 0;
2481 if (__s.__current_ != __s.__last_)
2484 if (__might_have_digraph_)
2486 const _CharT* __next = _VSTD::next(__s.__current_);
2487 if (__next != __s.__last_)
2489 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2492 __ch2.first = __traits_.translate_nocase(__ch2.first);
2493 __ch2.second = __traits_.translate_nocase(__ch2.second);
2495 else if (__collate_)
2497 __ch2.first = __traits_.translate(__ch2.first);
2498 __ch2.second = __traits_.translate(__ch2.second);
2500 if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2502 // __ch2 is a digraph in this locale
2504 for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2506 if (__ch2 == __digraphs_[__i])
2512 if (__collate_ && !__ranges_.empty())
2514 string_type __s2 = __traits_.transform(&__ch2.first,
2516 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2518 if (__ranges_[__i].first <= __s2 &&
2519 __s2 <= __ranges_[__i].second)
2526 if (!__equivalences_.empty())
2528 string_type __s2 = __traits_.transform_primary(&__ch2.first,
2530 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2532 if (__s2 == __equivalences_[__i])
2539 if (__traits_.isctype(__ch2.first, __mask_) &&
2540 __traits_.isctype(__ch2.second, __mask_))
2545 if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2546 !__traits_.isctype(__ch2.second, __neg_mask_))
2555 // test *__s.__current_ as not a digraph
2556 _CharT __ch = *__s.__current_;
2558 __ch = __traits_.translate_nocase(__ch);
2559 else if (__collate_)
2560 __ch = __traits_.translate(__ch);
2561 for (size_t __i = 0; __i < __chars_.size(); ++__i)
2563 if (__ch == __chars_[__i])
2569 // When there's at least one of __neg_chars_ and __neg_mask_, the set
2570 // of "__found" chars is
2571 // union(complement(union(__neg_chars_, __neg_mask_)),
2574 // It doesn't make sense to check this when there are no __neg_chars_
2575 // and no __neg_mask_.
2576 if (!(__neg_mask_ == 0 && __neg_chars_.empty()))
2578 const bool __in_neg_mask = __traits_.isctype(__ch, __neg_mask_);
2579 const bool __in_neg_chars =
2580 _VSTD::find(__neg_chars_.begin(), __neg_chars_.end(), __ch) !=
2582 if (!(__in_neg_mask || __in_neg_chars))
2588 if (!__ranges_.empty())
2590 string_type __s2 = __collate_ ?
2591 __traits_.transform(&__ch, &__ch + 1) :
2592 string_type(1, __ch);
2593 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2595 if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2602 if (!__equivalences_.empty())
2604 string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2605 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2607 if (__s2 == __equivalences_[__i])
2614 if (__traits_.isctype(__ch, __mask_))
2621 __found = __negate_; // force reject
2623 if (__found != __negate_)
2625 __s.__do_ = __state::__accept_and_consume;
2626 __s.__current_ += __consumed;
2627 __s.__node_ = this->first();
2631 __s.__do_ = __state::__reject;
2632 __s.__node_ = nullptr;
2636 template <class _CharT, class _Traits> class __lookahead;
2638 template <class _CharT, class _Traits = regex_traits<_CharT> >
2639 class _LIBCPP_TEMPLATE_VIS basic_regex;
2641 typedef basic_regex<char> regex;
2642 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
2643 typedef basic_regex<wchar_t> wregex;
2646 template <class _CharT, class _Traits>
2648 _LIBCPP_TEMPLATE_VIS
2649 _LIBCPP_PREFERRED_NAME(regex)
2650 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wregex))
2655 typedef _CharT value_type;
2656 typedef _Traits traits_type;
2657 typedef typename _Traits::string_type string_type;
2658 typedef regex_constants::syntax_option_type flag_type;
2659 typedef typename _Traits::locale_type locale_type;
2664 unsigned __marked_count_;
2665 unsigned __loop_count_;
2667 shared_ptr<__empty_state<_CharT> > __start_;
2668 __owns_one_state<_CharT>* __end_;
2670 typedef _VSTD::__state<_CharT> __state;
2671 typedef _VSTD::__node<_CharT> __node;
2675 static const regex_constants::syntax_option_type icase = regex_constants::icase;
2676 static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2677 static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
2678 static const regex_constants::syntax_option_type collate = regex_constants::collate;
2679 static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2680 static const regex_constants::syntax_option_type basic = regex_constants::basic;
2681 static const regex_constants::syntax_option_type extended = regex_constants::extended;
2682 static const regex_constants::syntax_option_type awk = regex_constants::awk;
2683 static const regex_constants::syntax_option_type grep = regex_constants::grep;
2684 static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
2685 static const regex_constants::syntax_option_type multiline = regex_constants::multiline;
2687 // construct/copy/destroy:
2688 _LIBCPP_INLINE_VISIBILITY
2690 : __flags_(regex_constants::ECMAScript), __marked_count_(0), __loop_count_(0), __open_count_(0),
2693 _LIBCPP_INLINE_VISIBILITY
2694 explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2695 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2698 __init(__p, __p + __traits_.length(__p));
2701 _LIBCPP_INLINE_VISIBILITY
2702 basic_regex(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
2703 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2706 __init(__p, __p + __len);
2709 // basic_regex(const basic_regex&) = default;
2710 // basic_regex(basic_regex&&) = default;
2711 template <class _ST, class _SA>
2712 _LIBCPP_INLINE_VISIBILITY
2713 explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2714 flag_type __f = regex_constants::ECMAScript)
2715 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2718 __init(__p.begin(), __p.end());
2721 template <class _ForwardIterator>
2722 _LIBCPP_INLINE_VISIBILITY
2723 basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2724 flag_type __f = regex_constants::ECMAScript)
2725 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2728 __init(__first, __last);
2730 #ifndef _LIBCPP_CXX03_LANG
2731 _LIBCPP_INLINE_VISIBILITY
2732 basic_regex(initializer_list<value_type> __il,
2733 flag_type __f = regex_constants::ECMAScript)
2734 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2737 __init(__il.begin(), __il.end());
2739 #endif // _LIBCPP_CXX03_LANG
2741 // ~basic_regex() = default;
2743 // basic_regex& operator=(const basic_regex&) = default;
2744 // basic_regex& operator=(basic_regex&&) = default;
2745 _LIBCPP_INLINE_VISIBILITY
2746 basic_regex& operator=(const value_type* __p)
2747 {return assign(__p);}
2748 #ifndef _LIBCPP_CXX03_LANG
2749 _LIBCPP_INLINE_VISIBILITY
2750 basic_regex& operator=(initializer_list<value_type> __il)
2751 {return assign(__il);}
2752 #endif // _LIBCPP_CXX03_LANG
2753 template <class _ST, class _SA>
2754 _LIBCPP_INLINE_VISIBILITY
2755 basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2756 {return assign(__p);}
2759 _LIBCPP_INLINE_VISIBILITY
2760 basic_regex& assign(const basic_regex& __that)
2761 {return *this = __that;}
2762 #ifndef _LIBCPP_CXX03_LANG
2763 _LIBCPP_INLINE_VISIBILITY
2764 basic_regex& assign(basic_regex&& __that) _NOEXCEPT
2765 {return *this = _VSTD::move(__that);}
2767 _LIBCPP_INLINE_VISIBILITY
2768 basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2769 {return assign(__p, __p + __traits_.length(__p), __f);}
2770 _LIBCPP_INLINE_VISIBILITY
2771 basic_regex& assign(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
2772 {return assign(__p, __p + __len, __f);}
2773 template <class _ST, class _SA>
2774 _LIBCPP_INLINE_VISIBILITY
2775 basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
2776 flag_type __f = regex_constants::ECMAScript)
2777 {return assign(__s.begin(), __s.end(), __f);}
2779 template <class _InputIterator, __enable_if_t<__has_exactly_input_iterator_category<_InputIterator>::value, int> = 0>
2780 _LIBCPP_INLINE_VISIBILITY
2782 assign(_InputIterator __first, _InputIterator __last,
2783 flag_type __f = regex_constants::ECMAScript)
2785 basic_string<_CharT> __t(__first, __last);
2786 return assign(__t.begin(), __t.end(), __f);
2790 _LIBCPP_INLINE_VISIBILITY
2791 void __member_init(flag_type __f)
2794 __marked_count_ = 0;
2801 template <class _ForwardIterator, __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0>
2802 _LIBCPP_INLINE_VISIBILITY
2804 assign(_ForwardIterator __first, _ForwardIterator __last,
2805 flag_type __f = regex_constants::ECMAScript)
2807 return assign(basic_regex(__first, __last, __f));
2810 #ifndef _LIBCPP_CXX03_LANG
2812 _LIBCPP_INLINE_VISIBILITY
2813 basic_regex& assign(initializer_list<value_type> __il,
2814 flag_type __f = regex_constants::ECMAScript)
2815 {return assign(__il.begin(), __il.end(), __f);}
2817 #endif // _LIBCPP_CXX03_LANG
2819 // const operations:
2820 _LIBCPP_INLINE_VISIBILITY
2821 unsigned mark_count() const {return __marked_count_;}
2822 _LIBCPP_INLINE_VISIBILITY
2823 flag_type flags() const {return __flags_;}
2826 _LIBCPP_INLINE_VISIBILITY
2827 locale_type imbue(locale_type __loc)
2829 __member_init(ECMAScript);
2831 return __traits_.imbue(__loc);
2833 _LIBCPP_INLINE_VISIBILITY
2834 locale_type getloc() const {return __traits_.getloc();}
2837 void swap(basic_regex& __r);
2840 _LIBCPP_INLINE_VISIBILITY
2841 unsigned __loop_count() const {return __loop_count_;}
2843 _LIBCPP_INLINE_VISIBILITY
2844 bool __use_multiline() const
2846 return __get_grammar(__flags_) == ECMAScript && (__flags_ & multiline);
2849 template <class _ForwardIterator>
2851 __init(_ForwardIterator __first, _ForwardIterator __last);
2852 template <class _ForwardIterator>
2854 __parse(_ForwardIterator __first, _ForwardIterator __last);
2855 template <class _ForwardIterator>
2857 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2858 template <class _ForwardIterator>
2860 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2861 template <class _ForwardIterator>
2863 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2864 template <class _ForwardIterator>
2866 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2867 template <class _ForwardIterator>
2869 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2870 template <class _ForwardIterator>
2872 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2873 template <class _ForwardIterator>
2875 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2876 template <class _ForwardIterator>
2878 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2879 template <class _ForwardIterator>
2881 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2882 template <class _ForwardIterator>
2884 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2885 template <class _ForwardIterator>
2887 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2888 template <class _ForwardIterator>
2890 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2891 template <class _ForwardIterator>
2893 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2894 __owns_one_state<_CharT>* __s,
2895 unsigned __mexp_begin, unsigned __mexp_end);
2896 template <class _ForwardIterator>
2898 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2899 __owns_one_state<_CharT>* __s,
2900 unsigned __mexp_begin, unsigned __mexp_end);
2901 template <class _ForwardIterator>
2903 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2904 template <class _ForwardIterator>
2906 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2907 __bracket_expression<_CharT, _Traits>* __ml);
2908 template <class _ForwardIterator>
2910 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2911 __bracket_expression<_CharT, _Traits>* __ml);
2912 template <class _ForwardIterator>
2914 __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2915 __bracket_expression<_CharT, _Traits>* __ml);
2916 template <class _ForwardIterator>
2918 __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2919 __bracket_expression<_CharT, _Traits>* __ml);
2920 template <class _ForwardIterator>
2922 __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2923 basic_string<_CharT>& __col_sym);
2924 template <class _ForwardIterator>
2926 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
2927 template <class _ForwardIterator>
2929 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2930 template <class _ForwardIterator>
2932 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2933 template <class _ForwardIterator>
2935 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2936 template <class _ForwardIterator>
2938 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2939 template <class _ForwardIterator>
2941 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2942 template <class _ForwardIterator>
2944 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2945 template <class _ForwardIterator>
2947 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2948 template <class _ForwardIterator>
2950 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2951 template <class _ForwardIterator>
2953 __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2954 template <class _ForwardIterator>
2956 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2957 template <class _ForwardIterator>
2959 __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2960 template <class _ForwardIterator>
2962 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2963 template <class _ForwardIterator>
2965 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2966 template <class _ForwardIterator>
2968 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2969 template <class _ForwardIterator>
2971 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2972 basic_string<_CharT>* __str = nullptr);
2973 template <class _ForwardIterator>
2975 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
2976 template <class _ForwardIterator>
2978 __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2979 template <class _ForwardIterator>
2981 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
2982 template <class _ForwardIterator>
2984 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2985 basic_string<_CharT>& __str,
2986 __bracket_expression<_CharT, _Traits>* __ml);
2987 template <class _ForwardIterator>
2989 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2990 basic_string<_CharT>* __str = nullptr);
2992 bool __test_back_ref(_CharT);
2994 _LIBCPP_INLINE_VISIBILITY
2995 void __push_l_anchor();
2996 void __push_r_anchor();
2997 void __push_match_any();
2998 void __push_match_any_but_newline();
2999 _LIBCPP_INLINE_VISIBILITY
3000 void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
3001 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
3002 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
3003 __mexp_begin, __mexp_end);}
3004 _LIBCPP_INLINE_VISIBILITY
3005 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
3006 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
3007 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
3008 __mexp_begin, __mexp_end, false);}
3009 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
3010 size_t __mexp_begin = 0, size_t __mexp_end = 0,
3011 bool __greedy = true);
3012 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
3013 void __push_char(value_type __c);
3014 void __push_back_ref(int __i);
3015 void __push_alternation(__owns_one_state<_CharT>* __sa,
3016 __owns_one_state<_CharT>* __sb);
3017 void __push_begin_marked_subexpression();
3018 void __push_end_marked_subexpression(unsigned);
3019 void __push_empty();
3020 void __push_word_boundary(bool);
3021 void __push_lookahead(const basic_regex&, bool, unsigned);
3023 template <class _Allocator>
3025 __search(const _CharT* __first, const _CharT* __last,
3026 match_results<const _CharT*, _Allocator>& __m,
3027 regex_constants::match_flag_type __flags) const;
3029 template <class _Allocator>
3031 __match_at_start(const _CharT* __first, const _CharT* __last,
3032 match_results<const _CharT*, _Allocator>& __m,
3033 regex_constants::match_flag_type __flags, bool) const;
3034 template <class _Allocator>
3036 __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
3037 match_results<const _CharT*, _Allocator>& __m,
3038 regex_constants::match_flag_type __flags, bool) const;
3039 template <class _Allocator>
3041 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
3042 match_results<const _CharT*, _Allocator>& __m,
3043 regex_constants::match_flag_type __flags, bool) const;
3044 template <class _Allocator>
3046 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
3047 match_results<const _CharT*, _Allocator>& __m,
3048 regex_constants::match_flag_type __flags, bool) const;
3050 template <class _Bp, class _Ap, class _Cp, class _Tp>
3053 regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
3054 regex_constants::match_flag_type);
3056 template <class _Ap, class _Cp, class _Tp>
3059 regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
3060 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
3062 template <class _Bp, class _Cp, class _Tp>
3065 regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
3066 regex_constants::match_flag_type);
3068 template <class _Cp, class _Tp>
3071 regex_search(const _Cp*, const _Cp*,
3072 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
3074 template <class _Cp, class _Ap, class _Tp>
3077 regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
3078 regex_constants::match_flag_type);
3080 template <class _ST, class _SA, class _Cp, class _Tp>
3083 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
3084 const basic_regex<_Cp, _Tp>& __e,
3085 regex_constants::match_flag_type __flags);
3087 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
3090 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
3091 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
3092 const basic_regex<_Cp, _Tp>& __e,
3093 regex_constants::match_flag_type __flags);
3095 template <class _Iter, class _Ap, class _Cp, class _Tp>
3098 regex_search(__wrap_iter<_Iter> __first,
3099 __wrap_iter<_Iter> __last,
3100 match_results<__wrap_iter<_Iter>, _Ap>& __m,
3101 const basic_regex<_Cp, _Tp>& __e,
3102 regex_constants::match_flag_type __flags);
3104 template <class, class> friend class __lookahead;
3107 #if _LIBCPP_STD_VER >= 17
3108 template <class _ForwardIterator,
3109 __enable_if_t<__has_forward_iterator_category<_ForwardIterator>::value, int> = 0>
3110 basic_regex(_ForwardIterator, _ForwardIterator,
3111 regex_constants::syntax_option_type = regex_constants::ECMAScript)
3112 -> basic_regex<typename iterator_traits<_ForwardIterator>::value_type>;
3115 template <class _CharT, class _Traits>
3116 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
3117 template <class _CharT, class _Traits>
3118 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
3119 template <class _CharT, class _Traits>
3120 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
3121 template <class _CharT, class _Traits>
3122 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
3123 template <class _CharT, class _Traits>
3124 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
3125 template <class _CharT, class _Traits>
3126 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
3127 template <class _CharT, class _Traits>
3128 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
3129 template <class _CharT, class _Traits>
3130 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
3131 template <class _CharT, class _Traits>
3132 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
3133 template <class _CharT, class _Traits>
3134 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
3136 template <class _CharT, class _Traits>
3138 basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
3141 swap(__traits_, __r.__traits_);
3142 swap(__flags_, __r.__flags_);
3143 swap(__marked_count_, __r.__marked_count_);
3144 swap(__loop_count_, __r.__loop_count_);
3145 swap(__open_count_, __r.__open_count_);
3146 swap(__start_, __r.__start_);
3147 swap(__end_, __r.__end_);
3150 template <class _CharT, class _Traits>
3151 inline _LIBCPP_INLINE_VISIBILITY
3153 swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
3155 return __x.swap(__y);
3160 template <class _CharT, class _Traits>
3162 : public __owns_one_state<_CharT>
3164 typedef __owns_one_state<_CharT> base;
3166 basic_regex<_CharT, _Traits> __exp_;
3170 __lookahead(const __lookahead&);
3171 __lookahead& operator=(const __lookahead&);
3173 typedef _VSTD::__state<_CharT> __state;
3175 _LIBCPP_INLINE_VISIBILITY
3176 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
3177 : base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {}
3179 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
3182 template <class _CharT, class _Traits>
3184 __lookahead<_CharT, _Traits>::__exec(__state& __s) const
3186 match_results<const _CharT*> __m;
3187 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
3188 bool __matched = __exp_.__match_at_start_ecma(
3189 __s.__current_, __s.__last_,
3191 (__s.__flags_ | regex_constants::match_continuous) &
3192 ~regex_constants::__full_match,
3193 __s.__at_first_ && __s.__current_ == __s.__first_);
3194 if (__matched != __invert_)
3196 __s.__do_ = __state::__accept_but_not_consume;
3197 __s.__node_ = this->first();
3198 for (unsigned __i = 1; __i < __m.size(); ++__i) {
3199 __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
3204 __s.__do_ = __state::__reject;
3205 __s.__node_ = nullptr;
3209 template <class _CharT, class _Traits>
3210 template <class _ForwardIterator>
3212 basic_regex<_CharT, _Traits>::__init(_ForwardIterator __first, _ForwardIterator __last)
3214 if (__get_grammar(__flags_) == 0) __flags_ |= regex_constants::ECMAScript;
3215 _ForwardIterator __temp = __parse(__first, __last);
3216 if ( __temp != __last)
3217 __throw_regex_error<regex_constants::__re_err_parse>();
3220 template <class _CharT, class _Traits>
3221 template <class _ForwardIterator>
3223 basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
3224 _ForwardIterator __last)
3227 unique_ptr<__node> __h(new __end_state<_CharT>);
3228 __start_.reset(new __empty_state<_CharT>(__h.get()));
3230 __end_ = __start_.get();
3232 switch (__get_grammar(__flags_))
3235 __first = __parse_ecma_exp(__first, __last);
3238 __first = __parse_basic_reg_exp(__first, __last);
3242 __first = __parse_extended_reg_exp(__first, __last);
3245 __first = __parse_grep(__first, __last);
3248 __first = __parse_egrep(__first, __last);
3251 __throw_regex_error<regex_constants::__re_err_grammar>();
3256 template <class _CharT, class _Traits>
3257 template <class _ForwardIterator>
3259 basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
3260 _ForwardIterator __last)
3262 if (__first != __last)
3264 if (*__first == '^')
3269 if (__first != __last)
3271 __first = __parse_RE_expression(__first, __last);
3272 if (__first != __last)
3274 _ForwardIterator __temp = _VSTD::next(__first);
3275 if (__temp == __last && *__first == '$')
3282 if (__first != __last)
3283 __throw_regex_error<regex_constants::__re_err_empty>();
3288 template <class _CharT, class _Traits>
3289 template <class _ForwardIterator>
3291 basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
3292 _ForwardIterator __last)
3294 __owns_one_state<_CharT>* __sa = __end_;
3295 _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
3296 if (__temp == __first)
3297 __throw_regex_error<regex_constants::__re_err_empty>();
3299 while (__first != __last && *__first == '|')
3301 __owns_one_state<_CharT>* __sb = __end_;
3302 __temp = __parse_ERE_branch(++__first, __last);
3303 if (__temp == __first)
3304 __throw_regex_error<regex_constants::__re_err_empty>();
3305 __push_alternation(__sa, __sb);
3311 template <class _CharT, class _Traits>
3312 template <class _ForwardIterator>
3314 basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3315 _ForwardIterator __last)
3317 _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
3318 if (__temp == __first)
3319 __throw_regex_error<regex_constants::__re_err_empty>();
3323 __temp = __parse_ERE_expression(__first, __last);
3324 } while (__temp != __first);
3328 template <class _CharT, class _Traits>
3329 template <class _ForwardIterator>
3331 basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3332 _ForwardIterator __last)
3334 __owns_one_state<_CharT>* __e = __end_;
3335 unsigned __mexp_begin = __marked_count_;
3336 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3337 if (__temp == __first && __temp != __last)
3350 __push_begin_marked_subexpression();
3351 unsigned __temp_count = __marked_count_;
3353 __temp = __parse_extended_reg_exp(++__temp, __last);
3354 if (__temp == __last || *__temp != ')')
3355 __throw_regex_error<regex_constants::error_paren>();
3356 __push_end_marked_subexpression(__temp_count);
3362 if (__temp != __first)
3363 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3369 template <class _CharT, class _Traits>
3370 template <class _ForwardIterator>
3372 basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3373 _ForwardIterator __last)
3377 _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3378 if (__temp == __first)
3385 template <class _CharT, class _Traits>
3386 template <class _ForwardIterator>
3388 basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3389 _ForwardIterator __last)
3391 if (__first != __last)
3393 __owns_one_state<_CharT>* __e = __end_;
3394 unsigned __mexp_begin = __marked_count_;
3395 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3396 if (__temp != __first)
3397 __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3398 __mexp_begin+1, __marked_count_+1);
3403 template <class _CharT, class _Traits>
3404 template <class _ForwardIterator>
3406 basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3407 _ForwardIterator __last)
3409 _ForwardIterator __temp = __first;
3410 __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3411 if (__temp == __first)
3413 __temp = __parse_Back_open_paren(__first, __last);
3414 if (__temp != __first)
3416 __push_begin_marked_subexpression();
3417 unsigned __temp_count = __marked_count_;
3418 __first = __parse_RE_expression(__temp, __last);
3419 __temp = __parse_Back_close_paren(__first, __last);
3420 if (__temp == __first)
3421 __throw_regex_error<regex_constants::error_paren>();
3422 __push_end_marked_subexpression(__temp_count);
3426 __first = __parse_BACKREF(__first, __last);
3431 template <class _CharT, class _Traits>
3432 template <class _ForwardIterator>
3434 basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3435 _ForwardIterator __first,
3436 _ForwardIterator __last)
3438 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
3439 if (__temp == __first)
3441 __temp = __parse_QUOTED_CHAR(__first, __last);
3442 if (__temp == __first)
3444 if (__temp != __last && *__temp == '.')
3450 __temp = __parse_bracket_expression(__first, __last);
3457 template <class _CharT, class _Traits>
3458 template <class _ForwardIterator>
3460 basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3461 _ForwardIterator __first,
3462 _ForwardIterator __last)
3464 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3465 if (__temp == __first)
3467 __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3468 if (__temp == __first)
3470 if (__temp != __last && *__temp == '.')
3476 __temp = __parse_bracket_expression(__first, __last);
3483 template <class _CharT, class _Traits>
3484 template <class _ForwardIterator>
3486 basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3487 _ForwardIterator __last)
3489 if (__first != __last)
3491 _ForwardIterator __temp = _VSTD::next(__first);
3492 if (__temp != __last)
3494 if (*__first == '\\' && *__temp == '(')
3501 template <class _CharT, class _Traits>
3502 template <class _ForwardIterator>
3504 basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3505 _ForwardIterator __last)
3507 if (__first != __last)
3509 _ForwardIterator __temp = _VSTD::next(__first);
3510 if (__temp != __last)
3512 if (*__first == '\\' && *__temp == ')')
3519 template <class _CharT, class _Traits>
3520 template <class _ForwardIterator>
3522 basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3523 _ForwardIterator __last)
3525 if (__first != __last)
3527 _ForwardIterator __temp = _VSTD::next(__first);
3528 if (__temp != __last)
3530 if (*__first == '\\' && *__temp == '{')
3537 template <class _CharT, class _Traits>
3538 template <class _ForwardIterator>
3540 basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3541 _ForwardIterator __last)
3543 if (__first != __last)
3545 _ForwardIterator __temp = _VSTD::next(__first);
3546 if (__temp != __last)
3548 if (*__first == '\\' && *__temp == '}')
3555 template <class _CharT, class _Traits>
3556 template <class _ForwardIterator>
3558 basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3559 _ForwardIterator __last)
3561 if (__first != __last)
3563 _ForwardIterator __temp = _VSTD::next(__first);
3564 if (__temp != __last && *__first == '\\' && __test_back_ref(*__temp))
3570 template <class _CharT, class _Traits>
3571 template <class _ForwardIterator>
3573 basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3574 _ForwardIterator __last)
3576 if (__first != __last)
3578 _ForwardIterator __temp = _VSTD::next(__first);
3579 if (__temp == __last && *__first == '$')
3581 // Not called inside a bracket
3582 if (*__first == '.' || *__first == '\\' || *__first == '[')
3584 __push_char(*__first);
3590 template <class _CharT, class _Traits>
3591 template <class _ForwardIterator>
3593 basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3594 _ForwardIterator __last)
3596 if (__first != __last)
3613 if (__open_count_ == 0)
3615 __push_char(*__first);
3620 __push_char(*__first);
3628 template <class _CharT, class _Traits>
3629 template <class _ForwardIterator>
3631 basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3632 _ForwardIterator __last)
3634 if (__first != __last)
3636 _ForwardIterator __temp = _VSTD::next(__first);
3637 if (__temp != __last)
3639 if (*__first == '\\')
3649 __push_char(*__temp);
3659 template <class _CharT, class _Traits>
3660 template <class _ForwardIterator>
3662 basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3663 _ForwardIterator __last)
3665 if (__first != __last)
3667 _ForwardIterator __temp = _VSTD::next(__first);
3668 if (__temp != __last)
3670 if (*__first == '\\')
3687 __push_char(*__temp);
3691 if (__get_grammar(__flags_) == awk)
3692 __first = __parse_awk_escape(++__first, __last);
3693 else if(__test_back_ref(*__temp))
3703 template <class _CharT, class _Traits>
3704 template <class _ForwardIterator>
3706 basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
3707 _ForwardIterator __last,
3708 __owns_one_state<_CharT>* __s,
3709 unsigned __mexp_begin,
3710 unsigned __mexp_end)
3712 if (__first != __last)
3714 if (*__first == '*')
3716 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3721 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3722 if (__temp != __first)
3726 __temp = __parse_DUP_COUNT(__first, __last, __min);
3727 if (__temp == __first)
3728 __throw_regex_error<regex_constants::error_badbrace>();
3730 if (__first == __last)
3731 __throw_regex_error<regex_constants::error_brace>();
3732 if (*__first != ',')
3734 __temp = __parse_Back_close_brace(__first, __last);
3735 if (__temp == __first)
3736 __throw_regex_error<regex_constants::error_brace>();
3737 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3743 ++__first; // consume ','
3745 __first = __parse_DUP_COUNT(__first, __last, __max);
3746 __temp = __parse_Back_close_brace(__first, __last);
3747 if (__temp == __first)
3748 __throw_regex_error<regex_constants::error_brace>();
3750 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3754 __throw_regex_error<regex_constants::error_badbrace>();
3755 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3766 template <class _CharT, class _Traits>
3767 template <class _ForwardIterator>
3769 basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
3770 _ForwardIterator __last,
3771 __owns_one_state<_CharT>* __s,
3772 unsigned __mexp_begin,
3773 unsigned __mexp_end)
3775 if (__first != __last)
3777 unsigned __grammar = __get_grammar(__flags_);
3782 if (__grammar == ECMAScript && __first != __last && *__first == '?')
3785 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3788 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3792 if (__grammar == ECMAScript && __first != __last && *__first == '?')
3795 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3798 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3802 if (__grammar == ECMAScript && __first != __last && *__first == '?')
3805 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3808 __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
3813 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
3814 if (__temp == __first)
3815 __throw_regex_error<regex_constants::error_badbrace>();
3817 if (__first == __last)
3818 __throw_regex_error<regex_constants::error_brace>();
3823 if (__grammar == ECMAScript && __first != __last && *__first == '?')
3826 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3829 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
3833 if (__first == __last)
3834 __throw_regex_error<regex_constants::error_badbrace>();
3835 if (*__first == '}')
3838 if (__grammar == ECMAScript && __first != __last && *__first == '?')
3841 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3844 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3849 __temp = __parse_DUP_COUNT(__first, __last, __max);
3850 if (__temp == __first)
3851 __throw_regex_error<regex_constants::error_brace>();
3853 if (__first == __last || *__first != '}')
3854 __throw_regex_error<regex_constants::error_brace>();
3857 __throw_regex_error<regex_constants::error_badbrace>();
3858 if (__grammar == ECMAScript && __first != __last && *__first == '?')
3861 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3864 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
3868 __throw_regex_error<regex_constants::error_badbrace>();
3877 template <class _CharT, class _Traits>
3878 template <class _ForwardIterator>
3880 basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3881 _ForwardIterator __last)
3883 if (__first != __last && *__first == '[')
3886 if (__first == __last)
3887 __throw_regex_error<regex_constants::error_brack>();
3888 bool __negate = false;
3889 if (*__first == '^')
3894 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3895 // __ml owned by *this
3896 if (__first == __last)
3897 __throw_regex_error<regex_constants::error_brack>();
3898 if (__get_grammar(__flags_) != ECMAScript && *__first == ']')
3900 __ml->__add_char(']');
3903 __first = __parse_follow_list(__first, __last, __ml);
3904 if (__first == __last)
3905 __throw_regex_error<regex_constants::error_brack>();
3906 if (*__first == '-')
3908 __ml->__add_char('-');
3911 if (__first == __last || *__first != ']')
3912 __throw_regex_error<regex_constants::error_brack>();
3918 template <class _CharT, class _Traits>
3919 template <class _ForwardIterator>
3921 basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
3922 _ForwardIterator __last,
3923 __bracket_expression<_CharT, _Traits>* __ml)
3925 if (__first != __last)
3929 _ForwardIterator __temp = __parse_expression_term(__first, __last,
3931 if (__temp == __first)
3939 template <class _CharT, class _Traits>
3940 template <class _ForwardIterator>
3942 basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
3943 _ForwardIterator __last,
3944 __bracket_expression<_CharT, _Traits>* __ml)
3946 if (__first != __last && *__first != ']')
3948 _ForwardIterator __temp = _VSTD::next(__first);
3949 basic_string<_CharT> __start_range;
3950 if (__temp != __last && *__first == '[')
3953 return __parse_equivalence_class(++__temp, __last, __ml);
3954 else if (*__temp == ':')
3955 return __parse_character_class(++__temp, __last, __ml);
3956 else if (*__temp == '.')
3957 __first = __parse_collating_symbol(++__temp, __last, __start_range);
3959 unsigned __grammar = __get_grammar(__flags_);
3960 if (__start_range.empty())
3962 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3964 if (__grammar == ECMAScript)
3965 __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3967 __first = __parse_awk_escape(++__first, __last, &__start_range);
3971 __start_range = *__first;
3975 if (__first != __last && *__first != ']')
3977 __temp = _VSTD::next(__first);
3978 if (__temp != __last && *__first == '-' && *__temp != ']')
3981 basic_string<_CharT> __end_range;
3984 if (__temp != __last && *__first == '[' && *__temp == '.')
3985 __first = __parse_collating_symbol(++__temp, __last, __end_range);
3988 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3990 if (__grammar == ECMAScript)
3991 __first = __parse_class_escape(++__first, __last,
3994 __first = __parse_awk_escape(++__first, __last,
3999 __end_range = *__first;
4003 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
4005 else if (!__start_range.empty())
4007 if (__start_range.size() == 1)
4008 __ml->__add_char(__start_range[0]);
4010 __ml->__add_digraph(__start_range[0], __start_range[1]);
4013 else if (!__start_range.empty())
4015 if (__start_range.size() == 1)
4016 __ml->__add_char(__start_range[0]);
4018 __ml->__add_digraph(__start_range[0], __start_range[1]);
4024 template <class _CharT, class _Traits>
4025 template <class _ForwardIterator>
4027 basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
4028 _ForwardIterator __last,
4029 basic_string<_CharT>& __str,
4030 __bracket_expression<_CharT, _Traits>* __ml)
4032 if (__first == __last)
4033 __throw_regex_error<regex_constants::error_escape>();
4043 __ml->__add_class(ctype_base::digit);
4046 __ml->__add_neg_class(ctype_base::digit);
4049 __ml->__add_class(ctype_base::space);
4052 __ml->__add_neg_class(ctype_base::space);
4055 __ml->__add_class(ctype_base::alnum);
4056 __ml->__add_char('_');
4059 __ml->__add_neg_class(ctype_base::alnum);
4060 __ml->__add_neg_char('_');
4063 __first = __parse_character_escape(__first, __last, &__str);
4067 template <class _CharT, class _Traits>
4068 template <class _ForwardIterator>
4070 basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
4071 _ForwardIterator __last,
4072 basic_string<_CharT>* __str)
4074 if (__first == __last)
4075 __throw_regex_error<regex_constants::error_escape>();
4084 __push_char(*__first);
4090 __push_char(_CharT(7));
4096 __push_char(_CharT(8));
4100 *__str = _CharT(0xC);
4102 __push_char(_CharT(0xC));
4106 *__str = _CharT(0xA);
4108 __push_char(_CharT(0xA));
4112 *__str = _CharT(0xD);
4114 __push_char(_CharT(0xD));
4118 *__str = _CharT(0x9);
4120 __push_char(_CharT(0x9));
4124 *__str = _CharT(0xB);
4126 __push_char(_CharT(0xB));
4129 if ('0' <= *__first && *__first <= '7')
4131 unsigned __val = *__first - '0';
4132 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
4134 __val = 8 * __val + *__first - '0';
4135 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
4136 __val = 8 * __val + *__first++ - '0';
4139 *__str = _CharT(__val);
4141 __push_char(_CharT(__val));
4144 __throw_regex_error<regex_constants::error_escape>();
4148 template <class _CharT, class _Traits>
4149 template <class _ForwardIterator>
4151 basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
4152 _ForwardIterator __last,
4153 __bracket_expression<_CharT, _Traits>* __ml)
4156 // This means =] must exist
4157 value_type __equal_close[2] = {'=', ']'};
4158 _ForwardIterator __temp = _VSTD::search(__first, __last, __equal_close,
4160 if (__temp == __last)
4161 __throw_regex_error<regex_constants::error_brack>();
4162 // [__first, __temp) contains all text in [= ... =]
4163 string_type __collate_name =
4164 __traits_.lookup_collatename(__first, __temp);
4165 if (__collate_name.empty())
4166 __throw_regex_error<regex_constants::error_collate>();
4167 string_type __equiv_name =
4168 __traits_.transform_primary(__collate_name.begin(),
4169 __collate_name.end());
4170 if (!__equiv_name.empty())
4171 __ml->__add_equivalence(__equiv_name);
4174 switch (__collate_name.size())
4177 __ml->__add_char(__collate_name[0]);
4180 __ml->__add_digraph(__collate_name[0], __collate_name[1]);
4183 __throw_regex_error<regex_constants::error_collate>();
4186 __first = _VSTD::next(__temp, 2);
4190 template <class _CharT, class _Traits>
4191 template <class _ForwardIterator>
4193 basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
4194 _ForwardIterator __last,
4195 __bracket_expression<_CharT, _Traits>* __ml)
4198 // This means :] must exist
4199 value_type __colon_close[2] = {':', ']'};
4200 _ForwardIterator __temp = _VSTD::search(__first, __last, __colon_close,
4202 if (__temp == __last)
4203 __throw_regex_error<regex_constants::error_brack>();
4204 // [__first, __temp) contains all text in [: ... :]
4205 typedef typename _Traits::char_class_type char_class_type;
4206 char_class_type __class_type =
4207 __traits_.lookup_classname(__first, __temp, __flags_ & icase);
4208 if (__class_type == 0)
4209 __throw_regex_error<regex_constants::error_ctype>();
4210 __ml->__add_class(__class_type);
4211 __first = _VSTD::next(__temp, 2);
4215 template <class _CharT, class _Traits>
4216 template <class _ForwardIterator>
4218 basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
4219 _ForwardIterator __last,
4220 basic_string<_CharT>& __col_sym)
4223 // This means .] must exist
4224 value_type __dot_close[2] = {'.', ']'};
4225 _ForwardIterator __temp = _VSTD::search(__first, __last, __dot_close,
4227 if (__temp == __last)
4228 __throw_regex_error<regex_constants::error_brack>();
4229 // [__first, __temp) contains all text in [. ... .]
4230 __col_sym = __traits_.lookup_collatename(__first, __temp);
4231 switch (__col_sym.size())
4237 __throw_regex_error<regex_constants::error_collate>();
4239 __first = _VSTD::next(__temp, 2);
4243 template <class _CharT, class _Traits>
4244 template <class _ForwardIterator>
4246 basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4247 _ForwardIterator __last,
4250 if (__first != __last )
4252 int __val = __traits_.value(*__first, 10);
4257 __first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
4260 if (__c >= numeric_limits<int>::max() / 10)
4261 __throw_regex_error<regex_constants::error_badbrace>();
4270 template <class _CharT, class _Traits>
4271 template <class _ForwardIterator>
4273 basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4274 _ForwardIterator __last)
4276 __owns_one_state<_CharT>* __sa = __end_;
4277 _ForwardIterator __temp = __parse_alternative(__first, __last);
4278 if (__temp == __first)
4281 while (__first != __last && *__first == '|')
4283 __owns_one_state<_CharT>* __sb = __end_;
4284 __temp = __parse_alternative(++__first, __last);
4285 if (__temp == __first)
4287 __push_alternation(__sa, __sb);
4293 template <class _CharT, class _Traits>
4294 template <class _ForwardIterator>
4296 basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4297 _ForwardIterator __last)
4301 _ForwardIterator __temp = __parse_term(__first, __last);
4302 if (__temp == __first)
4309 template <class _CharT, class _Traits>
4310 template <class _ForwardIterator>
4312 basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4313 _ForwardIterator __last)
4315 _ForwardIterator __temp = __parse_assertion(__first, __last);
4316 if (__temp == __first)
4318 __owns_one_state<_CharT>* __e = __end_;
4319 unsigned __mexp_begin = __marked_count_;
4320 __temp = __parse_atom(__first, __last);
4321 if (__temp != __first)
4322 __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4323 __mexp_begin+1, __marked_count_+1);
4330 template <class _CharT, class _Traits>
4331 template <class _ForwardIterator>
4333 basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4334 _ForwardIterator __last)
4336 if (__first != __last)
4350 _ForwardIterator __temp = _VSTD::next(__first);
4351 if (__temp != __last)
4355 __push_word_boundary(false);
4358 else if (*__temp == 'B')
4360 __push_word_boundary(true);
4368 _ForwardIterator __temp = _VSTD::next(__first);
4369 if (__temp != __last && *__temp == '?')
4371 if (++__temp != __last)
4378 __exp.__flags_ = __flags_;
4379 __temp = __exp.__parse(++__temp, __last);
4380 unsigned __mexp = __exp.__marked_count_;
4381 __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
4382 __marked_count_ += __mexp;
4383 if (__temp == __last || *__temp != ')')
4384 __throw_regex_error<regex_constants::error_paren>();
4391 __exp.__flags_ = __flags_;
4392 __temp = __exp.__parse(++__temp, __last);
4393 unsigned __mexp = __exp.__marked_count_;
4394 __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
4395 __marked_count_ += __mexp;
4396 if (__temp == __last || *__temp != ')')
4397 __throw_regex_error<regex_constants::error_paren>();
4411 template <class _CharT, class _Traits>
4412 template <class _ForwardIterator>
4414 basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4415 _ForwardIterator __last)
4417 if (__first != __last)
4422 __push_match_any_but_newline();
4426 __first = __parse_atom_escape(__first, __last);
4429 __first = __parse_bracket_expression(__first, __last);
4434 if (__first == __last)
4435 __throw_regex_error<regex_constants::error_paren>();
4436 _ForwardIterator __temp = _VSTD::next(__first);
4437 if (__temp != __last && *__first == '?' && *__temp == ':')
4440 __first = __parse_ecma_exp(++__temp, __last);
4441 if (__first == __last || *__first != ')')
4442 __throw_regex_error<regex_constants::error_paren>();
4448 __push_begin_marked_subexpression();
4449 unsigned __temp_count = __marked_count_;
4451 __first = __parse_ecma_exp(__first, __last);
4452 if (__first == __last || *__first != ')')
4453 __throw_regex_error<regex_constants::error_paren>();
4454 __push_end_marked_subexpression(__temp_count);
4464 __throw_regex_error<regex_constants::error_badrepeat>();
4467 __first = __parse_pattern_character(__first, __last);
4474 template <class _CharT, class _Traits>
4475 template <class _ForwardIterator>
4477 basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4478 _ForwardIterator __last)
4480 if (__first != __last && *__first == '\\')
4482 _ForwardIterator __t1 = _VSTD::next(__first);
4484 __throw_regex_error<regex_constants::error_escape>();
4486 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4491 __t2 = __parse_character_class_escape(__t1, __last);
4496 __t2 = __parse_character_escape(__t1, __last);
4505 template <class _CharT, class _Traits>
4506 template <class _ForwardIterator>
4508 basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4509 _ForwardIterator __last)
4511 if (__first != __last)
4513 if (*__first == '0')
4515 __push_char(_CharT());
4518 else if ('1' <= *__first && *__first <= '9')
4520 unsigned __v = *__first - '0';
4522 __first != __last && '0' <= *__first && *__first <= '9'; ++__first)
4524 if (__v >= numeric_limits<unsigned>::max() / 10)
4525 __throw_regex_error<regex_constants::error_backref>();
4526 __v = 10 * __v + *__first - '0';
4528 if (__v == 0 || __v > mark_count())
4529 __throw_regex_error<regex_constants::error_backref>();
4530 __push_back_ref(__v);
4536 template <class _CharT, class _Traits>
4537 template <class _ForwardIterator>
4539 basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4540 _ForwardIterator __last)
4542 if (__first != __last)
4544 __bracket_expression<_CharT, _Traits>* __ml;
4548 __ml = __start_matching_list(false);
4549 __ml->__add_class(ctype_base::digit);
4553 __ml = __start_matching_list(true);
4554 __ml->__add_class(ctype_base::digit);
4558 __ml = __start_matching_list(false);
4559 __ml->__add_class(ctype_base::space);
4563 __ml = __start_matching_list(true);
4564 __ml->__add_class(ctype_base::space);
4568 __ml = __start_matching_list(false);
4569 __ml->__add_class(ctype_base::alnum);
4570 __ml->__add_char('_');
4574 __ml = __start_matching_list(true);
4575 __ml->__add_class(ctype_base::alnum);
4576 __ml->__add_char('_');
4584 template <class _CharT, class _Traits>
4585 template <class _ForwardIterator>
4587 basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
4588 _ForwardIterator __last,
4589 basic_string<_CharT>* __str)
4591 if (__first != __last)
4593 _ForwardIterator __t;
4600 *__str = _CharT(0xC);
4602 __push_char(_CharT(0xC));
4607 *__str = _CharT(0xA);
4609 __push_char(_CharT(0xA));
4614 *__str = _CharT(0xD);
4616 __push_char(_CharT(0xD));
4621 *__str = _CharT(0x9);
4623 __push_char(_CharT(0x9));
4628 *__str = _CharT(0xB);
4630 __push_char(_CharT(0xB));
4634 if ((__t = _VSTD::next(__first)) != __last)
4636 if (('A' <= *__t && *__t <= 'Z') ||
4637 ('a' <= *__t && *__t <= 'z'))
4640 *__str = _CharT(*__t % 32);
4642 __push_char(_CharT(*__t % 32));
4646 __throw_regex_error<regex_constants::error_escape>();
4649 __throw_regex_error<regex_constants::error_escape>();
4653 if (__first == __last)
4654 __throw_regex_error<regex_constants::error_escape>();
4655 __hd = __traits_.value(*__first, 16);
4657 __throw_regex_error<regex_constants::error_escape>();
4658 __sum = 16 * __sum + static_cast<unsigned>(__hd);
4660 if (__first == __last)
4661 __throw_regex_error<regex_constants::error_escape>();
4662 __hd = __traits_.value(*__first, 16);
4664 __throw_regex_error<regex_constants::error_escape>();
4665 __sum = 16 * __sum + static_cast<unsigned>(__hd);
4669 if (__first == __last)
4670 __throw_regex_error<regex_constants::error_escape>();
4671 __hd = __traits_.value(*__first, 16);
4673 __throw_regex_error<regex_constants::error_escape>();
4674 __sum = 16 * __sum + static_cast<unsigned>(__hd);
4676 if (__first == __last)
4677 __throw_regex_error<regex_constants::error_escape>();
4678 __hd = __traits_.value(*__first, 16);
4680 __throw_regex_error<regex_constants::error_escape>();
4681 __sum = 16 * __sum + static_cast<unsigned>(__hd);
4683 *__str = _CharT(__sum);
4685 __push_char(_CharT(__sum));
4692 __push_char(_CharT(0));
4696 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4701 __push_char(*__first);
4705 __throw_regex_error<regex_constants::error_escape>();
4712 template <class _CharT, class _Traits>
4713 template <class _ForwardIterator>
4715 basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4716 _ForwardIterator __last)
4718 if (__first != __last)
4738 __push_char(*__first);
4746 template <class _CharT, class _Traits>
4747 template <class _ForwardIterator>
4749 basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4750 _ForwardIterator __last)
4752 __owns_one_state<_CharT>* __sa = __end_;
4753 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4754 if (__t1 != __first)
4755 __parse_basic_reg_exp(__first, __t1);
4759 if (__first != __last)
4761 while (__first != __last)
4763 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4764 __owns_one_state<_CharT>* __sb = __end_;
4765 if (__t1 != __first)
4766 __parse_basic_reg_exp(__first, __t1);
4769 __push_alternation(__sa, __sb);
4771 if (__first != __last)
4777 template <class _CharT, class _Traits>
4778 template <class _ForwardIterator>
4780 basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4781 _ForwardIterator __last)
4783 __owns_one_state<_CharT>* __sa = __end_;
4784 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4785 if (__t1 != __first)
4786 __parse_extended_reg_exp(__first, __t1);
4790 if (__first != __last)
4792 while (__first != __last)
4794 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4795 __owns_one_state<_CharT>* __sb = __end_;
4796 if (__t1 != __first)
4797 __parse_extended_reg_exp(__first, __t1);
4800 __push_alternation(__sa, __sb);
4802 if (__first != __last)
4808 template <class _CharT, class _Traits>
4810 basic_regex<_CharT, _Traits>::__test_back_ref(_CharT __c)
4812 unsigned __val = __traits_.value(__c, 10);
4813 if (__val >= 1 && __val <= 9)
4815 if (__val > mark_count())
4816 __throw_regex_error<regex_constants::error_backref>();
4817 __push_back_ref(__val);
4824 template <class _CharT, class _Traits>
4826 basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4827 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4830 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4831 __end_->first() = nullptr;
4832 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4833 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4835 __s->first() = nullptr;
4837 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
4838 __end_ = __e2->second();
4839 __s->first() = __e2.release();
4843 template <class _CharT, class _Traits>
4845 basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4847 if (flags() & icase)
4848 __end_->first() = new __match_char_icase<_CharT, _Traits>
4849 (__traits_, __c, __end_->first());
4850 else if (flags() & collate)
4851 __end_->first() = new __match_char_collate<_CharT, _Traits>
4852 (__traits_, __c, __end_->first());
4854 __end_->first() = new __match_char<_CharT>(__c, __end_->first());
4855 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4858 template <class _CharT, class _Traits>
4860 basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4862 if (!(__flags_ & nosubs))
4865 new __begin_marked_subexpression<_CharT>(++__marked_count_,
4867 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4871 template <class _CharT, class _Traits>
4873 basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4875 if (!(__flags_ & nosubs))
4878 new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4879 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4883 template <class _CharT, class _Traits>
4885 basic_regex<_CharT, _Traits>::__push_l_anchor()
4887 __end_->first() = new __l_anchor_multiline<_CharT>(__use_multiline(), __end_->first());
4888 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4891 template <class _CharT, class _Traits>
4893 basic_regex<_CharT, _Traits>::__push_r_anchor()
4895 __end_->first() = new __r_anchor_multiline<_CharT>(__use_multiline(), __end_->first());
4896 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4899 template <class _CharT, class _Traits>
4901 basic_regex<_CharT, _Traits>::__push_match_any()
4903 __end_->first() = new __match_any<_CharT>(__end_->first());
4904 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4907 template <class _CharT, class _Traits>
4909 basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4911 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4912 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4915 template <class _CharT, class _Traits>
4917 basic_regex<_CharT, _Traits>::__push_empty()
4919 __end_->first() = new __empty_state<_CharT>(__end_->first());
4920 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4923 template <class _CharT, class _Traits>
4925 basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4927 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4929 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4932 template <class _CharT, class _Traits>
4934 basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4936 if (flags() & icase)
4937 __end_->first() = new __back_ref_icase<_CharT, _Traits>
4938 (__traits_, __i, __end_->first());
4939 else if (flags() & collate)
4940 __end_->first() = new __back_ref_collate<_CharT, _Traits>
4941 (__traits_, __i, __end_->first());
4943 __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
4944 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4947 template <class _CharT, class _Traits>
4949 basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4950 __owns_one_state<_CharT>* __ea)
4952 __sa->first() = new __alternate<_CharT>(
4953 static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4954 static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4955 __ea->first() = nullptr;
4956 __ea->first() = new __empty_state<_CharT>(__end_->first());
4957 __end_->first() = nullptr;
4958 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4959 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4962 template <class _CharT, class _Traits>
4963 __bracket_expression<_CharT, _Traits>*
4964 basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4966 __bracket_expression<_CharT, _Traits>* __r =
4967 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4968 __negate, __flags_ & icase,
4969 __flags_ & collate);
4970 __end_->first() = __r;
4975 template <class _CharT, class _Traits>
4977 basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
4981 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
4982 __end_->first(), __mexp);
4983 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4988 typedef sub_match<const char*> csub_match;
4989 typedef sub_match<string::const_iterator> ssub_match;
4990 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
4991 typedef sub_match<const wchar_t*> wcsub_match;
4992 typedef sub_match<wstring::const_iterator> wssub_match;
4995 template <class _BidirectionalIterator>
4997 _LIBCPP_TEMPLATE_VIS
4998 _LIBCPP_PREFERRED_NAME(csub_match)
4999 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcsub_match))
5000 _LIBCPP_PREFERRED_NAME(ssub_match)
5001 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wssub_match))
5003 : public pair<_BidirectionalIterator, _BidirectionalIterator>
5006 typedef _BidirectionalIterator iterator;
5007 typedef typename iterator_traits<iterator>::value_type value_type;
5008 typedef typename iterator_traits<iterator>::difference_type difference_type;
5009 typedef basic_string<value_type> string_type;
5013 _LIBCPP_INLINE_VISIBILITY
5014 _LIBCPP_CONSTEXPR sub_match() : matched() {}
5016 _LIBCPP_INLINE_VISIBILITY
5017 difference_type length() const
5018 {return matched ? _VSTD::distance(this->first, this->second) : 0;}
5019 _LIBCPP_INLINE_VISIBILITY
5020 string_type str() const
5021 {return matched ? string_type(this->first, this->second) : string_type();}
5022 _LIBCPP_INLINE_VISIBILITY
5023 operator string_type() const
5026 _LIBCPP_INLINE_VISIBILITY
5027 int compare(const sub_match& __s) const
5028 {return str().compare(__s.str());}
5029 _LIBCPP_INLINE_VISIBILITY
5030 int compare(const string_type& __s) const
5031 {return str().compare(__s);}
5032 _LIBCPP_INLINE_VISIBILITY
5033 int compare(const value_type* __s) const
5034 {return str().compare(__s);}
5036 _LIBCPP_HIDE_FROM_ABI
5037 void swap(sub_match& __s)
5038 #ifndef _LIBCPP_CXX03_LANG
5039 _NOEXCEPT(__is_nothrow_swappable<_BidirectionalIterator>::value)
5040 #endif // _LIBCPP_CXX03_LANG
5042 this->pair<_BidirectionalIterator, _BidirectionalIterator>::swap(__s);
5043 std::swap(matched, __s.matched);
5047 template <class _BiIter>
5048 inline _LIBCPP_INLINE_VISIBILITY
5050 operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5052 return __x.compare(__y) == 0;
5055 #if _LIBCPP_STD_VER >= 20
5056 template<class _BiIter>
5057 using __sub_match_cat = compare_three_way_result_t<basic_string<typename iterator_traits<_BiIter>::value_type>>;
5059 template <class _BiIter>
5060 _LIBCPP_HIDE_FROM_ABI auto operator<=>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) {
5061 return static_cast<__sub_match_cat<_BiIter>>(__x.compare(__y) <=> 0);
5063 #else // _LIBCPP_STD_VER >= 20
5064 template <class _BiIter>
5065 inline _LIBCPP_INLINE_VISIBILITY
5067 operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5069 return !(__x == __y);
5072 template <class _BiIter>
5073 inline _LIBCPP_INLINE_VISIBILITY
5075 operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5077 return __x.compare(__y) < 0;
5080 template <class _BiIter>
5081 inline _LIBCPP_INLINE_VISIBILITY
5083 operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5085 return !(__y < __x);
5088 template <class _BiIter>
5089 inline _LIBCPP_INLINE_VISIBILITY
5091 operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5093 return !(__x < __y);
5096 template <class _BiIter>
5097 inline _LIBCPP_INLINE_VISIBILITY
5099 operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5104 template <class _BiIter, class _ST, class _SA>
5105 inline _LIBCPP_INLINE_VISIBILITY
5107 operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5108 const sub_match<_BiIter>& __y)
5110 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
5113 template <class _BiIter, class _ST, class _SA>
5114 inline _LIBCPP_INLINE_VISIBILITY
5116 operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5117 const sub_match<_BiIter>& __y)
5119 return !(__x == __y);
5122 template <class _BiIter, class _ST, class _SA>
5123 inline _LIBCPP_INLINE_VISIBILITY
5125 operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5126 const sub_match<_BiIter>& __y)
5128 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
5131 template <class _BiIter, class _ST, class _SA>
5132 inline _LIBCPP_INLINE_VISIBILITY
5134 operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5135 const sub_match<_BiIter>& __y)
5140 template <class _BiIter, class _ST, class _SA>
5141 inline _LIBCPP_INLINE_VISIBILITY
5142 bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5143 const sub_match<_BiIter>& __y)
5145 return !(__x < __y);
5148 template <class _BiIter, class _ST, class _SA>
5149 inline _LIBCPP_INLINE_VISIBILITY
5151 operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5152 const sub_match<_BiIter>& __y)
5154 return !(__y < __x);
5156 #endif // _LIBCPP_STD_VER >= 20
5158 template <class _BiIter, class _ST, class _SA>
5159 inline _LIBCPP_INLINE_VISIBILITY
5161 operator==(const sub_match<_BiIter>& __x,
5162 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5164 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
5167 #if _LIBCPP_STD_VER >= 20
5168 template <class _BiIter, class _ST, class _SA>
5169 _LIBCPP_HIDE_FROM_ABI auto operator<=>(
5170 const sub_match<_BiIter>& __x, const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) {
5171 return static_cast<__sub_match_cat<_BiIter>>(
5172 __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) <=> 0);
5174 #else // _LIBCPP_STD_VER >= 20
5175 template <class _BiIter, class _ST, class _SA>
5176 inline _LIBCPP_INLINE_VISIBILITY
5178 operator!=(const sub_match<_BiIter>& __x,
5179 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5181 return !(__x == __y);
5184 template <class _BiIter, class _ST, class _SA>
5185 inline _LIBCPP_INLINE_VISIBILITY
5187 operator<(const sub_match<_BiIter>& __x,
5188 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5190 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
5193 template <class _BiIter, class _ST, class _SA>
5194 inline _LIBCPP_INLINE_VISIBILITY
5195 bool operator>(const sub_match<_BiIter>& __x,
5196 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5201 template <class _BiIter, class _ST, class _SA>
5202 inline _LIBCPP_INLINE_VISIBILITY
5204 operator>=(const sub_match<_BiIter>& __x,
5205 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5207 return !(__x < __y);
5210 template <class _BiIter, class _ST, class _SA>
5211 inline _LIBCPP_INLINE_VISIBILITY
5213 operator<=(const sub_match<_BiIter>& __x,
5214 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5216 return !(__y < __x);
5219 template <class _BiIter>
5220 inline _LIBCPP_INLINE_VISIBILITY
5222 operator==(typename iterator_traits<_BiIter>::value_type const* __x,
5223 const sub_match<_BiIter>& __y)
5225 return __y.compare(__x) == 0;
5228 template <class _BiIter>
5229 inline _LIBCPP_INLINE_VISIBILITY
5231 operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
5232 const sub_match<_BiIter>& __y)
5234 return !(__x == __y);
5237 template <class _BiIter>
5238 inline _LIBCPP_INLINE_VISIBILITY
5240 operator<(typename iterator_traits<_BiIter>::value_type const* __x,
5241 const sub_match<_BiIter>& __y)
5243 return __y.compare(__x) > 0;
5246 template <class _BiIter>
5247 inline _LIBCPP_INLINE_VISIBILITY
5249 operator>(typename iterator_traits<_BiIter>::value_type const* __x,
5250 const sub_match<_BiIter>& __y)
5255 template <class _BiIter>
5256 inline _LIBCPP_INLINE_VISIBILITY
5258 operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
5259 const sub_match<_BiIter>& __y)
5261 return !(__x < __y);
5264 template <class _BiIter>
5265 inline _LIBCPP_INLINE_VISIBILITY
5267 operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
5268 const sub_match<_BiIter>& __y)
5270 return !(__y < __x);
5272 #endif // _LIBCPP_STD_VER >= 20
5274 template <class _BiIter>
5275 inline _LIBCPP_INLINE_VISIBILITY
5277 operator==(const sub_match<_BiIter>& __x,
5278 typename iterator_traits<_BiIter>::value_type const* __y)
5280 return __x.compare(__y) == 0;
5283 #if _LIBCPP_STD_VER >= 20
5284 template <class _BiIter>
5285 _LIBCPP_HIDE_FROM_ABI auto
5286 operator<=>(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) {
5287 return static_cast<__sub_match_cat<_BiIter>>(__x.compare(__y) <=> 0);
5289 #else // _LIBCPP_STD_VER >= 20
5290 template <class _BiIter>
5291 inline _LIBCPP_INLINE_VISIBILITY
5293 operator!=(const sub_match<_BiIter>& __x,
5294 typename iterator_traits<_BiIter>::value_type const* __y)
5296 return !(__x == __y);
5299 template <class _BiIter>
5300 inline _LIBCPP_INLINE_VISIBILITY
5302 operator<(const sub_match<_BiIter>& __x,
5303 typename iterator_traits<_BiIter>::value_type const* __y)
5305 return __x.compare(__y) < 0;
5308 template <class _BiIter>
5309 inline _LIBCPP_INLINE_VISIBILITY
5311 operator>(const sub_match<_BiIter>& __x,
5312 typename iterator_traits<_BiIter>::value_type const* __y)
5317 template <class _BiIter>
5318 inline _LIBCPP_INLINE_VISIBILITY
5320 operator>=(const sub_match<_BiIter>& __x,
5321 typename iterator_traits<_BiIter>::value_type const* __y)
5323 return !(__x < __y);
5326 template <class _BiIter>
5327 inline _LIBCPP_INLINE_VISIBILITY
5329 operator<=(const sub_match<_BiIter>& __x,
5330 typename iterator_traits<_BiIter>::value_type const* __y)
5332 return !(__y < __x);
5335 template <class _BiIter>
5336 inline _LIBCPP_INLINE_VISIBILITY
5338 operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5339 const sub_match<_BiIter>& __y)
5341 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5342 return __y.compare(string_type(1, __x)) == 0;
5345 template <class _BiIter>
5346 inline _LIBCPP_INLINE_VISIBILITY
5348 operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5349 const sub_match<_BiIter>& __y)
5351 return !(__x == __y);
5354 template <class _BiIter>
5355 inline _LIBCPP_INLINE_VISIBILITY
5357 operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5358 const sub_match<_BiIter>& __y)
5360 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5361 return __y.compare(string_type(1, __x)) > 0;
5364 template <class _BiIter>
5365 inline _LIBCPP_INLINE_VISIBILITY
5367 operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5368 const sub_match<_BiIter>& __y)
5373 template <class _BiIter>
5374 inline _LIBCPP_INLINE_VISIBILITY
5376 operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5377 const sub_match<_BiIter>& __y)
5379 return !(__x < __y);
5382 template <class _BiIter>
5383 inline _LIBCPP_INLINE_VISIBILITY
5385 operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5386 const sub_match<_BiIter>& __y)
5388 return !(__y < __x);
5390 #endif // _LIBCPP_STD_VER >= 20
5392 template <class _BiIter>
5393 inline _LIBCPP_INLINE_VISIBILITY
5395 operator==(const sub_match<_BiIter>& __x,
5396 typename iterator_traits<_BiIter>::value_type const& __y)
5398 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5399 return __x.compare(string_type(1, __y)) == 0;
5402 #if _LIBCPP_STD_VER >= 20
5403 template <class _BiIter>
5404 _LIBCPP_HIDE_FROM_ABI auto
5405 operator<=>(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) {
5406 using string_type = basic_string<typename iterator_traits<_BiIter>::value_type>;
5407 return static_cast<__sub_match_cat<_BiIter>>(__x.compare(string_type(1, __y)) <=> 0);
5409 #else // _LIBCPP_STD_VER >= 20
5410 template <class _BiIter>
5411 inline _LIBCPP_INLINE_VISIBILITY
5413 operator!=(const sub_match<_BiIter>& __x,
5414 typename iterator_traits<_BiIter>::value_type const& __y)
5416 return !(__x == __y);
5419 template <class _BiIter>
5420 inline _LIBCPP_INLINE_VISIBILITY
5422 operator<(const sub_match<_BiIter>& __x,
5423 typename iterator_traits<_BiIter>::value_type const& __y)
5425 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5426 return __x.compare(string_type(1, __y)) < 0;
5429 template <class _BiIter>
5430 inline _LIBCPP_INLINE_VISIBILITY
5432 operator>(const sub_match<_BiIter>& __x,
5433 typename iterator_traits<_BiIter>::value_type const& __y)
5438 template <class _BiIter>
5439 inline _LIBCPP_INLINE_VISIBILITY
5441 operator>=(const sub_match<_BiIter>& __x,
5442 typename iterator_traits<_BiIter>::value_type const& __y)
5444 return !(__x < __y);
5447 template <class _BiIter>
5448 inline _LIBCPP_INLINE_VISIBILITY
5450 operator<=(const sub_match<_BiIter>& __x,
5451 typename iterator_traits<_BiIter>::value_type const& __y)
5453 return !(__y < __x);
5455 #endif // _LIBCPP_STD_VER >= 20
5457 template <class _CharT, class _ST, class _BiIter>
5458 inline _LIBCPP_INLINE_VISIBILITY
5459 basic_ostream<_CharT, _ST>&
5460 operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5462 return __os << __m.str();
5465 typedef match_results<const char*> cmatch;
5466 typedef match_results<string::const_iterator> smatch;
5467 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
5468 typedef match_results<const wchar_t*> wcmatch;
5469 typedef match_results<wstring::const_iterator> wsmatch;
5472 template <class _BidirectionalIterator, class _Allocator>
5474 _LIBCPP_TEMPLATE_VIS
5475 _LIBCPP_PREFERRED_NAME(cmatch)
5476 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcmatch))
5477 _LIBCPP_PREFERRED_NAME(smatch)
5478 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsmatch))
5482 typedef _Allocator allocator_type;
5483 typedef sub_match<_BidirectionalIterator> value_type;
5485 typedef vector<value_type, allocator_type> __container_type;
5487 __container_type __matches_;
5488 value_type __unmatched_;
5489 value_type __prefix_;
5490 value_type __suffix_;
5493 _BidirectionalIterator __position_start_;
5494 typedef const value_type& const_reference;
5495 typedef value_type& reference;
5496 typedef typename __container_type::const_iterator const_iterator;
5497 typedef const_iterator iterator;
5498 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5499 typedef typename allocator_traits<allocator_type>::size_type size_type;
5500 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5501 typedef basic_string<char_type> string_type;
5503 // construct/copy/destroy:
5504 #ifndef _LIBCPP_CXX03_LANG
5505 match_results() : match_results(allocator_type()) {}
5506 explicit match_results(const allocator_type& __a);
5508 explicit match_results(const allocator_type& __a = allocator_type());
5511 // match_results(const match_results&) = default;
5512 // match_results& operator=(const match_results&) = default;
5513 // match_results(match_results&& __m) = default;
5514 // match_results& operator=(match_results&& __m) = default;
5515 // ~match_results() = default;
5517 _LIBCPP_INLINE_VISIBILITY
5518 bool ready() const {return __ready_;}
5521 _LIBCPP_INLINE_VISIBILITY
5522 size_type size() const _NOEXCEPT {return __matches_.size();}
5523 _LIBCPP_INLINE_VISIBILITY
5524 size_type max_size() const _NOEXCEPT {return __matches_.max_size();}
5525 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
5526 bool empty() const _NOEXCEPT {return size() == 0;}
5529 _LIBCPP_INLINE_VISIBILITY
5530 difference_type length(size_type __sub = 0) const
5532 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::length() called when not ready");
5533 return (*this)[__sub].length();
5535 _LIBCPP_INLINE_VISIBILITY
5536 difference_type position(size_type __sub = 0) const
5538 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::position() called when not ready");
5539 return _VSTD::distance(__position_start_, (*this)[__sub].first);
5541 _LIBCPP_INLINE_VISIBILITY
5542 string_type str(size_type __sub = 0) const
5544 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::str() called when not ready");
5545 return (*this)[__sub].str();
5547 _LIBCPP_INLINE_VISIBILITY
5548 const_reference operator[](size_type __n) const
5550 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::operator[]() called when not ready");
5551 return __n < __matches_.size() ? __matches_[__n] : __unmatched_;
5554 _LIBCPP_INLINE_VISIBILITY
5555 const_reference prefix() const
5557 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::prefix() called when not ready");
5560 _LIBCPP_INLINE_VISIBILITY
5561 const_reference suffix() const
5563 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::suffix() called when not ready");
5567 _LIBCPP_INLINE_VISIBILITY
5568 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
5569 _LIBCPP_INLINE_VISIBILITY
5570 const_iterator end() const {return __matches_.end();}
5571 _LIBCPP_INLINE_VISIBILITY
5572 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
5573 _LIBCPP_INLINE_VISIBILITY
5574 const_iterator cend() const {return __matches_.end();}
5577 template <class _OutputIter>
5579 format(_OutputIter __output_iter, const char_type* __fmt_first,
5580 const char_type* __fmt_last,
5581 regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5582 template <class _OutputIter, class _ST, class _SA>
5583 _LIBCPP_INLINE_VISIBILITY
5585 format(_OutputIter __output_iter, const basic_string<char_type, _ST, _SA>& __fmt,
5586 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5587 {return format(__output_iter, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
5588 template <class _ST, class _SA>
5589 _LIBCPP_INLINE_VISIBILITY
5590 basic_string<char_type, _ST, _SA>
5591 format(const basic_string<char_type, _ST, _SA>& __fmt,
5592 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5594 basic_string<char_type, _ST, _SA> __r;
5595 format(std::back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5599 _LIBCPP_INLINE_VISIBILITY
5601 format(const char_type* __fmt,
5602 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5605 format(std::back_inserter(__r), __fmt,
5606 __fmt + char_traits<char_type>::length(__fmt), __flags);
5611 _LIBCPP_INLINE_VISIBILITY
5612 allocator_type get_allocator() const {return __matches_.get_allocator();}
5615 void swap(match_results& __m);
5617 template <class _Bp, class _Ap>
5618 _LIBCPP_INLINE_VISIBILITY
5619 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
5620 const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
5622 _Bp __mf = __m.prefix().first;
5623 __matches_.resize(__m.size());
5624 for (size_type __i = 0; __i < __matches_.size(); ++__i)
5626 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5627 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
5628 __matches_[__i].matched = __m[__i].matched;
5630 __unmatched_.first = __l;
5631 __unmatched_.second = __l;
5632 __unmatched_.matched = false;
5633 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5634 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
5635 __prefix_.matched = __m.prefix().matched;
5636 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5637 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
5638 __suffix_.matched = __m.suffix().matched;
5639 if (!__no_update_pos)
5640 __position_start_ = __prefix_.first;
5641 __ready_ = __m.ready();
5645 void __init(unsigned __s,
5646 _BidirectionalIterator __f, _BidirectionalIterator __l,
5647 bool __no_update_pos = false);
5649 template <class, class> friend class basic_regex;
5651 template <class _Bp, class _Ap, class _Cp, class _Tp>
5654 regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
5655 regex_constants::match_flag_type);
5657 template <class _Bp, class _Ap>
5660 operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
5662 template <class, class> friend class __lookahead;
5665 template <class _BidirectionalIterator, class _Allocator>
5666 match_results<_BidirectionalIterator, _Allocator>::match_results(
5667 const allocator_type& __a)
5677 template <class _BidirectionalIterator, class _Allocator>
5679 match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
5680 _BidirectionalIterator __f, _BidirectionalIterator __l,
5681 bool __no_update_pos)
5683 __unmatched_.first = __l;
5684 __unmatched_.second = __l;
5685 __unmatched_.matched = false;
5686 __matches_.assign(__s, __unmatched_);
5687 __prefix_.first = __f;
5688 __prefix_.second = __f;
5689 __prefix_.matched = false;
5690 __suffix_ = __unmatched_;
5691 if (!__no_update_pos)
5692 __position_start_ = __prefix_.first;
5696 template <class _BidirectionalIterator, class _Allocator>
5697 template <class _OutputIter>
5699 match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __output_iter,
5700 const char_type* __fmt_first, const char_type* __fmt_last,
5701 regex_constants::match_flag_type __flags) const
5703 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::format() called when not ready");
5704 if (__flags & regex_constants::format_sed)
5706 for (; __fmt_first != __fmt_last; ++__fmt_first)
5708 if (*__fmt_first == '&')
5709 __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5711 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5714 if ('0' <= *__fmt_first && *__fmt_first <= '9')
5716 size_t __i = *__fmt_first - '0';
5717 __output_iter = _VSTD::copy((*this)[__i].first,
5718 (*this)[__i].second, __output_iter);
5722 *__output_iter = *__fmt_first;
5728 *__output_iter = *__fmt_first;
5735 for (; __fmt_first != __fmt_last; ++__fmt_first)
5737 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5739 switch (__fmt_first[1])
5742 *__output_iter = *++__fmt_first;
5747 __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5752 __output_iter = _VSTD::copy(__prefix_.first, __prefix_.second, __output_iter);
5756 __output_iter = _VSTD::copy(__suffix_.first, __suffix_.second, __output_iter);
5759 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5762 size_t __idx = *__fmt_first - '0';
5763 if (__fmt_first + 1 != __fmt_last &&
5764 '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5767 if (__idx >= numeric_limits<size_t>::max() / 10)
5768 __throw_regex_error<regex_constants::error_escape>();
5769 __idx = 10 * __idx + *__fmt_first - '0';
5771 __output_iter = _VSTD::copy((*this)[__idx].first,
5772 (*this)[__idx].second, __output_iter);
5776 *__output_iter = *__fmt_first;
5784 *__output_iter = *__fmt_first;
5789 return __output_iter;
5792 template <class _BidirectionalIterator, class _Allocator>
5794 match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5797 swap(__matches_, __m.__matches_);
5798 swap(__unmatched_, __m.__unmatched_);
5799 swap(__prefix_, __m.__prefix_);
5800 swap(__suffix_, __m.__suffix_);
5801 swap(__position_start_, __m.__position_start_);
5802 swap(__ready_, __m.__ready_);
5805 template <class _BidirectionalIterator, class _Allocator>
5806 _LIBCPP_HIDE_FROM_ABI bool
5807 operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5808 const match_results<_BidirectionalIterator, _Allocator>& __y)
5810 if (__x.__ready_ != __y.__ready_)
5814 return __x.__matches_ == __y.__matches_ &&
5815 __x.__prefix_ == __y.__prefix_ &&
5816 __x.__suffix_ == __y.__suffix_;
5819 #if _LIBCPP_STD_VER < 20
5820 template <class _BidirectionalIterator, class _Allocator>
5821 inline _LIBCPP_INLINE_VISIBILITY
5823 operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5824 const match_results<_BidirectionalIterator, _Allocator>& __y)
5826 return !(__x == __y);
5830 template <class _BidirectionalIterator, class _Allocator>
5831 inline _LIBCPP_INLINE_VISIBILITY
5833 swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5834 match_results<_BidirectionalIterator, _Allocator>& __y)
5841 template <class _CharT, class _Traits>
5842 template <class _Allocator>
5844 basic_regex<_CharT, _Traits>::__match_at_start_ecma(
5845 const _CharT* __first, const _CharT* __last,
5846 match_results<const _CharT*, _Allocator>& __m,
5847 regex_constants::match_flag_type __flags, bool __at_first) const
5849 vector<__state> __states;
5850 __node* __st = __start_.get();
5853 sub_match<const _CharT*> __unmatched;
5854 __unmatched.first = __last;
5855 __unmatched.second = __last;
5856 __unmatched.matched = false;
5858 __states.push_back(__state());
5859 __states.back().__do_ = 0;
5860 __states.back().__first_ = __first;
5861 __states.back().__current_ = __first;
5862 __states.back().__last_ = __last;
5863 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
5864 __states.back().__loop_data_.resize(__loop_count());
5865 __states.back().__node_ = __st;
5866 __states.back().__flags_ = __flags;
5867 __states.back().__at_first_ = __at_first;
5869 int __length = __last - __first;
5873 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5874 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5875 __throw_regex_error<regex_constants::error_complexity>();
5876 __state& __s = __states.back();
5878 __s.__node_->__exec(__s);
5881 case __state::__end_state:
5882 if ((__flags & regex_constants::match_not_null) &&
5883 __s.__current_ == __first)
5885 __states.pop_back();
5888 if ((__flags & regex_constants::__full_match) &&
5889 __s.__current_ != __last)
5891 __states.pop_back();
5894 __m.__matches_[0].first = __first;
5895 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
5896 __m.__matches_[0].matched = true;
5897 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5898 __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5900 case __state::__accept_and_consume:
5901 case __state::__repeat:
5902 case __state::__accept_but_not_consume:
5904 case __state::__split:
5906 __state __snext = __s;
5907 __s.__node_->__exec_split(true, __s);
5908 __snext.__node_->__exec_split(false, __snext);
5909 __states.push_back(_VSTD::move(__snext));
5912 case __state::__reject:
5913 __states.pop_back();
5916 __throw_regex_error<regex_constants::__re_err_unknown>();
5920 } while (!__states.empty());
5925 template <class _CharT, class _Traits>
5926 template <class _Allocator>
5928 basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5929 const _CharT* __first, const _CharT* __last,
5930 match_results<const _CharT*, _Allocator>& __m,
5931 regex_constants::match_flag_type __flags, bool __at_first) const
5933 deque<__state> __states;
5934 ptrdiff_t __highest_j = 0;
5935 ptrdiff_t __np = _VSTD::distance(__first, __last);
5936 __node* __st = __start_.get();
5939 __states.push_back(__state());
5940 __states.back().__do_ = 0;
5941 __states.back().__first_ = __first;
5942 __states.back().__current_ = __first;
5943 __states.back().__last_ = __last;
5944 __states.back().__loop_data_.resize(__loop_count());
5945 __states.back().__node_ = __st;
5946 __states.back().__flags_ = __flags;
5947 __states.back().__at_first_ = __at_first;
5948 bool __matched = false;
5950 int __length = __last - __first;
5954 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5955 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5956 __throw_regex_error<regex_constants::error_complexity>();
5957 __state& __s = __states.back();
5959 __s.__node_->__exec(__s);
5962 case __state::__end_state:
5963 if ((__flags & regex_constants::match_not_null) &&
5964 __s.__current_ == __first)
5966 __states.pop_back();
5969 if ((__flags & regex_constants::__full_match) &&
5970 __s.__current_ != __last)
5972 __states.pop_back();
5975 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
5976 __highest_j = __s.__current_ - __s.__first_;
5978 if (__highest_j == __np)
5981 __states.pop_back();
5983 case __state::__consume_input:
5985 case __state::__accept_and_consume:
5986 __states.push_front(_VSTD::move(__s));
5987 __states.pop_back();
5989 case __state::__repeat:
5990 case __state::__accept_but_not_consume:
5992 case __state::__split:
5994 __state __snext = __s;
5995 __s.__node_->__exec_split(true, __s);
5996 __snext.__node_->__exec_split(false, __snext);
5997 __states.push_back(_VSTD::move(__snext));
6000 case __state::__reject:
6001 __states.pop_back();
6004 __throw_regex_error<regex_constants::__re_err_unknown>();
6007 } while (!__states.empty());
6010 __m.__matches_[0].first = __first;
6011 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
6012 __m.__matches_[0].matched = true;
6019 template <class _CharT, class _Traits>
6020 template <class _Allocator>
6022 basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
6023 const _CharT* __first, const _CharT* __last,
6024 match_results<const _CharT*, _Allocator>& __m,
6025 regex_constants::match_flag_type __flags, bool __at_first) const
6027 vector<__state> __states;
6028 __state __best_state;
6029 ptrdiff_t __highest_j = 0;
6030 ptrdiff_t __np = _VSTD::distance(__first, __last);
6031 __node* __st = __start_.get();
6034 sub_match<const _CharT*> __unmatched;
6035 __unmatched.first = __last;
6036 __unmatched.second = __last;
6037 __unmatched.matched = false;
6039 __states.push_back(__state());
6040 __states.back().__do_ = 0;
6041 __states.back().__first_ = __first;
6042 __states.back().__current_ = __first;
6043 __states.back().__last_ = __last;
6044 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
6045 __states.back().__loop_data_.resize(__loop_count());
6046 __states.back().__node_ = __st;
6047 __states.back().__flags_ = __flags;
6048 __states.back().__at_first_ = __at_first;
6049 bool __matched = false;
6051 int __length = __last - __first;
6055 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
6056 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
6057 __throw_regex_error<regex_constants::error_complexity>();
6058 __state& __s = __states.back();
6060 __s.__node_->__exec(__s);
6063 case __state::__end_state:
6064 if ((__flags & regex_constants::match_not_null) &&
6065 __s.__current_ == __first)
6067 __states.pop_back();
6070 if ((__flags & regex_constants::__full_match) &&
6071 __s.__current_ != __last)
6073 __states.pop_back();
6076 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
6078 __highest_j = __s.__current_ - __s.__first_;
6082 if (__highest_j == __np)
6085 __states.pop_back();
6087 case __state::__accept_and_consume:
6088 case __state::__repeat:
6089 case __state::__accept_but_not_consume:
6091 case __state::__split:
6093 __state __snext = __s;
6094 __s.__node_->__exec_split(true, __s);
6095 __snext.__node_->__exec_split(false, __snext);
6096 __states.push_back(_VSTD::move(__snext));
6099 case __state::__reject:
6100 __states.pop_back();
6103 __throw_regex_error<regex_constants::__re_err_unknown>();
6106 } while (!__states.empty());
6109 __m.__matches_[0].first = __first;
6110 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
6111 __m.__matches_[0].matched = true;
6112 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
6113 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
6120 template <class _CharT, class _Traits>
6121 template <class _Allocator>
6123 basic_regex<_CharT, _Traits>::__match_at_start(
6124 const _CharT* __first, const _CharT* __last,
6125 match_results<const _CharT*, _Allocator>& __m,
6126 regex_constants::match_flag_type __flags, bool __at_first) const
6128 if (__get_grammar(__flags_) == ECMAScript)
6129 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
6130 if (mark_count() == 0)
6131 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
6132 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
6135 template <class _CharT, class _Traits>
6136 template <class _Allocator>
6138 basic_regex<_CharT, _Traits>::__search(
6139 const _CharT* __first, const _CharT* __last,
6140 match_results<const _CharT*, _Allocator>& __m,
6141 regex_constants::match_flag_type __flags) const
6143 if (__flags & regex_constants::match_prev_avail)
6144 __flags &= ~(regex_constants::match_not_bol | regex_constants::match_not_bow);
6146 __m.__init(1 + mark_count(), __first, __last,
6147 __flags & regex_constants::__no_update_pos);
6148 if (__match_at_start(__first, __last, __m, __flags,
6149 !(__flags & regex_constants::__no_update_pos)))
6151 __m.__prefix_.second = __m[0].first;
6152 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
6153 __m.__suffix_.first = __m[0].second;
6154 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
6157 if (__first != __last && !(__flags & regex_constants::match_continuous))
6159 __flags |= regex_constants::match_prev_avail;
6160 for (++__first; __first != __last; ++__first)
6162 __m.__matches_.assign(__m.size(), __m.__unmatched_);
6163 if (__match_at_start(__first, __last, __m, __flags, false))
6165 __m.__prefix_.second = __m[0].first;
6166 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
6167 __m.__suffix_.first = __m[0].second;
6168 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
6171 __m.__matches_.assign(__m.size(), __m.__unmatched_);
6174 __m.__matches_.clear();
6178 template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
6179 inline _LIBCPP_INLINE_VISIBILITY
6181 regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
6182 match_results<_BidirectionalIterator, _Allocator>& __m,
6183 const basic_regex<_CharT, _Traits>& __e,
6184 regex_constants::match_flag_type __flags = regex_constants::match_default)
6186 int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
6187 basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
6188 match_results<const _CharT*> __mc;
6189 bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
6190 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
6194 template <class _Iter, class _Allocator, class _CharT, class _Traits>
6195 inline _LIBCPP_INLINE_VISIBILITY
6197 regex_search(__wrap_iter<_Iter> __first,
6198 __wrap_iter<_Iter> __last,
6199 match_results<__wrap_iter<_Iter>, _Allocator>& __m,
6200 const basic_regex<_CharT, _Traits>& __e,
6201 regex_constants::match_flag_type __flags = regex_constants::match_default)
6203 match_results<const _CharT*> __mc;
6204 bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
6205 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
6209 template <class _Allocator, class _CharT, class _Traits>
6210 inline _LIBCPP_INLINE_VISIBILITY
6212 regex_search(const _CharT* __first, const _CharT* __last,
6213 match_results<const _CharT*, _Allocator>& __m,
6214 const basic_regex<_CharT, _Traits>& __e,
6215 regex_constants::match_flag_type __flags = regex_constants::match_default)
6217 return __e.__search(__first, __last, __m, __flags);
6220 template <class _BidirectionalIterator, class _CharT, class _Traits>
6221 inline _LIBCPP_INLINE_VISIBILITY
6223 regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
6224 const basic_regex<_CharT, _Traits>& __e,
6225 regex_constants::match_flag_type __flags = regex_constants::match_default)
6227 basic_string<_CharT> __s(__first, __last);
6228 match_results<const _CharT*> __mc;
6229 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
6232 template <class _CharT, class _Traits>
6233 inline _LIBCPP_INLINE_VISIBILITY
6235 regex_search(const _CharT* __first, const _CharT* __last,
6236 const basic_regex<_CharT, _Traits>& __e,
6237 regex_constants::match_flag_type __flags = regex_constants::match_default)
6239 match_results<const _CharT*> __mc;
6240 return __e.__search(__first, __last, __mc, __flags);
6243 template <class _CharT, class _Allocator, class _Traits>
6244 inline _LIBCPP_INLINE_VISIBILITY
6246 regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6247 const basic_regex<_CharT, _Traits>& __e,
6248 regex_constants::match_flag_type __flags = regex_constants::match_default)
6250 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
6253 template <class _CharT, class _Traits>
6254 inline _LIBCPP_INLINE_VISIBILITY
6256 regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6257 regex_constants::match_flag_type __flags = regex_constants::match_default)
6259 match_results<const _CharT*> __m;
6260 return _VSTD::regex_search(__str, __m, __e, __flags);
6263 template <class _ST, class _SA, class _CharT, class _Traits>
6264 inline _LIBCPP_INLINE_VISIBILITY
6266 regex_search(const basic_string<_CharT, _ST, _SA>& __s,
6267 const basic_regex<_CharT, _Traits>& __e,
6268 regex_constants::match_flag_type __flags = regex_constants::match_default)
6270 match_results<const _CharT*> __mc;
6271 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
6274 template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6275 inline _LIBCPP_INLINE_VISIBILITY
6277 regex_search(const basic_string<_CharT, _ST, _SA>& __s,
6278 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6279 const basic_regex<_CharT, _Traits>& __e,
6280 regex_constants::match_flag_type __flags = regex_constants::match_default)
6282 match_results<const _CharT*> __mc;
6283 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
6284 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
6288 #if _LIBCPP_STD_VER >= 14
6289 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
6291 regex_search(const basic_string<_Cp, _ST, _SA>&& __s,
6292 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
6293 const basic_regex<_Cp, _Tp>& __e,
6294 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6299 template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
6300 _LIBCPP_HIDE_FROM_ABI bool
6301 regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6302 match_results<_BidirectionalIterator, _Allocator>& __m,
6303 const basic_regex<_CharT, _Traits>& __e,
6304 regex_constants::match_flag_type __flags = regex_constants::match_default)
6306 bool __r = _VSTD::regex_search(
6307 __first, __last, __m, __e,
6308 __flags | regex_constants::match_continuous |
6309 regex_constants::__full_match);
6312 __r = !__m.suffix().matched;
6314 __m.__matches_.clear();
6319 template <class _BidirectionalIterator, class _CharT, class _Traits>
6320 inline _LIBCPP_INLINE_VISIBILITY
6322 regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6323 const basic_regex<_CharT, _Traits>& __e,
6324 regex_constants::match_flag_type __flags = regex_constants::match_default)
6326 match_results<_BidirectionalIterator> __m;
6327 return _VSTD::regex_match(__first, __last, __m, __e, __flags);
6330 template <class _CharT, class _Allocator, class _Traits>
6331 inline _LIBCPP_INLINE_VISIBILITY
6333 regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6334 const basic_regex<_CharT, _Traits>& __e,
6335 regex_constants::match_flag_type __flags = regex_constants::match_default)
6337 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
6340 template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6341 inline _LIBCPP_INLINE_VISIBILITY
6343 regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6344 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6345 const basic_regex<_CharT, _Traits>& __e,
6346 regex_constants::match_flag_type __flags = regex_constants::match_default)
6348 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
6351 #if _LIBCPP_STD_VER >= 14
6352 template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6353 inline _LIBCPP_INLINE_VISIBILITY
6355 regex_match(const basic_string<_CharT, _ST, _SA>&& __s,
6356 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6357 const basic_regex<_CharT, _Traits>& __e,
6358 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6361 template <class _CharT, class _Traits>
6362 inline _LIBCPP_INLINE_VISIBILITY
6364 regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6365 regex_constants::match_flag_type __flags = regex_constants::match_default)
6367 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
6370 template <class _ST, class _SA, class _CharT, class _Traits>
6371 inline _LIBCPP_INLINE_VISIBILITY
6373 regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6374 const basic_regex<_CharT, _Traits>& __e,
6375 regex_constants::match_flag_type __flags = regex_constants::match_default)
6377 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
6382 template <class _BidirectionalIterator,
6383 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6384 class _Traits = regex_traits<_CharT> >
6385 class _LIBCPP_TEMPLATE_VIS regex_iterator;
6387 typedef regex_iterator<const char*> cregex_iterator;
6388 typedef regex_iterator<string::const_iterator> sregex_iterator;
6389 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
6390 typedef regex_iterator<const wchar_t*> wcregex_iterator;
6391 typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
6394 template <class _BidirectionalIterator, class _CharT, class _Traits>
6396 _LIBCPP_TEMPLATE_VIS
6397 _LIBCPP_PREFERRED_NAME(cregex_iterator)
6398 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_iterator))
6399 _LIBCPP_PREFERRED_NAME(sregex_iterator)
6400 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_iterator))
6404 typedef basic_regex<_CharT, _Traits> regex_type;
6405 typedef match_results<_BidirectionalIterator> value_type;
6406 typedef ptrdiff_t difference_type;
6407 typedef const value_type* pointer;
6408 typedef const value_type& reference;
6409 typedef forward_iterator_tag iterator_category;
6412 _BidirectionalIterator __begin_;
6413 _BidirectionalIterator __end_;
6414 const regex_type* __pregex_;
6415 regex_constants::match_flag_type __flags_;
6416 value_type __match_;
6420 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6421 const regex_type& __re,
6422 regex_constants::match_flag_type __m
6423 = regex_constants::match_default);
6424 #if _LIBCPP_STD_VER >= 14
6425 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6426 const regex_type&& __re,
6427 regex_constants::match_flag_type __m
6428 = regex_constants::match_default) = delete;
6431 _LIBCPP_HIDE_FROM_ABI bool operator==(const regex_iterator& __x) const;
6432 #if _LIBCPP_STD_VER >= 20
6433 _LIBCPP_HIDE_FROM_ABI bool operator==(default_sentinel_t) const { return *this == regex_iterator(); }
6435 #if _LIBCPP_STD_VER < 20
6436 _LIBCPP_INLINE_VISIBILITY
6437 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
6440 _LIBCPP_INLINE_VISIBILITY
6441 reference operator*() const {return __match_;}
6442 _LIBCPP_INLINE_VISIBILITY
6443 pointer operator->() const {return _VSTD::addressof(__match_);}
6445 regex_iterator& operator++();
6446 _LIBCPP_INLINE_VISIBILITY
6447 regex_iterator operator++(int)
6449 regex_iterator __t(*this);
6455 template <class _BidirectionalIterator, class _CharT, class _Traits>
6456 regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
6457 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
6461 template <class _BidirectionalIterator, class _CharT, class _Traits>
6462 regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6463 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6464 const regex_type& __re, regex_constants::match_flag_type __m)
6467 __pregex_(_VSTD::addressof(__re)),
6470 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
6473 template <class _BidirectionalIterator, class _CharT, class _Traits>
6475 regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6476 operator==(const regex_iterator& __x) const
6478 if (__match_.empty() && __x.__match_.empty())
6480 if (__match_.empty() || __x.__match_.empty())
6482 return __begin_ == __x.__begin_ &&
6483 __end_ == __x.__end_ &&
6484 __pregex_ == __x.__pregex_ &&
6485 __flags_ == __x.__flags_ &&
6486 __match_[0] == __x.__match_[0];
6489 template <class _BidirectionalIterator, class _CharT, class _Traits>
6490 regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6491 regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6493 __flags_ |= regex_constants::__no_update_pos;
6494 _BidirectionalIterator __start = __match_[0].second;
6495 if (__match_[0].first == __match_[0].second)
6497 if (__start == __end_)
6499 __match_ = value_type();
6502 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
6503 __flags_ | regex_constants::match_not_null |
6504 regex_constants::match_continuous))
6509 __flags_ |= regex_constants::match_prev_avail;
6510 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
6511 __match_ = value_type();
6515 // regex_token_iterator
6517 template <class _BidirectionalIterator,
6518 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6519 class _Traits = regex_traits<_CharT> >
6520 class _LIBCPP_TEMPLATE_VIS regex_token_iterator;
6522 typedef regex_token_iterator<const char*> cregex_token_iterator;
6523 typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
6524 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
6525 typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
6526 typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
6529 template <class _BidirectionalIterator, class _CharT, class _Traits>
6531 _LIBCPP_TEMPLATE_VIS
6532 _LIBCPP_PREFERRED_NAME(cregex_token_iterator)
6533 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_token_iterator))
6534 _LIBCPP_PREFERRED_NAME(sregex_token_iterator)
6535 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_token_iterator))
6536 regex_token_iterator
6539 typedef basic_regex<_CharT, _Traits> regex_type;
6540 typedef sub_match<_BidirectionalIterator> value_type;
6541 typedef ptrdiff_t difference_type;
6542 typedef const value_type* pointer;
6543 typedef const value_type& reference;
6544 typedef forward_iterator_tag iterator_category;
6547 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6549 _Position __position_;
6550 const value_type* __result_;
6551 value_type __suffix_;
6553 vector<int> __subs_;
6556 regex_token_iterator();
6557 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6558 const regex_type& __re, int __submatch = 0,
6559 regex_constants::match_flag_type __m =
6560 regex_constants::match_default);
6561 #if _LIBCPP_STD_VER >= 14
6562 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6563 const regex_type&& __re, int __submatch = 0,
6564 regex_constants::match_flag_type __m =
6565 regex_constants::match_default) = delete;
6568 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6569 const regex_type& __re, const vector<int>& __submatches,
6570 regex_constants::match_flag_type __m =
6571 regex_constants::match_default);
6572 #if _LIBCPP_STD_VER >= 14
6573 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6574 const regex_type&& __re, const vector<int>& __submatches,
6575 regex_constants::match_flag_type __m =
6576 regex_constants::match_default) = delete;
6579 #ifndef _LIBCPP_CXX03_LANG
6580 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6581 const regex_type& __re,
6582 initializer_list<int> __submatches,
6583 regex_constants::match_flag_type __m =
6584 regex_constants::match_default);
6586 #if _LIBCPP_STD_VER >= 14
6587 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6588 const regex_type&& __re,
6589 initializer_list<int> __submatches,
6590 regex_constants::match_flag_type __m =
6591 regex_constants::match_default) = delete;
6593 #endif // _LIBCPP_CXX03_LANG
6594 template <size_t _Np>
6595 regex_token_iterator(_BidirectionalIterator __a,
6596 _BidirectionalIterator __b,
6597 const regex_type& __re,
6598 const int (&__submatches)[_Np],
6599 regex_constants::match_flag_type __m =
6600 regex_constants::match_default);
6601 #if _LIBCPP_STD_VER >= 14
6602 template <size_t _Np>
6603 regex_token_iterator(_BidirectionalIterator __a,
6604 _BidirectionalIterator __b,
6605 const regex_type&& __re,
6606 const int (&__submatches)[_Np],
6607 regex_constants::match_flag_type __m =
6608 regex_constants::match_default) = delete;
6611 regex_token_iterator(const regex_token_iterator&);
6612 regex_token_iterator& operator=(const regex_token_iterator&);
6614 _LIBCPP_HIDE_FROM_ABI bool operator==(const regex_token_iterator& __x) const;
6615 #if _LIBCPP_STD_VER >= 20
6616 _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDE_FROM_ABI bool operator==(default_sentinel_t) const {
6617 return *this == regex_token_iterator();
6620 #if _LIBCPP_STD_VER < 20
6621 _LIBCPP_INLINE_VISIBILITY
6622 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
6625 _LIBCPP_INLINE_VISIBILITY
6626 const value_type& operator*() const {return *__result_;}
6627 _LIBCPP_INLINE_VISIBILITY
6628 const value_type* operator->() const {return __result_;}
6630 regex_token_iterator& operator++();
6631 _LIBCPP_INLINE_VISIBILITY
6632 regex_token_iterator operator++(int)
6634 regex_token_iterator __t(*this);
6640 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
6641 void __establish_result () {
6642 if (__subs_[__n_] == -1)
6643 __result_ = &__position_->prefix();
6645 __result_ = &(*__position_)[__subs_[__n_]];
6649 template <class _BidirectionalIterator, class _CharT, class _Traits>
6650 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6651 regex_token_iterator()
6652 : __result_(nullptr),
6658 template <class _BidirectionalIterator, class _CharT, class _Traits>
6660 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6661 __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6663 if (__position_ != _Position())
6664 __establish_result ();
6665 else if (__subs_[__n_] == -1)
6667 __suffix_.matched = true;
6668 __suffix_.first = __a;
6669 __suffix_.second = __b;
6670 __result_ = &__suffix_;
6673 __result_ = nullptr;
6676 template <class _BidirectionalIterator, class _CharT, class _Traits>
6677 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6678 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6679 const regex_type& __re, int __submatch,
6680 regex_constants::match_flag_type __m)
6681 : __position_(__a, __b, __re, __m),
6683 __subs_(1, __submatch)
6688 template <class _BidirectionalIterator, class _CharT, class _Traits>
6689 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6690 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6691 const regex_type& __re, const vector<int>& __submatches,
6692 regex_constants::match_flag_type __m)
6693 : __position_(__a, __b, __re, __m),
6695 __subs_(__submatches)
6700 #ifndef _LIBCPP_CXX03_LANG
6702 template <class _BidirectionalIterator, class _CharT, class _Traits>
6703 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6704 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6705 const regex_type& __re,
6706 initializer_list<int> __submatches,
6707 regex_constants::match_flag_type __m)
6708 : __position_(__a, __b, __re, __m),
6710 __subs_(__submatches)
6715 #endif // _LIBCPP_CXX03_LANG
6717 template <class _BidirectionalIterator, class _CharT, class _Traits>
6718 template <size_t _Np>
6719 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6720 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6721 const regex_type& __re,
6722 const int (&__submatches)[_Np],
6723 regex_constants::match_flag_type __m)
6724 : __position_(__a, __b, __re, __m),
6726 __subs_(begin(__submatches), end(__submatches))
6731 template <class _BidirectionalIterator, class _CharT, class _Traits>
6732 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6733 regex_token_iterator(const regex_token_iterator& __x)
6734 : __position_(__x.__position_),
6735 __result_(__x.__result_),
6736 __suffix_(__x.__suffix_),
6738 __subs_(__x.__subs_)
6740 if (__x.__result_ == &__x.__suffix_)
6741 __result_ = &__suffix_;
6742 else if ( __result_ != nullptr )
6743 __establish_result ();
6746 template <class _BidirectionalIterator, class _CharT, class _Traits>
6747 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6748 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6749 operator=(const regex_token_iterator& __x)
6753 __position_ = __x.__position_;
6754 if (__x.__result_ == &__x.__suffix_)
6755 __result_ = &__suffix_;
6757 __result_ = __x.__result_;
6758 __suffix_ = __x.__suffix_;
6760 __subs_ = __x.__subs_;
6762 if ( __result_ != nullptr && __result_ != &__suffix_ )
6763 __establish_result();
6768 template <class _BidirectionalIterator, class _CharT, class _Traits>
6770 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6771 operator==(const regex_token_iterator& __x) const
6773 if (__result_ == nullptr && __x.__result_ == nullptr)
6775 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6776 __suffix_ == __x.__suffix_)
6778 if (__result_ == nullptr || __x.__result_ == nullptr)
6780 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6782 return __position_ == __x.__position_ && __n_ == __x.__n_ &&
6783 __subs_ == __x.__subs_;
6786 template <class _BidirectionalIterator, class _CharT, class _Traits>
6787 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6788 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6790 _Position __prev = __position_;
6791 if (__result_ == &__suffix_)
6792 __result_ = nullptr;
6793 else if (static_cast<size_t>(__n_ + 1) < __subs_.size())
6796 __establish_result();
6802 if (__position_ != _Position())
6803 __establish_result();
6806 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
6807 && __prev->suffix().length() != 0)
6809 __suffix_.matched = true;
6810 __suffix_.first = __prev->suffix().first;
6811 __suffix_.second = __prev->suffix().second;
6812 __result_ = &__suffix_;
6815 __result_ = nullptr;
6823 template <class _OutputIterator, class _BidirectionalIterator,
6824 class _Traits, class _CharT>
6825 _LIBCPP_HIDE_FROM_ABI _OutputIterator
6826 regex_replace(_OutputIterator __output_iter,
6827 _BidirectionalIterator __first, _BidirectionalIterator __last,
6828 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6829 regex_constants::match_flag_type __flags = regex_constants::match_default)
6831 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6832 _Iter __i(__first, __last, __e, __flags);
6836 if (!(__flags & regex_constants::format_no_copy))
6837 __output_iter = _VSTD::copy(__first, __last, __output_iter);
6841 sub_match<_BidirectionalIterator> __lm;
6842 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6844 if (!(__flags & regex_constants::format_no_copy))
6845 __output_iter = _VSTD::copy(__i->prefix().first, __i->prefix().second, __output_iter);
6846 __output_iter = __i->format(__output_iter, __fmt, __fmt + __len, __flags);
6847 __lm = __i->suffix();
6848 if (__flags & regex_constants::format_first_only)
6851 if (!(__flags & regex_constants::format_no_copy))
6852 __output_iter = _VSTD::copy(__lm.first, __lm.second, __output_iter);
6854 return __output_iter;
6857 template <class _OutputIterator, class _BidirectionalIterator,
6858 class _Traits, class _CharT, class _ST, class _SA>
6859 inline _LIBCPP_INLINE_VISIBILITY
6861 regex_replace(_OutputIterator __output_iter,
6862 _BidirectionalIterator __first, _BidirectionalIterator __last,
6863 const basic_regex<_CharT, _Traits>& __e,
6864 const basic_string<_CharT, _ST, _SA>& __fmt,
6865 regex_constants::match_flag_type __flags = regex_constants::match_default)
6867 return _VSTD::regex_replace(__output_iter, __first, __last, __e, __fmt.c_str(), __flags);
6870 template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6872 inline _LIBCPP_INLINE_VISIBILITY
6873 basic_string<_CharT, _ST, _SA>
6874 regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6875 const basic_regex<_CharT, _Traits>& __e,
6876 const basic_string<_CharT, _FST, _FSA>& __fmt,
6877 regex_constants::match_flag_type __flags = regex_constants::match_default)
6879 basic_string<_CharT, _ST, _SA> __r;
6880 _VSTD::regex_replace(std::back_inserter(__r), __s.begin(), __s.end(), __e,
6881 __fmt.c_str(), __flags);
6885 template <class _Traits, class _CharT, class _ST, class _SA>
6886 inline _LIBCPP_INLINE_VISIBILITY
6887 basic_string<_CharT, _ST, _SA>
6888 regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6889 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6890 regex_constants::match_flag_type __flags = regex_constants::match_default)
6892 basic_string<_CharT, _ST, _SA> __r;
6893 _VSTD::regex_replace(std::back_inserter(__r), __s.begin(), __s.end(), __e,
6898 template <class _Traits, class _CharT, class _ST, class _SA>
6899 inline _LIBCPP_INLINE_VISIBILITY
6900 basic_string<_CharT>
6901 regex_replace(const _CharT* __s,
6902 const basic_regex<_CharT, _Traits>& __e,
6903 const basic_string<_CharT, _ST, _SA>& __fmt,
6904 regex_constants::match_flag_type __flags = regex_constants::match_default)
6906 basic_string<_CharT> __r;
6907 _VSTD::regex_replace(std::back_inserter(__r), __s,
6908 __s + char_traits<_CharT>::length(__s), __e,
6909 __fmt.c_str(), __flags);
6913 template <class _Traits, class _CharT>
6914 inline _LIBCPP_INLINE_VISIBILITY
6915 basic_string<_CharT>
6916 regex_replace(const _CharT* __s,
6917 const basic_regex<_CharT, _Traits>& __e,
6918 const _CharT* __fmt,
6919 regex_constants::match_flag_type __flags = regex_constants::match_default)
6921 basic_string<_CharT> __r;
6922 _VSTD::regex_replace(std::back_inserter(__r), __s,
6923 __s + char_traits<_CharT>::length(__s), __e,
6928 _LIBCPP_END_NAMESPACE_STD
6930 #if _LIBCPP_STD_VER >= 17
6931 _LIBCPP_BEGIN_NAMESPACE_STD
6933 template <class _BidirT>
6934 using match_results _LIBCPP_AVAILABILITY_PMR = std::match_results<_BidirT, polymorphic_allocator<std::sub_match<_BidirT>>>;
6936 using cmatch _LIBCPP_AVAILABILITY_PMR = match_results<const char*>;
6937 using smatch _LIBCPP_AVAILABILITY_PMR = match_results<std::pmr::string::const_iterator>;
6939 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
6940 using wcmatch _LIBCPP_AVAILABILITY_PMR = match_results<const wchar_t*>;
6941 using wsmatch _LIBCPP_AVAILABILITY_PMR = match_results<std::pmr::wstring::const_iterator>;
6944 _LIBCPP_END_NAMESPACE_STD
6949 #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
6951 # include <concepts>
6954 # include <iterator>
6957 # include <type_traits>
6958 # include <typeinfo>
6962 #endif // _LIBCPP_REGEX