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_() {}
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>
2780 _LIBCPP_INLINE_VISIBILITY
2781 typename enable_if<__has_exactly_input_iterator_category<_InputIterator>::value, basic_regex&>::type
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>
2802 _LIBCPP_INLINE_VISIBILITY
2805 __has_forward_iterator_category<_ForwardIterator>::value,
2808 assign(_ForwardIterator __first, _ForwardIterator __last,
2809 flag_type __f = regex_constants::ECMAScript)
2811 return assign(basic_regex(__first, __last, __f));
2814 #ifndef _LIBCPP_CXX03_LANG
2816 _LIBCPP_INLINE_VISIBILITY
2817 basic_regex& assign(initializer_list<value_type> __il,
2818 flag_type __f = regex_constants::ECMAScript)
2819 {return assign(__il.begin(), __il.end(), __f);}
2821 #endif // _LIBCPP_CXX03_LANG
2823 // const operations:
2824 _LIBCPP_INLINE_VISIBILITY
2825 unsigned mark_count() const {return __marked_count_;}
2826 _LIBCPP_INLINE_VISIBILITY
2827 flag_type flags() const {return __flags_;}
2830 _LIBCPP_INLINE_VISIBILITY
2831 locale_type imbue(locale_type __loc)
2833 __member_init(ECMAScript);
2835 return __traits_.imbue(__loc);
2837 _LIBCPP_INLINE_VISIBILITY
2838 locale_type getloc() const {return __traits_.getloc();}
2841 void swap(basic_regex& __r);
2844 _LIBCPP_INLINE_VISIBILITY
2845 unsigned __loop_count() const {return __loop_count_;}
2847 _LIBCPP_INLINE_VISIBILITY
2848 bool __use_multiline() const
2850 return __get_grammar(__flags_) == ECMAScript && (__flags_ & multiline);
2853 template <class _ForwardIterator>
2855 __init(_ForwardIterator __first, _ForwardIterator __last);
2856 template <class _ForwardIterator>
2858 __parse(_ForwardIterator __first, _ForwardIterator __last);
2859 template <class _ForwardIterator>
2861 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2862 template <class _ForwardIterator>
2864 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2865 template <class _ForwardIterator>
2867 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2868 template <class _ForwardIterator>
2870 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2871 template <class _ForwardIterator>
2873 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2874 template <class _ForwardIterator>
2876 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2877 template <class _ForwardIterator>
2879 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2880 template <class _ForwardIterator>
2882 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2883 template <class _ForwardIterator>
2885 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2886 template <class _ForwardIterator>
2888 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2889 template <class _ForwardIterator>
2891 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2892 template <class _ForwardIterator>
2894 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2895 template <class _ForwardIterator>
2897 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2898 __owns_one_state<_CharT>* __s,
2899 unsigned __mexp_begin, unsigned __mexp_end);
2900 template <class _ForwardIterator>
2902 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2903 __owns_one_state<_CharT>* __s,
2904 unsigned __mexp_begin, unsigned __mexp_end);
2905 template <class _ForwardIterator>
2907 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2908 template <class _ForwardIterator>
2910 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2911 __bracket_expression<_CharT, _Traits>* __ml);
2912 template <class _ForwardIterator>
2914 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2915 __bracket_expression<_CharT, _Traits>* __ml);
2916 template <class _ForwardIterator>
2918 __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2919 __bracket_expression<_CharT, _Traits>* __ml);
2920 template <class _ForwardIterator>
2922 __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2923 __bracket_expression<_CharT, _Traits>* __ml);
2924 template <class _ForwardIterator>
2926 __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2927 basic_string<_CharT>& __col_sym);
2928 template <class _ForwardIterator>
2930 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
2931 template <class _ForwardIterator>
2933 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2934 template <class _ForwardIterator>
2936 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2937 template <class _ForwardIterator>
2939 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2940 template <class _ForwardIterator>
2942 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2943 template <class _ForwardIterator>
2945 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2946 template <class _ForwardIterator>
2948 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2949 template <class _ForwardIterator>
2951 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2952 template <class _ForwardIterator>
2954 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2955 template <class _ForwardIterator>
2957 __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2958 template <class _ForwardIterator>
2960 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2961 template <class _ForwardIterator>
2963 __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2964 template <class _ForwardIterator>
2966 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2967 template <class _ForwardIterator>
2969 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2970 template <class _ForwardIterator>
2972 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2973 template <class _ForwardIterator>
2975 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2976 basic_string<_CharT>* __str = nullptr);
2977 template <class _ForwardIterator>
2979 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
2980 template <class _ForwardIterator>
2982 __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2983 template <class _ForwardIterator>
2985 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
2986 template <class _ForwardIterator>
2988 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2989 basic_string<_CharT>& __str,
2990 __bracket_expression<_CharT, _Traits>* __ml);
2991 template <class _ForwardIterator>
2993 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2994 basic_string<_CharT>* __str = nullptr);
2996 bool __test_back_ref(_CharT);
2998 _LIBCPP_INLINE_VISIBILITY
2999 void __push_l_anchor();
3000 void __push_r_anchor();
3001 void __push_match_any();
3002 void __push_match_any_but_newline();
3003 _LIBCPP_INLINE_VISIBILITY
3004 void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
3005 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
3006 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
3007 __mexp_begin, __mexp_end);}
3008 _LIBCPP_INLINE_VISIBILITY
3009 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
3010 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
3011 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
3012 __mexp_begin, __mexp_end, false);}
3013 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
3014 size_t __mexp_begin = 0, size_t __mexp_end = 0,
3015 bool __greedy = true);
3016 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
3017 void __push_char(value_type __c);
3018 void __push_back_ref(int __i);
3019 void __push_alternation(__owns_one_state<_CharT>* __sa,
3020 __owns_one_state<_CharT>* __sb);
3021 void __push_begin_marked_subexpression();
3022 void __push_end_marked_subexpression(unsigned);
3023 void __push_empty();
3024 void __push_word_boundary(bool);
3025 void __push_lookahead(const basic_regex&, bool, unsigned);
3027 template <class _Allocator>
3029 __search(const _CharT* __first, const _CharT* __last,
3030 match_results<const _CharT*, _Allocator>& __m,
3031 regex_constants::match_flag_type __flags) const;
3033 template <class _Allocator>
3035 __match_at_start(const _CharT* __first, const _CharT* __last,
3036 match_results<const _CharT*, _Allocator>& __m,
3037 regex_constants::match_flag_type __flags, bool) const;
3038 template <class _Allocator>
3040 __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
3041 match_results<const _CharT*, _Allocator>& __m,
3042 regex_constants::match_flag_type __flags, bool) const;
3043 template <class _Allocator>
3045 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
3046 match_results<const _CharT*, _Allocator>& __m,
3047 regex_constants::match_flag_type __flags, bool) const;
3048 template <class _Allocator>
3050 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
3051 match_results<const _CharT*, _Allocator>& __m,
3052 regex_constants::match_flag_type __flags, bool) const;
3054 template <class _Bp, class _Ap, class _Cp, class _Tp>
3057 regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
3058 regex_constants::match_flag_type);
3060 template <class _Ap, class _Cp, class _Tp>
3063 regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
3064 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
3066 template <class _Bp, class _Cp, class _Tp>
3069 regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
3070 regex_constants::match_flag_type);
3072 template <class _Cp, class _Tp>
3075 regex_search(const _Cp*, const _Cp*,
3076 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
3078 template <class _Cp, class _Ap, class _Tp>
3081 regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
3082 regex_constants::match_flag_type);
3084 template <class _ST, class _SA, class _Cp, class _Tp>
3087 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
3088 const basic_regex<_Cp, _Tp>& __e,
3089 regex_constants::match_flag_type __flags);
3091 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
3094 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
3095 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
3096 const basic_regex<_Cp, _Tp>& __e,
3097 regex_constants::match_flag_type __flags);
3099 template <class _Iter, class _Ap, class _Cp, class _Tp>
3102 regex_search(__wrap_iter<_Iter> __first,
3103 __wrap_iter<_Iter> __last,
3104 match_results<__wrap_iter<_Iter>, _Ap>& __m,
3105 const basic_regex<_Cp, _Tp>& __e,
3106 regex_constants::match_flag_type __flags);
3108 template <class, class> friend class __lookahead;
3111 #if _LIBCPP_STD_VER >= 17
3112 template <class _ForwardIterator,
3113 class = typename enable_if<__has_forward_iterator_category<_ForwardIterator>::value, nullptr_t>::type
3115 basic_regex(_ForwardIterator, _ForwardIterator,
3116 regex_constants::syntax_option_type = regex_constants::ECMAScript)
3117 -> basic_regex<typename iterator_traits<_ForwardIterator>::value_type>;
3120 template <class _CharT, class _Traits>
3121 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
3122 template <class _CharT, class _Traits>
3123 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
3124 template <class _CharT, class _Traits>
3125 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
3126 template <class _CharT, class _Traits>
3127 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
3128 template <class _CharT, class _Traits>
3129 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
3130 template <class _CharT, class _Traits>
3131 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
3132 template <class _CharT, class _Traits>
3133 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
3134 template <class _CharT, class _Traits>
3135 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
3136 template <class _CharT, class _Traits>
3137 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
3138 template <class _CharT, class _Traits>
3139 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
3141 template <class _CharT, class _Traits>
3143 basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
3146 swap(__traits_, __r.__traits_);
3147 swap(__flags_, __r.__flags_);
3148 swap(__marked_count_, __r.__marked_count_);
3149 swap(__loop_count_, __r.__loop_count_);
3150 swap(__open_count_, __r.__open_count_);
3151 swap(__start_, __r.__start_);
3152 swap(__end_, __r.__end_);
3155 template <class _CharT, class _Traits>
3156 inline _LIBCPP_INLINE_VISIBILITY
3158 swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
3160 return __x.swap(__y);
3165 template <class _CharT, class _Traits>
3167 : public __owns_one_state<_CharT>
3169 typedef __owns_one_state<_CharT> base;
3171 basic_regex<_CharT, _Traits> __exp_;
3175 __lookahead(const __lookahead&);
3176 __lookahead& operator=(const __lookahead&);
3178 typedef _VSTD::__state<_CharT> __state;
3180 _LIBCPP_INLINE_VISIBILITY
3181 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
3182 : base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {}
3184 _LIBCPP_HIDE_FROM_ABI_VIRTUAL virtual void __exec(__state&) const;
3187 template <class _CharT, class _Traits>
3189 __lookahead<_CharT, _Traits>::__exec(__state& __s) const
3191 match_results<const _CharT*> __m;
3192 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
3193 bool __matched = __exp_.__match_at_start_ecma(
3194 __s.__current_, __s.__last_,
3196 (__s.__flags_ | regex_constants::match_continuous) &
3197 ~regex_constants::__full_match,
3198 __s.__at_first_ && __s.__current_ == __s.__first_);
3199 if (__matched != __invert_)
3201 __s.__do_ = __state::__accept_but_not_consume;
3202 __s.__node_ = this->first();
3203 for (unsigned __i = 1; __i < __m.size(); ++__i) {
3204 __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
3209 __s.__do_ = __state::__reject;
3210 __s.__node_ = nullptr;
3214 template <class _CharT, class _Traits>
3215 template <class _ForwardIterator>
3217 basic_regex<_CharT, _Traits>::__init(_ForwardIterator __first, _ForwardIterator __last)
3219 if (__get_grammar(__flags_) == 0) __flags_ |= regex_constants::ECMAScript;
3220 _ForwardIterator __temp = __parse(__first, __last);
3221 if ( __temp != __last)
3222 __throw_regex_error<regex_constants::__re_err_parse>();
3225 template <class _CharT, class _Traits>
3226 template <class _ForwardIterator>
3228 basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
3229 _ForwardIterator __last)
3232 unique_ptr<__node> __h(new __end_state<_CharT>);
3233 __start_.reset(new __empty_state<_CharT>(__h.get()));
3235 __end_ = __start_.get();
3237 switch (__get_grammar(__flags_))
3240 __first = __parse_ecma_exp(__first, __last);
3243 __first = __parse_basic_reg_exp(__first, __last);
3247 __first = __parse_extended_reg_exp(__first, __last);
3250 __first = __parse_grep(__first, __last);
3253 __first = __parse_egrep(__first, __last);
3256 __throw_regex_error<regex_constants::__re_err_grammar>();
3261 template <class _CharT, class _Traits>
3262 template <class _ForwardIterator>
3264 basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
3265 _ForwardIterator __last)
3267 if (__first != __last)
3269 if (*__first == '^')
3274 if (__first != __last)
3276 __first = __parse_RE_expression(__first, __last);
3277 if (__first != __last)
3279 _ForwardIterator __temp = _VSTD::next(__first);
3280 if (__temp == __last && *__first == '$')
3287 if (__first != __last)
3288 __throw_regex_error<regex_constants::__re_err_empty>();
3293 template <class _CharT, class _Traits>
3294 template <class _ForwardIterator>
3296 basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
3297 _ForwardIterator __last)
3299 __owns_one_state<_CharT>* __sa = __end_;
3300 _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
3301 if (__temp == __first)
3302 __throw_regex_error<regex_constants::__re_err_empty>();
3304 while (__first != __last && *__first == '|')
3306 __owns_one_state<_CharT>* __sb = __end_;
3307 __temp = __parse_ERE_branch(++__first, __last);
3308 if (__temp == __first)
3309 __throw_regex_error<regex_constants::__re_err_empty>();
3310 __push_alternation(__sa, __sb);
3316 template <class _CharT, class _Traits>
3317 template <class _ForwardIterator>
3319 basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3320 _ForwardIterator __last)
3322 _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
3323 if (__temp == __first)
3324 __throw_regex_error<regex_constants::__re_err_empty>();
3328 __temp = __parse_ERE_expression(__first, __last);
3329 } while (__temp != __first);
3333 template <class _CharT, class _Traits>
3334 template <class _ForwardIterator>
3336 basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3337 _ForwardIterator __last)
3339 __owns_one_state<_CharT>* __e = __end_;
3340 unsigned __mexp_begin = __marked_count_;
3341 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3342 if (__temp == __first && __temp != __last)
3355 __push_begin_marked_subexpression();
3356 unsigned __temp_count = __marked_count_;
3358 __temp = __parse_extended_reg_exp(++__temp, __last);
3359 if (__temp == __last || *__temp != ')')
3360 __throw_regex_error<regex_constants::error_paren>();
3361 __push_end_marked_subexpression(__temp_count);
3367 if (__temp != __first)
3368 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3374 template <class _CharT, class _Traits>
3375 template <class _ForwardIterator>
3377 basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3378 _ForwardIterator __last)
3382 _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3383 if (__temp == __first)
3390 template <class _CharT, class _Traits>
3391 template <class _ForwardIterator>
3393 basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3394 _ForwardIterator __last)
3396 if (__first != __last)
3398 __owns_one_state<_CharT>* __e = __end_;
3399 unsigned __mexp_begin = __marked_count_;
3400 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3401 if (__temp != __first)
3402 __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3403 __mexp_begin+1, __marked_count_+1);
3408 template <class _CharT, class _Traits>
3409 template <class _ForwardIterator>
3411 basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3412 _ForwardIterator __last)
3414 _ForwardIterator __temp = __first;
3415 __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3416 if (__temp == __first)
3418 __temp = __parse_Back_open_paren(__first, __last);
3419 if (__temp != __first)
3421 __push_begin_marked_subexpression();
3422 unsigned __temp_count = __marked_count_;
3423 __first = __parse_RE_expression(__temp, __last);
3424 __temp = __parse_Back_close_paren(__first, __last);
3425 if (__temp == __first)
3426 __throw_regex_error<regex_constants::error_paren>();
3427 __push_end_marked_subexpression(__temp_count);
3431 __first = __parse_BACKREF(__first, __last);
3436 template <class _CharT, class _Traits>
3437 template <class _ForwardIterator>
3439 basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3440 _ForwardIterator __first,
3441 _ForwardIterator __last)
3443 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
3444 if (__temp == __first)
3446 __temp = __parse_QUOTED_CHAR(__first, __last);
3447 if (__temp == __first)
3449 if (__temp != __last && *__temp == '.')
3455 __temp = __parse_bracket_expression(__first, __last);
3462 template <class _CharT, class _Traits>
3463 template <class _ForwardIterator>
3465 basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3466 _ForwardIterator __first,
3467 _ForwardIterator __last)
3469 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3470 if (__temp == __first)
3472 __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3473 if (__temp == __first)
3475 if (__temp != __last && *__temp == '.')
3481 __temp = __parse_bracket_expression(__first, __last);
3488 template <class _CharT, class _Traits>
3489 template <class _ForwardIterator>
3491 basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3492 _ForwardIterator __last)
3494 if (__first != __last)
3496 _ForwardIterator __temp = _VSTD::next(__first);
3497 if (__temp != __last)
3499 if (*__first == '\\' && *__temp == '(')
3506 template <class _CharT, class _Traits>
3507 template <class _ForwardIterator>
3509 basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3510 _ForwardIterator __last)
3512 if (__first != __last)
3514 _ForwardIterator __temp = _VSTD::next(__first);
3515 if (__temp != __last)
3517 if (*__first == '\\' && *__temp == ')')
3524 template <class _CharT, class _Traits>
3525 template <class _ForwardIterator>
3527 basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3528 _ForwardIterator __last)
3530 if (__first != __last)
3532 _ForwardIterator __temp = _VSTD::next(__first);
3533 if (__temp != __last)
3535 if (*__first == '\\' && *__temp == '{')
3542 template <class _CharT, class _Traits>
3543 template <class _ForwardIterator>
3545 basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3546 _ForwardIterator __last)
3548 if (__first != __last)
3550 _ForwardIterator __temp = _VSTD::next(__first);
3551 if (__temp != __last)
3553 if (*__first == '\\' && *__temp == '}')
3560 template <class _CharT, class _Traits>
3561 template <class _ForwardIterator>
3563 basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3564 _ForwardIterator __last)
3566 if (__first != __last)
3568 _ForwardIterator __temp = _VSTD::next(__first);
3569 if (__temp != __last && *__first == '\\' && __test_back_ref(*__temp))
3575 template <class _CharT, class _Traits>
3576 template <class _ForwardIterator>
3578 basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3579 _ForwardIterator __last)
3581 if (__first != __last)
3583 _ForwardIterator __temp = _VSTD::next(__first);
3584 if (__temp == __last && *__first == '$')
3586 // Not called inside a bracket
3587 if (*__first == '.' || *__first == '\\' || *__first == '[')
3589 __push_char(*__first);
3595 template <class _CharT, class _Traits>
3596 template <class _ForwardIterator>
3598 basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3599 _ForwardIterator __last)
3601 if (__first != __last)
3618 if (__open_count_ == 0)
3620 __push_char(*__first);
3625 __push_char(*__first);
3633 template <class _CharT, class _Traits>
3634 template <class _ForwardIterator>
3636 basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3637 _ForwardIterator __last)
3639 if (__first != __last)
3641 _ForwardIterator __temp = _VSTD::next(__first);
3642 if (__temp != __last)
3644 if (*__first == '\\')
3654 __push_char(*__temp);
3664 template <class _CharT, class _Traits>
3665 template <class _ForwardIterator>
3667 basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3668 _ForwardIterator __last)
3670 if (__first != __last)
3672 _ForwardIterator __temp = _VSTD::next(__first);
3673 if (__temp != __last)
3675 if (*__first == '\\')
3692 __push_char(*__temp);
3696 if (__get_grammar(__flags_) == awk)
3697 __first = __parse_awk_escape(++__first, __last);
3698 else if(__test_back_ref(*__temp))
3708 template <class _CharT, class _Traits>
3709 template <class _ForwardIterator>
3711 basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
3712 _ForwardIterator __last,
3713 __owns_one_state<_CharT>* __s,
3714 unsigned __mexp_begin,
3715 unsigned __mexp_end)
3717 if (__first != __last)
3719 if (*__first == '*')
3721 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3726 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3727 if (__temp != __first)
3731 __temp = __parse_DUP_COUNT(__first, __last, __min);
3732 if (__temp == __first)
3733 __throw_regex_error<regex_constants::error_badbrace>();
3735 if (__first == __last)
3736 __throw_regex_error<regex_constants::error_brace>();
3737 if (*__first != ',')
3739 __temp = __parse_Back_close_brace(__first, __last);
3740 if (__temp == __first)
3741 __throw_regex_error<regex_constants::error_brace>();
3742 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3748 ++__first; // consume ','
3750 __first = __parse_DUP_COUNT(__first, __last, __max);
3751 __temp = __parse_Back_close_brace(__first, __last);
3752 if (__temp == __first)
3753 __throw_regex_error<regex_constants::error_brace>();
3755 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3759 __throw_regex_error<regex_constants::error_badbrace>();
3760 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3771 template <class _CharT, class _Traits>
3772 template <class _ForwardIterator>
3774 basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
3775 _ForwardIterator __last,
3776 __owns_one_state<_CharT>* __s,
3777 unsigned __mexp_begin,
3778 unsigned __mexp_end)
3780 if (__first != __last)
3782 unsigned __grammar = __get_grammar(__flags_);
3787 if (__grammar == ECMAScript && __first != __last && *__first == '?')
3790 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3793 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3797 if (__grammar == ECMAScript && __first != __last && *__first == '?')
3800 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3803 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3807 if (__grammar == ECMAScript && __first != __last && *__first == '?')
3810 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3813 __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
3818 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
3819 if (__temp == __first)
3820 __throw_regex_error<regex_constants::error_badbrace>();
3822 if (__first == __last)
3823 __throw_regex_error<regex_constants::error_brace>();
3828 if (__grammar == ECMAScript && __first != __last && *__first == '?')
3831 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3834 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
3838 if (__first == __last)
3839 __throw_regex_error<regex_constants::error_badbrace>();
3840 if (*__first == '}')
3843 if (__grammar == ECMAScript && __first != __last && *__first == '?')
3846 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3849 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3854 __temp = __parse_DUP_COUNT(__first, __last, __max);
3855 if (__temp == __first)
3856 __throw_regex_error<regex_constants::error_brace>();
3858 if (__first == __last || *__first != '}')
3859 __throw_regex_error<regex_constants::error_brace>();
3862 __throw_regex_error<regex_constants::error_badbrace>();
3863 if (__grammar == ECMAScript && __first != __last && *__first == '?')
3866 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3869 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
3873 __throw_regex_error<regex_constants::error_badbrace>();
3882 template <class _CharT, class _Traits>
3883 template <class _ForwardIterator>
3885 basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3886 _ForwardIterator __last)
3888 if (__first != __last && *__first == '[')
3891 if (__first == __last)
3892 __throw_regex_error<regex_constants::error_brack>();
3893 bool __negate = false;
3894 if (*__first == '^')
3899 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3900 // __ml owned by *this
3901 if (__first == __last)
3902 __throw_regex_error<regex_constants::error_brack>();
3903 if (__get_grammar(__flags_) != ECMAScript && *__first == ']')
3905 __ml->__add_char(']');
3908 __first = __parse_follow_list(__first, __last, __ml);
3909 if (__first == __last)
3910 __throw_regex_error<regex_constants::error_brack>();
3911 if (*__first == '-')
3913 __ml->__add_char('-');
3916 if (__first == __last || *__first != ']')
3917 __throw_regex_error<regex_constants::error_brack>();
3923 template <class _CharT, class _Traits>
3924 template <class _ForwardIterator>
3926 basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
3927 _ForwardIterator __last,
3928 __bracket_expression<_CharT, _Traits>* __ml)
3930 if (__first != __last)
3934 _ForwardIterator __temp = __parse_expression_term(__first, __last,
3936 if (__temp == __first)
3944 template <class _CharT, class _Traits>
3945 template <class _ForwardIterator>
3947 basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
3948 _ForwardIterator __last,
3949 __bracket_expression<_CharT, _Traits>* __ml)
3951 if (__first != __last && *__first != ']')
3953 _ForwardIterator __temp = _VSTD::next(__first);
3954 basic_string<_CharT> __start_range;
3955 if (__temp != __last && *__first == '[')
3958 return __parse_equivalence_class(++__temp, __last, __ml);
3959 else if (*__temp == ':')
3960 return __parse_character_class(++__temp, __last, __ml);
3961 else if (*__temp == '.')
3962 __first = __parse_collating_symbol(++__temp, __last, __start_range);
3964 unsigned __grammar = __get_grammar(__flags_);
3965 if (__start_range.empty())
3967 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3969 if (__grammar == ECMAScript)
3970 __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3972 __first = __parse_awk_escape(++__first, __last, &__start_range);
3976 __start_range = *__first;
3980 if (__first != __last && *__first != ']')
3982 __temp = _VSTD::next(__first);
3983 if (__temp != __last && *__first == '-' && *__temp != ']')
3986 basic_string<_CharT> __end_range;
3989 if (__temp != __last && *__first == '[' && *__temp == '.')
3990 __first = __parse_collating_symbol(++__temp, __last, __end_range);
3993 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3995 if (__grammar == ECMAScript)
3996 __first = __parse_class_escape(++__first, __last,
3999 __first = __parse_awk_escape(++__first, __last,
4004 __end_range = *__first;
4008 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
4010 else if (!__start_range.empty())
4012 if (__start_range.size() == 1)
4013 __ml->__add_char(__start_range[0]);
4015 __ml->__add_digraph(__start_range[0], __start_range[1]);
4018 else if (!__start_range.empty())
4020 if (__start_range.size() == 1)
4021 __ml->__add_char(__start_range[0]);
4023 __ml->__add_digraph(__start_range[0], __start_range[1]);
4029 template <class _CharT, class _Traits>
4030 template <class _ForwardIterator>
4032 basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
4033 _ForwardIterator __last,
4034 basic_string<_CharT>& __str,
4035 __bracket_expression<_CharT, _Traits>* __ml)
4037 if (__first == __last)
4038 __throw_regex_error<regex_constants::error_escape>();
4048 __ml->__add_class(ctype_base::digit);
4051 __ml->__add_neg_class(ctype_base::digit);
4054 __ml->__add_class(ctype_base::space);
4057 __ml->__add_neg_class(ctype_base::space);
4060 __ml->__add_class(ctype_base::alnum);
4061 __ml->__add_char('_');
4064 __ml->__add_neg_class(ctype_base::alnum);
4065 __ml->__add_neg_char('_');
4068 __first = __parse_character_escape(__first, __last, &__str);
4072 template <class _CharT, class _Traits>
4073 template <class _ForwardIterator>
4075 basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
4076 _ForwardIterator __last,
4077 basic_string<_CharT>* __str)
4079 if (__first == __last)
4080 __throw_regex_error<regex_constants::error_escape>();
4089 __push_char(*__first);
4095 __push_char(_CharT(7));
4101 __push_char(_CharT(8));
4105 *__str = _CharT(0xC);
4107 __push_char(_CharT(0xC));
4111 *__str = _CharT(0xA);
4113 __push_char(_CharT(0xA));
4117 *__str = _CharT(0xD);
4119 __push_char(_CharT(0xD));
4123 *__str = _CharT(0x9);
4125 __push_char(_CharT(0x9));
4129 *__str = _CharT(0xB);
4131 __push_char(_CharT(0xB));
4134 if ('0' <= *__first && *__first <= '7')
4136 unsigned __val = *__first - '0';
4137 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
4139 __val = 8 * __val + *__first - '0';
4140 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
4141 __val = 8 * __val + *__first++ - '0';
4144 *__str = _CharT(__val);
4146 __push_char(_CharT(__val));
4149 __throw_regex_error<regex_constants::error_escape>();
4153 template <class _CharT, class _Traits>
4154 template <class _ForwardIterator>
4156 basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
4157 _ForwardIterator __last,
4158 __bracket_expression<_CharT, _Traits>* __ml)
4161 // This means =] must exist
4162 value_type __equal_close[2] = {'=', ']'};
4163 _ForwardIterator __temp = _VSTD::search(__first, __last, __equal_close,
4165 if (__temp == __last)
4166 __throw_regex_error<regex_constants::error_brack>();
4167 // [__first, __temp) contains all text in [= ... =]
4168 string_type __collate_name =
4169 __traits_.lookup_collatename(__first, __temp);
4170 if (__collate_name.empty())
4171 __throw_regex_error<regex_constants::error_collate>();
4172 string_type __equiv_name =
4173 __traits_.transform_primary(__collate_name.begin(),
4174 __collate_name.end());
4175 if (!__equiv_name.empty())
4176 __ml->__add_equivalence(__equiv_name);
4179 switch (__collate_name.size())
4182 __ml->__add_char(__collate_name[0]);
4185 __ml->__add_digraph(__collate_name[0], __collate_name[1]);
4188 __throw_regex_error<regex_constants::error_collate>();
4191 __first = _VSTD::next(__temp, 2);
4195 template <class _CharT, class _Traits>
4196 template <class _ForwardIterator>
4198 basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
4199 _ForwardIterator __last,
4200 __bracket_expression<_CharT, _Traits>* __ml)
4203 // This means :] must exist
4204 value_type __colon_close[2] = {':', ']'};
4205 _ForwardIterator __temp = _VSTD::search(__first, __last, __colon_close,
4207 if (__temp == __last)
4208 __throw_regex_error<regex_constants::error_brack>();
4209 // [__first, __temp) contains all text in [: ... :]
4210 typedef typename _Traits::char_class_type char_class_type;
4211 char_class_type __class_type =
4212 __traits_.lookup_classname(__first, __temp, __flags_ & icase);
4213 if (__class_type == 0)
4214 __throw_regex_error<regex_constants::error_ctype>();
4215 __ml->__add_class(__class_type);
4216 __first = _VSTD::next(__temp, 2);
4220 template <class _CharT, class _Traits>
4221 template <class _ForwardIterator>
4223 basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
4224 _ForwardIterator __last,
4225 basic_string<_CharT>& __col_sym)
4228 // This means .] must exist
4229 value_type __dot_close[2] = {'.', ']'};
4230 _ForwardIterator __temp = _VSTD::search(__first, __last, __dot_close,
4232 if (__temp == __last)
4233 __throw_regex_error<regex_constants::error_brack>();
4234 // [__first, __temp) contains all text in [. ... .]
4235 __col_sym = __traits_.lookup_collatename(__first, __temp);
4236 switch (__col_sym.size())
4242 __throw_regex_error<regex_constants::error_collate>();
4244 __first = _VSTD::next(__temp, 2);
4248 template <class _CharT, class _Traits>
4249 template <class _ForwardIterator>
4251 basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4252 _ForwardIterator __last,
4255 if (__first != __last )
4257 int __val = __traits_.value(*__first, 10);
4262 __first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
4265 if (__c >= numeric_limits<int>::max() / 10)
4266 __throw_regex_error<regex_constants::error_badbrace>();
4275 template <class _CharT, class _Traits>
4276 template <class _ForwardIterator>
4278 basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4279 _ForwardIterator __last)
4281 __owns_one_state<_CharT>* __sa = __end_;
4282 _ForwardIterator __temp = __parse_alternative(__first, __last);
4283 if (__temp == __first)
4286 while (__first != __last && *__first == '|')
4288 __owns_one_state<_CharT>* __sb = __end_;
4289 __temp = __parse_alternative(++__first, __last);
4290 if (__temp == __first)
4292 __push_alternation(__sa, __sb);
4298 template <class _CharT, class _Traits>
4299 template <class _ForwardIterator>
4301 basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4302 _ForwardIterator __last)
4306 _ForwardIterator __temp = __parse_term(__first, __last);
4307 if (__temp == __first)
4314 template <class _CharT, class _Traits>
4315 template <class _ForwardIterator>
4317 basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4318 _ForwardIterator __last)
4320 _ForwardIterator __temp = __parse_assertion(__first, __last);
4321 if (__temp == __first)
4323 __owns_one_state<_CharT>* __e = __end_;
4324 unsigned __mexp_begin = __marked_count_;
4325 __temp = __parse_atom(__first, __last);
4326 if (__temp != __first)
4327 __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4328 __mexp_begin+1, __marked_count_+1);
4335 template <class _CharT, class _Traits>
4336 template <class _ForwardIterator>
4338 basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4339 _ForwardIterator __last)
4341 if (__first != __last)
4355 _ForwardIterator __temp = _VSTD::next(__first);
4356 if (__temp != __last)
4360 __push_word_boundary(false);
4363 else if (*__temp == 'B')
4365 __push_word_boundary(true);
4373 _ForwardIterator __temp = _VSTD::next(__first);
4374 if (__temp != __last && *__temp == '?')
4376 if (++__temp != __last)
4383 __exp.__flags_ = __flags_;
4384 __temp = __exp.__parse(++__temp, __last);
4385 unsigned __mexp = __exp.__marked_count_;
4386 __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
4387 __marked_count_ += __mexp;
4388 if (__temp == __last || *__temp != ')')
4389 __throw_regex_error<regex_constants::error_paren>();
4396 __exp.__flags_ = __flags_;
4397 __temp = __exp.__parse(++__temp, __last);
4398 unsigned __mexp = __exp.__marked_count_;
4399 __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
4400 __marked_count_ += __mexp;
4401 if (__temp == __last || *__temp != ')')
4402 __throw_regex_error<regex_constants::error_paren>();
4416 template <class _CharT, class _Traits>
4417 template <class _ForwardIterator>
4419 basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4420 _ForwardIterator __last)
4422 if (__first != __last)
4427 __push_match_any_but_newline();
4431 __first = __parse_atom_escape(__first, __last);
4434 __first = __parse_bracket_expression(__first, __last);
4439 if (__first == __last)
4440 __throw_regex_error<regex_constants::error_paren>();
4441 _ForwardIterator __temp = _VSTD::next(__first);
4442 if (__temp != __last && *__first == '?' && *__temp == ':')
4445 __first = __parse_ecma_exp(++__temp, __last);
4446 if (__first == __last || *__first != ')')
4447 __throw_regex_error<regex_constants::error_paren>();
4453 __push_begin_marked_subexpression();
4454 unsigned __temp_count = __marked_count_;
4456 __first = __parse_ecma_exp(__first, __last);
4457 if (__first == __last || *__first != ')')
4458 __throw_regex_error<regex_constants::error_paren>();
4459 __push_end_marked_subexpression(__temp_count);
4469 __throw_regex_error<regex_constants::error_badrepeat>();
4472 __first = __parse_pattern_character(__first, __last);
4479 template <class _CharT, class _Traits>
4480 template <class _ForwardIterator>
4482 basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4483 _ForwardIterator __last)
4485 if (__first != __last && *__first == '\\')
4487 _ForwardIterator __t1 = _VSTD::next(__first);
4489 __throw_regex_error<regex_constants::error_escape>();
4491 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4496 __t2 = __parse_character_class_escape(__t1, __last);
4501 __t2 = __parse_character_escape(__t1, __last);
4510 template <class _CharT, class _Traits>
4511 template <class _ForwardIterator>
4513 basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4514 _ForwardIterator __last)
4516 if (__first != __last)
4518 if (*__first == '0')
4520 __push_char(_CharT());
4523 else if ('1' <= *__first && *__first <= '9')
4525 unsigned __v = *__first - '0';
4527 __first != __last && '0' <= *__first && *__first <= '9'; ++__first)
4529 if (__v >= numeric_limits<unsigned>::max() / 10)
4530 __throw_regex_error<regex_constants::error_backref>();
4531 __v = 10 * __v + *__first - '0';
4533 if (__v == 0 || __v > mark_count())
4534 __throw_regex_error<regex_constants::error_backref>();
4535 __push_back_ref(__v);
4541 template <class _CharT, class _Traits>
4542 template <class _ForwardIterator>
4544 basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4545 _ForwardIterator __last)
4547 if (__first != __last)
4549 __bracket_expression<_CharT, _Traits>* __ml;
4553 __ml = __start_matching_list(false);
4554 __ml->__add_class(ctype_base::digit);
4558 __ml = __start_matching_list(true);
4559 __ml->__add_class(ctype_base::digit);
4563 __ml = __start_matching_list(false);
4564 __ml->__add_class(ctype_base::space);
4568 __ml = __start_matching_list(true);
4569 __ml->__add_class(ctype_base::space);
4573 __ml = __start_matching_list(false);
4574 __ml->__add_class(ctype_base::alnum);
4575 __ml->__add_char('_');
4579 __ml = __start_matching_list(true);
4580 __ml->__add_class(ctype_base::alnum);
4581 __ml->__add_char('_');
4589 template <class _CharT, class _Traits>
4590 template <class _ForwardIterator>
4592 basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
4593 _ForwardIterator __last,
4594 basic_string<_CharT>* __str)
4596 if (__first != __last)
4598 _ForwardIterator __t;
4605 *__str = _CharT(0xC);
4607 __push_char(_CharT(0xC));
4612 *__str = _CharT(0xA);
4614 __push_char(_CharT(0xA));
4619 *__str = _CharT(0xD);
4621 __push_char(_CharT(0xD));
4626 *__str = _CharT(0x9);
4628 __push_char(_CharT(0x9));
4633 *__str = _CharT(0xB);
4635 __push_char(_CharT(0xB));
4639 if ((__t = _VSTD::next(__first)) != __last)
4641 if (('A' <= *__t && *__t <= 'Z') ||
4642 ('a' <= *__t && *__t <= 'z'))
4645 *__str = _CharT(*__t % 32);
4647 __push_char(_CharT(*__t % 32));
4651 __throw_regex_error<regex_constants::error_escape>();
4654 __throw_regex_error<regex_constants::error_escape>();
4658 if (__first == __last)
4659 __throw_regex_error<regex_constants::error_escape>();
4660 __hd = __traits_.value(*__first, 16);
4662 __throw_regex_error<regex_constants::error_escape>();
4663 __sum = 16 * __sum + static_cast<unsigned>(__hd);
4665 if (__first == __last)
4666 __throw_regex_error<regex_constants::error_escape>();
4667 __hd = __traits_.value(*__first, 16);
4669 __throw_regex_error<regex_constants::error_escape>();
4670 __sum = 16 * __sum + static_cast<unsigned>(__hd);
4674 if (__first == __last)
4675 __throw_regex_error<regex_constants::error_escape>();
4676 __hd = __traits_.value(*__first, 16);
4678 __throw_regex_error<regex_constants::error_escape>();
4679 __sum = 16 * __sum + static_cast<unsigned>(__hd);
4681 if (__first == __last)
4682 __throw_regex_error<regex_constants::error_escape>();
4683 __hd = __traits_.value(*__first, 16);
4685 __throw_regex_error<regex_constants::error_escape>();
4686 __sum = 16 * __sum + static_cast<unsigned>(__hd);
4688 *__str = _CharT(__sum);
4690 __push_char(_CharT(__sum));
4697 __push_char(_CharT(0));
4701 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4706 __push_char(*__first);
4710 __throw_regex_error<regex_constants::error_escape>();
4717 template <class _CharT, class _Traits>
4718 template <class _ForwardIterator>
4720 basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4721 _ForwardIterator __last)
4723 if (__first != __last)
4743 __push_char(*__first);
4751 template <class _CharT, class _Traits>
4752 template <class _ForwardIterator>
4754 basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4755 _ForwardIterator __last)
4757 __owns_one_state<_CharT>* __sa = __end_;
4758 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4759 if (__t1 != __first)
4760 __parse_basic_reg_exp(__first, __t1);
4764 if (__first != __last)
4766 while (__first != __last)
4768 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4769 __owns_one_state<_CharT>* __sb = __end_;
4770 if (__t1 != __first)
4771 __parse_basic_reg_exp(__first, __t1);
4774 __push_alternation(__sa, __sb);
4776 if (__first != __last)
4782 template <class _CharT, class _Traits>
4783 template <class _ForwardIterator>
4785 basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4786 _ForwardIterator __last)
4788 __owns_one_state<_CharT>* __sa = __end_;
4789 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4790 if (__t1 != __first)
4791 __parse_extended_reg_exp(__first, __t1);
4795 if (__first != __last)
4797 while (__first != __last)
4799 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4800 __owns_one_state<_CharT>* __sb = __end_;
4801 if (__t1 != __first)
4802 __parse_extended_reg_exp(__first, __t1);
4805 __push_alternation(__sa, __sb);
4807 if (__first != __last)
4813 template <class _CharT, class _Traits>
4815 basic_regex<_CharT, _Traits>::__test_back_ref(_CharT __c)
4817 unsigned __val = __traits_.value(__c, 10);
4818 if (__val >= 1 && __val <= 9)
4820 if (__val > mark_count())
4821 __throw_regex_error<regex_constants::error_backref>();
4822 __push_back_ref(__val);
4829 template <class _CharT, class _Traits>
4831 basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4832 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4835 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4836 __end_->first() = nullptr;
4837 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4838 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4840 __s->first() = nullptr;
4842 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
4843 __end_ = __e2->second();
4844 __s->first() = __e2.release();
4848 template <class _CharT, class _Traits>
4850 basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4852 if (flags() & icase)
4853 __end_->first() = new __match_char_icase<_CharT, _Traits>
4854 (__traits_, __c, __end_->first());
4855 else if (flags() & collate)
4856 __end_->first() = new __match_char_collate<_CharT, _Traits>
4857 (__traits_, __c, __end_->first());
4859 __end_->first() = new __match_char<_CharT>(__c, __end_->first());
4860 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4863 template <class _CharT, class _Traits>
4865 basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4867 if (!(__flags_ & nosubs))
4870 new __begin_marked_subexpression<_CharT>(++__marked_count_,
4872 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4876 template <class _CharT, class _Traits>
4878 basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4880 if (!(__flags_ & nosubs))
4883 new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4884 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4888 template <class _CharT, class _Traits>
4890 basic_regex<_CharT, _Traits>::__push_l_anchor()
4892 __end_->first() = new __l_anchor_multiline<_CharT>(__use_multiline(), __end_->first());
4893 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4896 template <class _CharT, class _Traits>
4898 basic_regex<_CharT, _Traits>::__push_r_anchor()
4900 __end_->first() = new __r_anchor_multiline<_CharT>(__use_multiline(), __end_->first());
4901 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4904 template <class _CharT, class _Traits>
4906 basic_regex<_CharT, _Traits>::__push_match_any()
4908 __end_->first() = new __match_any<_CharT>(__end_->first());
4909 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4912 template <class _CharT, class _Traits>
4914 basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4916 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4917 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4920 template <class _CharT, class _Traits>
4922 basic_regex<_CharT, _Traits>::__push_empty()
4924 __end_->first() = new __empty_state<_CharT>(__end_->first());
4925 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4928 template <class _CharT, class _Traits>
4930 basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4932 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4934 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4937 template <class _CharT, class _Traits>
4939 basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4941 if (flags() & icase)
4942 __end_->first() = new __back_ref_icase<_CharT, _Traits>
4943 (__traits_, __i, __end_->first());
4944 else if (flags() & collate)
4945 __end_->first() = new __back_ref_collate<_CharT, _Traits>
4946 (__traits_, __i, __end_->first());
4948 __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
4949 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4952 template <class _CharT, class _Traits>
4954 basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4955 __owns_one_state<_CharT>* __ea)
4957 __sa->first() = new __alternate<_CharT>(
4958 static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4959 static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4960 __ea->first() = nullptr;
4961 __ea->first() = new __empty_state<_CharT>(__end_->first());
4962 __end_->first() = nullptr;
4963 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4964 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4967 template <class _CharT, class _Traits>
4968 __bracket_expression<_CharT, _Traits>*
4969 basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4971 __bracket_expression<_CharT, _Traits>* __r =
4972 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4973 __negate, __flags_ & icase,
4974 __flags_ & collate);
4975 __end_->first() = __r;
4980 template <class _CharT, class _Traits>
4982 basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
4986 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
4987 __end_->first(), __mexp);
4988 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4993 typedef sub_match<const char*> csub_match;
4994 typedef sub_match<string::const_iterator> ssub_match;
4995 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
4996 typedef sub_match<const wchar_t*> wcsub_match;
4997 typedef sub_match<wstring::const_iterator> wssub_match;
5000 template <class _BidirectionalIterator>
5002 _LIBCPP_TEMPLATE_VIS
5003 _LIBCPP_PREFERRED_NAME(csub_match)
5004 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcsub_match))
5005 _LIBCPP_PREFERRED_NAME(ssub_match)
5006 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wssub_match))
5008 : public pair<_BidirectionalIterator, _BidirectionalIterator>
5011 typedef _BidirectionalIterator iterator;
5012 typedef typename iterator_traits<iterator>::value_type value_type;
5013 typedef typename iterator_traits<iterator>::difference_type difference_type;
5014 typedef basic_string<value_type> string_type;
5018 _LIBCPP_INLINE_VISIBILITY
5019 _LIBCPP_CONSTEXPR sub_match() : matched() {}
5021 _LIBCPP_INLINE_VISIBILITY
5022 difference_type length() const
5023 {return matched ? _VSTD::distance(this->first, this->second) : 0;}
5024 _LIBCPP_INLINE_VISIBILITY
5025 string_type str() const
5026 {return matched ? string_type(this->first, this->second) : string_type();}
5027 _LIBCPP_INLINE_VISIBILITY
5028 operator string_type() const
5031 _LIBCPP_INLINE_VISIBILITY
5032 int compare(const sub_match& __s) const
5033 {return str().compare(__s.str());}
5034 _LIBCPP_INLINE_VISIBILITY
5035 int compare(const string_type& __s) const
5036 {return str().compare(__s);}
5037 _LIBCPP_INLINE_VISIBILITY
5038 int compare(const value_type* __s) const
5039 {return str().compare(__s);}
5041 _LIBCPP_HIDE_FROM_ABI
5042 void swap(sub_match& __s)
5043 #ifndef _LIBCPP_CXX03_LANG
5044 _NOEXCEPT(__is_nothrow_swappable<_BidirectionalIterator>::value)
5045 #endif // _LIBCPP_CXX03_LANG
5047 this->pair<_BidirectionalIterator, _BidirectionalIterator>::swap(__s);
5048 std::swap(matched, __s.matched);
5052 template <class _BiIter>
5053 inline _LIBCPP_INLINE_VISIBILITY
5055 operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5057 return __x.compare(__y) == 0;
5060 #if _LIBCPP_STD_VER >= 20
5061 template<class _BiIter>
5062 using __sub_match_cat = compare_three_way_result_t<basic_string<typename iterator_traits<_BiIter>::value_type>>;
5064 template <class _BiIter>
5065 _LIBCPP_HIDE_FROM_ABI auto operator<=>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y) {
5066 return static_cast<__sub_match_cat<_BiIter>>(__x.compare(__y) <=> 0);
5068 #else // _LIBCPP_STD_VER >= 20
5069 template <class _BiIter>
5070 inline _LIBCPP_INLINE_VISIBILITY
5072 operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5074 return !(__x == __y);
5077 template <class _BiIter>
5078 inline _LIBCPP_INLINE_VISIBILITY
5080 operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5082 return __x.compare(__y) < 0;
5085 template <class _BiIter>
5086 inline _LIBCPP_INLINE_VISIBILITY
5088 operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5090 return !(__y < __x);
5093 template <class _BiIter>
5094 inline _LIBCPP_INLINE_VISIBILITY
5096 operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5098 return !(__x < __y);
5101 template <class _BiIter>
5102 inline _LIBCPP_INLINE_VISIBILITY
5104 operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5109 template <class _BiIter, class _ST, class _SA>
5110 inline _LIBCPP_INLINE_VISIBILITY
5112 operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5113 const sub_match<_BiIter>& __y)
5115 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
5118 template <class _BiIter, class _ST, class _SA>
5119 inline _LIBCPP_INLINE_VISIBILITY
5121 operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5122 const sub_match<_BiIter>& __y)
5124 return !(__x == __y);
5127 template <class _BiIter, class _ST, class _SA>
5128 inline _LIBCPP_INLINE_VISIBILITY
5130 operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5131 const sub_match<_BiIter>& __y)
5133 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
5136 template <class _BiIter, class _ST, class _SA>
5137 inline _LIBCPP_INLINE_VISIBILITY
5139 operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5140 const sub_match<_BiIter>& __y)
5145 template <class _BiIter, class _ST, class _SA>
5146 inline _LIBCPP_INLINE_VISIBILITY
5147 bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5148 const sub_match<_BiIter>& __y)
5150 return !(__x < __y);
5153 template <class _BiIter, class _ST, class _SA>
5154 inline _LIBCPP_INLINE_VISIBILITY
5156 operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5157 const sub_match<_BiIter>& __y)
5159 return !(__y < __x);
5161 #endif // _LIBCPP_STD_VER >= 20
5163 template <class _BiIter, class _ST, class _SA>
5164 inline _LIBCPP_INLINE_VISIBILITY
5166 operator==(const sub_match<_BiIter>& __x,
5167 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5169 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
5172 #if _LIBCPP_STD_VER >= 20
5173 template <class _BiIter, class _ST, class _SA>
5174 _LIBCPP_HIDE_FROM_ABI auto operator<=>(
5175 const sub_match<_BiIter>& __x, const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y) {
5176 return static_cast<__sub_match_cat<_BiIter>>(
5177 __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) <=> 0);
5179 #else // _LIBCPP_STD_VER >= 20
5180 template <class _BiIter, class _ST, class _SA>
5181 inline _LIBCPP_INLINE_VISIBILITY
5183 operator!=(const sub_match<_BiIter>& __x,
5184 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5186 return !(__x == __y);
5189 template <class _BiIter, class _ST, class _SA>
5190 inline _LIBCPP_INLINE_VISIBILITY
5192 operator<(const sub_match<_BiIter>& __x,
5193 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5195 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
5198 template <class _BiIter, class _ST, class _SA>
5199 inline _LIBCPP_INLINE_VISIBILITY
5200 bool operator>(const sub_match<_BiIter>& __x,
5201 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5206 template <class _BiIter, class _ST, class _SA>
5207 inline _LIBCPP_INLINE_VISIBILITY
5209 operator>=(const sub_match<_BiIter>& __x,
5210 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5212 return !(__x < __y);
5215 template <class _BiIter, class _ST, class _SA>
5216 inline _LIBCPP_INLINE_VISIBILITY
5218 operator<=(const sub_match<_BiIter>& __x,
5219 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5221 return !(__y < __x);
5224 template <class _BiIter>
5225 inline _LIBCPP_INLINE_VISIBILITY
5227 operator==(typename iterator_traits<_BiIter>::value_type const* __x,
5228 const sub_match<_BiIter>& __y)
5230 return __y.compare(__x) == 0;
5233 template <class _BiIter>
5234 inline _LIBCPP_INLINE_VISIBILITY
5236 operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
5237 const sub_match<_BiIter>& __y)
5239 return !(__x == __y);
5242 template <class _BiIter>
5243 inline _LIBCPP_INLINE_VISIBILITY
5245 operator<(typename iterator_traits<_BiIter>::value_type const* __x,
5246 const sub_match<_BiIter>& __y)
5248 return __y.compare(__x) > 0;
5251 template <class _BiIter>
5252 inline _LIBCPP_INLINE_VISIBILITY
5254 operator>(typename iterator_traits<_BiIter>::value_type const* __x,
5255 const sub_match<_BiIter>& __y)
5260 template <class _BiIter>
5261 inline _LIBCPP_INLINE_VISIBILITY
5263 operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
5264 const sub_match<_BiIter>& __y)
5266 return !(__x < __y);
5269 template <class _BiIter>
5270 inline _LIBCPP_INLINE_VISIBILITY
5272 operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
5273 const sub_match<_BiIter>& __y)
5275 return !(__y < __x);
5277 #endif // _LIBCPP_STD_VER >= 20
5279 template <class _BiIter>
5280 inline _LIBCPP_INLINE_VISIBILITY
5282 operator==(const sub_match<_BiIter>& __x,
5283 typename iterator_traits<_BiIter>::value_type const* __y)
5285 return __x.compare(__y) == 0;
5288 #if _LIBCPP_STD_VER >= 20
5289 template <class _BiIter>
5290 _LIBCPP_HIDE_FROM_ABI auto
5291 operator<=>(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const* __y) {
5292 return static_cast<__sub_match_cat<_BiIter>>(__x.compare(__y) <=> 0);
5294 #else // _LIBCPP_STD_VER >= 20
5295 template <class _BiIter>
5296 inline _LIBCPP_INLINE_VISIBILITY
5298 operator!=(const sub_match<_BiIter>& __x,
5299 typename iterator_traits<_BiIter>::value_type const* __y)
5301 return !(__x == __y);
5304 template <class _BiIter>
5305 inline _LIBCPP_INLINE_VISIBILITY
5307 operator<(const sub_match<_BiIter>& __x,
5308 typename iterator_traits<_BiIter>::value_type const* __y)
5310 return __x.compare(__y) < 0;
5313 template <class _BiIter>
5314 inline _LIBCPP_INLINE_VISIBILITY
5316 operator>(const sub_match<_BiIter>& __x,
5317 typename iterator_traits<_BiIter>::value_type const* __y)
5322 template <class _BiIter>
5323 inline _LIBCPP_INLINE_VISIBILITY
5325 operator>=(const sub_match<_BiIter>& __x,
5326 typename iterator_traits<_BiIter>::value_type const* __y)
5328 return !(__x < __y);
5331 template <class _BiIter>
5332 inline _LIBCPP_INLINE_VISIBILITY
5334 operator<=(const sub_match<_BiIter>& __x,
5335 typename iterator_traits<_BiIter>::value_type const* __y)
5337 return !(__y < __x);
5340 template <class _BiIter>
5341 inline _LIBCPP_INLINE_VISIBILITY
5343 operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5344 const sub_match<_BiIter>& __y)
5346 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5347 return __y.compare(string_type(1, __x)) == 0;
5350 template <class _BiIter>
5351 inline _LIBCPP_INLINE_VISIBILITY
5353 operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5354 const sub_match<_BiIter>& __y)
5356 return !(__x == __y);
5359 template <class _BiIter>
5360 inline _LIBCPP_INLINE_VISIBILITY
5362 operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5363 const sub_match<_BiIter>& __y)
5365 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5366 return __y.compare(string_type(1, __x)) > 0;
5369 template <class _BiIter>
5370 inline _LIBCPP_INLINE_VISIBILITY
5372 operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5373 const sub_match<_BiIter>& __y)
5378 template <class _BiIter>
5379 inline _LIBCPP_INLINE_VISIBILITY
5381 operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5382 const sub_match<_BiIter>& __y)
5384 return !(__x < __y);
5387 template <class _BiIter>
5388 inline _LIBCPP_INLINE_VISIBILITY
5390 operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5391 const sub_match<_BiIter>& __y)
5393 return !(__y < __x);
5395 #endif // _LIBCPP_STD_VER >= 20
5397 template <class _BiIter>
5398 inline _LIBCPP_INLINE_VISIBILITY
5400 operator==(const sub_match<_BiIter>& __x,
5401 typename iterator_traits<_BiIter>::value_type const& __y)
5403 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5404 return __x.compare(string_type(1, __y)) == 0;
5407 #if _LIBCPP_STD_VER >= 20
5408 template <class _BiIter>
5409 _LIBCPP_HIDE_FROM_ABI auto
5410 operator<=>(const sub_match<_BiIter>& __x, typename iterator_traits<_BiIter>::value_type const& __y) {
5411 using string_type = basic_string<typename iterator_traits<_BiIter>::value_type>;
5412 return static_cast<__sub_match_cat<_BiIter>>(__x.compare(string_type(1, __y)) <=> 0);
5414 #else // _LIBCPP_STD_VER >= 20
5415 template <class _BiIter>
5416 inline _LIBCPP_INLINE_VISIBILITY
5418 operator!=(const sub_match<_BiIter>& __x,
5419 typename iterator_traits<_BiIter>::value_type const& __y)
5421 return !(__x == __y);
5424 template <class _BiIter>
5425 inline _LIBCPP_INLINE_VISIBILITY
5427 operator<(const sub_match<_BiIter>& __x,
5428 typename iterator_traits<_BiIter>::value_type const& __y)
5430 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5431 return __x.compare(string_type(1, __y)) < 0;
5434 template <class _BiIter>
5435 inline _LIBCPP_INLINE_VISIBILITY
5437 operator>(const sub_match<_BiIter>& __x,
5438 typename iterator_traits<_BiIter>::value_type const& __y)
5443 template <class _BiIter>
5444 inline _LIBCPP_INLINE_VISIBILITY
5446 operator>=(const sub_match<_BiIter>& __x,
5447 typename iterator_traits<_BiIter>::value_type const& __y)
5449 return !(__x < __y);
5452 template <class _BiIter>
5453 inline _LIBCPP_INLINE_VISIBILITY
5455 operator<=(const sub_match<_BiIter>& __x,
5456 typename iterator_traits<_BiIter>::value_type const& __y)
5458 return !(__y < __x);
5460 #endif // _LIBCPP_STD_VER >= 20
5462 template <class _CharT, class _ST, class _BiIter>
5463 inline _LIBCPP_INLINE_VISIBILITY
5464 basic_ostream<_CharT, _ST>&
5465 operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5467 return __os << __m.str();
5470 typedef match_results<const char*> cmatch;
5471 typedef match_results<string::const_iterator> smatch;
5472 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
5473 typedef match_results<const wchar_t*> wcmatch;
5474 typedef match_results<wstring::const_iterator> wsmatch;
5477 template <class _BidirectionalIterator, class _Allocator>
5479 _LIBCPP_TEMPLATE_VIS
5480 _LIBCPP_PREFERRED_NAME(cmatch)
5481 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcmatch))
5482 _LIBCPP_PREFERRED_NAME(smatch)
5483 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsmatch))
5487 typedef _Allocator allocator_type;
5488 typedef sub_match<_BidirectionalIterator> value_type;
5490 typedef vector<value_type, allocator_type> __container_type;
5492 __container_type __matches_;
5493 value_type __unmatched_;
5494 value_type __prefix_;
5495 value_type __suffix_;
5498 _BidirectionalIterator __position_start_;
5499 typedef const value_type& const_reference;
5500 typedef value_type& reference;
5501 typedef typename __container_type::const_iterator const_iterator;
5502 typedef const_iterator iterator;
5503 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5504 typedef typename allocator_traits<allocator_type>::size_type size_type;
5505 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5506 typedef basic_string<char_type> string_type;
5508 // construct/copy/destroy:
5509 #ifndef _LIBCPP_CXX03_LANG
5510 match_results() : match_results(allocator_type()) {}
5511 explicit match_results(const allocator_type& __a);
5513 explicit match_results(const allocator_type& __a = allocator_type());
5516 // match_results(const match_results&) = default;
5517 // match_results& operator=(const match_results&) = default;
5518 // match_results(match_results&& __m) = default;
5519 // match_results& operator=(match_results&& __m) = default;
5520 // ~match_results() = default;
5522 _LIBCPP_INLINE_VISIBILITY
5523 bool ready() const {return __ready_;}
5526 _LIBCPP_INLINE_VISIBILITY
5527 size_type size() const _NOEXCEPT {return __matches_.size();}
5528 _LIBCPP_INLINE_VISIBILITY
5529 size_type max_size() const _NOEXCEPT {return __matches_.max_size();}
5530 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
5531 bool empty() const _NOEXCEPT {return size() == 0;}
5534 _LIBCPP_INLINE_VISIBILITY
5535 difference_type length(size_type __sub = 0) const
5537 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::length() called when not ready");
5538 return (*this)[__sub].length();
5540 _LIBCPP_INLINE_VISIBILITY
5541 difference_type position(size_type __sub = 0) const
5543 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::position() called when not ready");
5544 return _VSTD::distance(__position_start_, (*this)[__sub].first);
5546 _LIBCPP_INLINE_VISIBILITY
5547 string_type str(size_type __sub = 0) const
5549 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::str() called when not ready");
5550 return (*this)[__sub].str();
5552 _LIBCPP_INLINE_VISIBILITY
5553 const_reference operator[](size_type __n) const
5555 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::operator[]() called when not ready");
5556 return __n < __matches_.size() ? __matches_[__n] : __unmatched_;
5559 _LIBCPP_INLINE_VISIBILITY
5560 const_reference prefix() const
5562 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::prefix() called when not ready");
5565 _LIBCPP_INLINE_VISIBILITY
5566 const_reference suffix() const
5568 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::suffix() called when not ready");
5572 _LIBCPP_INLINE_VISIBILITY
5573 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
5574 _LIBCPP_INLINE_VISIBILITY
5575 const_iterator end() const {return __matches_.end();}
5576 _LIBCPP_INLINE_VISIBILITY
5577 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
5578 _LIBCPP_INLINE_VISIBILITY
5579 const_iterator cend() const {return __matches_.end();}
5582 template <class _OutputIter>
5584 format(_OutputIter __output_iter, const char_type* __fmt_first,
5585 const char_type* __fmt_last,
5586 regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5587 template <class _OutputIter, class _ST, class _SA>
5588 _LIBCPP_INLINE_VISIBILITY
5590 format(_OutputIter __output_iter, const basic_string<char_type, _ST, _SA>& __fmt,
5591 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5592 {return format(__output_iter, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
5593 template <class _ST, class _SA>
5594 _LIBCPP_INLINE_VISIBILITY
5595 basic_string<char_type, _ST, _SA>
5596 format(const basic_string<char_type, _ST, _SA>& __fmt,
5597 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5599 basic_string<char_type, _ST, _SA> __r;
5600 format(std::back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5604 _LIBCPP_INLINE_VISIBILITY
5606 format(const char_type* __fmt,
5607 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5610 format(std::back_inserter(__r), __fmt,
5611 __fmt + char_traits<char_type>::length(__fmt), __flags);
5616 _LIBCPP_INLINE_VISIBILITY
5617 allocator_type get_allocator() const {return __matches_.get_allocator();}
5620 void swap(match_results& __m);
5622 template <class _Bp, class _Ap>
5623 _LIBCPP_INLINE_VISIBILITY
5624 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
5625 const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
5627 _Bp __mf = __m.prefix().first;
5628 __matches_.resize(__m.size());
5629 for (size_type __i = 0; __i < __matches_.size(); ++__i)
5631 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5632 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
5633 __matches_[__i].matched = __m[__i].matched;
5635 __unmatched_.first = __l;
5636 __unmatched_.second = __l;
5637 __unmatched_.matched = false;
5638 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5639 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
5640 __prefix_.matched = __m.prefix().matched;
5641 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5642 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
5643 __suffix_.matched = __m.suffix().matched;
5644 if (!__no_update_pos)
5645 __position_start_ = __prefix_.first;
5646 __ready_ = __m.ready();
5650 void __init(unsigned __s,
5651 _BidirectionalIterator __f, _BidirectionalIterator __l,
5652 bool __no_update_pos = false);
5654 template <class, class> friend class basic_regex;
5656 template <class _Bp, class _Ap, class _Cp, class _Tp>
5659 regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
5660 regex_constants::match_flag_type);
5662 template <class _Bp, class _Ap>
5665 operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
5667 template <class, class> friend class __lookahead;
5670 template <class _BidirectionalIterator, class _Allocator>
5671 match_results<_BidirectionalIterator, _Allocator>::match_results(
5672 const allocator_type& __a)
5682 template <class _BidirectionalIterator, class _Allocator>
5684 match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
5685 _BidirectionalIterator __f, _BidirectionalIterator __l,
5686 bool __no_update_pos)
5688 __unmatched_.first = __l;
5689 __unmatched_.second = __l;
5690 __unmatched_.matched = false;
5691 __matches_.assign(__s, __unmatched_);
5692 __prefix_.first = __f;
5693 __prefix_.second = __f;
5694 __prefix_.matched = false;
5695 __suffix_ = __unmatched_;
5696 if (!__no_update_pos)
5697 __position_start_ = __prefix_.first;
5701 template <class _BidirectionalIterator, class _Allocator>
5702 template <class _OutputIter>
5704 match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __output_iter,
5705 const char_type* __fmt_first, const char_type* __fmt_last,
5706 regex_constants::match_flag_type __flags) const
5708 _LIBCPP_ASSERT_UNCATEGORIZED(ready(), "match_results::format() called when not ready");
5709 if (__flags & regex_constants::format_sed)
5711 for (; __fmt_first != __fmt_last; ++__fmt_first)
5713 if (*__fmt_first == '&')
5714 __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5716 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5719 if ('0' <= *__fmt_first && *__fmt_first <= '9')
5721 size_t __i = *__fmt_first - '0';
5722 __output_iter = _VSTD::copy((*this)[__i].first,
5723 (*this)[__i].second, __output_iter);
5727 *__output_iter = *__fmt_first;
5733 *__output_iter = *__fmt_first;
5740 for (; __fmt_first != __fmt_last; ++__fmt_first)
5742 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5744 switch (__fmt_first[1])
5747 *__output_iter = *++__fmt_first;
5752 __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5757 __output_iter = _VSTD::copy(__prefix_.first, __prefix_.second, __output_iter);
5761 __output_iter = _VSTD::copy(__suffix_.first, __suffix_.second, __output_iter);
5764 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5767 size_t __idx = *__fmt_first - '0';
5768 if (__fmt_first + 1 != __fmt_last &&
5769 '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5772 if (__idx >= numeric_limits<size_t>::max() / 10)
5773 __throw_regex_error<regex_constants::error_escape>();
5774 __idx = 10 * __idx + *__fmt_first - '0';
5776 __output_iter = _VSTD::copy((*this)[__idx].first,
5777 (*this)[__idx].second, __output_iter);
5781 *__output_iter = *__fmt_first;
5789 *__output_iter = *__fmt_first;
5794 return __output_iter;
5797 template <class _BidirectionalIterator, class _Allocator>
5799 match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5802 swap(__matches_, __m.__matches_);
5803 swap(__unmatched_, __m.__unmatched_);
5804 swap(__prefix_, __m.__prefix_);
5805 swap(__suffix_, __m.__suffix_);
5806 swap(__position_start_, __m.__position_start_);
5807 swap(__ready_, __m.__ready_);
5810 template <class _BidirectionalIterator, class _Allocator>
5811 _LIBCPP_HIDE_FROM_ABI bool
5812 operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5813 const match_results<_BidirectionalIterator, _Allocator>& __y)
5815 if (__x.__ready_ != __y.__ready_)
5819 return __x.__matches_ == __y.__matches_ &&
5820 __x.__prefix_ == __y.__prefix_ &&
5821 __x.__suffix_ == __y.__suffix_;
5824 #if _LIBCPP_STD_VER < 20
5825 template <class _BidirectionalIterator, class _Allocator>
5826 inline _LIBCPP_INLINE_VISIBILITY
5828 operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5829 const match_results<_BidirectionalIterator, _Allocator>& __y)
5831 return !(__x == __y);
5835 template <class _BidirectionalIterator, class _Allocator>
5836 inline _LIBCPP_INLINE_VISIBILITY
5838 swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5839 match_results<_BidirectionalIterator, _Allocator>& __y)
5846 template <class _CharT, class _Traits>
5847 template <class _Allocator>
5849 basic_regex<_CharT, _Traits>::__match_at_start_ecma(
5850 const _CharT* __first, const _CharT* __last,
5851 match_results<const _CharT*, _Allocator>& __m,
5852 regex_constants::match_flag_type __flags, bool __at_first) const
5854 vector<__state> __states;
5855 __node* __st = __start_.get();
5858 sub_match<const _CharT*> __unmatched;
5859 __unmatched.first = __last;
5860 __unmatched.second = __last;
5861 __unmatched.matched = false;
5863 __states.push_back(__state());
5864 __states.back().__do_ = 0;
5865 __states.back().__first_ = __first;
5866 __states.back().__current_ = __first;
5867 __states.back().__last_ = __last;
5868 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
5869 __states.back().__loop_data_.resize(__loop_count());
5870 __states.back().__node_ = __st;
5871 __states.back().__flags_ = __flags;
5872 __states.back().__at_first_ = __at_first;
5874 int __length = __last - __first;
5878 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5879 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5880 __throw_regex_error<regex_constants::error_complexity>();
5881 __state& __s = __states.back();
5883 __s.__node_->__exec(__s);
5886 case __state::__end_state:
5887 if ((__flags & regex_constants::match_not_null) &&
5888 __s.__current_ == __first)
5890 __states.pop_back();
5893 if ((__flags & regex_constants::__full_match) &&
5894 __s.__current_ != __last)
5896 __states.pop_back();
5899 __m.__matches_[0].first = __first;
5900 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
5901 __m.__matches_[0].matched = true;
5902 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5903 __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5905 case __state::__accept_and_consume:
5906 case __state::__repeat:
5907 case __state::__accept_but_not_consume:
5909 case __state::__split:
5911 __state __snext = __s;
5912 __s.__node_->__exec_split(true, __s);
5913 __snext.__node_->__exec_split(false, __snext);
5914 __states.push_back(_VSTD::move(__snext));
5917 case __state::__reject:
5918 __states.pop_back();
5921 __throw_regex_error<regex_constants::__re_err_unknown>();
5925 } while (!__states.empty());
5930 template <class _CharT, class _Traits>
5931 template <class _Allocator>
5933 basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5934 const _CharT* __first, const _CharT* __last,
5935 match_results<const _CharT*, _Allocator>& __m,
5936 regex_constants::match_flag_type __flags, bool __at_first) const
5938 deque<__state> __states;
5939 ptrdiff_t __highest_j = 0;
5940 ptrdiff_t __np = _VSTD::distance(__first, __last);
5941 __node* __st = __start_.get();
5944 __states.push_back(__state());
5945 __states.back().__do_ = 0;
5946 __states.back().__first_ = __first;
5947 __states.back().__current_ = __first;
5948 __states.back().__last_ = __last;
5949 __states.back().__loop_data_.resize(__loop_count());
5950 __states.back().__node_ = __st;
5951 __states.back().__flags_ = __flags;
5952 __states.back().__at_first_ = __at_first;
5953 bool __matched = false;
5955 int __length = __last - __first;
5959 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5960 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5961 __throw_regex_error<regex_constants::error_complexity>();
5962 __state& __s = __states.back();
5964 __s.__node_->__exec(__s);
5967 case __state::__end_state:
5968 if ((__flags & regex_constants::match_not_null) &&
5969 __s.__current_ == __first)
5971 __states.pop_back();
5974 if ((__flags & regex_constants::__full_match) &&
5975 __s.__current_ != __last)
5977 __states.pop_back();
5980 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
5981 __highest_j = __s.__current_ - __s.__first_;
5983 if (__highest_j == __np)
5986 __states.pop_back();
5988 case __state::__consume_input:
5990 case __state::__accept_and_consume:
5991 __states.push_front(_VSTD::move(__s));
5992 __states.pop_back();
5994 case __state::__repeat:
5995 case __state::__accept_but_not_consume:
5997 case __state::__split:
5999 __state __snext = __s;
6000 __s.__node_->__exec_split(true, __s);
6001 __snext.__node_->__exec_split(false, __snext);
6002 __states.push_back(_VSTD::move(__snext));
6005 case __state::__reject:
6006 __states.pop_back();
6009 __throw_regex_error<regex_constants::__re_err_unknown>();
6012 } while (!__states.empty());
6015 __m.__matches_[0].first = __first;
6016 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
6017 __m.__matches_[0].matched = true;
6024 template <class _CharT, class _Traits>
6025 template <class _Allocator>
6027 basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
6028 const _CharT* __first, const _CharT* __last,
6029 match_results<const _CharT*, _Allocator>& __m,
6030 regex_constants::match_flag_type __flags, bool __at_first) const
6032 vector<__state> __states;
6033 __state __best_state;
6034 ptrdiff_t __highest_j = 0;
6035 ptrdiff_t __np = _VSTD::distance(__first, __last);
6036 __node* __st = __start_.get();
6039 sub_match<const _CharT*> __unmatched;
6040 __unmatched.first = __last;
6041 __unmatched.second = __last;
6042 __unmatched.matched = false;
6044 __states.push_back(__state());
6045 __states.back().__do_ = 0;
6046 __states.back().__first_ = __first;
6047 __states.back().__current_ = __first;
6048 __states.back().__last_ = __last;
6049 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
6050 __states.back().__loop_data_.resize(__loop_count());
6051 __states.back().__node_ = __st;
6052 __states.back().__flags_ = __flags;
6053 __states.back().__at_first_ = __at_first;
6054 bool __matched = false;
6056 int __length = __last - __first;
6060 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
6061 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
6062 __throw_regex_error<regex_constants::error_complexity>();
6063 __state& __s = __states.back();
6065 __s.__node_->__exec(__s);
6068 case __state::__end_state:
6069 if ((__flags & regex_constants::match_not_null) &&
6070 __s.__current_ == __first)
6072 __states.pop_back();
6075 if ((__flags & regex_constants::__full_match) &&
6076 __s.__current_ != __last)
6078 __states.pop_back();
6081 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
6083 __highest_j = __s.__current_ - __s.__first_;
6087 if (__highest_j == __np)
6090 __states.pop_back();
6092 case __state::__accept_and_consume:
6093 case __state::__repeat:
6094 case __state::__accept_but_not_consume:
6096 case __state::__split:
6098 __state __snext = __s;
6099 __s.__node_->__exec_split(true, __s);
6100 __snext.__node_->__exec_split(false, __snext);
6101 __states.push_back(_VSTD::move(__snext));
6104 case __state::__reject:
6105 __states.pop_back();
6108 __throw_regex_error<regex_constants::__re_err_unknown>();
6111 } while (!__states.empty());
6114 __m.__matches_[0].first = __first;
6115 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
6116 __m.__matches_[0].matched = true;
6117 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
6118 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
6125 template <class _CharT, class _Traits>
6126 template <class _Allocator>
6128 basic_regex<_CharT, _Traits>::__match_at_start(
6129 const _CharT* __first, const _CharT* __last,
6130 match_results<const _CharT*, _Allocator>& __m,
6131 regex_constants::match_flag_type __flags, bool __at_first) const
6133 if (__get_grammar(__flags_) == ECMAScript)
6134 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
6135 if (mark_count() == 0)
6136 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
6137 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
6140 template <class _CharT, class _Traits>
6141 template <class _Allocator>
6143 basic_regex<_CharT, _Traits>::__search(
6144 const _CharT* __first, const _CharT* __last,
6145 match_results<const _CharT*, _Allocator>& __m,
6146 regex_constants::match_flag_type __flags) const
6148 if (__flags & regex_constants::match_prev_avail)
6149 __flags &= ~(regex_constants::match_not_bol | regex_constants::match_not_bow);
6151 __m.__init(1 + mark_count(), __first, __last,
6152 __flags & regex_constants::__no_update_pos);
6153 if (__match_at_start(__first, __last, __m, __flags,
6154 !(__flags & regex_constants::__no_update_pos)))
6156 __m.__prefix_.second = __m[0].first;
6157 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
6158 __m.__suffix_.first = __m[0].second;
6159 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
6162 if (__first != __last && !(__flags & regex_constants::match_continuous))
6164 __flags |= regex_constants::match_prev_avail;
6165 for (++__first; __first != __last; ++__first)
6167 __m.__matches_.assign(__m.size(), __m.__unmatched_);
6168 if (__match_at_start(__first, __last, __m, __flags, false))
6170 __m.__prefix_.second = __m[0].first;
6171 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
6172 __m.__suffix_.first = __m[0].second;
6173 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
6176 __m.__matches_.assign(__m.size(), __m.__unmatched_);
6179 __m.__matches_.clear();
6183 template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
6184 inline _LIBCPP_INLINE_VISIBILITY
6186 regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
6187 match_results<_BidirectionalIterator, _Allocator>& __m,
6188 const basic_regex<_CharT, _Traits>& __e,
6189 regex_constants::match_flag_type __flags = regex_constants::match_default)
6191 int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
6192 basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
6193 match_results<const _CharT*> __mc;
6194 bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
6195 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
6199 template <class _Iter, class _Allocator, class _CharT, class _Traits>
6200 inline _LIBCPP_INLINE_VISIBILITY
6202 regex_search(__wrap_iter<_Iter> __first,
6203 __wrap_iter<_Iter> __last,
6204 match_results<__wrap_iter<_Iter>, _Allocator>& __m,
6205 const basic_regex<_CharT, _Traits>& __e,
6206 regex_constants::match_flag_type __flags = regex_constants::match_default)
6208 match_results<const _CharT*> __mc;
6209 bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
6210 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
6214 template <class _Allocator, class _CharT, class _Traits>
6215 inline _LIBCPP_INLINE_VISIBILITY
6217 regex_search(const _CharT* __first, const _CharT* __last,
6218 match_results<const _CharT*, _Allocator>& __m,
6219 const basic_regex<_CharT, _Traits>& __e,
6220 regex_constants::match_flag_type __flags = regex_constants::match_default)
6222 return __e.__search(__first, __last, __m, __flags);
6225 template <class _BidirectionalIterator, class _CharT, class _Traits>
6226 inline _LIBCPP_INLINE_VISIBILITY
6228 regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
6229 const basic_regex<_CharT, _Traits>& __e,
6230 regex_constants::match_flag_type __flags = regex_constants::match_default)
6232 basic_string<_CharT> __s(__first, __last);
6233 match_results<const _CharT*> __mc;
6234 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
6237 template <class _CharT, class _Traits>
6238 inline _LIBCPP_INLINE_VISIBILITY
6240 regex_search(const _CharT* __first, const _CharT* __last,
6241 const basic_regex<_CharT, _Traits>& __e,
6242 regex_constants::match_flag_type __flags = regex_constants::match_default)
6244 match_results<const _CharT*> __mc;
6245 return __e.__search(__first, __last, __mc, __flags);
6248 template <class _CharT, class _Allocator, class _Traits>
6249 inline _LIBCPP_INLINE_VISIBILITY
6251 regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6252 const basic_regex<_CharT, _Traits>& __e,
6253 regex_constants::match_flag_type __flags = regex_constants::match_default)
6255 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
6258 template <class _CharT, class _Traits>
6259 inline _LIBCPP_INLINE_VISIBILITY
6261 regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6262 regex_constants::match_flag_type __flags = regex_constants::match_default)
6264 match_results<const _CharT*> __m;
6265 return _VSTD::regex_search(__str, __m, __e, __flags);
6268 template <class _ST, class _SA, class _CharT, class _Traits>
6269 inline _LIBCPP_INLINE_VISIBILITY
6271 regex_search(const basic_string<_CharT, _ST, _SA>& __s,
6272 const basic_regex<_CharT, _Traits>& __e,
6273 regex_constants::match_flag_type __flags = regex_constants::match_default)
6275 match_results<const _CharT*> __mc;
6276 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
6279 template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6280 inline _LIBCPP_INLINE_VISIBILITY
6282 regex_search(const basic_string<_CharT, _ST, _SA>& __s,
6283 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6284 const basic_regex<_CharT, _Traits>& __e,
6285 regex_constants::match_flag_type __flags = regex_constants::match_default)
6287 match_results<const _CharT*> __mc;
6288 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
6289 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
6293 #if _LIBCPP_STD_VER >= 14
6294 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
6296 regex_search(const basic_string<_Cp, _ST, _SA>&& __s,
6297 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
6298 const basic_regex<_Cp, _Tp>& __e,
6299 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6304 template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
6305 _LIBCPP_HIDE_FROM_ABI bool
6306 regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6307 match_results<_BidirectionalIterator, _Allocator>& __m,
6308 const basic_regex<_CharT, _Traits>& __e,
6309 regex_constants::match_flag_type __flags = regex_constants::match_default)
6311 bool __r = _VSTD::regex_search(
6312 __first, __last, __m, __e,
6313 __flags | regex_constants::match_continuous |
6314 regex_constants::__full_match);
6317 __r = !__m.suffix().matched;
6319 __m.__matches_.clear();
6324 template <class _BidirectionalIterator, class _CharT, class _Traits>
6325 inline _LIBCPP_INLINE_VISIBILITY
6327 regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6328 const basic_regex<_CharT, _Traits>& __e,
6329 regex_constants::match_flag_type __flags = regex_constants::match_default)
6331 match_results<_BidirectionalIterator> __m;
6332 return _VSTD::regex_match(__first, __last, __m, __e, __flags);
6335 template <class _CharT, class _Allocator, class _Traits>
6336 inline _LIBCPP_INLINE_VISIBILITY
6338 regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6339 const basic_regex<_CharT, _Traits>& __e,
6340 regex_constants::match_flag_type __flags = regex_constants::match_default)
6342 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
6345 template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6346 inline _LIBCPP_INLINE_VISIBILITY
6348 regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6349 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6350 const basic_regex<_CharT, _Traits>& __e,
6351 regex_constants::match_flag_type __flags = regex_constants::match_default)
6353 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
6356 #if _LIBCPP_STD_VER >= 14
6357 template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6358 inline _LIBCPP_INLINE_VISIBILITY
6360 regex_match(const basic_string<_CharT, _ST, _SA>&& __s,
6361 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6362 const basic_regex<_CharT, _Traits>& __e,
6363 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6366 template <class _CharT, class _Traits>
6367 inline _LIBCPP_INLINE_VISIBILITY
6369 regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6370 regex_constants::match_flag_type __flags = regex_constants::match_default)
6372 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
6375 template <class _ST, class _SA, class _CharT, class _Traits>
6376 inline _LIBCPP_INLINE_VISIBILITY
6378 regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6379 const basic_regex<_CharT, _Traits>& __e,
6380 regex_constants::match_flag_type __flags = regex_constants::match_default)
6382 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
6387 template <class _BidirectionalIterator,
6388 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6389 class _Traits = regex_traits<_CharT> >
6390 class _LIBCPP_TEMPLATE_VIS regex_iterator;
6392 typedef regex_iterator<const char*> cregex_iterator;
6393 typedef regex_iterator<string::const_iterator> sregex_iterator;
6394 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
6395 typedef regex_iterator<const wchar_t*> wcregex_iterator;
6396 typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
6399 template <class _BidirectionalIterator, class _CharT, class _Traits>
6401 _LIBCPP_TEMPLATE_VIS
6402 _LIBCPP_PREFERRED_NAME(cregex_iterator)
6403 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_iterator))
6404 _LIBCPP_PREFERRED_NAME(sregex_iterator)
6405 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_iterator))
6409 typedef basic_regex<_CharT, _Traits> regex_type;
6410 typedef match_results<_BidirectionalIterator> value_type;
6411 typedef ptrdiff_t difference_type;
6412 typedef const value_type* pointer;
6413 typedef const value_type& reference;
6414 typedef forward_iterator_tag iterator_category;
6417 _BidirectionalIterator __begin_;
6418 _BidirectionalIterator __end_;
6419 const regex_type* __pregex_;
6420 regex_constants::match_flag_type __flags_;
6421 value_type __match_;
6425 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6426 const regex_type& __re,
6427 regex_constants::match_flag_type __m
6428 = regex_constants::match_default);
6429 #if _LIBCPP_STD_VER >= 14
6430 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6431 const regex_type&& __re,
6432 regex_constants::match_flag_type __m
6433 = regex_constants::match_default) = delete;
6436 _LIBCPP_HIDE_FROM_ABI bool operator==(const regex_iterator& __x) const;
6437 #if _LIBCPP_STD_VER >= 20
6438 _LIBCPP_HIDE_FROM_ABI bool operator==(default_sentinel_t) const { return *this == regex_iterator(); }
6440 #if _LIBCPP_STD_VER < 20
6441 _LIBCPP_INLINE_VISIBILITY
6442 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
6445 _LIBCPP_INLINE_VISIBILITY
6446 reference operator*() const {return __match_;}
6447 _LIBCPP_INLINE_VISIBILITY
6448 pointer operator->() const {return _VSTD::addressof(__match_);}
6450 regex_iterator& operator++();
6451 _LIBCPP_INLINE_VISIBILITY
6452 regex_iterator operator++(int)
6454 regex_iterator __t(*this);
6460 template <class _BidirectionalIterator, class _CharT, class _Traits>
6461 regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
6462 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
6466 template <class _BidirectionalIterator, class _CharT, class _Traits>
6467 regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6468 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6469 const regex_type& __re, regex_constants::match_flag_type __m)
6472 __pregex_(_VSTD::addressof(__re)),
6475 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
6478 template <class _BidirectionalIterator, class _CharT, class _Traits>
6480 regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6481 operator==(const regex_iterator& __x) const
6483 if (__match_.empty() && __x.__match_.empty())
6485 if (__match_.empty() || __x.__match_.empty())
6487 return __begin_ == __x.__begin_ &&
6488 __end_ == __x.__end_ &&
6489 __pregex_ == __x.__pregex_ &&
6490 __flags_ == __x.__flags_ &&
6491 __match_[0] == __x.__match_[0];
6494 template <class _BidirectionalIterator, class _CharT, class _Traits>
6495 regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6496 regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6498 __flags_ |= regex_constants::__no_update_pos;
6499 _BidirectionalIterator __start = __match_[0].second;
6500 if (__match_[0].first == __match_[0].second)
6502 if (__start == __end_)
6504 __match_ = value_type();
6507 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
6508 __flags_ | regex_constants::match_not_null |
6509 regex_constants::match_continuous))
6514 __flags_ |= regex_constants::match_prev_avail;
6515 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
6516 __match_ = value_type();
6520 // regex_token_iterator
6522 template <class _BidirectionalIterator,
6523 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6524 class _Traits = regex_traits<_CharT> >
6525 class _LIBCPP_TEMPLATE_VIS regex_token_iterator;
6527 typedef regex_token_iterator<const char*> cregex_token_iterator;
6528 typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
6529 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
6530 typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
6531 typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
6534 template <class _BidirectionalIterator, class _CharT, class _Traits>
6536 _LIBCPP_TEMPLATE_VIS
6537 _LIBCPP_PREFERRED_NAME(cregex_token_iterator)
6538 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_token_iterator))
6539 _LIBCPP_PREFERRED_NAME(sregex_token_iterator)
6540 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_token_iterator))
6541 regex_token_iterator
6544 typedef basic_regex<_CharT, _Traits> regex_type;
6545 typedef sub_match<_BidirectionalIterator> value_type;
6546 typedef ptrdiff_t difference_type;
6547 typedef const value_type* pointer;
6548 typedef const value_type& reference;
6549 typedef forward_iterator_tag iterator_category;
6552 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6554 _Position __position_;
6555 const value_type* __result_;
6556 value_type __suffix_;
6558 vector<int> __subs_;
6561 regex_token_iterator();
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);
6566 #if _LIBCPP_STD_VER >= 14
6567 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6568 const regex_type&& __re, int __submatch = 0,
6569 regex_constants::match_flag_type __m =
6570 regex_constants::match_default) = delete;
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);
6577 #if _LIBCPP_STD_VER >= 14
6578 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6579 const regex_type&& __re, const vector<int>& __submatches,
6580 regex_constants::match_flag_type __m =
6581 regex_constants::match_default) = delete;
6584 #ifndef _LIBCPP_CXX03_LANG
6585 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6586 const regex_type& __re,
6587 initializer_list<int> __submatches,
6588 regex_constants::match_flag_type __m =
6589 regex_constants::match_default);
6591 #if _LIBCPP_STD_VER >= 14
6592 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6593 const regex_type&& __re,
6594 initializer_list<int> __submatches,
6595 regex_constants::match_flag_type __m =
6596 regex_constants::match_default) = delete;
6598 #endif // _LIBCPP_CXX03_LANG
6599 template <size_t _Np>
6600 regex_token_iterator(_BidirectionalIterator __a,
6601 _BidirectionalIterator __b,
6602 const regex_type& __re,
6603 const int (&__submatches)[_Np],
6604 regex_constants::match_flag_type __m =
6605 regex_constants::match_default);
6606 #if _LIBCPP_STD_VER >= 14
6607 template <size_t _Np>
6608 regex_token_iterator(_BidirectionalIterator __a,
6609 _BidirectionalIterator __b,
6610 const regex_type&& __re,
6611 const int (&__submatches)[_Np],
6612 regex_constants::match_flag_type __m =
6613 regex_constants::match_default) = delete;
6616 regex_token_iterator(const regex_token_iterator&);
6617 regex_token_iterator& operator=(const regex_token_iterator&);
6619 _LIBCPP_HIDE_FROM_ABI bool operator==(const regex_token_iterator& __x) const;
6620 #if _LIBCPP_STD_VER >= 20
6621 _LIBCPP_HIDE_FROM_ABI _LIBCPP_HIDE_FROM_ABI bool operator==(default_sentinel_t) const {
6622 return *this == regex_token_iterator();
6625 #if _LIBCPP_STD_VER < 20
6626 _LIBCPP_INLINE_VISIBILITY
6627 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
6630 _LIBCPP_INLINE_VISIBILITY
6631 const value_type& operator*() const {return *__result_;}
6632 _LIBCPP_INLINE_VISIBILITY
6633 const value_type* operator->() const {return __result_;}
6635 regex_token_iterator& operator++();
6636 _LIBCPP_INLINE_VISIBILITY
6637 regex_token_iterator operator++(int)
6639 regex_token_iterator __t(*this);
6645 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
6646 void __establish_result () {
6647 if (__subs_[__n_] == -1)
6648 __result_ = &__position_->prefix();
6650 __result_ = &(*__position_)[__subs_[__n_]];
6654 template <class _BidirectionalIterator, class _CharT, class _Traits>
6655 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6656 regex_token_iterator()
6657 : __result_(nullptr),
6663 template <class _BidirectionalIterator, class _CharT, class _Traits>
6665 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6666 __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6668 if (__position_ != _Position())
6669 __establish_result ();
6670 else if (__subs_[__n_] == -1)
6672 __suffix_.matched = true;
6673 __suffix_.first = __a;
6674 __suffix_.second = __b;
6675 __result_ = &__suffix_;
6678 __result_ = nullptr;
6681 template <class _BidirectionalIterator, class _CharT, class _Traits>
6682 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6683 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6684 const regex_type& __re, int __submatch,
6685 regex_constants::match_flag_type __m)
6686 : __position_(__a, __b, __re, __m),
6688 __subs_(1, __submatch)
6693 template <class _BidirectionalIterator, class _CharT, class _Traits>
6694 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6695 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6696 const regex_type& __re, const vector<int>& __submatches,
6697 regex_constants::match_flag_type __m)
6698 : __position_(__a, __b, __re, __m),
6700 __subs_(__submatches)
6705 #ifndef _LIBCPP_CXX03_LANG
6707 template <class _BidirectionalIterator, class _CharT, class _Traits>
6708 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6709 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6710 const regex_type& __re,
6711 initializer_list<int> __submatches,
6712 regex_constants::match_flag_type __m)
6713 : __position_(__a, __b, __re, __m),
6715 __subs_(__submatches)
6720 #endif // _LIBCPP_CXX03_LANG
6722 template <class _BidirectionalIterator, class _CharT, class _Traits>
6723 template <size_t _Np>
6724 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6725 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6726 const regex_type& __re,
6727 const int (&__submatches)[_Np],
6728 regex_constants::match_flag_type __m)
6729 : __position_(__a, __b, __re, __m),
6731 __subs_(begin(__submatches), end(__submatches))
6736 template <class _BidirectionalIterator, class _CharT, class _Traits>
6737 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6738 regex_token_iterator(const regex_token_iterator& __x)
6739 : __position_(__x.__position_),
6740 __result_(__x.__result_),
6741 __suffix_(__x.__suffix_),
6743 __subs_(__x.__subs_)
6745 if (__x.__result_ == &__x.__suffix_)
6746 __result_ = &__suffix_;
6747 else if ( __result_ != nullptr )
6748 __establish_result ();
6751 template <class _BidirectionalIterator, class _CharT, class _Traits>
6752 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6753 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6754 operator=(const regex_token_iterator& __x)
6758 __position_ = __x.__position_;
6759 if (__x.__result_ == &__x.__suffix_)
6760 __result_ = &__suffix_;
6762 __result_ = __x.__result_;
6763 __suffix_ = __x.__suffix_;
6765 __subs_ = __x.__subs_;
6767 if ( __result_ != nullptr && __result_ != &__suffix_ )
6768 __establish_result();
6773 template <class _BidirectionalIterator, class _CharT, class _Traits>
6775 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6776 operator==(const regex_token_iterator& __x) const
6778 if (__result_ == nullptr && __x.__result_ == nullptr)
6780 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6781 __suffix_ == __x.__suffix_)
6783 if (__result_ == nullptr || __x.__result_ == nullptr)
6785 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6787 return __position_ == __x.__position_ && __n_ == __x.__n_ &&
6788 __subs_ == __x.__subs_;
6791 template <class _BidirectionalIterator, class _CharT, class _Traits>
6792 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6793 regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6795 _Position __prev = __position_;
6796 if (__result_ == &__suffix_)
6797 __result_ = nullptr;
6798 else if (static_cast<size_t>(__n_ + 1) < __subs_.size())
6801 __establish_result();
6807 if (__position_ != _Position())
6808 __establish_result();
6811 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
6812 && __prev->suffix().length() != 0)
6814 __suffix_.matched = true;
6815 __suffix_.first = __prev->suffix().first;
6816 __suffix_.second = __prev->suffix().second;
6817 __result_ = &__suffix_;
6820 __result_ = nullptr;
6828 template <class _OutputIterator, class _BidirectionalIterator,
6829 class _Traits, class _CharT>
6830 _LIBCPP_HIDE_FROM_ABI _OutputIterator
6831 regex_replace(_OutputIterator __output_iter,
6832 _BidirectionalIterator __first, _BidirectionalIterator __last,
6833 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6834 regex_constants::match_flag_type __flags = regex_constants::match_default)
6836 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6837 _Iter __i(__first, __last, __e, __flags);
6841 if (!(__flags & regex_constants::format_no_copy))
6842 __output_iter = _VSTD::copy(__first, __last, __output_iter);
6846 sub_match<_BidirectionalIterator> __lm;
6847 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6849 if (!(__flags & regex_constants::format_no_copy))
6850 __output_iter = _VSTD::copy(__i->prefix().first, __i->prefix().second, __output_iter);
6851 __output_iter = __i->format(__output_iter, __fmt, __fmt + __len, __flags);
6852 __lm = __i->suffix();
6853 if (__flags & regex_constants::format_first_only)
6856 if (!(__flags & regex_constants::format_no_copy))
6857 __output_iter = _VSTD::copy(__lm.first, __lm.second, __output_iter);
6859 return __output_iter;
6862 template <class _OutputIterator, class _BidirectionalIterator,
6863 class _Traits, class _CharT, class _ST, class _SA>
6864 inline _LIBCPP_INLINE_VISIBILITY
6866 regex_replace(_OutputIterator __output_iter,
6867 _BidirectionalIterator __first, _BidirectionalIterator __last,
6868 const basic_regex<_CharT, _Traits>& __e,
6869 const basic_string<_CharT, _ST, _SA>& __fmt,
6870 regex_constants::match_flag_type __flags = regex_constants::match_default)
6872 return _VSTD::regex_replace(__output_iter, __first, __last, __e, __fmt.c_str(), __flags);
6875 template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6877 inline _LIBCPP_INLINE_VISIBILITY
6878 basic_string<_CharT, _ST, _SA>
6879 regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6880 const basic_regex<_CharT, _Traits>& __e,
6881 const basic_string<_CharT, _FST, _FSA>& __fmt,
6882 regex_constants::match_flag_type __flags = regex_constants::match_default)
6884 basic_string<_CharT, _ST, _SA> __r;
6885 _VSTD::regex_replace(std::back_inserter(__r), __s.begin(), __s.end(), __e,
6886 __fmt.c_str(), __flags);
6890 template <class _Traits, class _CharT, class _ST, class _SA>
6891 inline _LIBCPP_INLINE_VISIBILITY
6892 basic_string<_CharT, _ST, _SA>
6893 regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6894 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6895 regex_constants::match_flag_type __flags = regex_constants::match_default)
6897 basic_string<_CharT, _ST, _SA> __r;
6898 _VSTD::regex_replace(std::back_inserter(__r), __s.begin(), __s.end(), __e,
6903 template <class _Traits, class _CharT, class _ST, class _SA>
6904 inline _LIBCPP_INLINE_VISIBILITY
6905 basic_string<_CharT>
6906 regex_replace(const _CharT* __s,
6907 const basic_regex<_CharT, _Traits>& __e,
6908 const basic_string<_CharT, _ST, _SA>& __fmt,
6909 regex_constants::match_flag_type __flags = regex_constants::match_default)
6911 basic_string<_CharT> __r;
6912 _VSTD::regex_replace(std::back_inserter(__r), __s,
6913 __s + char_traits<_CharT>::length(__s), __e,
6914 __fmt.c_str(), __flags);
6918 template <class _Traits, class _CharT>
6919 inline _LIBCPP_INLINE_VISIBILITY
6920 basic_string<_CharT>
6921 regex_replace(const _CharT* __s,
6922 const basic_regex<_CharT, _Traits>& __e,
6923 const _CharT* __fmt,
6924 regex_constants::match_flag_type __flags = regex_constants::match_default)
6926 basic_string<_CharT> __r;
6927 _VSTD::regex_replace(std::back_inserter(__r), __s,
6928 __s + char_traits<_CharT>::length(__s), __e,
6933 _LIBCPP_END_NAMESPACE_STD
6935 #if _LIBCPP_STD_VER >= 17
6936 _LIBCPP_BEGIN_NAMESPACE_STD
6938 template <class _BidirT>
6939 using match_results _LIBCPP_AVAILABILITY_PMR = std::match_results<_BidirT, polymorphic_allocator<std::sub_match<_BidirT>>>;
6941 using cmatch _LIBCPP_AVAILABILITY_PMR = match_results<const char*>;
6942 using smatch _LIBCPP_AVAILABILITY_PMR = match_results<std::pmr::string::const_iterator>;
6944 #ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
6945 using wcmatch _LIBCPP_AVAILABILITY_PMR = match_results<const wchar_t*>;
6946 using wsmatch _LIBCPP_AVAILABILITY_PMR = match_results<std::pmr::wstring::const_iterator>;
6949 _LIBCPP_END_NAMESPACE_STD
6954 #if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
6956 # include <concepts>
6959 # include <iterator>
6961 # include <type_traits>
6962 # include <typeinfo>
6966 #endif // _LIBCPP_REGEX