blob: d45f6c1318d306309a2279b98cf7b3cfdd8bac5a [file] [log] [blame]
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001// -*- C++ -*-
Louis Dionne9bd93882021-11-17 16:25:01 -05002//===----------------------------------------------------------------------===//
Howard Hinnanta3af5a32010-06-17 00:34:59 +00003//
Chandler Carruthd2012102019-01-19 10:56:40 +00004// 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
Howard Hinnanta3af5a32010-06-17 00:34:59 +00007//
8//===----------------------------------------------------------------------===//
9
10#ifndef _LIBCPP_REGEX
11#define _LIBCPP_REGEX
12
13/*
14 regex synopsis
15
16#include <initializer_list>
17
18namespace std
19{
20
21namespace regex_constants
22{
23
Arthur O'Dwyer4f981132020-06-25 15:31:03 -040024enum syntax_option_type
Howard Hinnanta3af5a32010-06-17 00:34:59 +000025{
26 icase = unspecified,
27 nosubs = unspecified,
28 optimize = unspecified,
29 collate = unspecified,
30 ECMAScript = unspecified,
31 basic = unspecified,
32 extended = unspecified,
33 awk = unspecified,
34 grep = unspecified,
Mark de Wevera989cce2020-11-18 18:09:13 +010035 egrep = unspecified,
36 multiline = unspecified
Howard Hinnanta3af5a32010-06-17 00:34:59 +000037};
38
39constexpr syntax_option_type operator~(syntax_option_type f);
40constexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs);
41constexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs);
42
43enum match_flag_type
44{
45 match_default = 0,
46 match_not_bol = unspecified,
47 match_not_eol = unspecified,
48 match_not_bow = unspecified,
49 match_not_eow = unspecified,
50 match_any = unspecified,
51 match_not_null = unspecified,
52 match_continuous = unspecified,
53 match_prev_avail = unspecified,
54 format_default = 0,
55 format_sed = unspecified,
56 format_no_copy = unspecified,
57 format_first_only = unspecified
58};
59
60constexpr match_flag_type operator~(match_flag_type f);
61constexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs);
62constexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs);
63
64enum error_type
65{
66 error_collate = unspecified,
67 error_ctype = unspecified,
68 error_escape = unspecified,
69 error_backref = unspecified,
70 error_brack = unspecified,
71 error_paren = unspecified,
72 error_brace = unspecified,
73 error_badbrace = unspecified,
74 error_range = unspecified,
75 error_space = unspecified,
76 error_badrepeat = unspecified,
77 error_complexity = unspecified,
78 error_stack = unspecified
79};
80
81} // regex_constants
82
83class regex_error
84 : public runtime_error
85{
86public:
87 explicit regex_error(regex_constants::error_type ecode);
88 regex_constants::error_type code() const;
89};
90
91template <class charT>
92struct regex_traits
93{
94public:
95 typedef charT char_type;
96 typedef basic_string<char_type> string_type;
97 typedef locale locale_type;
98 typedef /bitmask_type/ char_class_type;
99
100 regex_traits();
101
102 static size_t length(const char_type* p);
103 charT translate(charT c) const;
104 charT translate_nocase(charT c) const;
105 template <class ForwardIterator>
106 string_type
107 transform(ForwardIterator first, ForwardIterator last) const;
108 template <class ForwardIterator>
109 string_type
110 transform_primary( ForwardIterator first, ForwardIterator last) const;
111 template <class ForwardIterator>
112 string_type
113 lookup_collatename(ForwardIterator first, ForwardIterator last) const;
114 template <class ForwardIterator>
115 char_class_type
116 lookup_classname(ForwardIterator first, ForwardIterator last,
117 bool icase = false) const;
118 bool isctype(charT c, char_class_type f) const;
119 int value(charT ch, int radix) const;
120 locale_type imbue(locale_type l);
121 locale_type getloc()const;
122};
123
124template <class charT, class traits = regex_traits<charT>>
125class basic_regex
126{
127public:
128 // types:
129 typedef charT value_type;
Hubert Tong1f1ae9c2016-08-02 21:34:48 +0000130 typedef traits traits_type;
131 typedef typename traits::string_type string_type;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000132 typedef regex_constants::syntax_option_type flag_type;
133 typedef typename traits::locale_type locale_type;
134
135 // constants:
136 static constexpr regex_constants::syntax_option_type icase = regex_constants::icase;
137 static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
138 static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize;
139 static constexpr regex_constants::syntax_option_type collate = regex_constants::collate;
140 static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
141 static constexpr regex_constants::syntax_option_type basic = regex_constants::basic;
142 static constexpr regex_constants::syntax_option_type extended = regex_constants::extended;
143 static constexpr regex_constants::syntax_option_type awk = regex_constants::awk;
144 static constexpr regex_constants::syntax_option_type grep = regex_constants::grep;
145 static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep;
Mark de Wevera989cce2020-11-18 18:09:13 +0100146 static constexpr regex_constants::syntax_option_type multiline = regex_constants::multiline;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000147
148 // construct/copy/destroy:
149 basic_regex();
150 explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
Hubert Tong19662862016-08-07 22:26:04 +0000151 basic_regex(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000152 basic_regex(const basic_regex&);
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000153 basic_regex(basic_regex&&) noexcept;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000154 template <class ST, class SA>
155 explicit basic_regex(const basic_string<charT, ST, SA>& p,
156 flag_type f = regex_constants::ECMAScript);
157 template <class ForwardIterator>
158 basic_regex(ForwardIterator first, ForwardIterator last,
159 flag_type f = regex_constants::ECMAScript);
160 basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
161
162 ~basic_regex();
163
164 basic_regex& operator=(const basic_regex&);
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000165 basic_regex& operator=(basic_regex&&) noexcept;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000166 basic_regex& operator=(const charT* ptr);
167 basic_regex& operator=(initializer_list<charT> il);
168 template <class ST, class SA>
169 basic_regex& operator=(const basic_string<charT, ST, SA>& p);
170
171 // assign:
172 basic_regex& assign(const basic_regex& that);
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000173 basic_regex& assign(basic_regex&& that) noexcept;
Marshall Clowd4028932019-09-25 16:40:30 +0000174 basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);
175 basic_regex& assign(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000176 template <class string_traits, class A>
177 basic_regex& assign(const basic_string<charT, string_traits, A>& s,
Marshall Clowd4028932019-09-25 16:40:30 +0000178 flag_type f = regex_constants::ECMAScript);
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000179 template <class InputIterator>
180 basic_regex& assign(InputIterator first, InputIterator last,
Marshall Clowd4028932019-09-25 16:40:30 +0000181 flag_type f = regex_constants::ECMAScript);
182 basic_regex& assign(initializer_list<charT>, flag_type f = regex_constants::ECMAScript);
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000183
184 // const operations:
185 unsigned mark_count() const;
186 flag_type flags() const;
187
188 // locale:
189 locale_type imbue(locale_type loc);
190 locale_type getloc() const;
191
192 // swap:
193 void swap(basic_regex&);
194};
195
Marshall Clow2dce1f42018-05-23 01:57:02 +0000196template<class ForwardIterator>
197basic_regex(ForwardIterator, ForwardIterator,
198 regex_constants::syntax_option_type = regex_constants::ECMAScript)
199 -> basic_regex<typename iterator_traits<ForwardIterator>::value_type>; // C++17
200
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000201typedef basic_regex<char> regex;
202typedef basic_regex<wchar_t> wregex;
203
204template <class charT, class traits>
205 void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
206
207template <class BidirectionalIterator>
208class sub_match
209 : public pair<BidirectionalIterator, BidirectionalIterator>
210{
211public:
212 typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
213 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
214 typedef BidirectionalIterator iterator;
215 typedef basic_string<value_type> string_type;
216
217 bool matched;
218
Howard Hinnantb5c53a82010-12-08 21:07:55 +0000219 constexpr sub_match();
220
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000221 difference_type length() const;
222 operator string_type() const;
223 string_type str() const;
224
225 int compare(const sub_match& s) const;
226 int compare(const string_type& s) const;
227 int compare(const value_type* s) const;
228};
229
230typedef sub_match<const char*> csub_match;
231typedef sub_match<const wchar_t*> wcsub_match;
232typedef sub_match<string::const_iterator> ssub_match;
233typedef sub_match<wstring::const_iterator> wssub_match;
234
235template <class BiIter>
236 bool
237 operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
238
239template <class BiIter>
240 bool
241 operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
242
243template <class BiIter>
244 bool
245 operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
246
247template <class BiIter>
248 bool
249 operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
250
251template <class BiIter>
252 bool
253 operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
254
255template <class BiIter>
256 bool
257 operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
258
259template <class BiIter, class ST, class SA>
260 bool
261 operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
262 const sub_match<BiIter>& rhs);
263
264template <class BiIter, class ST, class SA>
265 bool
266 operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
267 const sub_match<BiIter>& rhs);
268
269template <class BiIter, class ST, class SA>
270 bool
271 operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
272 const sub_match<BiIter>& rhs);
273
274template <class BiIter, class ST, class SA>
275 bool
276 operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
277 const sub_match<BiIter>& rhs);
278
279template <class BiIter, class ST, class SA>
280 bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
281 const sub_match<BiIter>& rhs);
282
283template <class BiIter, class ST, class SA>
284 bool
285 operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
286 const sub_match<BiIter>& rhs);
287
288template <class BiIter, class ST, class SA>
289 bool
290 operator==(const sub_match<BiIter>& lhs,
291 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
292
293template <class BiIter, class ST, class SA>
294 bool
295 operator!=(const sub_match<BiIter>& lhs,
296 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
297
298template <class BiIter, class ST, class SA>
299 bool
300 operator<(const sub_match<BiIter>& lhs,
301 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
302
303template <class BiIter, class ST, class SA>
304 bool operator>(const sub_match<BiIter>& lhs,
305 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
306
307template <class BiIter, class ST, class SA>
308 bool
309 operator>=(const sub_match<BiIter>& lhs,
310 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
311
312template <class BiIter, class ST, class SA>
313 bool
314 operator<=(const sub_match<BiIter>& lhs,
315 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
316
317template <class BiIter>
318 bool
319 operator==(typename iterator_traits<BiIter>::value_type const* lhs,
320 const sub_match<BiIter>& rhs);
321
322template <class BiIter>
323 bool
324 operator!=(typename iterator_traits<BiIter>::value_type const* lhs,
325 const sub_match<BiIter>& rhs);
326
327template <class BiIter>
328 bool
329 operator<(typename iterator_traits<BiIter>::value_type const* lhs,
330 const sub_match<BiIter>& rhs);
331
332template <class BiIter>
333 bool
334 operator>(typename iterator_traits<BiIter>::value_type const* lhs,
335 const sub_match<BiIter>& rhs);
336
337template <class BiIter>
338 bool
339 operator>=(typename iterator_traits<BiIter>::value_type const* lhs,
340 const sub_match<BiIter>& rhs);
341
342template <class BiIter>
343 bool
344 operator<=(typename iterator_traits<BiIter>::value_type const* lhs,
345 const sub_match<BiIter>& rhs);
346
347template <class BiIter>
348 bool
349 operator==(const sub_match<BiIter>& lhs,
350 typename iterator_traits<BiIter>::value_type const* rhs);
351
352template <class BiIter>
353 bool
354 operator!=(const sub_match<BiIter>& lhs,
355 typename iterator_traits<BiIter>::value_type const* rhs);
356
357template <class BiIter>
358 bool
359 operator<(const sub_match<BiIter>& lhs,
360 typename iterator_traits<BiIter>::value_type const* rhs);
361
362template <class BiIter>
363 bool
364 operator>(const sub_match<BiIter>& lhs,
365 typename iterator_traits<BiIter>::value_type const* rhs);
366
367template <class BiIter>
368 bool
369 operator>=(const sub_match<BiIter>& lhs,
370 typename iterator_traits<BiIter>::value_type const* rhs);
371
372template <class BiIter>
373 bool
374 operator<=(const sub_match<BiIter>& lhs,
375 typename iterator_traits<BiIter>::value_type const* rhs);
376
377template <class BiIter>
378 bool
379 operator==(typename iterator_traits<BiIter>::value_type const& lhs,
380 const sub_match<BiIter>& rhs);
381
382template <class BiIter>
383 bool
384 operator!=(typename iterator_traits<BiIter>::value_type const& lhs,
385 const sub_match<BiIter>& rhs);
386
387template <class BiIter>
388 bool
389 operator<(typename iterator_traits<BiIter>::value_type const& lhs,
390 const sub_match<BiIter>& rhs);
391
392template <class BiIter>
393 bool
394 operator>(typename iterator_traits<BiIter>::value_type const& lhs,
395 const sub_match<BiIter>& rhs);
396
397template <class BiIter>
398 bool
399 operator>=(typename iterator_traits<BiIter>::value_type const& lhs,
400 const sub_match<BiIter>& rhs);
401
402template <class BiIter>
403 bool
404 operator<=(typename iterator_traits<BiIter>::value_type const& lhs,
405 const sub_match<BiIter>& rhs);
406
407template <class BiIter>
408 bool
409 operator==(const sub_match<BiIter>& lhs,
410 typename iterator_traits<BiIter>::value_type const& rhs);
411
412template <class BiIter>
413 bool
414 operator!=(const sub_match<BiIter>& lhs,
415 typename iterator_traits<BiIter>::value_type const& rhs);
416
417template <class BiIter>
418 bool
419 operator<(const sub_match<BiIter>& lhs,
420 typename iterator_traits<BiIter>::value_type const& rhs);
421
422template <class BiIter>
423 bool
424 operator>(const sub_match<BiIter>& lhs,
425 typename iterator_traits<BiIter>::value_type const& rhs);
426
427template <class BiIter>
428 bool
429 operator>=(const sub_match<BiIter>& lhs,
430 typename iterator_traits<BiIter>::value_type const& rhs);
431
432template <class BiIter>
433 bool
434 operator<=(const sub_match<BiIter>& lhs,
435 typename iterator_traits<BiIter>::value_type const& rhs);
436
437template <class charT, class ST, class BiIter>
438 basic_ostream<charT, ST>&
439 operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
440
441template <class BidirectionalIterator,
442 class Allocator = allocator<sub_match<BidirectionalIterator>>>
443class match_results
444{
445public:
446 typedef sub_match<BidirectionalIterator> value_type;
447 typedef const value_type& const_reference;
Marshall Clow96e06142014-02-26 01:56:31 +0000448 typedef value_type& reference;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000449 typedef /implementation-defined/ const_iterator;
450 typedef const_iterator iterator;
451 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
452 typedef typename allocator_traits<Allocator>::size_type size_type;
453 typedef Allocator allocator_type;
454 typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
455 typedef basic_string<char_type> string_type;
456
457 // construct/copy/destroy:
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +0100458 explicit match_results(const Allocator& a = Allocator()); // before C++20
459 match_results() : match_results(Allocator()) {} // C++20
460 explicit match_results(const Allocator& a); // C++20
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000461 match_results(const match_results& m);
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000462 match_results(match_results&& m) noexcept;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000463 match_results& operator=(const match_results& m);
464 match_results& operator=(match_results&& m);
465 ~match_results();
466
Howard Hinnantb5c53a82010-12-08 21:07:55 +0000467 bool ready() const;
468
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000469 // size:
470 size_type size() const;
471 size_type max_size() const;
472 bool empty() const;
473
474 // element access:
475 difference_type length(size_type sub = 0) const;
476 difference_type position(size_type sub = 0) const;
477 string_type str(size_type sub = 0) const;
478 const_reference operator[](size_type n) const;
479
480 const_reference prefix() const;
481 const_reference suffix() const;
482
483 const_iterator begin() const;
484 const_iterator end() const;
485 const_iterator cbegin() const;
486 const_iterator cend() const;
487
488 // format:
489 template <class OutputIter>
490 OutputIter
491 format(OutputIter out, const char_type* fmt_first,
492 const char_type* fmt_last,
493 regex_constants::match_flag_type flags = regex_constants::format_default) const;
494 template <class OutputIter, class ST, class SA>
495 OutputIter
496 format(OutputIter out, const basic_string<char_type, ST, SA>& fmt,
497 regex_constants::match_flag_type flags = regex_constants::format_default) const;
498 template <class ST, class SA>
499 basic_string<char_type, ST, SA>
500 format(const basic_string<char_type, ST, SA>& fmt,
501 regex_constants::match_flag_type flags = regex_constants::format_default) const;
502 string_type
503 format(const char_type* fmt,
504 regex_constants::match_flag_type flags = regex_constants::format_default) const;
505
506 // allocator:
507 allocator_type get_allocator() const;
508
509 // swap:
510 void swap(match_results& that);
511};
512
513typedef match_results<const char*> cmatch;
514typedef match_results<const wchar_t*> wcmatch;
515typedef match_results<string::const_iterator> smatch;
516typedef match_results<wstring::const_iterator> wsmatch;
517
518template <class BidirectionalIterator, class Allocator>
519 bool
520 operator==(const match_results<BidirectionalIterator, Allocator>& m1,
521 const match_results<BidirectionalIterator, Allocator>& m2);
522
523template <class BidirectionalIterator, class Allocator>
524 bool
525 operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
526 const match_results<BidirectionalIterator, Allocator>& m2);
527
528template <class BidirectionalIterator, class Allocator>
529 void
530 swap(match_results<BidirectionalIterator, Allocator>& m1,
531 match_results<BidirectionalIterator, Allocator>& m2);
532
533template <class BidirectionalIterator, class Allocator, class charT, class traits>
534 bool
535 regex_match(BidirectionalIterator first, BidirectionalIterator last,
536 match_results<BidirectionalIterator, Allocator>& m,
537 const basic_regex<charT, traits>& e,
538 regex_constants::match_flag_type flags = regex_constants::match_default);
539
540template <class BidirectionalIterator, class charT, class traits>
541 bool
542 regex_match(BidirectionalIterator first, BidirectionalIterator last,
543 const basic_regex<charT, traits>& e,
544 regex_constants::match_flag_type flags = regex_constants::match_default);
545
546template <class charT, class Allocator, class traits>
547 bool
548 regex_match(const charT* str, match_results<const charT*, Allocator>& m,
549 const basic_regex<charT, traits>& e,
550 regex_constants::match_flag_type flags = regex_constants::match_default);
551
552template <class ST, class SA, class Allocator, class charT, class traits>
553 bool
554 regex_match(const basic_string<charT, ST, SA>& s,
555 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
556 const basic_regex<charT, traits>& e,
557 regex_constants::match_flag_type flags = regex_constants::match_default);
558
Marshall Clow8c950072014-02-19 21:21:11 +0000559template <class ST, class SA, class Allocator, class charT, class traits>
560 bool
561 regex_match(const basic_string<charT, ST, SA>&& s,
562 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
563 const basic_regex<charT, traits>& e,
564 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
565
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000566template <class charT, class traits>
567 bool
568 regex_match(const charT* str, const basic_regex<charT, traits>& e,
569 regex_constants::match_flag_type flags = regex_constants::match_default);
570
571template <class ST, class SA, class charT, class traits>
572 bool
573 regex_match(const basic_string<charT, ST, SA>& s,
574 const basic_regex<charT, traits>& e,
575 regex_constants::match_flag_type flags = regex_constants::match_default);
576
577template <class BidirectionalIterator, class Allocator, class charT, class traits>
578 bool
579 regex_search(BidirectionalIterator first, BidirectionalIterator last,
580 match_results<BidirectionalIterator, Allocator>& m,
581 const basic_regex<charT, traits>& e,
582 regex_constants::match_flag_type flags = regex_constants::match_default);
583
584template <class BidirectionalIterator, class charT, class traits>
585 bool
586 regex_search(BidirectionalIterator first, BidirectionalIterator last,
587 const basic_regex<charT, traits>& e,
588 regex_constants::match_flag_type flags = regex_constants::match_default);
589
590template <class charT, class Allocator, class traits>
591 bool
592 regex_search(const charT* str, match_results<const charT*, Allocator>& m,
593 const basic_regex<charT, traits>& e,
594 regex_constants::match_flag_type flags = regex_constants::match_default);
595
596template <class charT, class traits>
597 bool
598 regex_search(const charT* str, const basic_regex<charT, traits>& e,
599 regex_constants::match_flag_type flags = regex_constants::match_default);
600
601template <class ST, class SA, class charT, class traits>
602 bool
603 regex_search(const basic_string<charT, ST, SA>& s,
604 const basic_regex<charT, traits>& e,
605 regex_constants::match_flag_type flags = regex_constants::match_default);
606
607template <class ST, class SA, class Allocator, class charT, class traits>
608 bool
609 regex_search(const basic_string<charT, ST, SA>& s,
610 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
611 const basic_regex<charT, traits>& e,
612 regex_constants::match_flag_type flags = regex_constants::match_default);
613
Marshall Clow8c950072014-02-19 21:21:11 +0000614template <class ST, class SA, class Allocator, class charT, class traits>
615 bool
616 regex_search(const basic_string<charT, ST, SA>&& s,
617 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
618 const basic_regex<charT, traits>& e,
619 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
620
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000621template <class OutputIterator, class BidirectionalIterator,
622 class traits, class charT, class ST, class SA>
623 OutputIterator
624 regex_replace(OutputIterator out,
625 BidirectionalIterator first, BidirectionalIterator last,
626 const basic_regex<charT, traits>& e,
627 const basic_string<charT, ST, SA>& fmt,
628 regex_constants::match_flag_type flags = regex_constants::match_default);
629
630template <class OutputIterator, class BidirectionalIterator,
631 class traits, class charT>
632 OutputIterator
633 regex_replace(OutputIterator out,
634 BidirectionalIterator first, BidirectionalIterator last,
635 const basic_regex<charT, traits>& e, const charT* fmt,
636 regex_constants::match_flag_type flags = regex_constants::match_default);
637
Arthur O'Dwyer4f981132020-06-25 15:31:03 -0400638template <class traits, class charT, class ST, class SA, class FST, class FSA>
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000639 basic_string<charT, ST, SA>
640 regex_replace(const basic_string<charT, ST, SA>& s,
641 const basic_regex<charT, traits>& e,
642 const basic_string<charT, FST, FSA>& fmt,
643 regex_constants::match_flag_type flags = regex_constants::match_default);
644
645template <class traits, class charT, class ST, class SA>
646 basic_string<charT, ST, SA>
647 regex_replace(const basic_string<charT, ST, SA>& s,
648 const basic_regex<charT, traits>& e, const charT* fmt,
649 regex_constants::match_flag_type flags = regex_constants::match_default);
650
651template <class traits, class charT, class ST, class SA>
652 basic_string<charT>
653 regex_replace(const charT* s,
654 const basic_regex<charT, traits>& e,
655 const basic_string<charT, ST, SA>& fmt,
656 regex_constants::match_flag_type flags = regex_constants::match_default);
657
658template <class traits, class charT>
659 basic_string<charT>
660 regex_replace(const charT* s,
661 const basic_regex<charT, traits>& e,
662 const charT* fmt,
663 regex_constants::match_flag_type flags = regex_constants::match_default);
664
665template <class BidirectionalIterator,
666 class charT = typename iterator_traits< BidirectionalIterator>::value_type,
667 class traits = regex_traits<charT>>
668class regex_iterator
669{
670public:
671 typedef basic_regex<charT, traits> regex_type;
672 typedef match_results<BidirectionalIterator> value_type;
673 typedef ptrdiff_t difference_type;
674 typedef const value_type* pointer;
675 typedef const value_type& reference;
676 typedef forward_iterator_tag iterator_category;
677
678 regex_iterator();
679 regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
680 const regex_type& re,
681 regex_constants::match_flag_type m = regex_constants::match_default);
Arthur O'Dwyer4f981132020-06-25 15:31:03 -0400682 regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
683 const regex_type&& re,
684 regex_constants::match_flag_type m
Marshall Clow8c950072014-02-19 21:21:11 +0000685 = regex_constants::match_default) = delete; // C++14
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000686 regex_iterator(const regex_iterator&);
687 regex_iterator& operator=(const regex_iterator&);
688
689 bool operator==(const regex_iterator&) const;
690 bool operator!=(const regex_iterator&) const;
691
692 const value_type& operator*() const;
693 const value_type* operator->() const;
694
695 regex_iterator& operator++();
696 regex_iterator operator++(int);
697};
698
699typedef regex_iterator<const char*> cregex_iterator;
700typedef regex_iterator<const wchar_t*> wcregex_iterator;
701typedef regex_iterator<string::const_iterator> sregex_iterator;
702typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
703
704template <class BidirectionalIterator,
Arthur O'Dwyer4f981132020-06-25 15:31:03 -0400705 class charT = typename iterator_traits<BidirectionalIterator>::value_type,
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000706 class traits = regex_traits<charT>>
707class regex_token_iterator
708{
709public:
710 typedef basic_regex<charT, traits> regex_type;
711 typedef sub_match<BidirectionalIterator> value_type;
712 typedef ptrdiff_t difference_type;
713 typedef const value_type* pointer;
714 typedef const value_type& reference;
715 typedef forward_iterator_tag iterator_category;
716
717 regex_token_iterator();
718 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
719 const regex_type& re, int submatch = 0,
720 regex_constants::match_flag_type m = regex_constants::match_default);
721 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Marshall Clow8c950072014-02-19 21:21:11 +0000722 const regex_type&& re, int submatch = 0,
723 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
724 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000725 const regex_type& re, const vector<int>& submatches,
726 regex_constants::match_flag_type m = regex_constants::match_default);
727 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Marshall Clow8c950072014-02-19 21:21:11 +0000728 const regex_type&& re, const vector<int>& submatches,
729 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
730 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000731 const regex_type& re, initializer_list<int> submatches,
732 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +0000733 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
734 const regex_type&& re, initializer_list<int> submatches,
735 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000736 template <size_t N>
737 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
738 const regex_type& re, const int (&submatches)[N],
739 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +0000740 template <size_t N>
741 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Arthur O'Dwyer4f981132020-06-25 15:31:03 -0400742 const regex_type&& re, const int (&submatches)[N],
743 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000744 regex_token_iterator(const regex_token_iterator&);
745 regex_token_iterator& operator=(const regex_token_iterator&);
746
747 bool operator==(const regex_token_iterator&) const;
748 bool operator!=(const regex_token_iterator&) const;
749
750 const value_type& operator*() const;
751 const value_type* operator->() const;
752
753 regex_token_iterator& operator++();
754 regex_token_iterator operator++(int);
755};
756
757typedef regex_token_iterator<const char*> cregex_token_iterator;
758typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
759typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
760typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
761
762} // std
763*/
764
Nikolas Klauserf210d8a2022-02-15 18:18:08 +0100765#include <__algorithm/find.h>
Nikolas Klauseree2dbc32022-04-17 16:01:38 +0200766#include <__algorithm/search.h>
Louis Dionneb4fce352022-03-25 12:55:36 -0400767#include <__assert> // all public C++ headers provide the assertion handler
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000768#include <__config>
Nikolas Klauserfb1b0672022-06-10 19:53:10 +0200769#include <__iterator/back_insert_iterator.h>
Louis Dionne77249522021-06-11 09:55:11 -0400770#include <__iterator/wrap_iter.h>
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000771#include <__locale>
Arthur O'Dwyerebf2d342022-10-06 16:53:30 -0400772#include <__memory_resource/polymorphic_allocator.h>
Nikolas Klauser8fccd622022-03-05 19:17:07 +0100773#include <__utility/move.h>
Nikolas Klauser0b5df932022-09-05 00:01:15 +0200774#include <__utility/pair.h>
Nikolas Klauser8fccd622022-03-05 19:17:07 +0100775#include <__utility/swap.h>
Howard Hinnantaa0874c2010-07-12 15:51:17 +0000776#include <deque>
Arthur O'Dwyer597cac42021-05-12 23:04:03 -0400777#include <stdexcept>
778#include <string>
Arthur O'Dwyer597cac42021-05-12 23:04:03 -0400779#include <vector>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000780#include <version>
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000781
Nikolas Klausera0e0edb2022-06-16 22:43:46 +0200782// standard-mandated includes
783
784// [iterator.range]
785#include <__iterator/access.h>
786#include <__iterator/data.h>
787#include <__iterator/empty.h>
788#include <__iterator/reverse_access.h>
789#include <__iterator/size.h>
790
791// [re.syn]
792#include <compare>
793#include <initializer_list>
794
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000795#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500796# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000797#endif
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000798
Eric Fiselierf4433a32017-05-31 22:07:49 +0000799_LIBCPP_PUSH_MACROS
800#include <__undef_macros>
801
802
Marshall Clowd39d21d2017-09-12 17:56:59 +0000803#define _LIBCPP_REGEX_COMPLEXITY_FACTOR 4096
804
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000805_LIBCPP_BEGIN_NAMESPACE_STD
806
807namespace regex_constants
808{
809
810// syntax_option_type
811
812enum syntax_option_type
813{
814 icase = 1 << 0,
815 nosubs = 1 << 1,
816 optimize = 1 << 2,
817 collate = 1 << 3,
Marshall Clow88a30872019-03-28 17:30:23 +0000818#ifdef _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO
819 ECMAScript = 1 << 9,
820#else
Howard Hinnantebbc2b62010-07-27 17:24:17 +0000821 ECMAScript = 0,
Marshall Clow88a30872019-03-28 17:30:23 +0000822#endif
Howard Hinnantebbc2b62010-07-27 17:24:17 +0000823 basic = 1 << 4,
824 extended = 1 << 5,
825 awk = 1 << 6,
826 grep = 1 << 7,
Mark de Wevera989cce2020-11-18 18:09:13 +0100827 egrep = 1 << 8,
828 // 1 << 9 may be used by ECMAScript
829 multiline = 1 << 10
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000830};
831
Nikolas Klausera9ad6702022-08-13 13:23:16 +0200832_LIBCPP_HIDE_FROM_ABI inline _LIBCPP_CONSTEXPR
Marshall Clow88a30872019-03-28 17:30:23 +0000833syntax_option_type __get_grammar(syntax_option_type __g)
834{
835#ifdef _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO
836 return static_cast<syntax_option_type>(__g & 0x3F0);
837#else
838 return static_cast<syntax_option_type>(__g & 0x1F0);
839#endif
840}
841
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000842inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000843_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000844syntax_option_type
845operator~(syntax_option_type __x)
846{
Marshall Clow924cffa2013-03-22 02:13:55 +0000847 return syntax_option_type(~int(__x) & 0x1FF);
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000848}
849
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000850inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000851_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000852syntax_option_type
853operator&(syntax_option_type __x, syntax_option_type __y)
854{
855 return syntax_option_type(int(__x) & int(__y));
856}
857
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000858inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000859_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000860syntax_option_type
861operator|(syntax_option_type __x, syntax_option_type __y)
862{
863 return syntax_option_type(int(__x) | int(__y));
864}
865
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000866inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000867_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000868syntax_option_type
869operator^(syntax_option_type __x, syntax_option_type __y)
870{
871 return syntax_option_type(int(__x) ^ int(__y));
872}
873
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000874inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000875syntax_option_type&
876operator&=(syntax_option_type& __x, syntax_option_type __y)
877{
878 __x = __x & __y;
879 return __x;
880}
881
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000882inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000883syntax_option_type&
884operator|=(syntax_option_type& __x, syntax_option_type __y)
885{
886 __x = __x | __y;
887 return __x;
888}
889
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000890inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000891syntax_option_type&
892operator^=(syntax_option_type& __x, syntax_option_type __y)
893{
894 __x = __x ^ __y;
895 return __x;
896}
897
898// match_flag_type
899
900enum match_flag_type
901{
902 match_default = 0,
903 match_not_bol = 1 << 0,
904 match_not_eol = 1 << 1,
905 match_not_bow = 1 << 2,
906 match_not_eow = 1 << 3,
907 match_any = 1 << 4,
908 match_not_null = 1 << 5,
909 match_continuous = 1 << 6,
910 match_prev_avail = 1 << 7,
911 format_default = 0,
912 format_sed = 1 << 8,
913 format_no_copy = 1 << 9,
Howard Hinnantd3925342010-08-16 20:21:16 +0000914 format_first_only = 1 << 10,
Tim Shen11113f52016-10-27 21:40:34 +0000915 __no_update_pos = 1 << 11,
916 __full_match = 1 << 12
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000917};
918
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000919inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000920_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000921match_flag_type
922operator~(match_flag_type __x)
923{
Marshall Clow924cffa2013-03-22 02:13:55 +0000924 return match_flag_type(~int(__x) & 0x0FFF);
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000925}
926
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000927inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000928_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000929match_flag_type
930operator&(match_flag_type __x, match_flag_type __y)
931{
932 return match_flag_type(int(__x) & int(__y));
933}
934
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000935inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000936_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000937match_flag_type
938operator|(match_flag_type __x, match_flag_type __y)
939{
940 return match_flag_type(int(__x) | int(__y));
941}
942
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000943inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000944_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000945match_flag_type
946operator^(match_flag_type __x, match_flag_type __y)
947{
948 return match_flag_type(int(__x) ^ int(__y));
949}
950
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000951inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000952match_flag_type&
953operator&=(match_flag_type& __x, match_flag_type __y)
954{
955 __x = __x & __y;
956 return __x;
957}
958
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000959inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000960match_flag_type&
961operator|=(match_flag_type& __x, match_flag_type __y)
962{
963 __x = __x | __y;
964 return __x;
965}
966
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000967inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000968match_flag_type&
969operator^=(match_flag_type& __x, match_flag_type __y)
970{
971 __x = __x ^ __y;
972 return __x;
973}
974
975enum error_type
976{
977 error_collate = 1,
978 error_ctype,
979 error_escape,
980 error_backref,
981 error_brack,
982 error_paren,
983 error_brace,
984 error_badbrace,
985 error_range,
986 error_space,
987 error_badrepeat,
988 error_complexity,
Howard Hinnant6c891682010-06-24 21:28:00 +0000989 error_stack,
Howard Hinnantebbc2b62010-07-27 17:24:17 +0000990 __re_err_grammar,
991 __re_err_empty,
Mark de Wevera0ad9762019-11-09 17:01:37 +0100992 __re_err_unknown,
993 __re_err_parse
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000994};
995
Nikolas Klauserd26407a2021-12-02 14:12:51 +0100996} // namespace regex_constants
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000997
998class _LIBCPP_EXCEPTION_ABI regex_error
999 : public runtime_error
1000{
1001 regex_constants::error_type __code_;
1002public:
1003 explicit regex_error(regex_constants::error_type __ecode);
Dimitry Andric47269ce2020-03-13 19:36:26 +01001004 regex_error(const regex_error&) _NOEXCEPT = default;
Nikolas Klauseraa3a6cd2022-08-24 02:14:29 +02001005 ~regex_error() _NOEXCEPT override;
1006 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001007 regex_constants::error_type code() const {return __code_;}
1008};
1009
Marshall Clowc8ccc292015-07-28 13:30:47 +00001010template <regex_constants::error_type _Ev>
Louis Dionne16fe2952018-07-11 23:14:33 +00001011_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
Marshall Clowc8ccc292015-07-28 13:30:47 +00001012void __throw_regex_error()
1013{
1014#ifndef _LIBCPP_NO_EXCEPTIONS
Marshall Clow8bf61bb2015-08-17 21:14:16 +00001015 throw regex_error(_Ev);
1016#else
Marshall Clow8fea1612016-08-25 15:09:01 +00001017 _VSTD::abort();
Marshall Clowc8ccc292015-07-28 13:30:47 +00001018#endif
1019}
1020
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001021template <class _CharT>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001022struct _LIBCPP_TEMPLATE_VIS regex_traits
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001023{
1024public:
1025 typedef _CharT char_type;
1026 typedef basic_string<char_type> string_type;
1027 typedef locale locale_type;
Dan Albert70ee07e2020-04-06 13:34:27 -07001028#ifdef __BIONIC__
1029 // Originally bionic's ctype_base used its own ctype masks because the
1030 // builtin ctype implementation wasn't in libc++ yet. Bionic's ctype mask
1031 // was only 8 bits wide and already saturated, so it used a wider type here
1032 // to make room for __regex_word (then a part of this class rather than
1033 // ctype_base). Bionic has since moved to the builtin ctype_base
1034 // implementation, but this was not updated to match. Since then Android has
1035 // needed to maintain a stable libc++ ABI, and this can't be changed without
1036 // an ABI break.
1037 typedef uint16_t char_class_type;
1038#else
Howard Hinnant40b45e12010-06-21 21:01:43 +00001039 typedef ctype_base::mask char_class_type;
Dan Albert70ee07e2020-04-06 13:34:27 -07001040#endif
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001041
Mikhail Maltsev014ed062019-06-14 09:04:16 +00001042 static const char_class_type __regex_word = ctype_base::__regex_word;
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001043private:
1044 locale __loc_;
1045 const ctype<char_type>* __ct_;
1046 const collate<char_type>* __col_;
1047
1048public:
1049 regex_traits();
1050
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001051 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001052 static size_t length(const char_type* __p)
1053 {return char_traits<char_type>::length(__p);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001054 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001055 char_type translate(char_type __c) const {return __c;}
1056 char_type translate_nocase(char_type __c) const;
1057 template <class _ForwardIterator>
1058 string_type
1059 transform(_ForwardIterator __f, _ForwardIterator __l) const;
1060 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001061 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001062 string_type
1063 transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
1064 {return __transform_primary(__f, __l, char_type());}
1065 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001066 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001067 string_type
1068 lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
1069 {return __lookup_collatename(__f, __l, char_type());}
1070 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001071 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001072 char_class_type
1073 lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
Howard Hinnant40b45e12010-06-21 21:01:43 +00001074 bool __icase = false) const
1075 {return __lookup_classname(__f, __l, __icase, char_type());}
1076 bool isctype(char_type __c, char_class_type __m) const;
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001077 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant40b45e12010-06-21 21:01:43 +00001078 int value(char_type __ch, int __radix) const
Marshall Clowef420192013-10-21 15:43:25 +00001079 {return __regex_traits_value(__ch, __radix);}
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001080 locale_type imbue(locale_type __l);
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001081 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001082 locale_type getloc()const {return __loc_;}
1083
1084private:
1085 void __init();
1086
1087 template <class _ForwardIterator>
1088 string_type
1089 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
Louis Dionne89258142021-08-23 15:32:36 -04001090#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001091 template <class _ForwardIterator>
1092 string_type
1093 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
Louis Dionne89258142021-08-23 15:32:36 -04001094#endif
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001095 template <class _ForwardIterator>
1096 string_type
1097 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
Louis Dionne89258142021-08-23 15:32:36 -04001098#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001099 template <class _ForwardIterator>
1100 string_type
1101 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
Louis Dionne89258142021-08-23 15:32:36 -04001102#endif
Howard Hinnant40b45e12010-06-21 21:01:43 +00001103 template <class _ForwardIterator>
1104 char_class_type
1105 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1106 bool __icase, char) const;
Louis Dionne89258142021-08-23 15:32:36 -04001107#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnant40b45e12010-06-21 21:01:43 +00001108 template <class _ForwardIterator>
1109 char_class_type
1110 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1111 bool __icase, wchar_t) const;
Louis Dionne89258142021-08-23 15:32:36 -04001112#endif
Howard Hinnant40b45e12010-06-21 21:01:43 +00001113
Marshall Clowef420192013-10-21 15:43:25 +00001114 static int __regex_traits_value(unsigned char __ch, int __radix);
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001115 _LIBCPP_INLINE_VISIBILITY
Marshall Clowef420192013-10-21 15:43:25 +00001116 int __regex_traits_value(char __ch, int __radix) const
1117 {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
Louis Dionne89258142021-08-23 15:32:36 -04001118#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001119 _LIBCPP_INLINE_VISIBILITY
Marshall Clowef420192013-10-21 15:43:25 +00001120 int __regex_traits_value(wchar_t __ch, int __radix) const;
Louis Dionne89258142021-08-23 15:32:36 -04001121#endif
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001122};
1123
1124template <class _CharT>
Howard Hinnant592cb612013-03-07 19:38:08 +00001125const typename regex_traits<_CharT>::char_class_type
1126regex_traits<_CharT>::__regex_word;
1127
1128template <class _CharT>
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001129regex_traits<_CharT>::regex_traits()
1130{
1131 __init();
1132}
1133
1134template <class _CharT>
1135typename regex_traits<_CharT>::char_type
1136regex_traits<_CharT>::translate_nocase(char_type __c) const
1137{
1138 return __ct_->tolower(__c);
1139}
1140
1141template <class _CharT>
1142template <class _ForwardIterator>
1143typename regex_traits<_CharT>::string_type
1144regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
1145{
1146 string_type __s(__f, __l);
1147 return __col_->transform(__s.data(), __s.data() + __s.size());
1148}
1149
1150template <class _CharT>
1151void
1152regex_traits<_CharT>::__init()
1153{
1154 __ct_ = &use_facet<ctype<char_type> >(__loc_);
1155 __col_ = &use_facet<collate<char_type> >(__loc_);
1156}
1157
1158template <class _CharT>
1159typename regex_traits<_CharT>::locale_type
1160regex_traits<_CharT>::imbue(locale_type __l)
1161{
1162 locale __r = __loc_;
1163 __loc_ = __l;
1164 __init();
1165 return __r;
1166}
1167
1168// transform_primary is very FreeBSD-specific
1169
1170template <class _CharT>
1171template <class _ForwardIterator>
1172typename regex_traits<_CharT>::string_type
1173regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1174 _ForwardIterator __l, char) const
1175{
1176 const string_type __s(__f, __l);
1177 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1178 switch (__d.size())
1179 {
1180 case 1:
1181 break;
1182 case 12:
1183 __d[11] = __d[3];
1184 break;
1185 default:
1186 __d.clear();
1187 break;
1188 }
1189 return __d;
1190}
1191
Louis Dionne89258142021-08-23 15:32:36 -04001192#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001193template <class _CharT>
1194template <class _ForwardIterator>
1195typename regex_traits<_CharT>::string_type
1196regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1197 _ForwardIterator __l, wchar_t) const
1198{
1199 const string_type __s(__f, __l);
1200 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1201 switch (__d.size())
1202 {
1203 case 1:
1204 break;
1205 case 3:
1206 __d[2] = __d[0];
1207 break;
1208 default:
1209 __d.clear();
1210 break;
1211 }
1212 return __d;
1213}
Louis Dionne89258142021-08-23 15:32:36 -04001214#endif
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001215
1216// lookup_collatename is very FreeBSD-specific
1217
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00001218_LIBCPP_FUNC_VIS string __get_collation_name(const char* __s);
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001219
1220template <class _CharT>
1221template <class _ForwardIterator>
1222typename regex_traits<_CharT>::string_type
1223regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1224 _ForwardIterator __l, char) const
1225{
1226 string_type __s(__f, __l);
1227 string_type __r;
1228 if (!__s.empty())
1229 {
1230 __r = __get_collation_name(__s.c_str());
1231 if (__r.empty() && __s.size() <= 2)
1232 {
1233 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1234 if (__r.size() == 1 || __r.size() == 12)
1235 __r = __s;
1236 else
1237 __r.clear();
1238 }
1239 }
1240 return __r;
1241}
1242
Louis Dionne89258142021-08-23 15:32:36 -04001243#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001244template <class _CharT>
1245template <class _ForwardIterator>
1246typename regex_traits<_CharT>::string_type
1247regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1248 _ForwardIterator __l, wchar_t) const
1249{
1250 string_type __s(__f, __l);
1251 string __n;
1252 __n.reserve(__s.size());
1253 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1254 __i != __e; ++__i)
1255 {
1256 if (static_cast<unsigned>(*__i) >= 127)
1257 return string_type();
1258 __n.push_back(char(*__i));
1259 }
1260 string_type __r;
1261 if (!__s.empty())
1262 {
1263 __n = __get_collation_name(__n.c_str());
1264 if (!__n.empty())
1265 __r.assign(__n.begin(), __n.end());
1266 else if (__s.size() <= 2)
1267 {
1268 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1269 if (__r.size() == 1 || __r.size() == 3)
1270 __r = __s;
1271 else
1272 __r.clear();
1273 }
1274 }
1275 return __r;
1276}
Louis Dionne89258142021-08-23 15:32:36 -04001277#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001278
Howard Hinnant40b45e12010-06-21 21:01:43 +00001279// lookup_classname
1280
Dan Albert49f384c2014-07-29 19:23:39 +00001281regex_traits<char>::char_class_type _LIBCPP_FUNC_VIS
1282__get_classname(const char* __s, bool __icase);
Howard Hinnant40b45e12010-06-21 21:01:43 +00001283
1284template <class _CharT>
1285template <class _ForwardIterator>
1286typename regex_traits<_CharT>::char_class_type
1287regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1288 _ForwardIterator __l,
1289 bool __icase, char) const
1290{
1291 string_type __s(__f, __l);
1292 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1293 return __get_classname(__s.c_str(), __icase);
1294}
1295
Louis Dionne89258142021-08-23 15:32:36 -04001296#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnant40b45e12010-06-21 21:01:43 +00001297template <class _CharT>
1298template <class _ForwardIterator>
1299typename regex_traits<_CharT>::char_class_type
1300regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1301 _ForwardIterator __l,
1302 bool __icase, wchar_t) const
1303{
1304 string_type __s(__f, __l);
1305 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1306 string __n;
1307 __n.reserve(__s.size());
1308 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1309 __i != __e; ++__i)
1310 {
1311 if (static_cast<unsigned>(*__i) >= 127)
1312 return char_class_type();
1313 __n.push_back(char(*__i));
1314 }
1315 return __get_classname(__n.c_str(), __icase);
1316}
Louis Dionne89258142021-08-23 15:32:36 -04001317#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnant40b45e12010-06-21 21:01:43 +00001318
1319template <class _CharT>
1320bool
1321regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
1322{
1323 if (__ct_->is(__m, __c))
1324 return true;
1325 return (__c == '_' && (__m & __regex_word));
1326}
1327
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001328inline _LIBCPP_INLINE_VISIBILITY
Nikolas Klauser7b8c0502022-07-08 18:17:26 +02001329bool __is_07(unsigned char __c)
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001330{
Nikolas Klauser7b8c0502022-07-08 18:17:26 +02001331 return (__c & 0xF8u) ==
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001332#if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
1333 0xF0;
1334#else
1335 0x30;
1336#endif
1337}
1338
1339inline _LIBCPP_INLINE_VISIBILITY
Nikolas Klauser7b8c0502022-07-08 18:17:26 +02001340bool __is_89(unsigned char __c)
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001341{
Nikolas Klauser7b8c0502022-07-08 18:17:26 +02001342 return (__c & 0xFEu) ==
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001343#if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
1344 0xF8;
1345#else
1346 0x38;
1347#endif
1348}
1349
1350inline _LIBCPP_INLINE_VISIBILITY
Nikolas Klauser7b8c0502022-07-08 18:17:26 +02001351unsigned char __to_lower(unsigned char __c)
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001352{
1353#if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
Muiez Ahmed42e738f2022-08-30 14:18:44 -04001354 return __c & 0xBF;
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001355#else
Nikolas Klauser7b8c0502022-07-08 18:17:26 +02001356 return __c | 0x20;
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001357#endif
1358}
1359
Howard Hinnant40b45e12010-06-21 21:01:43 +00001360template <class _CharT>
1361int
Marshall Clowef420192013-10-21 15:43:25 +00001362regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
Howard Hinnant40b45e12010-06-21 21:01:43 +00001363{
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001364 if (__is_07(__ch)) // '0' <= __ch && __ch <= '7'
Howard Hinnant40b45e12010-06-21 21:01:43 +00001365 return __ch - '0';
1366 if (__radix != 8)
1367 {
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001368 if (__is_89(__ch)) // '8' <= __ch && __ch <= '9'
Howard Hinnant40b45e12010-06-21 21:01:43 +00001369 return __ch - '0';
1370 if (__radix == 16)
1371 {
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001372 __ch = __to_lower(__ch); // tolower
Howard Hinnant40b45e12010-06-21 21:01:43 +00001373 if ('a' <= __ch && __ch <= 'f')
Howard Hinnant6c891682010-06-24 21:28:00 +00001374 return __ch - ('a' - 10);
Howard Hinnant40b45e12010-06-21 21:01:43 +00001375 }
1376 }
1377 return -1;
1378}
1379
Louis Dionne89258142021-08-23 15:32:36 -04001380#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnant40b45e12010-06-21 21:01:43 +00001381template <class _CharT>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001382inline
Howard Hinnant40b45e12010-06-21 21:01:43 +00001383int
Marshall Clowef420192013-10-21 15:43:25 +00001384regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
Howard Hinnant40b45e12010-06-21 21:01:43 +00001385{
Marshall Clowef420192013-10-21 15:43:25 +00001386 return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
Howard Hinnant40b45e12010-06-21 21:01:43 +00001387}
Louis Dionne89258142021-08-23 15:32:36 -04001388#endif
Howard Hinnant40b45e12010-06-21 21:01:43 +00001389
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001390template <class _CharT> class __node;
1391
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001392template <class _BidirectionalIterator> class _LIBCPP_TEMPLATE_VIS sub_match;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001393
Howard Hinnant70d27852010-07-27 01:25:38 +00001394template <class _BidirectionalIterator,
1395 class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001396class _LIBCPP_TEMPLATE_VIS match_results;
Howard Hinnant70d27852010-07-27 01:25:38 +00001397
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001398template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001399struct __state
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001400{
1401 enum
1402 {
1403 __end_state = -1000,
1404 __consume_input, // -999
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001405 __begin_marked_expr, // -998
1406 __end_marked_expr, // -997
Howard Hinnant5bf96132010-07-08 17:43:58 +00001407 __pop_state, // -996
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001408 __accept_and_consume, // -995
1409 __accept_but_not_consume, // -994
1410 __reject, // -993
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001411 __split,
1412 __repeat
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001413 };
1414
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001415 int __do_;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001416 const _CharT* __first_;
1417 const _CharT* __current_;
1418 const _CharT* __last_;
1419 vector<sub_match<const _CharT*> > __sub_matches_;
1420 vector<pair<size_t, const _CharT*> > __loop_data_;
1421 const __node<_CharT>* __node_;
1422 regex_constants::match_flag_type __flags_;
Howard Hinnant066ba512011-03-26 20:02:27 +00001423 bool __at_first_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001424
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001425 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001426 __state()
1427 : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
1428 __node_(nullptr), __flags_() {}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001429};
1430
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001431// __node
Howard Hinnant67ad2132010-06-29 18:37:43 +00001432
1433template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001434class __node
Howard Hinnant67ad2132010-06-29 18:37:43 +00001435{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001436 __node(const __node&);
1437 __node& operator=(const __node&);
Howard Hinnant67ad2132010-06-29 18:37:43 +00001438public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001439 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant67ad2132010-06-29 18:37:43 +00001440
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001441 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001442 __node() {}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001443 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001444 virtual ~__node() {}
Howard Hinnant67ad2132010-06-29 18:37:43 +00001445
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001446 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierb41db9a2018-10-01 01:59:37 +00001447 virtual void __exec(__state&) const {}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001448 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierb41db9a2018-10-01 01:59:37 +00001449 virtual void __exec_split(bool, __state&) const {}
Howard Hinnant67ad2132010-06-29 18:37:43 +00001450};
1451
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001452// __end_state
Howard Hinnant67ad2132010-06-29 18:37:43 +00001453
1454template <class _CharT>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001455class __end_state
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001456 : public __node<_CharT>
Howard Hinnant67ad2132010-06-29 18:37:43 +00001457{
Howard Hinnant67ad2132010-06-29 18:37:43 +00001458public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001459 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant67ad2132010-06-29 18:37:43 +00001460
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001461 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001462 __end_state() {}
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00001463
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001464 virtual void __exec(__state&) const;
Howard Hinnant67ad2132010-06-29 18:37:43 +00001465};
1466
1467template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001468void
1469__end_state<_CharT>::__exec(__state& __s) const
Howard Hinnant93ef6552010-06-30 20:30:19 +00001470{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001471 __s.__do_ = __state::__end_state;
Howard Hinnant93ef6552010-06-30 20:30:19 +00001472}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001473
1474// __has_one_state
1475
Howard Hinnant93ef6552010-06-30 20:30:19 +00001476template <class _CharT>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001477class __has_one_state
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001478 : public __node<_CharT>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00001479{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001480 __node<_CharT>* __first_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001481
1482public:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001483 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001484 explicit __has_one_state(__node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001485 : __first_(__s) {}
1486
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001487 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001488 __node<_CharT>* first() const {return __first_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001489 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001490 __node<_CharT>*& first() {return __first_;}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001491};
1492
1493// __owns_one_state
1494
1495template <class _CharT>
1496class __owns_one_state
1497 : public __has_one_state<_CharT>
1498{
1499 typedef __has_one_state<_CharT> base;
1500
1501public:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001502 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001503 explicit __owns_one_state(__node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001504 : base(__s) {}
1505
Nikolas Klauseraa3a6cd2022-08-24 02:14:29 +02001506 ~__owns_one_state() override;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001507};
1508
1509template <class _CharT>
1510__owns_one_state<_CharT>::~__owns_one_state()
1511{
1512 delete this->first();
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00001513}
1514
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001515// __empty_state
1516
1517template <class _CharT>
1518class __empty_state
1519 : public __owns_one_state<_CharT>
1520{
1521 typedef __owns_one_state<_CharT> base;
1522
1523public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001524 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001525
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001526 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001527 explicit __empty_state(__node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001528 : base(__s) {}
1529
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001530 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001531};
1532
1533template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001534void
1535__empty_state<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001536{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001537 __s.__do_ = __state::__accept_but_not_consume;
1538 __s.__node_ = this->first();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001539}
1540
1541// __empty_non_own_state
1542
1543template <class _CharT>
1544class __empty_non_own_state
1545 : public __has_one_state<_CharT>
1546{
1547 typedef __has_one_state<_CharT> base;
1548
1549public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001550 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001551
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001552 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001553 explicit __empty_non_own_state(__node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001554 : base(__s) {}
1555
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001556 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001557};
1558
1559template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001560void
1561__empty_non_own_state<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001562{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001563 __s.__do_ = __state::__accept_but_not_consume;
1564 __s.__node_ = this->first();
1565}
1566
1567// __repeat_one_loop
1568
1569template <class _CharT>
1570class __repeat_one_loop
1571 : public __has_one_state<_CharT>
1572{
1573 typedef __has_one_state<_CharT> base;
1574
1575public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001576 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001577
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001578 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001579 explicit __repeat_one_loop(__node<_CharT>* __s)
1580 : base(__s) {}
1581
1582 virtual void __exec(__state&) const;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001583};
1584
1585template <class _CharT>
1586void
1587__repeat_one_loop<_CharT>::__exec(__state& __s) const
1588{
1589 __s.__do_ = __state::__repeat;
1590 __s.__node_ = this->first();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001591}
1592
1593// __owns_two_states
1594
1595template <class _CharT>
1596class __owns_two_states
1597 : public __owns_one_state<_CharT>
1598{
1599 typedef __owns_one_state<_CharT> base;
1600
1601 base* __second_;
1602
1603public:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001604 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001605 explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001606 : base(__s1), __second_(__s2) {}
1607
1608 virtual ~__owns_two_states();
1609
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001610 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001611 base* second() const {return __second_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001612 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001613 base*& second() {return __second_;}
1614};
1615
1616template <class _CharT>
1617__owns_two_states<_CharT>::~__owns_two_states()
1618{
1619 delete __second_;
1620}
1621
1622// __loop
1623
1624template <class _CharT>
1625class __loop
1626 : public __owns_two_states<_CharT>
1627{
1628 typedef __owns_two_states<_CharT> base;
1629
1630 size_t __min_;
1631 size_t __max_;
1632 unsigned __loop_id_;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001633 unsigned __mexp_begin_;
1634 unsigned __mexp_end_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001635 bool __greedy_;
1636
1637public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001638 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001639
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001640 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001641 explicit __loop(unsigned __loop_id,
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001642 __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
1643 unsigned __mexp_begin, unsigned __mexp_end,
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001644 bool __greedy = true,
1645 size_t __min = 0,
1646 size_t __max = numeric_limits<size_t>::max())
1647 : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001648 __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001649 __greedy_(__greedy) {}
1650
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001651 virtual void __exec(__state& __s) const;
1652 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnant5bf96132010-07-08 17:43:58 +00001653
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001654private:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001655 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001656 void __init_repeat(__state& __s) const
1657 {
1658 __s.__loop_data_[__loop_id_].second = __s.__current_;
1659 for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
1660 {
1661 __s.__sub_matches_[__i].first = __s.__last_;
1662 __s.__sub_matches_[__i].second = __s.__last_;
1663 __s.__sub_matches_[__i].matched = false;
1664 }
1665 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001666};
1667
1668template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001669void
1670__loop<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001671{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001672 if (__s.__do_ == __state::__repeat)
1673 {
1674 bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
1675 bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
1676 if (__do_repeat && __do_alt &&
1677 __s.__loop_data_[__loop_id_].second == __s.__current_)
1678 __do_repeat = false;
1679 if (__do_repeat && __do_alt)
1680 __s.__do_ = __state::__split;
1681 else if (__do_repeat)
1682 {
1683 __s.__do_ = __state::__accept_but_not_consume;
1684 __s.__node_ = this->first();
1685 __init_repeat(__s);
1686 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001687 else
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001688 {
1689 __s.__do_ = __state::__accept_but_not_consume;
1690 __s.__node_ = this->second();
1691 }
1692 }
1693 else
1694 {
Howard Hinnantebbc2b62010-07-27 17:24:17 +00001695 __s.__loop_data_[__loop_id_].first = 0;
1696 bool __do_repeat = 0 < __max_;
1697 bool __do_alt = 0 >= __min_;
1698 if (__do_repeat && __do_alt)
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001699 __s.__do_ = __state::__split;
Howard Hinnantebbc2b62010-07-27 17:24:17 +00001700 else if (__do_repeat)
1701 {
1702 __s.__do_ = __state::__accept_but_not_consume;
1703 __s.__node_ = this->first();
1704 __init_repeat(__s);
1705 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001706 else
1707 {
1708 __s.__do_ = __state::__accept_but_not_consume;
1709 __s.__node_ = this->second();
1710 }
1711 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001712}
1713
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001714template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001715void
1716__loop<_CharT>::__exec_split(bool __second, __state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001717{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001718 __s.__do_ = __state::__accept_but_not_consume;
1719 if (__greedy_ != __second)
Howard Hinnant5bf96132010-07-08 17:43:58 +00001720 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001721 __s.__node_ = this->first();
1722 __init_repeat(__s);
Howard Hinnant5bf96132010-07-08 17:43:58 +00001723 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001724 else
1725 __s.__node_ = this->second();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001726}
1727
Howard Hinnant16d65422010-07-16 19:08:36 +00001728// __alternate
1729
1730template <class _CharT>
1731class __alternate
1732 : public __owns_two_states<_CharT>
1733{
1734 typedef __owns_two_states<_CharT> base;
1735
1736public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001737 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant16d65422010-07-16 19:08:36 +00001738
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001739 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant16d65422010-07-16 19:08:36 +00001740 explicit __alternate(__owns_one_state<_CharT>* __s1,
1741 __owns_one_state<_CharT>* __s2)
1742 : base(__s1, __s2) {}
1743
1744 virtual void __exec(__state& __s) const;
1745 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnant16d65422010-07-16 19:08:36 +00001746};
1747
1748template <class _CharT>
1749void
1750__alternate<_CharT>::__exec(__state& __s) const
1751{
1752 __s.__do_ = __state::__split;
1753}
1754
1755template <class _CharT>
1756void
1757__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
1758{
1759 __s.__do_ = __state::__accept_but_not_consume;
Howard Hinnantcbf2f3f2010-07-22 14:12:20 +00001760 if (__second)
Howard Hinnant16d65422010-07-16 19:08:36 +00001761 __s.__node_ = this->second();
Howard Hinnantcbf2f3f2010-07-22 14:12:20 +00001762 else
1763 __s.__node_ = this->first();
Howard Hinnant16d65422010-07-16 19:08:36 +00001764}
1765
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001766// __begin_marked_subexpression
1767
1768template <class _CharT>
1769class __begin_marked_subexpression
1770 : public __owns_one_state<_CharT>
1771{
1772 typedef __owns_one_state<_CharT> base;
1773
Howard Hinnant5bf96132010-07-08 17:43:58 +00001774 unsigned __mexp_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001775public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001776 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001777
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001778 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001779 explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnant5bf96132010-07-08 17:43:58 +00001780 : base(__s), __mexp_(__mexp) {}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001781
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001782 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001783};
1784
1785template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001786void
1787__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001788{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001789 __s.__do_ = __state::__accept_but_not_consume;
1790 __s.__sub_matches_[__mexp_-1].first = __s.__current_;
1791 __s.__node_ = this->first();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001792}
1793
1794// __end_marked_subexpression
1795
1796template <class _CharT>
1797class __end_marked_subexpression
1798 : public __owns_one_state<_CharT>
1799{
1800 typedef __owns_one_state<_CharT> base;
1801
Howard Hinnant5bf96132010-07-08 17:43:58 +00001802 unsigned __mexp_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001803public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001804 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001805
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001806 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001807 explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnant5bf96132010-07-08 17:43:58 +00001808 : base(__s), __mexp_(__mexp) {}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001809
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001810 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001811};
1812
1813template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001814void
1815__end_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001816{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001817 __s.__do_ = __state::__accept_but_not_consume;
1818 __s.__sub_matches_[__mexp_-1].second = __s.__current_;
1819 __s.__sub_matches_[__mexp_-1].matched = true;
1820 __s.__node_ = this->first();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001821}
1822
Howard Hinnant2a315e32010-07-12 18:16:05 +00001823// __back_ref
1824
1825template <class _CharT>
1826class __back_ref
1827 : public __owns_one_state<_CharT>
1828{
1829 typedef __owns_one_state<_CharT> base;
1830
1831 unsigned __mexp_;
1832public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001833 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant2a315e32010-07-12 18:16:05 +00001834
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001835 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2a315e32010-07-12 18:16:05 +00001836 explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
1837 : base(__s), __mexp_(__mexp) {}
1838
1839 virtual void __exec(__state&) const;
Howard Hinnant2a315e32010-07-12 18:16:05 +00001840};
1841
1842template <class _CharT>
1843void
1844__back_ref<_CharT>::__exec(__state& __s) const
1845{
Marshall Clow360e8392015-08-24 15:57:09 +00001846 if (__mexp_ > __s.__sub_matches_.size())
1847 __throw_regex_error<regex_constants::error_backref>();
Howard Hinnant2a315e32010-07-12 18:16:05 +00001848 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1849 if (__sm.matched)
1850 {
1851 ptrdiff_t __len = __sm.second - __sm.first;
1852 if (__s.__last_ - __s.__current_ >= __len &&
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001853 _VSTD::equal(__sm.first, __sm.second, __s.__current_))
Howard Hinnant2a315e32010-07-12 18:16:05 +00001854 {
1855 __s.__do_ = __state::__accept_but_not_consume;
1856 __s.__current_ += __len;
1857 __s.__node_ = this->first();
1858 }
1859 else
1860 {
1861 __s.__do_ = __state::__reject;
1862 __s.__node_ = nullptr;
1863 }
1864 }
1865 else
1866 {
1867 __s.__do_ = __state::__reject;
1868 __s.__node_ = nullptr;
1869 }
1870}
1871
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001872// __back_ref_icase
1873
1874template <class _CharT, class _Traits>
1875class __back_ref_icase
1876 : public __owns_one_state<_CharT>
1877{
1878 typedef __owns_one_state<_CharT> base;
1879
1880 _Traits __traits_;
1881 unsigned __mexp_;
1882public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001883 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001884
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001885 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001886 explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
1887 __node<_CharT>* __s)
1888 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1889
1890 virtual void __exec(__state&) const;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001891};
1892
1893template <class _CharT, class _Traits>
1894void
1895__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
1896{
1897 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1898 if (__sm.matched)
1899 {
1900 ptrdiff_t __len = __sm.second - __sm.first;
1901 if (__s.__last_ - __s.__current_ >= __len)
1902 {
1903 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1904 {
1905 if (__traits_.translate_nocase(__sm.first[__i]) !=
1906 __traits_.translate_nocase(__s.__current_[__i]))
1907 goto __not_equal;
1908 }
1909 __s.__do_ = __state::__accept_but_not_consume;
1910 __s.__current_ += __len;
1911 __s.__node_ = this->first();
1912 }
1913 else
1914 {
1915 __s.__do_ = __state::__reject;
1916 __s.__node_ = nullptr;
1917 }
1918 }
1919 else
1920 {
1921__not_equal:
1922 __s.__do_ = __state::__reject;
1923 __s.__node_ = nullptr;
1924 }
1925}
1926
1927// __back_ref_collate
1928
1929template <class _CharT, class _Traits>
1930class __back_ref_collate
1931 : public __owns_one_state<_CharT>
1932{
1933 typedef __owns_one_state<_CharT> base;
1934
1935 _Traits __traits_;
1936 unsigned __mexp_;
1937public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001938 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001939
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001940 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001941 explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
1942 __node<_CharT>* __s)
1943 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1944
1945 virtual void __exec(__state&) const;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001946};
1947
1948template <class _CharT, class _Traits>
1949void
1950__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
1951{
1952 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1953 if (__sm.matched)
1954 {
1955 ptrdiff_t __len = __sm.second - __sm.first;
1956 if (__s.__last_ - __s.__current_ >= __len)
1957 {
1958 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1959 {
1960 if (__traits_.translate(__sm.first[__i]) !=
1961 __traits_.translate(__s.__current_[__i]))
1962 goto __not_equal;
1963 }
1964 __s.__do_ = __state::__accept_but_not_consume;
1965 __s.__current_ += __len;
1966 __s.__node_ = this->first();
1967 }
1968 else
1969 {
1970 __s.__do_ = __state::__reject;
1971 __s.__node_ = nullptr;
1972 }
1973 }
1974 else
1975 {
1976__not_equal:
1977 __s.__do_ = __state::__reject;
1978 __s.__node_ = nullptr;
1979 }
1980}
1981
Howard Hinnant70d27852010-07-27 01:25:38 +00001982// __word_boundary
1983
1984template <class _CharT, class _Traits>
1985class __word_boundary
1986 : public __owns_one_state<_CharT>
1987{
1988 typedef __owns_one_state<_CharT> base;
1989
1990 _Traits __traits_;
1991 bool __invert_;
1992public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001993 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant70d27852010-07-27 01:25:38 +00001994
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001995 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70d27852010-07-27 01:25:38 +00001996 explicit __word_boundary(const _Traits& __traits, bool __invert,
1997 __node<_CharT>* __s)
1998 : base(__s), __traits_(__traits), __invert_(__invert) {}
1999
2000 virtual void __exec(__state&) const;
Howard Hinnant70d27852010-07-27 01:25:38 +00002001};
2002
2003template <class _CharT, class _Traits>
2004void
2005__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
2006{
2007 bool __is_word_b = false;
2008 if (__s.__first_ != __s.__last_)
2009 {
2010 if (__s.__current_ == __s.__last_)
2011 {
2012 if (!(__s.__flags_ & regex_constants::match_not_eow))
2013 {
2014 _CharT __c = __s.__current_[-1];
2015 __is_word_b = __c == '_' ||
2016 __traits_.isctype(__c, ctype_base::alnum);
2017 }
2018 }
Howard Hinnant6b2602a2010-07-29 15:17:28 +00002019 else if (__s.__current_ == __s.__first_ &&
2020 !(__s.__flags_ & regex_constants::match_prev_avail))
Howard Hinnant70d27852010-07-27 01:25:38 +00002021 {
2022 if (!(__s.__flags_ & regex_constants::match_not_bow))
2023 {
2024 _CharT __c = *__s.__current_;
2025 __is_word_b = __c == '_' ||
2026 __traits_.isctype(__c, ctype_base::alnum);
2027 }
2028 }
2029 else
2030 {
2031 _CharT __c1 = __s.__current_[-1];
2032 _CharT __c2 = *__s.__current_;
2033 bool __is_c1_b = __c1 == '_' ||
2034 __traits_.isctype(__c1, ctype_base::alnum);
2035 bool __is_c2_b = __c2 == '_' ||
2036 __traits_.isctype(__c2, ctype_base::alnum);
2037 __is_word_b = __is_c1_b != __is_c2_b;
2038 }
2039 }
2040 if (__is_word_b != __invert_)
2041 {
2042 __s.__do_ = __state::__accept_but_not_consume;
2043 __s.__node_ = this->first();
2044 }
2045 else
2046 {
2047 __s.__do_ = __state::__reject;
2048 __s.__node_ = nullptr;
2049 }
2050}
2051
Howard Hinnant066ba512011-03-26 20:02:27 +00002052// __l_anchor
2053
2054template <class _CharT>
Mark de Wevera989cce2020-11-18 18:09:13 +01002055_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
Nikolas Klauser7b8c0502022-07-08 18:17:26 +02002056bool __is_eol(_CharT __c)
Mark de Wevera989cce2020-11-18 18:09:13 +01002057{
Nikolas Klauser7b8c0502022-07-08 18:17:26 +02002058 return __c == '\r' || __c == '\n';
Mark de Wevera989cce2020-11-18 18:09:13 +01002059}
2060
2061template <class _CharT>
2062class __l_anchor_multiline
Howard Hinnant066ba512011-03-26 20:02:27 +00002063 : public __owns_one_state<_CharT>
2064{
2065 typedef __owns_one_state<_CharT> base;
2066
Louis Dionneaf6be622021-07-27 17:30:47 -04002067 bool __multiline_;
Mark de Wevera989cce2020-11-18 18:09:13 +01002068
Howard Hinnant066ba512011-03-26 20:02:27 +00002069public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002070 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant066ba512011-03-26 20:02:27 +00002071
2072 _LIBCPP_INLINE_VISIBILITY
Mark de Wevera989cce2020-11-18 18:09:13 +01002073 __l_anchor_multiline(bool __multiline, __node<_CharT>* __s)
Louis Dionneaf6be622021-07-27 17:30:47 -04002074 : base(__s), __multiline_(__multiline) {}
Howard Hinnant066ba512011-03-26 20:02:27 +00002075
2076 virtual void __exec(__state&) const;
2077};
2078
2079template <class _CharT>
2080void
Mark de Wevera989cce2020-11-18 18:09:13 +01002081__l_anchor_multiline<_CharT>::__exec(__state& __s) const
Howard Hinnant066ba512011-03-26 20:02:27 +00002082{
Marshall Clow54404392015-03-19 17:05:59 +00002083 if (__s.__at_first_ && __s.__current_ == __s.__first_ &&
2084 !(__s.__flags_ & regex_constants::match_not_bol))
Howard Hinnant066ba512011-03-26 20:02:27 +00002085 {
2086 __s.__do_ = __state::__accept_but_not_consume;
2087 __s.__node_ = this->first();
2088 }
Louis Dionneaf6be622021-07-27 17:30:47 -04002089 else if (__multiline_ &&
Mark de Wevera989cce2020-11-18 18:09:13 +01002090 !__s.__at_first_ &&
2091 __is_eol(*_VSTD::prev(__s.__current_)))
2092 {
2093 __s.__do_ = __state::__accept_but_not_consume;
2094 __s.__node_ = this->first();
2095 }
Howard Hinnant066ba512011-03-26 20:02:27 +00002096 else
2097 {
2098 __s.__do_ = __state::__reject;
2099 __s.__node_ = nullptr;
2100 }
2101}
2102
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002103// __r_anchor
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002104
2105template <class _CharT>
Mark de Wevera989cce2020-11-18 18:09:13 +01002106class __r_anchor_multiline
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002107 : public __owns_one_state<_CharT>
2108{
2109 typedef __owns_one_state<_CharT> base;
2110
Louis Dionne6209e9f2022-03-03 13:39:12 -05002111 bool __multiline_;
Mark de Wevera989cce2020-11-18 18:09:13 +01002112
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002113public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002114 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002115
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002116 _LIBCPP_INLINE_VISIBILITY
Mark de Wevera989cce2020-11-18 18:09:13 +01002117 __r_anchor_multiline(bool __multiline, __node<_CharT>* __s)
Louis Dionne6209e9f2022-03-03 13:39:12 -05002118 : base(__s), __multiline_(__multiline) {}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002119
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002120 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002121};
2122
2123template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002124void
Mark de Wevera989cce2020-11-18 18:09:13 +01002125__r_anchor_multiline<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002126{
Marshall Clow54404392015-03-19 17:05:59 +00002127 if (__s.__current_ == __s.__last_ &&
2128 !(__s.__flags_ & regex_constants::match_not_eol))
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002129 {
2130 __s.__do_ = __state::__accept_but_not_consume;
2131 __s.__node_ = this->first();
2132 }
Louis Dionne6209e9f2022-03-03 13:39:12 -05002133 else if (__multiline_ && __is_eol(*__s.__current_))
Mark de Wevera989cce2020-11-18 18:09:13 +01002134 {
2135 __s.__do_ = __state::__accept_but_not_consume;
2136 __s.__node_ = this->first();
2137 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002138 else
2139 {
2140 __s.__do_ = __state::__reject;
2141 __s.__node_ = nullptr;
2142 }
2143}
2144
2145// __match_any
2146
2147template <class _CharT>
2148class __match_any
2149 : public __owns_one_state<_CharT>
2150{
2151 typedef __owns_one_state<_CharT> base;
2152
2153public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002154 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002155
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002156 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002157 __match_any(__node<_CharT>* __s)
2158 : base(__s) {}
2159
2160 virtual void __exec(__state&) const;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002161};
2162
2163template <class _CharT>
2164void
2165__match_any<_CharT>::__exec(__state& __s) const
2166{
2167 if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
2168 {
2169 __s.__do_ = __state::__accept_and_consume;
2170 ++__s.__current_;
2171 __s.__node_ = this->first();
2172 }
2173 else
2174 {
2175 __s.__do_ = __state::__reject;
2176 __s.__node_ = nullptr;
2177 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002178}
2179
Howard Hinnant70d27852010-07-27 01:25:38 +00002180// __match_any_but_newline
2181
2182template <class _CharT>
2183class __match_any_but_newline
2184 : public __owns_one_state<_CharT>
2185{
2186 typedef __owns_one_state<_CharT> base;
2187
2188public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002189 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant70d27852010-07-27 01:25:38 +00002190
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002191 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70d27852010-07-27 01:25:38 +00002192 __match_any_but_newline(__node<_CharT>* __s)
2193 : base(__s) {}
2194
Nikolas Klauseraa3a6cd2022-08-24 02:14:29 +02002195 void __exec(__state&) const override;
Howard Hinnant70d27852010-07-27 01:25:38 +00002196};
2197
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00002198template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
Louis Dionne89258142021-08-23 15:32:36 -04002199#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00002200template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
Louis Dionne89258142021-08-23 15:32:36 -04002201#endif
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00002202
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002203// __match_char
2204
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002205template <class _CharT>
Howard Hinnant67ad2132010-06-29 18:37:43 +00002206class __match_char
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002207 : public __owns_one_state<_CharT>
Howard Hinnant67ad2132010-06-29 18:37:43 +00002208{
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002209 typedef __owns_one_state<_CharT> base;
2210
Howard Hinnant67ad2132010-06-29 18:37:43 +00002211 _CharT __c_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002212
2213 __match_char(const __match_char&);
2214 __match_char& operator=(const __match_char&);
Howard Hinnant67ad2132010-06-29 18:37:43 +00002215public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002216 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant93ef6552010-06-30 20:30:19 +00002217
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002218 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002219 __match_char(_CharT __c, __node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002220 : base(__s), __c_(__c) {}
Howard Hinnant67ad2132010-06-29 18:37:43 +00002221
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002222 virtual void __exec(__state&) const;
Howard Hinnant67ad2132010-06-29 18:37:43 +00002223};
2224
Howard Hinnant93ef6552010-06-30 20:30:19 +00002225template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002226void
2227__match_char<_CharT>::__exec(__state& __s) const
Howard Hinnant93ef6552010-06-30 20:30:19 +00002228{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002229 if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2230 {
2231 __s.__do_ = __state::__accept_and_consume;
2232 ++__s.__current_;
2233 __s.__node_ = this->first();
2234 }
2235 else
2236 {
2237 __s.__do_ = __state::__reject;
2238 __s.__node_ = nullptr;
2239 }
Howard Hinnant93ef6552010-06-30 20:30:19 +00002240}
Howard Hinnant93ef6552010-06-30 20:30:19 +00002241
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002242// __match_char_icase
2243
2244template <class _CharT, class _Traits>
2245class __match_char_icase
2246 : public __owns_one_state<_CharT>
2247{
2248 typedef __owns_one_state<_CharT> base;
2249
2250 _Traits __traits_;
2251 _CharT __c_;
2252
2253 __match_char_icase(const __match_char_icase&);
2254 __match_char_icase& operator=(const __match_char_icase&);
2255public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002256 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002257
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002258 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002259 __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2260 : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2261
2262 virtual void __exec(__state&) const;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002263};
2264
2265template <class _CharT, class _Traits>
2266void
2267__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2268{
2269 if (__s.__current_ != __s.__last_ &&
2270 __traits_.translate_nocase(*__s.__current_) == __c_)
2271 {
2272 __s.__do_ = __state::__accept_and_consume;
2273 ++__s.__current_;
2274 __s.__node_ = this->first();
2275 }
2276 else
2277 {
2278 __s.__do_ = __state::__reject;
2279 __s.__node_ = nullptr;
2280 }
2281}
2282
2283// __match_char_collate
2284
2285template <class _CharT, class _Traits>
2286class __match_char_collate
2287 : public __owns_one_state<_CharT>
2288{
2289 typedef __owns_one_state<_CharT> base;
2290
2291 _Traits __traits_;
2292 _CharT __c_;
2293
2294 __match_char_collate(const __match_char_collate&);
2295 __match_char_collate& operator=(const __match_char_collate&);
2296public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002297 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002298
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002299 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002300 __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2301 : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2302
2303 virtual void __exec(__state&) const;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002304};
2305
2306template <class _CharT, class _Traits>
2307void
2308__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2309{
2310 if (__s.__current_ != __s.__last_ &&
2311 __traits_.translate(*__s.__current_) == __c_)
2312 {
2313 __s.__do_ = __state::__accept_and_consume;
2314 ++__s.__current_;
2315 __s.__node_ = this->first();
2316 }
2317 else
2318 {
2319 __s.__do_ = __state::__reject;
2320 __s.__node_ = nullptr;
2321 }
2322}
2323
Howard Hinnant3034c902010-07-13 21:48:06 +00002324// __bracket_expression
2325
2326template <class _CharT, class _Traits>
2327class __bracket_expression
2328 : public __owns_one_state<_CharT>
2329{
2330 typedef __owns_one_state<_CharT> base;
2331 typedef typename _Traits::string_type string_type;
2332
2333 _Traits __traits_;
2334 vector<_CharT> __chars_;
Howard Hinnant70b3e192010-07-28 17:35:27 +00002335 vector<_CharT> __neg_chars_;
Howard Hinnant3034c902010-07-13 21:48:06 +00002336 vector<pair<string_type, string_type> > __ranges_;
2337 vector<pair<_CharT, _CharT> > __digraphs_;
2338 vector<string_type> __equivalences_;
Dan Albert49f384c2014-07-29 19:23:39 +00002339 typename regex_traits<_CharT>::char_class_type __mask_;
2340 typename regex_traits<_CharT>::char_class_type __neg_mask_;
Howard Hinnant3034c902010-07-13 21:48:06 +00002341 bool __negate_;
2342 bool __icase_;
2343 bool __collate_;
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002344 bool __might_have_digraph_;
Howard Hinnant3034c902010-07-13 21:48:06 +00002345
2346 __bracket_expression(const __bracket_expression&);
2347 __bracket_expression& operator=(const __bracket_expression&);
2348public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002349 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant3034c902010-07-13 21:48:06 +00002350
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002351 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002352 __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2353 bool __negate, bool __icase, bool __collate)
Howard Hinnant70b3e192010-07-28 17:35:27 +00002354 : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2355 __negate_(__negate), __icase_(__icase), __collate_(__collate),
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002356 __might_have_digraph_(__traits_.getloc().name() != "C") {}
Howard Hinnant3034c902010-07-13 21:48:06 +00002357
2358 virtual void __exec(__state&) const;
2359
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002360 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70b3e192010-07-28 17:35:27 +00002361 bool __negated() const {return __negate_;}
2362
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002363 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002364 void __add_char(_CharT __c)
2365 {
2366 if (__icase_)
2367 __chars_.push_back(__traits_.translate_nocase(__c));
2368 else if (__collate_)
2369 __chars_.push_back(__traits_.translate(__c));
2370 else
2371 __chars_.push_back(__c);
2372 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002373 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70b3e192010-07-28 17:35:27 +00002374 void __add_neg_char(_CharT __c)
2375 {
2376 if (__icase_)
2377 __neg_chars_.push_back(__traits_.translate_nocase(__c));
2378 else if (__collate_)
2379 __neg_chars_.push_back(__traits_.translate(__c));
2380 else
2381 __neg_chars_.push_back(__c);
2382 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002383 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002384 void __add_range(string_type __b, string_type __e)
2385 {
2386 if (__collate_)
2387 {
2388 if (__icase_)
2389 {
2390 for (size_t __i = 0; __i < __b.size(); ++__i)
2391 __b[__i] = __traits_.translate_nocase(__b[__i]);
2392 for (size_t __i = 0; __i < __e.size(); ++__i)
2393 __e[__i] = __traits_.translate_nocase(__e[__i]);
2394 }
2395 else
2396 {
2397 for (size_t __i = 0; __i < __b.size(); ++__i)
2398 __b[__i] = __traits_.translate(__b[__i]);
2399 for (size_t __i = 0; __i < __e.size(); ++__i)
2400 __e[__i] = __traits_.translate(__e[__i]);
2401 }
2402 __ranges_.push_back(make_pair(
2403 __traits_.transform(__b.begin(), __b.end()),
2404 __traits_.transform(__e.begin(), __e.end())));
2405 }
2406 else
2407 {
2408 if (__b.size() != 1 || __e.size() != 1)
Marshall Clowa5212112019-05-28 22:42:32 +00002409 __throw_regex_error<regex_constants::error_range>();
Howard Hinnant3034c902010-07-13 21:48:06 +00002410 if (__icase_)
2411 {
2412 __b[0] = __traits_.translate_nocase(__b[0]);
2413 __e[0] = __traits_.translate_nocase(__e[0]);
2414 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002415 __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
Howard Hinnant3034c902010-07-13 21:48:06 +00002416 }
2417 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002418 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002419 void __add_digraph(_CharT __c1, _CharT __c2)
2420 {
2421 if (__icase_)
2422 __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
2423 __traits_.translate_nocase(__c2)));
2424 else if (__collate_)
2425 __digraphs_.push_back(make_pair(__traits_.translate(__c1),
2426 __traits_.translate(__c2)));
2427 else
2428 __digraphs_.push_back(make_pair(__c1, __c2));
2429 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002430 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002431 void __add_equivalence(const string_type& __s)
2432 {__equivalences_.push_back(__s);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002433 _LIBCPP_INLINE_VISIBILITY
Dan Albert49f384c2014-07-29 19:23:39 +00002434 void __add_class(typename regex_traits<_CharT>::char_class_type __mask)
Howard Hinnant3034c902010-07-13 21:48:06 +00002435 {__mask_ |= __mask;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002436 _LIBCPP_INLINE_VISIBILITY
Dan Albert49f384c2014-07-29 19:23:39 +00002437 void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask)
Howard Hinnant70b3e192010-07-28 17:35:27 +00002438 {__neg_mask_ |= __mask;}
Howard Hinnant3034c902010-07-13 21:48:06 +00002439};
2440
2441template <class _CharT, class _Traits>
2442void
2443__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2444{
2445 bool __found = false;
2446 unsigned __consumed = 0;
2447 if (__s.__current_ != __s.__last_)
2448 {
2449 ++__consumed;
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002450 if (__might_have_digraph_)
Howard Hinnant3034c902010-07-13 21:48:06 +00002451 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002452 const _CharT* __next = _VSTD::next(__s.__current_);
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002453 if (__next != __s.__last_)
Howard Hinnant3034c902010-07-13 21:48:06 +00002454 {
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002455 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2456 if (__icase_)
Howard Hinnant3034c902010-07-13 21:48:06 +00002457 {
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002458 __ch2.first = __traits_.translate_nocase(__ch2.first);
2459 __ch2.second = __traits_.translate_nocase(__ch2.second);
2460 }
2461 else if (__collate_)
2462 {
2463 __ch2.first = __traits_.translate(__ch2.first);
2464 __ch2.second = __traits_.translate(__ch2.second);
2465 }
2466 if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2467 {
2468 // __ch2 is a digraph in this locale
2469 ++__consumed;
2470 for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2471 {
2472 if (__ch2 == __digraphs_[__i])
2473 {
2474 __found = true;
2475 goto __exit;
2476 }
2477 }
2478 if (__collate_ && !__ranges_.empty())
2479 {
2480 string_type __s2 = __traits_.transform(&__ch2.first,
2481 &__ch2.first + 2);
2482 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2483 {
2484 if (__ranges_[__i].first <= __s2 &&
2485 __s2 <= __ranges_[__i].second)
2486 {
2487 __found = true;
2488 goto __exit;
2489 }
2490 }
2491 }
2492 if (!__equivalences_.empty())
2493 {
2494 string_type __s2 = __traits_.transform_primary(&__ch2.first,
2495 &__ch2.first + 2);
2496 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2497 {
2498 if (__s2 == __equivalences_[__i])
2499 {
2500 __found = true;
2501 goto __exit;
2502 }
2503 }
2504 }
2505 if (__traits_.isctype(__ch2.first, __mask_) &&
2506 __traits_.isctype(__ch2.second, __mask_))
Howard Hinnant3034c902010-07-13 21:48:06 +00002507 {
2508 __found = true;
2509 goto __exit;
2510 }
Howard Hinnant70b3e192010-07-28 17:35:27 +00002511 if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2512 !__traits_.isctype(__ch2.second, __neg_mask_))
2513 {
2514 __found = true;
2515 goto __exit;
2516 }
Howard Hinnant3034c902010-07-13 21:48:06 +00002517 goto __exit;
2518 }
Howard Hinnant3034c902010-07-13 21:48:06 +00002519 }
2520 }
2521 // test *__s.__current_ as not a digraph
2522 _CharT __ch = *__s.__current_;
2523 if (__icase_)
2524 __ch = __traits_.translate_nocase(__ch);
2525 else if (__collate_)
2526 __ch = __traits_.translate(__ch);
2527 for (size_t __i = 0; __i < __chars_.size(); ++__i)
2528 {
2529 if (__ch == __chars_[__i])
2530 {
2531 __found = true;
2532 goto __exit;
2533 }
2534 }
Louis Dionne9023f022018-08-24 14:10:28 +00002535 // When there's at least one of __neg_chars_ and __neg_mask_, the set
2536 // of "__found" chars is
Marshall Clow42af8d92017-10-18 16:49:22 +00002537 // union(complement(union(__neg_chars_, __neg_mask_)),
2538 // other cases...)
2539 //
Louis Dionne9023f022018-08-24 14:10:28 +00002540 // It doesn't make sense to check this when there are no __neg_chars_
2541 // and no __neg_mask_.
2542 if (!(__neg_mask_ == 0 && __neg_chars_.empty()))
Howard Hinnant70b3e192010-07-28 17:35:27 +00002543 {
Louis Dionne9023f022018-08-24 14:10:28 +00002544 const bool __in_neg_mask = __traits_.isctype(__ch, __neg_mask_);
Marshall Clow42af8d92017-10-18 16:49:22 +00002545 const bool __in_neg_chars =
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05002546 _VSTD::find(__neg_chars_.begin(), __neg_chars_.end(), __ch) !=
Marshall Clow42af8d92017-10-18 16:49:22 +00002547 __neg_chars_.end();
2548 if (!(__in_neg_mask || __in_neg_chars))
2549 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00002550 __found = true;
2551 goto __exit;
Marshall Clow42af8d92017-10-18 16:49:22 +00002552 }
Howard Hinnant70b3e192010-07-28 17:35:27 +00002553 }
Howard Hinnant3034c902010-07-13 21:48:06 +00002554 if (!__ranges_.empty())
2555 {
2556 string_type __s2 = __collate_ ?
2557 __traits_.transform(&__ch, &__ch + 1) :
2558 string_type(1, __ch);
2559 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2560 {
2561 if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2562 {
2563 __found = true;
2564 goto __exit;
2565 }
2566 }
2567 }
2568 if (!__equivalences_.empty())
2569 {
2570 string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2571 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2572 {
2573 if (__s2 == __equivalences_[__i])
2574 {
2575 __found = true;
2576 goto __exit;
2577 }
2578 }
2579 }
2580 if (__traits_.isctype(__ch, __mask_))
Howard Hinnant70b3e192010-07-28 17:35:27 +00002581 {
Howard Hinnant3034c902010-07-13 21:48:06 +00002582 __found = true;
Howard Hinnant70b3e192010-07-28 17:35:27 +00002583 goto __exit;
2584 }
Howard Hinnant3034c902010-07-13 21:48:06 +00002585 }
2586 else
2587 __found = __negate_; // force reject
2588__exit:
2589 if (__found != __negate_)
2590 {
Howard Hinnant3034c902010-07-13 21:48:06 +00002591 __s.__do_ = __state::__accept_and_consume;
2592 __s.__current_ += __consumed;
2593 __s.__node_ = this->first();
2594 }
2595 else
2596 {
2597 __s.__do_ = __state::__reject;
2598 __s.__node_ = nullptr;
2599 }
2600}
2601
Howard Hinnant944510a2011-06-14 19:58:17 +00002602template <class _CharT, class _Traits> class __lookahead;
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002603
Howard Hinnant6c891682010-06-24 21:28:00 +00002604template <class _CharT, class _Traits = regex_traits<_CharT> >
Richard Smith256954d2020-11-11 17:12:18 -08002605 class _LIBCPP_TEMPLATE_VIS basic_regex;
2606
2607typedef basic_regex<char> regex;
Louis Dionne89258142021-08-23 15:32:36 -04002608#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Richard Smith256954d2020-11-11 17:12:18 -08002609typedef basic_regex<wchar_t> wregex;
Louis Dionne89258142021-08-23 15:32:36 -04002610#endif
Richard Smith256954d2020-11-11 17:12:18 -08002611
2612template <class _CharT, class _Traits>
2613class
2614 _LIBCPP_TEMPLATE_VIS
2615 _LIBCPP_PREFERRED_NAME(regex)
Louis Dionne89258142021-08-23 15:32:36 -04002616 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wregex))
Richard Smith256954d2020-11-11 17:12:18 -08002617 basic_regex
Howard Hinnant6c891682010-06-24 21:28:00 +00002618{
2619public:
2620 // types:
2621 typedef _CharT value_type;
Hubert Tong1f1ae9c2016-08-02 21:34:48 +00002622 typedef _Traits traits_type;
2623 typedef typename _Traits::string_type string_type;
Howard Hinnant6c891682010-06-24 21:28:00 +00002624 typedef regex_constants::syntax_option_type flag_type;
2625 typedef typename _Traits::locale_type locale_type;
2626
2627private:
2628 _Traits __traits_;
2629 flag_type __flags_;
2630 unsigned __marked_count_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002631 unsigned __loop_count_;
Howard Hinnant67ad2132010-06-29 18:37:43 +00002632 int __open_count_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002633 shared_ptr<__empty_state<_CharT> > __start_;
2634 __owns_one_state<_CharT>* __end_;
2635
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002636 typedef _VSTD::__state<_CharT> __state;
2637 typedef _VSTD::__node<_CharT> __node;
Howard Hinnant6c891682010-06-24 21:28:00 +00002638
2639public:
2640 // constants:
Howard Hinnant5ddd33c2012-07-21 01:31:58 +00002641 static const regex_constants::syntax_option_type icase = regex_constants::icase;
2642 static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2643 static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
2644 static const regex_constants::syntax_option_type collate = regex_constants::collate;
2645 static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2646 static const regex_constants::syntax_option_type basic = regex_constants::basic;
2647 static const regex_constants::syntax_option_type extended = regex_constants::extended;
2648 static const regex_constants::syntax_option_type awk = regex_constants::awk;
2649 static const regex_constants::syntax_option_type grep = regex_constants::grep;
2650 static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
Mark de Wevera989cce2020-11-18 18:09:13 +01002651 static const regex_constants::syntax_option_type multiline = regex_constants::multiline;
Howard Hinnant6c891682010-06-24 21:28:00 +00002652
2653 // construct/copy/destroy:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002654 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002655 basic_regex()
Marshall Clow88a30872019-03-28 17:30:23 +00002656 : __flags_(regex_constants::ECMAScript), __marked_count_(0), __loop_count_(0), __open_count_(0),
Bruce Mitchener170d8972020-11-24 12:53:53 -05002657 __end_(nullptr)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002658 {}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002659 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002660 explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002661 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Bruce Mitchener170d8972020-11-24 12:53:53 -05002662 __end_(nullptr)
Marshall Clow88a30872019-03-28 17:30:23 +00002663 {
Mark de Wevera0ad9762019-11-09 17:01:37 +01002664 __init(__p, __p + __traits_.length(__p));
Marshall Clow88a30872019-03-28 17:30:23 +00002665 }
2666
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002667 _LIBCPP_INLINE_VISIBILITY
Hubert Tong19662862016-08-07 22:26:04 +00002668 basic_regex(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002669 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Bruce Mitchener170d8972020-11-24 12:53:53 -05002670 __end_(nullptr)
Marshall Clow88a30872019-03-28 17:30:23 +00002671 {
Mark de Wevera0ad9762019-11-09 17:01:37 +01002672 __init(__p, __p + __len);
Marshall Clow88a30872019-03-28 17:30:23 +00002673 }
2674
Howard Hinnant126da6a2010-07-27 22:20:32 +00002675// basic_regex(const basic_regex&) = default;
2676// basic_regex(basic_regex&&) = default;
Howard Hinnant6c891682010-06-24 21:28:00 +00002677 template <class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002678 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002679 explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2680 flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002681 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Bruce Mitchener170d8972020-11-24 12:53:53 -05002682 __end_(nullptr)
Marshall Clow88a30872019-03-28 17:30:23 +00002683 {
Mark de Wevera0ad9762019-11-09 17:01:37 +01002684 __init(__p.begin(), __p.end());
Marshall Clow88a30872019-03-28 17:30:23 +00002685 }
2686
Howard Hinnant6c891682010-06-24 21:28:00 +00002687 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002688 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002689 basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2690 flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002691 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Bruce Mitchener170d8972020-11-24 12:53:53 -05002692 __end_(nullptr)
Marshall Clow88a30872019-03-28 17:30:23 +00002693 {
Mark de Wevera0ad9762019-11-09 17:01:37 +01002694 __init(__first, __last);
Marshall Clow88a30872019-03-28 17:30:23 +00002695 }
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002696#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002697 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002698 basic_regex(initializer_list<value_type> __il,
2699 flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002700 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Bruce Mitchener170d8972020-11-24 12:53:53 -05002701 __end_(nullptr)
Marshall Clow88a30872019-03-28 17:30:23 +00002702 {
Mark de Wevera0ad9762019-11-09 17:01:37 +01002703 __init(__il.begin(), __il.end());
Marshall Clow88a30872019-03-28 17:30:23 +00002704 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002705#endif // _LIBCPP_CXX03_LANG
Howard Hinnant6c891682010-06-24 21:28:00 +00002706
Howard Hinnant997621e2010-08-13 18:11:23 +00002707// ~basic_regex() = default;
Howard Hinnant6c891682010-06-24 21:28:00 +00002708
Howard Hinnant126da6a2010-07-27 22:20:32 +00002709// basic_regex& operator=(const basic_regex&) = default;
2710// basic_regex& operator=(basic_regex&&) = default;
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002711 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002712 basic_regex& operator=(const value_type* __p)
2713 {return assign(__p);}
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002714#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002715 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002716 basic_regex& operator=(initializer_list<value_type> __il)
2717 {return assign(__il);}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002718#endif // _LIBCPP_CXX03_LANG
Howard Hinnant6c891682010-06-24 21:28:00 +00002719 template <class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002720 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002721 basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2722 {return assign(__p);}
Howard Hinnant6c891682010-06-24 21:28:00 +00002723
2724 // assign:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002725 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002726 basic_regex& assign(const basic_regex& __that)
2727 {return *this = __that;}
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002728#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant5ddd33c2012-07-21 01:31:58 +00002729 _LIBCPP_INLINE_VISIBILITY
2730 basic_regex& assign(basic_regex&& __that) _NOEXCEPT
2731 {return *this = _VSTD::move(__that);}
2732#endif
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002733 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002734 basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2735 {return assign(__p, __p + __traits_.length(__p), __f);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002736 _LIBCPP_INLINE_VISIBILITY
Marshall Clowd4028932019-09-25 16:40:30 +00002737 basic_regex& assign(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
Howard Hinnant997621e2010-08-13 18:11:23 +00002738 {return assign(__p, __p + __len, __f);}
Howard Hinnant6c891682010-06-24 21:28:00 +00002739 template <class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002740 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002741 basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
Howard Hinnant997621e2010-08-13 18:11:23 +00002742 flag_type __f = regex_constants::ECMAScript)
2743 {return assign(__s.begin(), __s.end(), __f);}
2744
Howard Hinnant6c891682010-06-24 21:28:00 +00002745 template <class _InputIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002746 _LIBCPP_INLINE_VISIBILITY
Nikolas Klauser15a63e92022-07-04 22:45:49 +02002747 typename enable_if<__is_exactly_cpp17_input_iterator<_InputIterator>::value, basic_regex&>::type
Howard Hinnant997621e2010-08-13 18:11:23 +00002748 assign(_InputIterator __first, _InputIterator __last,
2749 flag_type __f = regex_constants::ECMAScript)
2750 {
2751 basic_string<_CharT> __t(__first, __last);
2752 return assign(__t.begin(), __t.end(), __f);
2753 }
2754
2755private:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002756 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002757 void __member_init(flag_type __f)
2758 {
2759 __flags_ = __f;
2760 __marked_count_ = 0;
2761 __loop_count_ = 0;
2762 __open_count_ = 0;
2763 __end_ = nullptr;
Howard Hinnant997621e2010-08-13 18:11:23 +00002764 }
2765public:
2766
2767 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002768 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002769 typename enable_if
2770 <
Eric Fiseliercd5a6772019-11-18 01:46:58 -05002771 __is_cpp17_forward_iterator<_ForwardIterator>::value,
Howard Hinnant997621e2010-08-13 18:11:23 +00002772 basic_regex&
2773 >::type
2774 assign(_ForwardIterator __first, _ForwardIterator __last,
2775 flag_type __f = regex_constants::ECMAScript)
2776 {
Marshall Clowce03dc12015-01-13 16:49:52 +00002777 return assign(basic_regex(__first, __last, __f));
Howard Hinnant997621e2010-08-13 18:11:23 +00002778 }
2779
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002780#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002781
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002782 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002783 basic_regex& assign(initializer_list<value_type> __il,
Howard Hinnant997621e2010-08-13 18:11:23 +00002784 flag_type __f = regex_constants::ECMAScript)
2785 {return assign(__il.begin(), __il.end(), __f);}
Howard Hinnant6c891682010-06-24 21:28:00 +00002786
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002787#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002788
Howard Hinnant6c891682010-06-24 21:28:00 +00002789 // const operations:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002790 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002791 unsigned mark_count() const {return __marked_count_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002792 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002793 flag_type flags() const {return __flags_;}
2794
2795 // locale:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002796 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002797 locale_type imbue(locale_type __loc)
2798 {
2799 __member_init(ECMAScript);
2800 __start_.reset();
2801 return __traits_.imbue(__loc);
2802 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002803 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002804 locale_type getloc() const {return __traits_.getloc();}
2805
2806 // swap:
Howard Hinnant997621e2010-08-13 18:11:23 +00002807 void swap(basic_regex& __r);
Howard Hinnant6c891682010-06-24 21:28:00 +00002808
2809private:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002810 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002811 unsigned __loop_count() const {return __loop_count_;}
2812
Mark de Wevera989cce2020-11-18 18:09:13 +01002813 _LIBCPP_INLINE_VISIBILITY
2814 bool __use_multiline() const
2815 {
2816 return __get_grammar(__flags_) == ECMAScript && (__flags_ & multiline);
2817 }
2818
Howard Hinnant6c891682010-06-24 21:28:00 +00002819 template <class _ForwardIterator>
Mark de Wevera0ad9762019-11-09 17:01:37 +01002820 void
2821 __init(_ForwardIterator __first, _ForwardIterator __last);
2822 template <class _ForwardIterator>
Howard Hinnant126da6a2010-07-27 22:20:32 +00002823 _ForwardIterator
2824 __parse(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00002825 template <class _ForwardIterator>
2826 _ForwardIterator
2827 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2828 template <class _ForwardIterator>
2829 _ForwardIterator
2830 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2831 template <class _ForwardIterator>
2832 _ForwardIterator
2833 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2834 template <class _ForwardIterator>
2835 _ForwardIterator
2836 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2837 template <class _ForwardIterator>
2838 _ForwardIterator
2839 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2840 template <class _ForwardIterator>
2841 _ForwardIterator
2842 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2843 template <class _ForwardIterator>
2844 _ForwardIterator
2845 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2846 template <class _ForwardIterator>
2847 _ForwardIterator
2848 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2849 template <class _ForwardIterator>
2850 _ForwardIterator
2851 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2852 template <class _ForwardIterator>
2853 _ForwardIterator
2854 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2855 template <class _ForwardIterator>
2856 _ForwardIterator
2857 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2858 template <class _ForwardIterator>
2859 _ForwardIterator
2860 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2861 template <class _ForwardIterator>
2862 _ForwardIterator
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002863 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnant5bf96132010-07-08 17:43:58 +00002864 __owns_one_state<_CharT>* __s,
2865 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant89a40572010-06-25 20:56:08 +00002866 template <class _ForwardIterator>
2867 _ForwardIterator
Howard Hinnant16d65422010-07-16 19:08:36 +00002868 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2869 __owns_one_state<_CharT>* __s,
2870 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00002871 template <class _ForwardIterator>
2872 _ForwardIterator
Howard Hinnant89a40572010-06-25 20:56:08 +00002873 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2874 template <class _ForwardIterator>
2875 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002876 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2877 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00002878 template <class _ForwardIterator>
2879 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002880 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2881 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00002882 template <class _ForwardIterator>
2883 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002884 __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2885 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00002886 template <class _ForwardIterator>
2887 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002888 __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2889 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00002890 template <class _ForwardIterator>
2891 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002892 __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2893 basic_string<_CharT>& __col_sym);
Howard Hinnant89a40572010-06-25 20:56:08 +00002894 template <class _ForwardIterator>
2895 _ForwardIterator
2896 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
Howard Hinnant67ad2132010-06-29 18:37:43 +00002897 template <class _ForwardIterator>
2898 _ForwardIterator
2899 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2900 template <class _ForwardIterator>
2901 _ForwardIterator
2902 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2903 template <class _ForwardIterator>
2904 _ForwardIterator
2905 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2906 template <class _ForwardIterator>
2907 _ForwardIterator
2908 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2909 template <class _ForwardIterator>
2910 _ForwardIterator
2911 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2912 template <class _ForwardIterator>
2913 _ForwardIterator
2914 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante1053822010-07-22 17:53:24 +00002915 template <class _ForwardIterator>
2916 _ForwardIterator
2917 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2918 template <class _ForwardIterator>
2919 _ForwardIterator
2920 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2921 template <class _ForwardIterator>
2922 _ForwardIterator
2923 __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2924 template <class _ForwardIterator>
2925 _ForwardIterator
2926 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2927 template <class _ForwardIterator>
2928 _ForwardIterator
2929 __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2930 template <class _ForwardIterator>
2931 _ForwardIterator
Howard Hinnant70d27852010-07-27 01:25:38 +00002932 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2933 template <class _ForwardIterator>
2934 _ForwardIterator
2935 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2936 template <class _ForwardIterator>
2937 _ForwardIterator
2938 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2939 template <class _ForwardIterator>
2940 _ForwardIterator
Howard Hinnant70b3e192010-07-28 17:35:27 +00002941 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2942 basic_string<_CharT>* __str = nullptr);
Howard Hinnant70d27852010-07-27 01:25:38 +00002943 template <class _ForwardIterator>
2944 _ForwardIterator
2945 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnanteaf649e2010-07-27 19:53:10 +00002946 template <class _ForwardIterator>
2947 _ForwardIterator
2948 __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2949 template <class _ForwardIterator>
2950 _ForwardIterator
2951 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant70b3e192010-07-28 17:35:27 +00002952 template <class _ForwardIterator>
2953 _ForwardIterator
2954 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2955 basic_string<_CharT>& __str,
2956 __bracket_expression<_CharT, _Traits>* __ml);
2957 template <class _ForwardIterator>
2958 _ForwardIterator
2959 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2960 basic_string<_CharT>* __str = nullptr);
Howard Hinnant6c891682010-06-24 21:28:00 +00002961
Nikolas Klauser7b8c0502022-07-08 18:17:26 +02002962 bool __test_back_ref(_CharT);
Louis Dionnef16eb592020-02-19 15:56:15 -05002963
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002964 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant066ba512011-03-26 20:02:27 +00002965 void __push_l_anchor();
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002966 void __push_r_anchor();
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002967 void __push_match_any();
Howard Hinnant70d27852010-07-27 01:25:38 +00002968 void __push_match_any_but_newline();
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002969 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5bf96132010-07-08 17:43:58 +00002970 void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2971 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2972 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2973 __mexp_begin, __mexp_end);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002974 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70d27852010-07-27 01:25:38 +00002975 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2976 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2977 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2978 __mexp_begin, __mexp_end, false);}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002979 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
2980 size_t __mexp_begin = 0, size_t __mexp_end = 0,
2981 bool __greedy = true);
Howard Hinnant3034c902010-07-13 21:48:06 +00002982 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
Howard Hinnant67ad2132010-06-29 18:37:43 +00002983 void __push_char(value_type __c);
Howard Hinnant2a315e32010-07-12 18:16:05 +00002984 void __push_back_ref(int __i);
Howard Hinnant16d65422010-07-16 19:08:36 +00002985 void __push_alternation(__owns_one_state<_CharT>* __sa,
2986 __owns_one_state<_CharT>* __sb);
Howard Hinnant93ef6552010-06-30 20:30:19 +00002987 void __push_begin_marked_subexpression();
2988 void __push_end_marked_subexpression(unsigned);
Howard Hinnante1053822010-07-22 17:53:24 +00002989 void __push_empty();
Howard Hinnant70d27852010-07-27 01:25:38 +00002990 void __push_word_boundary(bool);
Howard Hinnant3efac712013-07-23 16:18:04 +00002991 void __push_lookahead(const basic_regex&, bool, unsigned);
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002992
Howard Hinnant66423212010-07-14 21:14:52 +00002993 template <class _Allocator>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002994 bool
Howard Hinnant66423212010-07-14 21:14:52 +00002995 __search(const _CharT* __first, const _CharT* __last,
2996 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002997 regex_constants::match_flag_type __flags) const;
2998
Howard Hinnant66423212010-07-14 21:14:52 +00002999 template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003000 bool
Howard Hinnant66423212010-07-14 21:14:52 +00003001 __match_at_start(const _CharT* __first, const _CharT* __last,
3002 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00003003 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant70d27852010-07-27 01:25:38 +00003004 template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003005 bool
Howard Hinnant70d27852010-07-27 01:25:38 +00003006 __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
3007 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00003008 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant66423212010-07-14 21:14:52 +00003009 template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003010 bool
3011 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
Howard Hinnant66423212010-07-14 21:14:52 +00003012 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00003013 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant66423212010-07-14 21:14:52 +00003014 template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003015 bool
Howard Hinnant66423212010-07-14 21:14:52 +00003016 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
3017 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00003018 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003019
Howard Hinnantc834c512011-11-29 18:15:50 +00003020 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00003021 friend
3022 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003023 regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00003024 regex_constants::match_flag_type);
Howard Hinnant6c891682010-06-24 21:28:00 +00003025
Howard Hinnantc834c512011-11-29 18:15:50 +00003026 template <class _Ap, class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00003027 friend
3028 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003029 regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
3030 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant66423212010-07-14 21:14:52 +00003031
Howard Hinnantc834c512011-11-29 18:15:50 +00003032 template <class _Bp, class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00003033 friend
3034 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003035 regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
Howard Hinnant66423212010-07-14 21:14:52 +00003036 regex_constants::match_flag_type);
3037
Howard Hinnantc834c512011-11-29 18:15:50 +00003038 template <class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00003039 friend
3040 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003041 regex_search(const _Cp*, const _Cp*,
3042 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant66423212010-07-14 21:14:52 +00003043
Howard Hinnantc834c512011-11-29 18:15:50 +00003044 template <class _Cp, class _Ap, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00003045 friend
3046 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003047 regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant66423212010-07-14 21:14:52 +00003048 regex_constants::match_flag_type);
3049
Howard Hinnantc834c512011-11-29 18:15:50 +00003050 template <class _ST, class _SA, class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00003051 friend
3052 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003053 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
3054 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant66423212010-07-14 21:14:52 +00003055 regex_constants::match_flag_type __flags);
3056
Howard Hinnantc834c512011-11-29 18:15:50 +00003057 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00003058 friend
3059 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003060 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
3061 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
3062 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant66423212010-07-14 21:14:52 +00003063 regex_constants::match_flag_type __flags);
Howard Hinnant126da6a2010-07-27 22:20:32 +00003064
Howard Hinnant4018c482013-06-29 23:45:43 +00003065 template <class _Iter, class _Ap, class _Cp, class _Tp>
3066 friend
3067 bool
3068 regex_search(__wrap_iter<_Iter> __first,
3069 __wrap_iter<_Iter> __last,
3070 match_results<__wrap_iter<_Iter>, _Ap>& __m,
3071 const basic_regex<_Cp, _Tp>& __e,
3072 regex_constants::match_flag_type __flags);
3073
Howard Hinnant126da6a2010-07-27 22:20:32 +00003074 template <class, class> friend class __lookahead;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003075};
Howard Hinnant6c891682010-06-24 21:28:00 +00003076
Louis Dionned59f8a52021-08-17 11:59:07 -04003077#if _LIBCPP_STD_VER >= 17
Marshall Clow2dce1f42018-05-23 01:57:02 +00003078template <class _ForwardIterator,
Eric Fiseliercd5a6772019-11-18 01:46:58 -05003079 class = typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value, nullptr_t>::type
Marshall Clow2dce1f42018-05-23 01:57:02 +00003080>
3081basic_regex(_ForwardIterator, _ForwardIterator,
3082 regex_constants::syntax_option_type = regex_constants::ECMAScript)
3083 -> basic_regex<typename iterator_traits<_ForwardIterator>::value_type>;
3084#endif
3085
Howard Hinnant6c891682010-06-24 21:28:00 +00003086template <class _CharT, class _Traits>
Howard Hinnant2c45cb42012-12-12 21:14:28 +00003087 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
3088template <class _CharT, class _Traits>
3089 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
3090template <class _CharT, class _Traits>
3091 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
3092template <class _CharT, class _Traits>
3093 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
3094template <class _CharT, class _Traits>
3095 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
3096template <class _CharT, class _Traits>
3097 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
3098template <class _CharT, class _Traits>
3099 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
3100template <class _CharT, class _Traits>
3101 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
3102template <class _CharT, class _Traits>
3103 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
3104template <class _CharT, class _Traits>
3105 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
3106
3107template <class _CharT, class _Traits>
Howard Hinnant997621e2010-08-13 18:11:23 +00003108void
3109basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
Howard Hinnant6c891682010-06-24 21:28:00 +00003110{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003111 using _VSTD::swap;
Howard Hinnant997621e2010-08-13 18:11:23 +00003112 swap(__traits_, __r.__traits_);
3113 swap(__flags_, __r.__flags_);
3114 swap(__marked_count_, __r.__marked_count_);
3115 swap(__loop_count_, __r.__loop_count_);
3116 swap(__open_count_, __r.__open_count_);
3117 swap(__start_, __r.__start_);
3118 swap(__end_, __r.__end_);
Howard Hinnant997621e2010-08-13 18:11:23 +00003119}
3120
3121template <class _CharT, class _Traits>
3122inline _LIBCPP_INLINE_VISIBILITY
3123void
3124swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
3125{
3126 return __x.swap(__y);
Howard Hinnant6c891682010-06-24 21:28:00 +00003127}
3128
Howard Hinnant126da6a2010-07-27 22:20:32 +00003129// __lookahead
3130
3131template <class _CharT, class _Traits>
3132class __lookahead
3133 : public __owns_one_state<_CharT>
3134{
3135 typedef __owns_one_state<_CharT> base;
3136
3137 basic_regex<_CharT, _Traits> __exp_;
Howard Hinnant3efac712013-07-23 16:18:04 +00003138 unsigned __mexp_;
Howard Hinnant126da6a2010-07-27 22:20:32 +00003139 bool __invert_;
3140
3141 __lookahead(const __lookahead&);
3142 __lookahead& operator=(const __lookahead&);
3143public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003144 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant126da6a2010-07-27 22:20:32 +00003145
Howard Hinnant7ca9d942010-09-23 15:13:20 +00003146 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3efac712013-07-23 16:18:04 +00003147 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
Eric Fiseliera75ee262015-07-22 01:29:41 +00003148 : base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {}
Howard Hinnant126da6a2010-07-27 22:20:32 +00003149
3150 virtual void __exec(__state&) const;
Howard Hinnant126da6a2010-07-27 22:20:32 +00003151};
3152
3153template <class _CharT, class _Traits>
3154void
3155__lookahead<_CharT, _Traits>::__exec(__state& __s) const
3156{
3157 match_results<const _CharT*> __m;
3158 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
Tim Shen11113f52016-10-27 21:40:34 +00003159 bool __matched = __exp_.__match_at_start_ecma(
3160 __s.__current_, __s.__last_,
3161 __m,
3162 (__s.__flags_ | regex_constants::match_continuous) &
3163 ~regex_constants::__full_match,
3164 __s.__at_first_ && __s.__current_ == __s.__first_);
Howard Hinnant126da6a2010-07-27 22:20:32 +00003165 if (__matched != __invert_)
3166 {
3167 __s.__do_ = __state::__accept_but_not_consume;
3168 __s.__node_ = this->first();
Howard Hinnant3efac712013-07-23 16:18:04 +00003169 for (unsigned __i = 1; __i < __m.size(); ++__i) {
3170 __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
3171 }
Howard Hinnant126da6a2010-07-27 22:20:32 +00003172 }
3173 else
3174 {
3175 __s.__do_ = __state::__reject;
3176 __s.__node_ = nullptr;
3177 }
3178}
3179
Howard Hinnant6c891682010-06-24 21:28:00 +00003180template <class _CharT, class _Traits>
3181template <class _ForwardIterator>
Mark de Wevera0ad9762019-11-09 17:01:37 +01003182void
3183basic_regex<_CharT, _Traits>::__init(_ForwardIterator __first, _ForwardIterator __last)
3184{
3185 if (__get_grammar(__flags_) == 0) __flags_ |= regex_constants::ECMAScript;
3186 _ForwardIterator __temp = __parse(__first, __last);
3187 if ( __temp != __last)
3188 __throw_regex_error<regex_constants::__re_err_parse>();
3189}
3190
3191template <class _CharT, class _Traits>
3192template <class _ForwardIterator>
Howard Hinnant126da6a2010-07-27 22:20:32 +00003193_ForwardIterator
Howard Hinnant6c891682010-06-24 21:28:00 +00003194basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
3195 _ForwardIterator __last)
3196{
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003197 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00003198 unique_ptr<__node> __h(new __end_state<_CharT>);
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003199 __start_.reset(new __empty_state<_CharT>(__h.get()));
3200 __h.release();
3201 __end_ = __start_.get();
3202 }
Marshall Clow88a30872019-03-28 17:30:23 +00003203 switch (__get_grammar(__flags_))
Howard Hinnant6c891682010-06-24 21:28:00 +00003204 {
3205 case ECMAScript:
Howard Hinnant126da6a2010-07-27 22:20:32 +00003206 __first = __parse_ecma_exp(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003207 break;
3208 case basic:
Howard Hinnant126da6a2010-07-27 22:20:32 +00003209 __first = __parse_basic_reg_exp(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003210 break;
3211 case extended:
Howard Hinnant6c891682010-06-24 21:28:00 +00003212 case awk:
Howard Hinnant70b3e192010-07-28 17:35:27 +00003213 __first = __parse_extended_reg_exp(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003214 break;
3215 case grep:
Howard Hinnant126da6a2010-07-27 22:20:32 +00003216 __first = __parse_grep(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003217 break;
3218 case egrep:
Howard Hinnant126da6a2010-07-27 22:20:32 +00003219 __first = __parse_egrep(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003220 break;
3221 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00003222 __throw_regex_error<regex_constants::__re_err_grammar>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003223 }
Howard Hinnant126da6a2010-07-27 22:20:32 +00003224 return __first;
Howard Hinnant6c891682010-06-24 21:28:00 +00003225}
3226
3227template <class _CharT, class _Traits>
3228template <class _ForwardIterator>
3229_ForwardIterator
3230basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
3231 _ForwardIterator __last)
3232{
3233 if (__first != __last)
3234 {
3235 if (*__first == '^')
3236 {
3237 __push_l_anchor();
3238 ++__first;
3239 }
3240 if (__first != __last)
3241 {
3242 __first = __parse_RE_expression(__first, __last);
3243 if (__first != __last)
3244 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003245 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003246 if (__temp == __last && *__first == '$')
3247 {
3248 __push_r_anchor();
3249 ++__first;
3250 }
3251 }
3252 }
3253 if (__first != __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003254 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003255 }
3256 return __first;
3257}
3258
3259template <class _CharT, class _Traits>
3260template <class _ForwardIterator>
3261_ForwardIterator
Howard Hinnant67ad2132010-06-29 18:37:43 +00003262basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
3263 _ForwardIterator __last)
3264{
Howard Hinnant16d65422010-07-16 19:08:36 +00003265 __owns_one_state<_CharT>* __sa = __end_;
3266 _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
3267 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003268 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant16d65422010-07-16 19:08:36 +00003269 __first = __temp;
3270 while (__first != __last && *__first == '|')
Howard Hinnant67ad2132010-06-29 18:37:43 +00003271 {
Howard Hinnant16d65422010-07-16 19:08:36 +00003272 __owns_one_state<_CharT>* __sb = __end_;
3273 __temp = __parse_ERE_branch(++__first, __last);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003274 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003275 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant16d65422010-07-16 19:08:36 +00003276 __push_alternation(__sa, __sb);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003277 __first = __temp;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003278 }
3279 return __first;
3280}
3281
3282template <class _CharT, class _Traits>
3283template <class _ForwardIterator>
3284_ForwardIterator
3285basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3286 _ForwardIterator __last)
3287{
3288 _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
3289 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003290 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003291 do
3292 {
3293 __first = __temp;
3294 __temp = __parse_ERE_expression(__first, __last);
3295 } while (__temp != __first);
3296 return __first;
3297}
3298
3299template <class _CharT, class _Traits>
3300template <class _ForwardIterator>
3301_ForwardIterator
3302basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3303 _ForwardIterator __last)
3304{
Howard Hinnant16d65422010-07-16 19:08:36 +00003305 __owns_one_state<_CharT>* __e = __end_;
3306 unsigned __mexp_begin = __marked_count_;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003307 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3308 if (__temp == __first && __temp != __last)
3309 {
3310 switch (*__temp)
3311 {
3312 case '^':
3313 __push_l_anchor();
3314 ++__temp;
3315 break;
3316 case '$':
3317 __push_r_anchor();
3318 ++__temp;
3319 break;
3320 case '(':
Howard Hinnant93ef6552010-06-30 20:30:19 +00003321 __push_begin_marked_subexpression();
3322 unsigned __temp_count = __marked_count_;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003323 ++__open_count_;
3324 __temp = __parse_extended_reg_exp(++__temp, __last);
3325 if (__temp == __last || *__temp != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00003326 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant93ef6552010-06-30 20:30:19 +00003327 __push_end_marked_subexpression(__temp_count);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003328 --__open_count_;
3329 ++__temp;
3330 break;
3331 }
3332 }
3333 if (__temp != __first)
Howard Hinnant16d65422010-07-16 19:08:36 +00003334 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3335 __marked_count_+1);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003336 __first = __temp;
3337 return __first;
3338}
3339
3340template <class _CharT, class _Traits>
3341template <class _ForwardIterator>
3342_ForwardIterator
Howard Hinnant6c891682010-06-24 21:28:00 +00003343basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3344 _ForwardIterator __last)
3345{
3346 while (true)
3347 {
3348 _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3349 if (__temp == __first)
3350 break;
3351 __first = __temp;
3352 }
3353 return __first;
3354}
3355
3356template <class _CharT, class _Traits>
3357template <class _ForwardIterator>
3358_ForwardIterator
3359basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3360 _ForwardIterator __last)
3361{
3362 if (__first != __last)
3363 {
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003364 __owns_one_state<_CharT>* __e = __end_;
Howard Hinnant5bf96132010-07-08 17:43:58 +00003365 unsigned __mexp_begin = __marked_count_;
Howard Hinnant6c891682010-06-24 21:28:00 +00003366 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3367 if (__temp != __first)
Howard Hinnant5bf96132010-07-08 17:43:58 +00003368 __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3369 __mexp_begin+1, __marked_count_+1);
Howard Hinnant6c891682010-06-24 21:28:00 +00003370 }
3371 return __first;
3372}
3373
3374template <class _CharT, class _Traits>
3375template <class _ForwardIterator>
3376_ForwardIterator
3377basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3378 _ForwardIterator __last)
3379{
3380 _ForwardIterator __temp = __first;
3381 __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3382 if (__temp == __first)
3383 {
3384 __temp = __parse_Back_open_paren(__first, __last);
3385 if (__temp != __first)
3386 {
Howard Hinnant93ef6552010-06-30 20:30:19 +00003387 __push_begin_marked_subexpression();
3388 unsigned __temp_count = __marked_count_;
Howard Hinnant6c891682010-06-24 21:28:00 +00003389 __first = __parse_RE_expression(__temp, __last);
3390 __temp = __parse_Back_close_paren(__first, __last);
3391 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003392 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant93ef6552010-06-30 20:30:19 +00003393 __push_end_marked_subexpression(__temp_count);
Howard Hinnant6c891682010-06-24 21:28:00 +00003394 __first = __temp;
Howard Hinnant6c891682010-06-24 21:28:00 +00003395 }
3396 else
3397 __first = __parse_BACKREF(__first, __last);
3398 }
3399 return __first;
3400}
3401
3402template <class _CharT, class _Traits>
3403template <class _ForwardIterator>
3404_ForwardIterator
3405basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3406 _ForwardIterator __first,
3407 _ForwardIterator __last)
3408{
Howard Hinnant67ad2132010-06-29 18:37:43 +00003409 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003410 if (__temp == __first)
3411 {
Howard Hinnant67ad2132010-06-29 18:37:43 +00003412 __temp = __parse_QUOTED_CHAR(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003413 if (__temp == __first)
3414 {
Howard Hinnant67ad2132010-06-29 18:37:43 +00003415 if (__temp != __last && *__temp == '.')
Howard Hinnant6c891682010-06-24 21:28:00 +00003416 {
3417 __push_match_any();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003418 ++__temp;
Howard Hinnant6c891682010-06-24 21:28:00 +00003419 }
3420 else
Howard Hinnant67ad2132010-06-29 18:37:43 +00003421 __temp = __parse_bracket_expression(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003422 }
3423 }
Howard Hinnant67ad2132010-06-29 18:37:43 +00003424 __first = __temp;
3425 return __first;
3426}
3427
3428template <class _CharT, class _Traits>
3429template <class _ForwardIterator>
3430_ForwardIterator
3431basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3432 _ForwardIterator __first,
3433 _ForwardIterator __last)
3434{
3435 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3436 if (__temp == __first)
3437 {
3438 __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3439 if (__temp == __first)
3440 {
3441 if (__temp != __last && *__temp == '.')
3442 {
3443 __push_match_any();
3444 ++__temp;
3445 }
3446 else
3447 __temp = __parse_bracket_expression(__first, __last);
3448 }
3449 }
3450 __first = __temp;
Howard Hinnant6c891682010-06-24 21:28:00 +00003451 return __first;
3452}
3453
3454template <class _CharT, class _Traits>
3455template <class _ForwardIterator>
3456_ForwardIterator
3457basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3458 _ForwardIterator __last)
3459{
3460 if (__first != __last)
3461 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003462 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003463 if (__temp != __last)
3464 {
3465 if (*__first == '\\' && *__temp == '(')
3466 __first = ++__temp;
3467 }
3468 }
3469 return __first;
3470}
3471
3472template <class _CharT, class _Traits>
3473template <class _ForwardIterator>
3474_ForwardIterator
3475basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3476 _ForwardIterator __last)
3477{
3478 if (__first != __last)
3479 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003480 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003481 if (__temp != __last)
3482 {
3483 if (*__first == '\\' && *__temp == ')')
3484 __first = ++__temp;
3485 }
3486 }
3487 return __first;
3488}
3489
3490template <class _CharT, class _Traits>
3491template <class _ForwardIterator>
3492_ForwardIterator
3493basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3494 _ForwardIterator __last)
3495{
3496 if (__first != __last)
3497 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003498 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003499 if (__temp != __last)
3500 {
3501 if (*__first == '\\' && *__temp == '{')
3502 __first = ++__temp;
3503 }
3504 }
3505 return __first;
3506}
3507
3508template <class _CharT, class _Traits>
3509template <class _ForwardIterator>
3510_ForwardIterator
3511basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3512 _ForwardIterator __last)
3513{
3514 if (__first != __last)
3515 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003516 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003517 if (__temp != __last)
3518 {
3519 if (*__first == '\\' && *__temp == '}')
3520 __first = ++__temp;
3521 }
3522 }
3523 return __first;
3524}
3525
3526template <class _CharT, class _Traits>
3527template <class _ForwardIterator>
3528_ForwardIterator
3529basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3530 _ForwardIterator __last)
3531{
3532 if (__first != __last)
3533 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003534 _ForwardIterator __temp = _VSTD::next(__first);
Louis Dionnef16eb592020-02-19 15:56:15 -05003535 if (__temp != __last && *__first == '\\' && __test_back_ref(*__temp))
3536 __first = ++__temp;
Howard Hinnant6c891682010-06-24 21:28:00 +00003537 }
3538 return __first;
3539}
3540
3541template <class _CharT, class _Traits>
3542template <class _ForwardIterator>
3543_ForwardIterator
3544basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3545 _ForwardIterator __last)
3546{
3547 if (__first != __last)
3548 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003549 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003550 if (__temp == __last && *__first == '$')
3551 return __first;
3552 // Not called inside a bracket
3553 if (*__first == '.' || *__first == '\\' || *__first == '[')
3554 return __first;
Howard Hinnant89a40572010-06-25 20:56:08 +00003555 __push_char(*__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003556 ++__first;
3557 }
3558 return __first;
3559}
3560
3561template <class _CharT, class _Traits>
3562template <class _ForwardIterator>
3563_ForwardIterator
Howard Hinnant67ad2132010-06-29 18:37:43 +00003564basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3565 _ForwardIterator __last)
3566{
3567 if (__first != __last)
3568 {
3569 switch (*__first)
3570 {
3571 case '^':
3572 case '.':
3573 case '[':
3574 case '$':
3575 case '(':
3576 case '|':
3577 case '*':
3578 case '+':
3579 case '?':
3580 case '{':
3581 case '\\':
3582 break;
3583 case ')':
3584 if (__open_count_ == 0)
3585 {
3586 __push_char(*__first);
3587 ++__first;
3588 }
3589 break;
3590 default:
3591 __push_char(*__first);
3592 ++__first;
3593 break;
3594 }
3595 }
3596 return __first;
3597}
3598
3599template <class _CharT, class _Traits>
3600template <class _ForwardIterator>
3601_ForwardIterator
Howard Hinnant6c891682010-06-24 21:28:00 +00003602basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3603 _ForwardIterator __last)
3604{
3605 if (__first != __last)
3606 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003607 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003608 if (__temp != __last)
3609 {
3610 if (*__first == '\\')
3611 {
3612 switch (*__temp)
3613 {
3614 case '^':
3615 case '.':
3616 case '*':
3617 case '[':
3618 case '$':
3619 case '\\':
Howard Hinnant89a40572010-06-25 20:56:08 +00003620 __push_char(*__temp);
Howard Hinnant6c891682010-06-24 21:28:00 +00003621 __first = ++__temp;
3622 break;
3623 }
3624 }
3625 }
3626 }
3627 return __first;
3628}
3629
3630template <class _CharT, class _Traits>
3631template <class _ForwardIterator>
3632_ForwardIterator
Howard Hinnant67ad2132010-06-29 18:37:43 +00003633basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3634 _ForwardIterator __last)
3635{
3636 if (__first != __last)
3637 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003638 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003639 if (__temp != __last)
3640 {
3641 if (*__first == '\\')
3642 {
3643 switch (*__temp)
3644 {
3645 case '^':
3646 case '.':
3647 case '*':
3648 case '[':
3649 case '$':
3650 case '\\':
3651 case '(':
3652 case ')':
3653 case '|':
3654 case '+':
3655 case '?':
3656 case '{':
Howard Hinnant73072eb2013-06-28 20:31:05 +00003657 case '}':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003658 __push_char(*__temp);
3659 __first = ++__temp;
3660 break;
Howard Hinnant70b3e192010-07-28 17:35:27 +00003661 default:
Marshall Clow88a30872019-03-28 17:30:23 +00003662 if (__get_grammar(__flags_) == awk)
Howard Hinnant70b3e192010-07-28 17:35:27 +00003663 __first = __parse_awk_escape(++__first, __last);
Louis Dionnef16eb592020-02-19 15:56:15 -05003664 else if(__test_back_ref(*__temp))
3665 __first = ++__temp;
Howard Hinnant70b3e192010-07-28 17:35:27 +00003666 break;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003667 }
3668 }
3669 }
3670 }
3671 return __first;
3672}
3673
3674template <class _CharT, class _Traits>
3675template <class _ForwardIterator>
3676_ForwardIterator
Howard Hinnant6c891682010-06-24 21:28:00 +00003677basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003678 _ForwardIterator __last,
Howard Hinnant5bf96132010-07-08 17:43:58 +00003679 __owns_one_state<_CharT>* __s,
3680 unsigned __mexp_begin,
3681 unsigned __mexp_end)
Howard Hinnant6c891682010-06-24 21:28:00 +00003682{
3683 if (__first != __last)
3684 {
Howard Hinnant89a40572010-06-25 20:56:08 +00003685 if (*__first == '*')
Howard Hinnant6c891682010-06-24 21:28:00 +00003686 {
Howard Hinnant5bf96132010-07-08 17:43:58 +00003687 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant6c891682010-06-24 21:28:00 +00003688 ++__first;
3689 }
3690 else
3691 {
3692 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3693 if (__temp != __first)
3694 {
3695 int __min = 0;
3696 __first = __temp;
3697 __temp = __parse_DUP_COUNT(__first, __last, __min);
3698 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003699 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003700 __first = __temp;
3701 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003702 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003703 if (*__first != ',')
3704 {
3705 __temp = __parse_Back_close_brace(__first, __last);
3706 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003707 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant2a315e32010-07-12 18:16:05 +00003708 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3709 true);
Howard Hinnant6c891682010-06-24 21:28:00 +00003710 __first = __temp;
3711 }
3712 else
3713 {
3714 ++__first; // consume ','
3715 int __max = -1;
3716 __first = __parse_DUP_COUNT(__first, __last, __max);
3717 __temp = __parse_Back_close_brace(__first, __last);
3718 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003719 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003720 if (__max == -1)
Howard Hinnant16d65422010-07-16 19:08:36 +00003721 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant6c891682010-06-24 21:28:00 +00003722 else
3723 {
3724 if (__max < __min)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003725 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant2a315e32010-07-12 18:16:05 +00003726 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3727 true);
Howard Hinnant6c891682010-06-24 21:28:00 +00003728 }
3729 __first = __temp;
3730 }
3731 }
3732 }
3733 }
3734 return __first;
3735}
3736
Howard Hinnant89a40572010-06-25 20:56:08 +00003737template <class _CharT, class _Traits>
3738template <class _ForwardIterator>
3739_ForwardIterator
Howard Hinnant67ad2132010-06-29 18:37:43 +00003740basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
Howard Hinnant16d65422010-07-16 19:08:36 +00003741 _ForwardIterator __last,
3742 __owns_one_state<_CharT>* __s,
3743 unsigned __mexp_begin,
3744 unsigned __mexp_end)
Howard Hinnant67ad2132010-06-29 18:37:43 +00003745{
3746 if (__first != __last)
3747 {
Marshall Clow88a30872019-03-28 17:30:23 +00003748 unsigned __grammar = __get_grammar(__flags_);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003749 switch (*__first)
3750 {
3751 case '*':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003752 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003753 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003754 {
3755 ++__first;
3756 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3757 }
3758 else
3759 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003760 break;
3761 case '+':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003762 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003763 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003764 {
3765 ++__first;
3766 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3767 }
3768 else
3769 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003770 break;
3771 case '?':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003772 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003773 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003774 {
3775 ++__first;
3776 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3777 }
3778 else
3779 __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003780 break;
3781 case '{':
3782 {
3783 int __min;
Howard Hinnant16d65422010-07-16 19:08:36 +00003784 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003785 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003786 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003787 __first = __temp;
3788 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003789 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003790 switch (*__first)
3791 {
3792 case '}':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003793 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003794 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003795 {
3796 ++__first;
3797 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3798 }
3799 else
3800 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003801 break;
3802 case ',':
Howard Hinnant72f73582010-08-11 17:04:31 +00003803 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00003804 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003805 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003806 if (*__first == '}')
3807 {
Howard Hinnant67ad2132010-06-29 18:37:43 +00003808 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003809 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003810 {
3811 ++__first;
3812 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3813 }
3814 else
3815 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003816 }
3817 else
3818 {
Howard Hinnant16d65422010-07-16 19:08:36 +00003819 int __max = -1;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003820 __temp = __parse_DUP_COUNT(__first, __last, __max);
3821 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003822 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003823 __first = __temp;
3824 if (__first == __last || *__first != '}')
Marshall Clowc8ccc292015-07-28 13:30:47 +00003825 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003826 ++__first;
3827 if (__max < __min)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003828 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant446e9c62010-07-29 00:36:00 +00003829 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003830 {
3831 ++__first;
3832 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3833 }
3834 else
3835 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003836 }
Howard Hinnant16d65422010-07-16 19:08:36 +00003837 break;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003838 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00003839 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003840 }
3841 }
3842 break;
3843 }
3844 }
3845 return __first;
3846}
3847
3848template <class _CharT, class _Traits>
3849template <class _ForwardIterator>
3850_ForwardIterator
Howard Hinnant89a40572010-06-25 20:56:08 +00003851basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3852 _ForwardIterator __last)
3853{
3854 if (__first != __last && *__first == '[')
3855 {
Howard Hinnant72f73582010-08-11 17:04:31 +00003856 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00003857 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003858 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant3034c902010-07-13 21:48:06 +00003859 bool __negate = false;
Howard Hinnant89a40572010-06-25 20:56:08 +00003860 if (*__first == '^')
3861 {
3862 ++__first;
Howard Hinnant3034c902010-07-13 21:48:06 +00003863 __negate = true;
Howard Hinnant89a40572010-06-25 20:56:08 +00003864 }
Howard Hinnant3034c902010-07-13 21:48:06 +00003865 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3866 // __ml owned by *this
Howard Hinnant89a40572010-06-25 20:56:08 +00003867 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003868 __throw_regex_error<regex_constants::error_brack>();
Marshall Clow88a30872019-03-28 17:30:23 +00003869 if (__get_grammar(__flags_) != ECMAScript && *__first == ']')
Howard Hinnant89a40572010-06-25 20:56:08 +00003870 {
Howard Hinnant3034c902010-07-13 21:48:06 +00003871 __ml->__add_char(']');
Howard Hinnant89a40572010-06-25 20:56:08 +00003872 ++__first;
3873 }
Howard Hinnant3034c902010-07-13 21:48:06 +00003874 __first = __parse_follow_list(__first, __last, __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00003875 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003876 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00003877 if (*__first == '-')
3878 {
Howard Hinnant3034c902010-07-13 21:48:06 +00003879 __ml->__add_char('-');
Howard Hinnant89a40572010-06-25 20:56:08 +00003880 ++__first;
3881 }
3882 if (__first == __last || *__first != ']')
Marshall Clowc8ccc292015-07-28 13:30:47 +00003883 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00003884 ++__first;
3885 }
3886 return __first;
3887}
3888
3889template <class _CharT, class _Traits>
3890template <class _ForwardIterator>
3891_ForwardIterator
3892basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00003893 _ForwardIterator __last,
3894 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant89a40572010-06-25 20:56:08 +00003895{
3896 if (__first != __last)
3897 {
3898 while (true)
3899 {
Howard Hinnant3034c902010-07-13 21:48:06 +00003900 _ForwardIterator __temp = __parse_expression_term(__first, __last,
3901 __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00003902 if (__temp == __first)
3903 break;
3904 __first = __temp;
3905 }
3906 }
3907 return __first;
3908}
3909
3910template <class _CharT, class _Traits>
3911template <class _ForwardIterator>
3912_ForwardIterator
3913basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00003914 _ForwardIterator __last,
3915 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant89a40572010-06-25 20:56:08 +00003916{
3917 if (__first != __last && *__first != ']')
3918 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003919 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant3034c902010-07-13 21:48:06 +00003920 basic_string<_CharT> __start_range;
Howard Hinnant89a40572010-06-25 20:56:08 +00003921 if (__temp != __last && *__first == '[')
3922 {
3923 if (*__temp == '=')
Howard Hinnant3034c902010-07-13 21:48:06 +00003924 return __parse_equivalence_class(++__temp, __last, __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00003925 else if (*__temp == ':')
Howard Hinnant3034c902010-07-13 21:48:06 +00003926 return __parse_character_class(++__temp, __last, __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00003927 else if (*__temp == '.')
Howard Hinnant3034c902010-07-13 21:48:06 +00003928 __first = __parse_collating_symbol(++__temp, __last, __start_range);
Howard Hinnant89a40572010-06-25 20:56:08 +00003929 }
Marshall Clow88a30872019-03-28 17:30:23 +00003930 unsigned __grammar = __get_grammar(__flags_);
Howard Hinnant70b3e192010-07-28 17:35:27 +00003931 if (__start_range.empty())
Howard Hinnant89a40572010-06-25 20:56:08 +00003932 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00003933 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3934 {
3935 if (__grammar == ECMAScript)
3936 __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3937 else
3938 __first = __parse_awk_escape(++__first, __last, &__start_range);
3939 }
3940 else
3941 {
3942 __start_range = *__first;
3943 ++__first;
3944 }
Howard Hinnant89a40572010-06-25 20:56:08 +00003945 }
3946 if (__first != __last && *__first != ']')
3947 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003948 __temp = _VSTD::next(__first);
Howard Hinnant89a40572010-06-25 20:56:08 +00003949 if (__temp != __last && *__first == '-' && *__temp != ']')
3950 {
3951 // parse a range
Howard Hinnant3034c902010-07-13 21:48:06 +00003952 basic_string<_CharT> __end_range;
Howard Hinnant89a40572010-06-25 20:56:08 +00003953 __first = __temp;
3954 ++__temp;
3955 if (__temp != __last && *__first == '[' && *__temp == '.')
Howard Hinnant3034c902010-07-13 21:48:06 +00003956 __first = __parse_collating_symbol(++__temp, __last, __end_range);
Howard Hinnant89a40572010-06-25 20:56:08 +00003957 else
3958 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00003959 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3960 {
3961 if (__grammar == ECMAScript)
3962 __first = __parse_class_escape(++__first, __last,
3963 __end_range, __ml);
3964 else
3965 __first = __parse_awk_escape(++__first, __last,
3966 &__end_range);
3967 }
3968 else
3969 {
3970 __end_range = *__first;
3971 ++__first;
3972 }
Howard Hinnant89a40572010-06-25 20:56:08 +00003973 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003974 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
Howard Hinnant89a40572010-06-25 20:56:08 +00003975 }
Howard Hinnant8ea98242013-08-23 17:37:05 +00003976 else if (!__start_range.empty())
Howard Hinnant3034c902010-07-13 21:48:06 +00003977 {
3978 if (__start_range.size() == 1)
3979 __ml->__add_char(__start_range[0]);
3980 else
3981 __ml->__add_digraph(__start_range[0], __start_range[1]);
3982 }
3983 }
Howard Hinnant8ea98242013-08-23 17:37:05 +00003984 else if (!__start_range.empty())
Howard Hinnant3034c902010-07-13 21:48:06 +00003985 {
3986 if (__start_range.size() == 1)
3987 __ml->__add_char(__start_range[0]);
3988 else
3989 __ml->__add_digraph(__start_range[0], __start_range[1]);
Howard Hinnant89a40572010-06-25 20:56:08 +00003990 }
3991 }
3992 return __first;
3993}
3994
3995template <class _CharT, class _Traits>
3996template <class _ForwardIterator>
3997_ForwardIterator
Howard Hinnant70b3e192010-07-28 17:35:27 +00003998basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
3999 _ForwardIterator __last,
4000 basic_string<_CharT>& __str,
4001 __bracket_expression<_CharT, _Traits>* __ml)
4002{
4003 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004004 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70b3e192010-07-28 17:35:27 +00004005 switch (*__first)
4006 {
4007 case 0:
4008 __str = *__first;
4009 return ++__first;
4010 case 'b':
4011 __str = _CharT(8);
4012 return ++__first;
4013 case 'd':
4014 __ml->__add_class(ctype_base::digit);
4015 return ++__first;
4016 case 'D':
4017 __ml->__add_neg_class(ctype_base::digit);
4018 return ++__first;
4019 case 's':
4020 __ml->__add_class(ctype_base::space);
4021 return ++__first;
4022 case 'S':
4023 __ml->__add_neg_class(ctype_base::space);
4024 return ++__first;
4025 case 'w':
4026 __ml->__add_class(ctype_base::alnum);
4027 __ml->__add_char('_');
4028 return ++__first;
4029 case 'W':
4030 __ml->__add_neg_class(ctype_base::alnum);
4031 __ml->__add_neg_char('_');
4032 return ++__first;
4033 }
4034 __first = __parse_character_escape(__first, __last, &__str);
4035 return __first;
4036}
4037
4038template <class _CharT, class _Traits>
4039template <class _ForwardIterator>
4040_ForwardIterator
4041basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
4042 _ForwardIterator __last,
4043 basic_string<_CharT>* __str)
4044{
4045 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004046 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70b3e192010-07-28 17:35:27 +00004047 switch (*__first)
4048 {
4049 case '\\':
4050 case '"':
4051 case '/':
4052 if (__str)
4053 *__str = *__first;
4054 else
4055 __push_char(*__first);
4056 return ++__first;
4057 case 'a':
4058 if (__str)
4059 *__str = _CharT(7);
4060 else
4061 __push_char(_CharT(7));
4062 return ++__first;
4063 case 'b':
4064 if (__str)
4065 *__str = _CharT(8);
4066 else
4067 __push_char(_CharT(8));
4068 return ++__first;
4069 case 'f':
4070 if (__str)
4071 *__str = _CharT(0xC);
4072 else
4073 __push_char(_CharT(0xC));
4074 return ++__first;
4075 case 'n':
4076 if (__str)
4077 *__str = _CharT(0xA);
4078 else
4079 __push_char(_CharT(0xA));
4080 return ++__first;
4081 case 'r':
4082 if (__str)
4083 *__str = _CharT(0xD);
4084 else
4085 __push_char(_CharT(0xD));
4086 return ++__first;
4087 case 't':
4088 if (__str)
4089 *__str = _CharT(0x9);
4090 else
4091 __push_char(_CharT(0x9));
4092 return ++__first;
4093 case 'v':
4094 if (__str)
4095 *__str = _CharT(0xB);
4096 else
4097 __push_char(_CharT(0xB));
4098 return ++__first;
4099 }
4100 if ('0' <= *__first && *__first <= '7')
4101 {
4102 unsigned __val = *__first - '0';
4103 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
4104 {
4105 __val = 8 * __val + *__first - '0';
4106 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
Howard Hinnanta3096872013-07-02 17:43:31 +00004107 __val = 8 * __val + *__first++ - '0';
Howard Hinnant70b3e192010-07-28 17:35:27 +00004108 }
4109 if (__str)
4110 *__str = _CharT(__val);
4111 else
4112 __push_char(_CharT(__val));
4113 }
4114 else
Marshall Clowc8ccc292015-07-28 13:30:47 +00004115 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70b3e192010-07-28 17:35:27 +00004116 return __first;
4117}
4118
4119template <class _CharT, class _Traits>
4120template <class _ForwardIterator>
4121_ForwardIterator
Howard Hinnant89a40572010-06-25 20:56:08 +00004122basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00004123 _ForwardIterator __last,
4124 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant89a40572010-06-25 20:56:08 +00004125{
4126 // Found [=
4127 // This means =] must exist
4128 value_type _Equal_close[2] = {'=', ']'};
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004129 _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
Howard Hinnant89a40572010-06-25 20:56:08 +00004130 _Equal_close+2);
4131 if (__temp == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004132 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00004133 // [__first, __temp) contains all text in [= ... =]
Howard Hinnant89a40572010-06-25 20:56:08 +00004134 string_type __collate_name =
4135 __traits_.lookup_collatename(__first, __temp);
4136 if (__collate_name.empty())
Marshall Clowc8ccc292015-07-28 13:30:47 +00004137 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant89a40572010-06-25 20:56:08 +00004138 string_type __equiv_name =
4139 __traits_.transform_primary(__collate_name.begin(),
4140 __collate_name.end());
4141 if (!__equiv_name.empty())
Howard Hinnant3034c902010-07-13 21:48:06 +00004142 __ml->__add_equivalence(__equiv_name);
Howard Hinnant89a40572010-06-25 20:56:08 +00004143 else
Howard Hinnant3034c902010-07-13 21:48:06 +00004144 {
4145 switch (__collate_name.size())
4146 {
4147 case 1:
4148 __ml->__add_char(__collate_name[0]);
4149 break;
4150 case 2:
4151 __ml->__add_digraph(__collate_name[0], __collate_name[1]);
4152 break;
4153 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00004154 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant3034c902010-07-13 21:48:06 +00004155 }
4156 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004157 __first = _VSTD::next(__temp, 2);
Howard Hinnant89a40572010-06-25 20:56:08 +00004158 return __first;
4159}
4160
4161template <class _CharT, class _Traits>
4162template <class _ForwardIterator>
4163_ForwardIterator
4164basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00004165 _ForwardIterator __last,
4166 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant89a40572010-06-25 20:56:08 +00004167{
4168 // Found [:
4169 // This means :] must exist
4170 value_type _Colon_close[2] = {':', ']'};
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004171 _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
Howard Hinnant89a40572010-06-25 20:56:08 +00004172 _Colon_close+2);
4173 if (__temp == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004174 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00004175 // [__first, __temp) contains all text in [: ... :]
4176 typedef typename _Traits::char_class_type char_class_type;
4177 char_class_type __class_type =
4178 __traits_.lookup_classname(__first, __temp, __flags_ & icase);
4179 if (__class_type == 0)
Mikhail Maltsev6ef945b2018-01-24 12:45:18 +00004180 __throw_regex_error<regex_constants::error_ctype>();
Howard Hinnant3034c902010-07-13 21:48:06 +00004181 __ml->__add_class(__class_type);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004182 __first = _VSTD::next(__temp, 2);
Howard Hinnant89a40572010-06-25 20:56:08 +00004183 return __first;
4184}
4185
4186template <class _CharT, class _Traits>
4187template <class _ForwardIterator>
4188_ForwardIterator
4189basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00004190 _ForwardIterator __last,
4191 basic_string<_CharT>& __col_sym)
Howard Hinnant89a40572010-06-25 20:56:08 +00004192{
4193 // Found [.
4194 // This means .] must exist
4195 value_type _Dot_close[2] = {'.', ']'};
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004196 _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
Howard Hinnant89a40572010-06-25 20:56:08 +00004197 _Dot_close+2);
4198 if (__temp == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004199 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00004200 // [__first, __temp) contains all text in [. ... .]
Howard Hinnant3034c902010-07-13 21:48:06 +00004201 __col_sym = __traits_.lookup_collatename(__first, __temp);
4202 switch (__col_sym.size())
4203 {
4204 case 1:
4205 case 2:
4206 break;
4207 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00004208 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant3034c902010-07-13 21:48:06 +00004209 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004210 __first = _VSTD::next(__temp, 2);
Howard Hinnant89a40572010-06-25 20:56:08 +00004211 return __first;
4212}
4213
4214template <class _CharT, class _Traits>
4215template <class _ForwardIterator>
4216_ForwardIterator
4217basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4218 _ForwardIterator __last,
4219 int& __c)
4220{
Marshall Clowaa38d972014-01-18 03:40:03 +00004221 if (__first != __last )
Howard Hinnant89a40572010-06-25 20:56:08 +00004222 {
Marshall Clowaa38d972014-01-18 03:40:03 +00004223 int __val = __traits_.value(*__first, 10);
4224 if ( __val != -1 )
Howard Hinnant89a40572010-06-25 20:56:08 +00004225 {
Marshall Clowaa38d972014-01-18 03:40:03 +00004226 __c = __val;
Louis Dionne173f29e2019-05-29 16:01:36 +00004227 for (++__first;
Marshall Clowaa38d972014-01-18 03:40:03 +00004228 __first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
4229 ++__first)
4230 {
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05004231 if (__c >= numeric_limits<int>::max() / 10)
Marshall Clow863ae382017-10-19 17:39:16 +00004232 __throw_regex_error<regex_constants::error_badbrace>();
Marshall Clowaa38d972014-01-18 03:40:03 +00004233 __c *= 10;
4234 __c += __val;
4235 }
Howard Hinnant89a40572010-06-25 20:56:08 +00004236 }
4237 }
4238 return __first;
4239}
4240
Howard Hinnant67ad2132010-06-29 18:37:43 +00004241template <class _CharT, class _Traits>
Howard Hinnante1053822010-07-22 17:53:24 +00004242template <class _ForwardIterator>
4243_ForwardIterator
4244basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4245 _ForwardIterator __last)
4246{
4247 __owns_one_state<_CharT>* __sa = __end_;
4248 _ForwardIterator __temp = __parse_alternative(__first, __last);
4249 if (__temp == __first)
4250 __push_empty();
4251 __first = __temp;
4252 while (__first != __last && *__first == '|')
4253 {
4254 __owns_one_state<_CharT>* __sb = __end_;
4255 __temp = __parse_alternative(++__first, __last);
4256 if (__temp == __first)
4257 __push_empty();
4258 __push_alternation(__sa, __sb);
4259 __first = __temp;
4260 }
4261 return __first;
4262}
4263
4264template <class _CharT, class _Traits>
4265template <class _ForwardIterator>
4266_ForwardIterator
4267basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4268 _ForwardIterator __last)
4269{
4270 while (true)
4271 {
4272 _ForwardIterator __temp = __parse_term(__first, __last);
4273 if (__temp == __first)
4274 break;
4275 __first = __temp;
4276 }
4277 return __first;
4278}
4279
4280template <class _CharT, class _Traits>
4281template <class _ForwardIterator>
4282_ForwardIterator
4283basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4284 _ForwardIterator __last)
4285{
4286 _ForwardIterator __temp = __parse_assertion(__first, __last);
4287 if (__temp == __first)
4288 {
Howard Hinnant70d27852010-07-27 01:25:38 +00004289 __owns_one_state<_CharT>* __e = __end_;
4290 unsigned __mexp_begin = __marked_count_;
Howard Hinnante1053822010-07-22 17:53:24 +00004291 __temp = __parse_atom(__first, __last);
4292 if (__temp != __first)
Howard Hinnant70d27852010-07-27 01:25:38 +00004293 __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4294 __mexp_begin+1, __marked_count_+1);
Howard Hinnante1053822010-07-22 17:53:24 +00004295 }
Howard Hinnant70d27852010-07-27 01:25:38 +00004296 else
4297 __first = __temp;
Howard Hinnante1053822010-07-22 17:53:24 +00004298 return __first;
4299}
4300
4301template <class _CharT, class _Traits>
4302template <class _ForwardIterator>
4303_ForwardIterator
4304basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4305 _ForwardIterator __last)
4306{
4307 if (__first != __last)
4308 {
4309 switch (*__first)
4310 {
4311 case '^':
4312 __push_l_anchor();
4313 ++__first;
4314 break;
4315 case '$':
4316 __push_r_anchor();
4317 ++__first;
4318 break;
4319 case '\\':
4320 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004321 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnante1053822010-07-22 17:53:24 +00004322 if (__temp != __last)
4323 {
4324 if (*__temp == 'b')
4325 {
Howard Hinnant70d27852010-07-27 01:25:38 +00004326 __push_word_boundary(false);
Howard Hinnante1053822010-07-22 17:53:24 +00004327 __first = ++__temp;
4328 }
4329 else if (*__temp == 'B')
4330 {
Howard Hinnant70d27852010-07-27 01:25:38 +00004331 __push_word_boundary(true);
Howard Hinnante1053822010-07-22 17:53:24 +00004332 __first = ++__temp;
4333 }
4334 }
4335 }
4336 break;
4337 case '(':
4338 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004339 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnante1053822010-07-22 17:53:24 +00004340 if (__temp != __last && *__temp == '?')
4341 {
4342 if (++__temp != __last)
4343 {
4344 switch (*__temp)
4345 {
4346 case '=':
Howard Hinnant126da6a2010-07-27 22:20:32 +00004347 {
4348 basic_regex __exp;
4349 __exp.__flags_ = __flags_;
4350 __temp = __exp.__parse(++__temp, __last);
Howard Hinnant3efac712013-07-23 16:18:04 +00004351 unsigned __mexp = __exp.__marked_count_;
4352 __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
4353 __marked_count_ += __mexp;
Howard Hinnant126da6a2010-07-27 22:20:32 +00004354 if (__temp == __last || *__temp != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00004355 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant126da6a2010-07-27 22:20:32 +00004356 __first = ++__temp;
4357 }
Howard Hinnante1053822010-07-22 17:53:24 +00004358 break;
4359 case '!':
Howard Hinnant126da6a2010-07-27 22:20:32 +00004360 {
4361 basic_regex __exp;
4362 __exp.__flags_ = __flags_;
4363 __temp = __exp.__parse(++__temp, __last);
Howard Hinnant3efac712013-07-23 16:18:04 +00004364 unsigned __mexp = __exp.__marked_count_;
4365 __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
4366 __marked_count_ += __mexp;
Howard Hinnant126da6a2010-07-27 22:20:32 +00004367 if (__temp == __last || *__temp != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00004368 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant126da6a2010-07-27 22:20:32 +00004369 __first = ++__temp;
4370 }
Howard Hinnante1053822010-07-22 17:53:24 +00004371 break;
4372 }
4373 }
4374 }
4375 }
4376 break;
4377 }
4378 }
4379 return __first;
4380}
4381
4382template <class _CharT, class _Traits>
4383template <class _ForwardIterator>
4384_ForwardIterator
4385basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4386 _ForwardIterator __last)
4387{
Howard Hinnant70d27852010-07-27 01:25:38 +00004388 if (__first != __last)
4389 {
4390 switch (*__first)
4391 {
4392 case '.':
4393 __push_match_any_but_newline();
4394 ++__first;
4395 break;
4396 case '\\':
4397 __first = __parse_atom_escape(__first, __last);
4398 break;
4399 case '[':
4400 __first = __parse_bracket_expression(__first, __last);
4401 break;
4402 case '(':
4403 {
Howard Hinnant72f73582010-08-11 17:04:31 +00004404 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004405 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004406 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004407 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant70d27852010-07-27 01:25:38 +00004408 if (__temp != __last && *__first == '?' && *__temp == ':')
4409 {
4410 ++__open_count_;
4411 __first = __parse_ecma_exp(++__temp, __last);
4412 if (__first == __last || *__first != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00004413 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004414 --__open_count_;
4415 ++__first;
4416 }
4417 else
4418 {
4419 __push_begin_marked_subexpression();
4420 unsigned __temp_count = __marked_count_;
4421 ++__open_count_;
4422 __first = __parse_ecma_exp(__first, __last);
4423 if (__first == __last || *__first != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00004424 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004425 __push_end_marked_subexpression(__temp_count);
4426 --__open_count_;
4427 ++__first;
4428 }
4429 }
4430 break;
Marshall Clow82058212015-07-23 18:27:51 +00004431 case '*':
4432 case '+':
4433 case '?':
4434 case '{':
Marshall Clowc8ccc292015-07-28 13:30:47 +00004435 __throw_regex_error<regex_constants::error_badrepeat>();
Marshall Clow82058212015-07-23 18:27:51 +00004436 break;
Howard Hinnant70d27852010-07-27 01:25:38 +00004437 default:
4438 __first = __parse_pattern_character(__first, __last);
4439 break;
4440 }
4441 }
4442 return __first;
4443}
4444
4445template <class _CharT, class _Traits>
4446template <class _ForwardIterator>
4447_ForwardIterator
4448basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4449 _ForwardIterator __last)
4450{
4451 if (__first != __last && *__first == '\\')
4452 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004453 _ForwardIterator __t1 = _VSTD::next(__first);
Marshall Clowdb9633c2016-01-19 00:50:37 +00004454 if (__t1 == __last)
4455 __throw_regex_error<regex_constants::error_escape>();
4456
Howard Hinnant70d27852010-07-27 01:25:38 +00004457 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4458 if (__t2 != __t1)
4459 __first = __t2;
4460 else
4461 {
4462 __t2 = __parse_character_class_escape(__t1, __last);
4463 if (__t2 != __t1)
4464 __first = __t2;
4465 else
4466 {
4467 __t2 = __parse_character_escape(__t1, __last);
4468 if (__t2 != __t1)
4469 __first = __t2;
4470 }
4471 }
4472 }
4473 return __first;
4474}
4475
4476template <class _CharT, class _Traits>
4477template <class _ForwardIterator>
4478_ForwardIterator
4479basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4480 _ForwardIterator __last)
4481{
4482 if (__first != __last)
4483 {
4484 if (*__first == '0')
4485 {
4486 __push_char(_CharT());
4487 ++__first;
4488 }
4489 else if ('1' <= *__first && *__first <= '9')
4490 {
4491 unsigned __v = *__first - '0';
Marshall Clowdc03ec72016-12-24 17:21:03 +00004492 for (++__first;
4493 __first != __last && '0' <= *__first && *__first <= '9'; ++__first)
Marshall Clow266b5ec2017-10-19 22:10:41 +00004494 {
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05004495 if (__v >= numeric_limits<unsigned>::max() / 10)
Marshall Clow266b5ec2017-10-19 22:10:41 +00004496 __throw_regex_error<regex_constants::error_backref>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004497 __v = 10 * __v + *__first - '0';
Marshall Clow266b5ec2017-10-19 22:10:41 +00004498 }
4499 if (__v == 0 || __v > mark_count())
Marshall Clowc8ccc292015-07-28 13:30:47 +00004500 __throw_regex_error<regex_constants::error_backref>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004501 __push_back_ref(__v);
4502 }
4503 }
4504 return __first;
4505}
4506
4507template <class _CharT, class _Traits>
4508template <class _ForwardIterator>
4509_ForwardIterator
4510basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4511 _ForwardIterator __last)
4512{
4513 if (__first != __last)
4514 {
4515 __bracket_expression<_CharT, _Traits>* __ml;
4516 switch (*__first)
4517 {
4518 case 'd':
4519 __ml = __start_matching_list(false);
4520 __ml->__add_class(ctype_base::digit);
4521 ++__first;
4522 break;
4523 case 'D':
4524 __ml = __start_matching_list(true);
4525 __ml->__add_class(ctype_base::digit);
4526 ++__first;
4527 break;
4528 case 's':
4529 __ml = __start_matching_list(false);
4530 __ml->__add_class(ctype_base::space);
4531 ++__first;
4532 break;
4533 case 'S':
4534 __ml = __start_matching_list(true);
4535 __ml->__add_class(ctype_base::space);
4536 ++__first;
4537 break;
4538 case 'w':
4539 __ml = __start_matching_list(false);
4540 __ml->__add_class(ctype_base::alnum);
4541 __ml->__add_char('_');
4542 ++__first;
4543 break;
4544 case 'W':
4545 __ml = __start_matching_list(true);
4546 __ml->__add_class(ctype_base::alnum);
4547 __ml->__add_char('_');
4548 ++__first;
4549 break;
4550 }
4551 }
4552 return __first;
4553}
4554
4555template <class _CharT, class _Traits>
4556template <class _ForwardIterator>
4557_ForwardIterator
4558basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
Howard Hinnant70b3e192010-07-28 17:35:27 +00004559 _ForwardIterator __last,
4560 basic_string<_CharT>* __str)
Howard Hinnant70d27852010-07-27 01:25:38 +00004561{
4562 if (__first != __last)
4563 {
4564 _ForwardIterator __t;
4565 unsigned __sum = 0;
4566 int __hd;
4567 switch (*__first)
4568 {
4569 case 'f':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004570 if (__str)
4571 *__str = _CharT(0xC);
4572 else
4573 __push_char(_CharT(0xC));
Howard Hinnant70d27852010-07-27 01:25:38 +00004574 ++__first;
4575 break;
4576 case 'n':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004577 if (__str)
4578 *__str = _CharT(0xA);
4579 else
4580 __push_char(_CharT(0xA));
Howard Hinnant70d27852010-07-27 01:25:38 +00004581 ++__first;
4582 break;
4583 case 'r':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004584 if (__str)
4585 *__str = _CharT(0xD);
4586 else
4587 __push_char(_CharT(0xD));
Howard Hinnant70d27852010-07-27 01:25:38 +00004588 ++__first;
4589 break;
4590 case 't':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004591 if (__str)
4592 *__str = _CharT(0x9);
4593 else
4594 __push_char(_CharT(0x9));
Howard Hinnant70d27852010-07-27 01:25:38 +00004595 ++__first;
4596 break;
4597 case 'v':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004598 if (__str)
4599 *__str = _CharT(0xB);
4600 else
4601 __push_char(_CharT(0xB));
Howard Hinnant70d27852010-07-27 01:25:38 +00004602 ++__first;
4603 break;
4604 case 'c':
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004605 if ((__t = _VSTD::next(__first)) != __last)
Howard Hinnant70d27852010-07-27 01:25:38 +00004606 {
Louis Dionne173f29e2019-05-29 16:01:36 +00004607 if (('A' <= *__t && *__t <= 'Z') ||
Howard Hinnantd04741b2013-07-15 18:21:11 +00004608 ('a' <= *__t && *__t <= 'z'))
Howard Hinnant70d27852010-07-27 01:25:38 +00004609 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00004610 if (__str)
4611 *__str = _CharT(*__t % 32);
4612 else
4613 __push_char(_CharT(*__t % 32));
Howard Hinnant70d27852010-07-27 01:25:38 +00004614 __first = ++__t;
4615 }
Louis Dionne173f29e2019-05-29 16:01:36 +00004616 else
Marshall Clowc8ccc292015-07-28 13:30:47 +00004617 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004618 }
Howard Hinnantd04741b2013-07-15 18:21:11 +00004619 else
Marshall Clowc8ccc292015-07-28 13:30:47 +00004620 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004621 break;
4622 case 'u':
Howard Hinnant72f73582010-08-11 17:04:31 +00004623 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004624 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004625 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004626 __hd = __traits_.value(*__first, 16);
4627 if (__hd == -1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004628 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant28b24882011-12-01 20:21:04 +00004629 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant72f73582010-08-11 17:04:31 +00004630 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004631 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004632 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004633 __hd = __traits_.value(*__first, 16);
4634 if (__hd == -1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004635 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant28b24882011-12-01 20:21:04 +00004636 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Louis Dionneaf6be622021-07-27 17:30:47 -04004637 // fallthrough
Howard Hinnant70d27852010-07-27 01:25:38 +00004638 case 'x':
Howard Hinnant72f73582010-08-11 17:04:31 +00004639 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004640 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004641 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004642 __hd = __traits_.value(*__first, 16);
4643 if (__hd == -1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004644 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant28b24882011-12-01 20:21:04 +00004645 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant72f73582010-08-11 17:04:31 +00004646 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004647 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004648 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004649 __hd = __traits_.value(*__first, 16);
4650 if (__hd == -1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004651 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant28b24882011-12-01 20:21:04 +00004652 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant70b3e192010-07-28 17:35:27 +00004653 if (__str)
4654 *__str = _CharT(__sum);
4655 else
4656 __push_char(_CharT(__sum));
Howard Hinnant70d27852010-07-27 01:25:38 +00004657 ++__first;
4658 break;
Marshall Clowf6cef0d2014-05-21 16:29:50 +00004659 case '0':
4660 if (__str)
4661 *__str = _CharT(0);
4662 else
4663 __push_char(_CharT(0));
4664 ++__first;
4665 break;
Howard Hinnant70d27852010-07-27 01:25:38 +00004666 default:
4667 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4668 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00004669 if (__str)
4670 *__str = *__first;
4671 else
4672 __push_char(*__first);
Howard Hinnant70d27852010-07-27 01:25:38 +00004673 ++__first;
4674 }
Howard Hinnant4f7a1f52013-06-28 18:57:30 +00004675 else
Marshall Clowc8ccc292015-07-28 13:30:47 +00004676 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004677 break;
4678 }
4679 }
4680 return __first;
4681}
4682
4683template <class _CharT, class _Traits>
4684template <class _ForwardIterator>
4685_ForwardIterator
4686basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4687 _ForwardIterator __last)
4688{
4689 if (__first != __last)
4690 {
4691 switch (*__first)
4692 {
4693 case '^':
4694 case '$':
4695 case '\\':
4696 case '.':
4697 case '*':
4698 case '+':
4699 case '?':
4700 case '(':
4701 case ')':
4702 case '[':
4703 case ']':
4704 case '{':
4705 case '}':
4706 case '|':
4707 break;
4708 default:
4709 __push_char(*__first);
4710 ++__first;
4711 break;
4712 }
4713 }
4714 return __first;
Howard Hinnante1053822010-07-22 17:53:24 +00004715}
4716
4717template <class _CharT, class _Traits>
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004718template <class _ForwardIterator>
4719_ForwardIterator
4720basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4721 _ForwardIterator __last)
4722{
4723 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004724 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004725 if (__t1 != __first)
4726 __parse_basic_reg_exp(__first, __t1);
4727 else
4728 __push_empty();
4729 __first = __t1;
4730 if (__first != __last)
4731 ++__first;
4732 while (__first != __last)
4733 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004734 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004735 __owns_one_state<_CharT>* __sb = __end_;
4736 if (__t1 != __first)
4737 __parse_basic_reg_exp(__first, __t1);
4738 else
4739 __push_empty();
4740 __push_alternation(__sa, __sb);
4741 __first = __t1;
4742 if (__first != __last)
4743 ++__first;
4744 }
4745 return __first;
4746}
4747
4748template <class _CharT, class _Traits>
4749template <class _ForwardIterator>
4750_ForwardIterator
4751basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4752 _ForwardIterator __last)
4753{
4754 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004755 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004756 if (__t1 != __first)
4757 __parse_extended_reg_exp(__first, __t1);
4758 else
4759 __push_empty();
4760 __first = __t1;
4761 if (__first != __last)
4762 ++__first;
4763 while (__first != __last)
4764 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004765 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004766 __owns_one_state<_CharT>* __sb = __end_;
4767 if (__t1 != __first)
4768 __parse_extended_reg_exp(__first, __t1);
4769 else
4770 __push_empty();
4771 __push_alternation(__sa, __sb);
4772 __first = __t1;
4773 if (__first != __last)
4774 ++__first;
4775 }
4776 return __first;
4777}
4778
4779template <class _CharT, class _Traits>
Louis Dionnef16eb592020-02-19 15:56:15 -05004780bool
Nikolas Klauser7b8c0502022-07-08 18:17:26 +02004781basic_regex<_CharT, _Traits>::__test_back_ref(_CharT __c)
Louis Dionnef16eb592020-02-19 15:56:15 -05004782{
Nikolas Klauser7b8c0502022-07-08 18:17:26 +02004783 unsigned __val = __traits_.value(__c, 10);
Louis Dionnef16eb592020-02-19 15:56:15 -05004784 if (__val >= 1 && __val <= 9)
4785 {
Mark de Weverd324e5f2020-02-20 18:13:38 -05004786 if (__val > mark_count())
4787 __throw_regex_error<regex_constants::error_backref>();
Louis Dionnef16eb592020-02-19 15:56:15 -05004788 __push_back_ref(__val);
4789 return true;
4790 }
4791
4792 return false;
4793}
4794
4795template <class _CharT, class _Traits>
Howard Hinnant67ad2132010-06-29 18:37:43 +00004796void
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00004797basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4798 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4799 bool __greedy)
4800{
4801 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4802 __end_->first() = nullptr;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00004803 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4804 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4805 __min, __max));
4806 __s->first() = nullptr;
4807 __e1.release();
4808 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00004809 __end_ = __e2->second();
Howard Hinnantaa0874c2010-07-12 15:51:17 +00004810 __s->first() = __e2.release();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00004811 ++__loop_count_;
4812}
4813
4814template <class _CharT, class _Traits>
4815void
Howard Hinnant67ad2132010-06-29 18:37:43 +00004816basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4817{
Howard Hinnant3034c902010-07-13 21:48:06 +00004818 if (flags() & icase)
Howard Hinnantcfe8d272010-07-12 19:11:27 +00004819 __end_->first() = new __match_char_icase<_CharT, _Traits>
4820 (__traits_, __c, __end_->first());
Howard Hinnant3034c902010-07-13 21:48:06 +00004821 else if (flags() & collate)
Howard Hinnantcfe8d272010-07-12 19:11:27 +00004822 __end_->first() = new __match_char_collate<_CharT, _Traits>
4823 (__traits_, __c, __end_->first());
4824 else
4825 __end_->first() = new __match_char<_CharT>(__c, __end_->first());
Howard Hinnant5bf96132010-07-08 17:43:58 +00004826 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
Howard Hinnant67ad2132010-06-29 18:37:43 +00004827}
4828
Howard Hinnant93ef6552010-06-30 20:30:19 +00004829template <class _CharT, class _Traits>
4830void
4831basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4832{
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00004833 if (!(__flags_ & nosubs))
4834 {
4835 __end_->first() =
4836 new __begin_marked_subexpression<_CharT>(++__marked_count_,
4837 __end_->first());
4838 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4839 }
Howard Hinnant93ef6552010-06-30 20:30:19 +00004840}
4841
4842template <class _CharT, class _Traits>
4843void
4844basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4845{
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00004846 if (!(__flags_ & nosubs))
4847 {
4848 __end_->first() =
4849 new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4850 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4851 }
Howard Hinnant93ef6552010-06-30 20:30:19 +00004852}
4853
Howard Hinnantaad0aa62010-07-09 00:15:26 +00004854template <class _CharT, class _Traits>
4855void
Howard Hinnant066ba512011-03-26 20:02:27 +00004856basic_regex<_CharT, _Traits>::__push_l_anchor()
4857{
Mark de Wevera989cce2020-11-18 18:09:13 +01004858 __end_->first() = new __l_anchor_multiline<_CharT>(__use_multiline(), __end_->first());
Howard Hinnant066ba512011-03-26 20:02:27 +00004859 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4860}
4861
4862template <class _CharT, class _Traits>
4863void
Howard Hinnantaad0aa62010-07-09 00:15:26 +00004864basic_regex<_CharT, _Traits>::__push_r_anchor()
4865{
Mark de Wevera989cce2020-11-18 18:09:13 +01004866 __end_->first() = new __r_anchor_multiline<_CharT>(__use_multiline(), __end_->first());
Howard Hinnantaad0aa62010-07-09 00:15:26 +00004867 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4868}
4869
Howard Hinnantaa0874c2010-07-12 15:51:17 +00004870template <class _CharT, class _Traits>
4871void
4872basic_regex<_CharT, _Traits>::__push_match_any()
4873{
4874 __end_->first() = new __match_any<_CharT>(__end_->first());
4875 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4876}
Howard Hinnantaad0aa62010-07-09 00:15:26 +00004877
Howard Hinnant2a315e32010-07-12 18:16:05 +00004878template <class _CharT, class _Traits>
4879void
Howard Hinnant70d27852010-07-27 01:25:38 +00004880basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4881{
4882 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4883 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4884}
4885
4886template <class _CharT, class _Traits>
4887void
Howard Hinnante1053822010-07-22 17:53:24 +00004888basic_regex<_CharT, _Traits>::__push_empty()
4889{
4890 __end_->first() = new __empty_state<_CharT>(__end_->first());
4891 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4892}
4893
4894template <class _CharT, class _Traits>
4895void
Howard Hinnant70d27852010-07-27 01:25:38 +00004896basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4897{
4898 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4899 __end_->first());
4900 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4901}
4902
4903template <class _CharT, class _Traits>
4904void
Howard Hinnant2a315e32010-07-12 18:16:05 +00004905basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4906{
Howard Hinnant3034c902010-07-13 21:48:06 +00004907 if (flags() & icase)
Howard Hinnantcfe8d272010-07-12 19:11:27 +00004908 __end_->first() = new __back_ref_icase<_CharT, _Traits>
4909 (__traits_, __i, __end_->first());
Howard Hinnant3034c902010-07-13 21:48:06 +00004910 else if (flags() & collate)
Howard Hinnantcfe8d272010-07-12 19:11:27 +00004911 __end_->first() = new __back_ref_collate<_CharT, _Traits>
4912 (__traits_, __i, __end_->first());
4913 else
4914 __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
Howard Hinnant2a315e32010-07-12 18:16:05 +00004915 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4916}
4917
Howard Hinnant3034c902010-07-13 21:48:06 +00004918template <class _CharT, class _Traits>
Howard Hinnant16d65422010-07-16 19:08:36 +00004919void
4920basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4921 __owns_one_state<_CharT>* __ea)
4922{
4923 __sa->first() = new __alternate<_CharT>(
4924 static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4925 static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4926 __ea->first() = nullptr;
4927 __ea->first() = new __empty_state<_CharT>(__end_->first());
4928 __end_->first() = nullptr;
4929 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4930 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4931}
4932
4933template <class _CharT, class _Traits>
Howard Hinnant3034c902010-07-13 21:48:06 +00004934__bracket_expression<_CharT, _Traits>*
4935basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4936{
4937 __bracket_expression<_CharT, _Traits>* __r =
4938 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4939 __negate, __flags_ & icase,
4940 __flags_ & collate);
4941 __end_->first() = __r;
4942 __end_ = __r;
4943 return __r;
4944}
4945
Howard Hinnant126da6a2010-07-27 22:20:32 +00004946template <class _CharT, class _Traits>
4947void
4948basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
Howard Hinnant3efac712013-07-23 16:18:04 +00004949 bool __invert,
4950 unsigned __mexp)
Howard Hinnant126da6a2010-07-27 22:20:32 +00004951{
4952 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
Howard Hinnant3efac712013-07-23 16:18:04 +00004953 __end_->first(), __mexp);
Howard Hinnant126da6a2010-07-27 22:20:32 +00004954 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4955}
4956
Howard Hinnant67ad2132010-06-29 18:37:43 +00004957// sub_match
4958
Richard Smith256954d2020-11-11 17:12:18 -08004959typedef sub_match<const char*> csub_match;
Richard Smith256954d2020-11-11 17:12:18 -08004960typedef sub_match<string::const_iterator> ssub_match;
Louis Dionne89258142021-08-23 15:32:36 -04004961#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
4962typedef sub_match<const wchar_t*> wcsub_match;
Richard Smith256954d2020-11-11 17:12:18 -08004963typedef sub_match<wstring::const_iterator> wssub_match;
Louis Dionne89258142021-08-23 15:32:36 -04004964#endif
Richard Smith256954d2020-11-11 17:12:18 -08004965
Howard Hinnant67ad2132010-06-29 18:37:43 +00004966template <class _BidirectionalIterator>
Richard Smith256954d2020-11-11 17:12:18 -08004967class
4968 _LIBCPP_TEMPLATE_VIS
4969 _LIBCPP_PREFERRED_NAME(csub_match)
Louis Dionne89258142021-08-23 15:32:36 -04004970 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcsub_match))
Richard Smith256954d2020-11-11 17:12:18 -08004971 _LIBCPP_PREFERRED_NAME(ssub_match)
Louis Dionne89258142021-08-23 15:32:36 -04004972 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wssub_match))
Richard Smith256954d2020-11-11 17:12:18 -08004973 sub_match
Howard Hinnant67ad2132010-06-29 18:37:43 +00004974 : public pair<_BidirectionalIterator, _BidirectionalIterator>
4975{
4976public:
4977 typedef _BidirectionalIterator iterator;
4978 typedef typename iterator_traits<iterator>::value_type value_type;
4979 typedef typename iterator_traits<iterator>::difference_type difference_type;
4980 typedef basic_string<value_type> string_type;
4981
4982 bool matched;
4983
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004984 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +00004985 _LIBCPP_CONSTEXPR sub_match() : matched() {}
Howard Hinnantb5c53a82010-12-08 21:07:55 +00004986
4987 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004988 difference_type length() const
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004989 {return matched ? _VSTD::distance(this->first, this->second) : 0;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004990 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004991 string_type str() const
4992 {return matched ? string_type(this->first, this->second) : string_type();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004993 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004994 operator string_type() const
4995 {return str();}
4996
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004997 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004998 int compare(const sub_match& __s) const
4999 {return str().compare(__s.str());}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005000 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00005001 int compare(const string_type& __s) const
5002 {return str().compare(__s);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005003 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00005004 int compare(const value_type* __s) const
5005 {return str().compare(__s);}
5006};
5007
Howard Hinnant67ad2132010-06-29 18:37:43 +00005008template <class _BiIter>
5009inline _LIBCPP_INLINE_VISIBILITY
5010bool
5011operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5012{
5013 return __x.compare(__y) == 0;
5014}
5015
5016template <class _BiIter>
5017inline _LIBCPP_INLINE_VISIBILITY
5018bool
5019operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5020{
5021 return !(__x == __y);
5022}
5023
5024template <class _BiIter>
5025inline _LIBCPP_INLINE_VISIBILITY
5026bool
5027operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5028{
5029 return __x.compare(__y) < 0;
5030}
5031
5032template <class _BiIter>
5033inline _LIBCPP_INLINE_VISIBILITY
5034bool
5035operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5036{
5037 return !(__y < __x);
5038}
5039
5040template <class _BiIter>
5041inline _LIBCPP_INLINE_VISIBILITY
5042bool
5043operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5044{
5045 return !(__x < __y);
5046}
5047
5048template <class _BiIter>
5049inline _LIBCPP_INLINE_VISIBILITY
5050bool
5051operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5052{
5053 return __y < __x;
5054}
5055
5056template <class _BiIter, class _ST, class _SA>
5057inline _LIBCPP_INLINE_VISIBILITY
5058bool
5059operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5060 const sub_match<_BiIter>& __y)
5061{
Marshall Clow54a46342014-12-15 23:57:56 +00005062 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00005063}
5064
5065template <class _BiIter, class _ST, class _SA>
5066inline _LIBCPP_INLINE_VISIBILITY
5067bool
5068operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5069 const sub_match<_BiIter>& __y)
5070{
5071 return !(__x == __y);
5072}
5073
5074template <class _BiIter, class _ST, class _SA>
5075inline _LIBCPP_INLINE_VISIBILITY
5076bool
5077operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5078 const sub_match<_BiIter>& __y)
5079{
Marshall Clow54a46342014-12-15 23:57:56 +00005080 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00005081}
5082
5083template <class _BiIter, class _ST, class _SA>
5084inline _LIBCPP_INLINE_VISIBILITY
5085bool
5086operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5087 const sub_match<_BiIter>& __y)
5088{
5089 return __y < __x;
5090}
5091
5092template <class _BiIter, class _ST, class _SA>
5093inline _LIBCPP_INLINE_VISIBILITY
5094bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5095 const sub_match<_BiIter>& __y)
5096{
5097 return !(__x < __y);
5098}
5099
5100template <class _BiIter, class _ST, class _SA>
5101inline _LIBCPP_INLINE_VISIBILITY
5102bool
5103operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5104 const sub_match<_BiIter>& __y)
5105{
5106 return !(__y < __x);
5107}
5108
5109template <class _BiIter, class _ST, class _SA>
5110inline _LIBCPP_INLINE_VISIBILITY
5111bool
5112operator==(const sub_match<_BiIter>& __x,
5113 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5114{
Marshall Clow54a46342014-12-15 23:57:56 +00005115 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00005116}
5117
5118template <class _BiIter, class _ST, class _SA>
5119inline _LIBCPP_INLINE_VISIBILITY
5120bool
5121operator!=(const sub_match<_BiIter>& __x,
5122 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5123{
5124 return !(__x == __y);
5125}
5126
5127template <class _BiIter, class _ST, class _SA>
5128inline _LIBCPP_INLINE_VISIBILITY
5129bool
5130operator<(const sub_match<_BiIter>& __x,
5131 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5132{
Marshall Clow54a46342014-12-15 23:57:56 +00005133 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00005134}
5135
5136template <class _BiIter, class _ST, class _SA>
5137inline _LIBCPP_INLINE_VISIBILITY
5138bool operator>(const sub_match<_BiIter>& __x,
5139 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5140{
5141 return __y < __x;
5142}
5143
5144template <class _BiIter, class _ST, class _SA>
5145inline _LIBCPP_INLINE_VISIBILITY
5146bool
5147operator>=(const sub_match<_BiIter>& __x,
5148 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5149{
5150 return !(__x < __y);
5151}
5152
5153template <class _BiIter, class _ST, class _SA>
5154inline _LIBCPP_INLINE_VISIBILITY
5155bool
5156operator<=(const sub_match<_BiIter>& __x,
5157 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5158{
5159 return !(__y < __x);
5160}
5161
5162template <class _BiIter>
5163inline _LIBCPP_INLINE_VISIBILITY
5164bool
5165operator==(typename iterator_traits<_BiIter>::value_type const* __x,
5166 const sub_match<_BiIter>& __y)
5167{
5168 return __y.compare(__x) == 0;
5169}
5170
5171template <class _BiIter>
5172inline _LIBCPP_INLINE_VISIBILITY
5173bool
5174operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
5175 const sub_match<_BiIter>& __y)
5176{
5177 return !(__x == __y);
5178}
5179
5180template <class _BiIter>
5181inline _LIBCPP_INLINE_VISIBILITY
5182bool
5183operator<(typename iterator_traits<_BiIter>::value_type const* __x,
5184 const sub_match<_BiIter>& __y)
5185{
5186 return __y.compare(__x) > 0;
5187}
5188
5189template <class _BiIter>
5190inline _LIBCPP_INLINE_VISIBILITY
5191bool
5192operator>(typename iterator_traits<_BiIter>::value_type const* __x,
5193 const sub_match<_BiIter>& __y)
5194{
5195 return __y < __x;
5196}
5197
5198template <class _BiIter>
5199inline _LIBCPP_INLINE_VISIBILITY
5200bool
5201operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
5202 const sub_match<_BiIter>& __y)
5203{
5204 return !(__x < __y);
5205}
5206
5207template <class _BiIter>
5208inline _LIBCPP_INLINE_VISIBILITY
5209bool
5210operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
5211 const sub_match<_BiIter>& __y)
5212{
5213 return !(__y < __x);
5214}
5215
5216template <class _BiIter>
5217inline _LIBCPP_INLINE_VISIBILITY
5218bool
5219operator==(const sub_match<_BiIter>& __x,
5220 typename iterator_traits<_BiIter>::value_type const* __y)
5221{
5222 return __x.compare(__y) == 0;
5223}
5224
5225template <class _BiIter>
5226inline _LIBCPP_INLINE_VISIBILITY
5227bool
5228operator!=(const sub_match<_BiIter>& __x,
5229 typename iterator_traits<_BiIter>::value_type const* __y)
5230{
5231 return !(__x == __y);
5232}
5233
5234template <class _BiIter>
5235inline _LIBCPP_INLINE_VISIBILITY
5236bool
5237operator<(const sub_match<_BiIter>& __x,
5238 typename iterator_traits<_BiIter>::value_type const* __y)
5239{
5240 return __x.compare(__y) < 0;
5241}
5242
5243template <class _BiIter>
5244inline _LIBCPP_INLINE_VISIBILITY
5245bool
5246operator>(const sub_match<_BiIter>& __x,
5247 typename iterator_traits<_BiIter>::value_type const* __y)
5248{
5249 return __y < __x;
5250}
5251
5252template <class _BiIter>
5253inline _LIBCPP_INLINE_VISIBILITY
5254bool
5255operator>=(const sub_match<_BiIter>& __x,
5256 typename iterator_traits<_BiIter>::value_type const* __y)
5257{
5258 return !(__x < __y);
5259}
5260
5261template <class _BiIter>
5262inline _LIBCPP_INLINE_VISIBILITY
5263bool
5264operator<=(const sub_match<_BiIter>& __x,
5265 typename iterator_traits<_BiIter>::value_type const* __y)
5266{
5267 return !(__y < __x);
5268}
5269
5270template <class _BiIter>
5271inline _LIBCPP_INLINE_VISIBILITY
5272bool
5273operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5274 const sub_match<_BiIter>& __y)
5275{
5276 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5277 return __y.compare(string_type(1, __x)) == 0;
5278}
5279
5280template <class _BiIter>
5281inline _LIBCPP_INLINE_VISIBILITY
5282bool
5283operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5284 const sub_match<_BiIter>& __y)
5285{
5286 return !(__x == __y);
5287}
5288
5289template <class _BiIter>
5290inline _LIBCPP_INLINE_VISIBILITY
5291bool
5292operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5293 const sub_match<_BiIter>& __y)
5294{
5295 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5296 return __y.compare(string_type(1, __x)) > 0;
5297}
5298
5299template <class _BiIter>
5300inline _LIBCPP_INLINE_VISIBILITY
5301bool
5302operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5303 const sub_match<_BiIter>& __y)
5304{
5305 return __y < __x;
5306}
5307
5308template <class _BiIter>
5309inline _LIBCPP_INLINE_VISIBILITY
5310bool
5311operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5312 const sub_match<_BiIter>& __y)
5313{
5314 return !(__x < __y);
5315}
5316
5317template <class _BiIter>
5318inline _LIBCPP_INLINE_VISIBILITY
5319bool
5320operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5321 const sub_match<_BiIter>& __y)
5322{
5323 return !(__y < __x);
5324}
5325
5326template <class _BiIter>
5327inline _LIBCPP_INLINE_VISIBILITY
5328bool
5329operator==(const sub_match<_BiIter>& __x,
5330 typename iterator_traits<_BiIter>::value_type const& __y)
5331{
5332 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5333 return __x.compare(string_type(1, __y)) == 0;
5334}
5335
5336template <class _BiIter>
5337inline _LIBCPP_INLINE_VISIBILITY
5338bool
5339operator!=(const sub_match<_BiIter>& __x,
5340 typename iterator_traits<_BiIter>::value_type const& __y)
5341{
5342 return !(__x == __y);
5343}
5344
5345template <class _BiIter>
5346inline _LIBCPP_INLINE_VISIBILITY
5347bool
5348operator<(const sub_match<_BiIter>& __x,
5349 typename iterator_traits<_BiIter>::value_type const& __y)
5350{
5351 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5352 return __x.compare(string_type(1, __y)) < 0;
5353}
5354
5355template <class _BiIter>
5356inline _LIBCPP_INLINE_VISIBILITY
5357bool
5358operator>(const sub_match<_BiIter>& __x,
5359 typename iterator_traits<_BiIter>::value_type const& __y)
5360{
5361 return __y < __x;
5362}
5363
5364template <class _BiIter>
5365inline _LIBCPP_INLINE_VISIBILITY
5366bool
5367operator>=(const sub_match<_BiIter>& __x,
5368 typename iterator_traits<_BiIter>::value_type const& __y)
5369{
5370 return !(__x < __y);
5371}
5372
5373template <class _BiIter>
5374inline _LIBCPP_INLINE_VISIBILITY
5375bool
5376operator<=(const sub_match<_BiIter>& __x,
5377 typename iterator_traits<_BiIter>::value_type const& __y)
5378{
5379 return !(__y < __x);
5380}
5381
5382template <class _CharT, class _ST, class _BiIter>
5383inline _LIBCPP_INLINE_VISIBILITY
5384basic_ostream<_CharT, _ST>&
5385operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5386{
5387 return __os << __m.str();
5388}
5389
Richard Smith256954d2020-11-11 17:12:18 -08005390typedef match_results<const char*> cmatch;
Richard Smith256954d2020-11-11 17:12:18 -08005391typedef match_results<string::const_iterator> smatch;
Louis Dionne89258142021-08-23 15:32:36 -04005392#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
5393typedef match_results<const wchar_t*> wcmatch;
Richard Smith256954d2020-11-11 17:12:18 -08005394typedef match_results<wstring::const_iterator> wsmatch;
Louis Dionne89258142021-08-23 15:32:36 -04005395#endif
Richard Smith256954d2020-11-11 17:12:18 -08005396
Howard Hinnant70d27852010-07-27 01:25:38 +00005397template <class _BidirectionalIterator, class _Allocator>
Richard Smith256954d2020-11-11 17:12:18 -08005398class
5399 _LIBCPP_TEMPLATE_VIS
5400 _LIBCPP_PREFERRED_NAME(cmatch)
Louis Dionne89258142021-08-23 15:32:36 -04005401 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcmatch))
Richard Smith256954d2020-11-11 17:12:18 -08005402 _LIBCPP_PREFERRED_NAME(smatch)
Louis Dionne89258142021-08-23 15:32:36 -04005403 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsmatch))
Richard Smith256954d2020-11-11 17:12:18 -08005404 match_results
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005405{
5406public:
5407 typedef _Allocator allocator_type;
5408 typedef sub_match<_BidirectionalIterator> value_type;
5409private:
5410 typedef vector<value_type, allocator_type> __container_type;
5411
5412 __container_type __matches_;
5413 value_type __unmatched_;
5414 value_type __prefix_;
5415 value_type __suffix_;
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005416 bool __ready_;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005417public:
Howard Hinnantd3925342010-08-16 20:21:16 +00005418 _BidirectionalIterator __position_start_;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005419 typedef const value_type& const_reference;
Marshall Clow96e06142014-02-26 01:56:31 +00005420 typedef value_type& reference;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005421 typedef typename __container_type::const_iterator const_iterator;
5422 typedef const_iterator iterator;
5423 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5424 typedef typename allocator_traits<allocator_type>::size_type size_type;
5425 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5426 typedef basic_string<char_type> string_type;
5427
5428 // construct/copy/destroy:
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +01005429#ifndef _LIBCPP_CXX03_LANG
5430 match_results() : match_results(allocator_type()) {}
5431 explicit match_results(const allocator_type& __a);
5432#else
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005433 explicit match_results(const allocator_type& __a = allocator_type());
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +01005434#endif
5435
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005436// match_results(const match_results&) = default;
5437// match_results& operator=(const match_results&) = default;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005438// match_results(match_results&& __m) = default;
5439// match_results& operator=(match_results&& __m) = default;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005440// ~match_results() = default;
5441
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005442 _LIBCPP_INLINE_VISIBILITY
5443 bool ready() const {return __ready_;}
5444
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005445 // size:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005446 _LIBCPP_INLINE_VISIBILITY
Marshall Clow081bcd22017-11-16 04:48:34 +00005447 size_type size() const _NOEXCEPT {return __matches_.size();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005448 _LIBCPP_INLINE_VISIBILITY
Marshall Clow081bcd22017-11-16 04:48:34 +00005449 size_type max_size() const _NOEXCEPT {return __matches_.max_size();}
5450 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
5451 bool empty() const _NOEXCEPT {return size() == 0;}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005452
5453 // element access:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005454 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005455 difference_type length(size_type __sub = 0) const
Marshall Clow14d319a2019-04-26 17:10:03 +00005456 {
5457 _LIBCPP_ASSERT(ready(), "match_results::length() called when not ready");
5458 return (*this)[__sub].length();
5459 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005460 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005461 difference_type position(size_type __sub = 0) const
Marshall Clow14d319a2019-04-26 17:10:03 +00005462 {
5463 _LIBCPP_ASSERT(ready(), "match_results::position() called when not ready");
5464 return _VSTD::distance(__position_start_, (*this)[__sub].first);
5465 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005466 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005467 string_type str(size_type __sub = 0) const
Marshall Clow14d319a2019-04-26 17:10:03 +00005468 {
5469 _LIBCPP_ASSERT(ready(), "match_results::str() called when not ready");
5470 return (*this)[__sub].str();
5471 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005472 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005473 const_reference operator[](size_type __n) const
Marshall Clow14d319a2019-04-26 17:10:03 +00005474 {
5475 _LIBCPP_ASSERT(ready(), "match_results::operator[]() called when not ready");
5476 return __n < __matches_.size() ? __matches_[__n] : __unmatched_;
5477 }
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005478
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005479 _LIBCPP_INLINE_VISIBILITY
Marshall Clow14d319a2019-04-26 17:10:03 +00005480 const_reference prefix() const
5481 {
5482 _LIBCPP_ASSERT(ready(), "match_results::prefix() called when not ready");
5483 return __prefix_;
5484 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005485 _LIBCPP_INLINE_VISIBILITY
Marshall Clow14d319a2019-04-26 17:10:03 +00005486 const_reference suffix() const
5487 {
5488 _LIBCPP_ASSERT(ready(), "match_results::suffix() called when not ready");
5489 return __suffix_;
5490 }
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005491
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005492 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f4191f2011-10-08 14:36:16 +00005493 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005494 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005495 const_iterator end() const {return __matches_.end();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005496 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f4191f2011-10-08 14:36:16 +00005497 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005498 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005499 const_iterator cend() const {return __matches_.end();}
5500
5501 // format:
5502 template <class _OutputIter>
5503 _OutputIter
Alexander Richardsonc9637642017-11-14 11:14:25 +00005504 format(_OutputIter __output_iter, const char_type* __fmt_first,
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005505 const char_type* __fmt_last,
5506 regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5507 template <class _OutputIter, class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005508 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005509 _OutputIter
Alexander Richardsonc9637642017-11-14 11:14:25 +00005510 format(_OutputIter __output_iter, const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnantcbc45252010-08-14 18:14:02 +00005511 regex_constants::match_flag_type __flags = regex_constants::format_default) const
Alexander Richardsonc9637642017-11-14 11:14:25 +00005512 {return format(__output_iter, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005513 template <class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005514 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005515 basic_string<char_type, _ST, _SA>
5516 format(const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnantcbc45252010-08-14 18:14:02 +00005517 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5518 {
5519 basic_string<char_type, _ST, _SA> __r;
5520 format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5521 __flags);
5522 return __r;
5523 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005524 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005525 string_type
5526 format(const char_type* __fmt,
Howard Hinnantcbc45252010-08-14 18:14:02 +00005527 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5528 {
5529 string_type __r;
5530 format(back_inserter(__r), __fmt,
5531 __fmt + char_traits<char_type>::length(__fmt), __flags);
5532 return __r;
5533 }
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005534
5535 // allocator:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005536 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005537 allocator_type get_allocator() const {return __matches_.get_allocator();}
5538
5539 // swap:
5540 void swap(match_results& __m);
5541
Howard Hinnantc834c512011-11-29 18:15:50 +00005542 template <class _Bp, class _Ap>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005543 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66423212010-07-14 21:14:52 +00005544 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
Howard Hinnantc834c512011-11-29 18:15:50 +00005545 const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
Howard Hinnant66423212010-07-14 21:14:52 +00005546 {
Howard Hinnantc834c512011-11-29 18:15:50 +00005547 _Bp __mf = __m.prefix().first;
Howard Hinnant66423212010-07-14 21:14:52 +00005548 __matches_.resize(__m.size());
5549 for (size_type __i = 0; __i < __matches_.size(); ++__i)
5550 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005551 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5552 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
Howard Hinnant66423212010-07-14 21:14:52 +00005553 __matches_[__i].matched = __m[__i].matched;
5554 }
5555 __unmatched_.first = __l;
5556 __unmatched_.second = __l;
5557 __unmatched_.matched = false;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005558 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5559 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
Howard Hinnant66423212010-07-14 21:14:52 +00005560 __prefix_.matched = __m.prefix().matched;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005561 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5562 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
Howard Hinnant66423212010-07-14 21:14:52 +00005563 __suffix_.matched = __m.suffix().matched;
Howard Hinnantd3925342010-08-16 20:21:16 +00005564 if (!__no_update_pos)
5565 __position_start_ = __prefix_.first;
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005566 __ready_ = __m.ready();
Howard Hinnant66423212010-07-14 21:14:52 +00005567 }
5568
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005569private:
5570 void __init(unsigned __s,
Howard Hinnantd3925342010-08-16 20:21:16 +00005571 _BidirectionalIterator __f, _BidirectionalIterator __l,
5572 bool __no_update_pos = false);
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005573
5574 template <class, class> friend class basic_regex;
5575
Howard Hinnantc834c512011-11-29 18:15:50 +00005576 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005577 friend
5578 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00005579 regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005580 regex_constants::match_flag_type);
Howard Hinnant126da6a2010-07-27 22:20:32 +00005581
Howard Hinnantc834c512011-11-29 18:15:50 +00005582 template <class _Bp, class _Ap>
Howard Hinnantcbc45252010-08-14 18:14:02 +00005583 friend
5584 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00005585 operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005586
Howard Hinnant126da6a2010-07-27 22:20:32 +00005587 template <class, class> friend class __lookahead;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005588};
5589
5590template <class _BidirectionalIterator, class _Allocator>
5591match_results<_BidirectionalIterator, _Allocator>::match_results(
5592 const allocator_type& __a)
5593 : __matches_(__a),
5594 __unmatched_(),
5595 __prefix_(),
Howard Hinnantd3925342010-08-16 20:21:16 +00005596 __suffix_(),
Eric Fiseliera75ee262015-07-22 01:29:41 +00005597 __ready_(false),
5598 __position_start_()
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005599{
5600}
5601
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005602template <class _BidirectionalIterator, class _Allocator>
5603void
5604match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
Howard Hinnantd3925342010-08-16 20:21:16 +00005605 _BidirectionalIterator __f, _BidirectionalIterator __l,
5606 bool __no_update_pos)
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005607{
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005608 __unmatched_.first = __l;
5609 __unmatched_.second = __l;
5610 __unmatched_.matched = false;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005611 __matches_.assign(__s, __unmatched_);
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005612 __prefix_.first = __f;
5613 __prefix_.second = __f;
5614 __prefix_.matched = false;
Howard Hinnant5bf96132010-07-08 17:43:58 +00005615 __suffix_ = __unmatched_;
Howard Hinnantd3925342010-08-16 20:21:16 +00005616 if (!__no_update_pos)
5617 __position_start_ = __prefix_.first;
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005618 __ready_ = true;
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005619}
5620
Howard Hinnantcbc45252010-08-14 18:14:02 +00005621template <class _BidirectionalIterator, class _Allocator>
5622template <class _OutputIter>
5623_OutputIter
Alexander Richardsonc9637642017-11-14 11:14:25 +00005624match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __output_iter,
Howard Hinnantcbc45252010-08-14 18:14:02 +00005625 const char_type* __fmt_first, const char_type* __fmt_last,
5626 regex_constants::match_flag_type __flags) const
5627{
Marshall Clow14d319a2019-04-26 17:10:03 +00005628 _LIBCPP_ASSERT(ready(), "match_results::format() called when not ready");
Howard Hinnantcbc45252010-08-14 18:14:02 +00005629 if (__flags & regex_constants::format_sed)
5630 {
5631 for (; __fmt_first != __fmt_last; ++__fmt_first)
5632 {
5633 if (*__fmt_first == '&')
Alexander Richardsonc9637642017-11-14 11:14:25 +00005634 __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5635 __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005636 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5637 {
5638 ++__fmt_first;
5639 if ('0' <= *__fmt_first && *__fmt_first <= '9')
5640 {
5641 size_t __i = *__fmt_first - '0';
Alexander Richardsonc9637642017-11-14 11:14:25 +00005642 __output_iter = _VSTD::copy((*this)[__i].first,
5643 (*this)[__i].second, __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005644 }
5645 else
5646 {
Alexander Richardsonc9637642017-11-14 11:14:25 +00005647 *__output_iter = *__fmt_first;
5648 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005649 }
5650 }
5651 else
5652 {
Alexander Richardsonc9637642017-11-14 11:14:25 +00005653 *__output_iter = *__fmt_first;
5654 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005655 }
5656 }
5657 }
5658 else
5659 {
5660 for (; __fmt_first != __fmt_last; ++__fmt_first)
5661 {
5662 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5663 {
5664 switch (__fmt_first[1])
5665 {
5666 case '$':
Alexander Richardsonc9637642017-11-14 11:14:25 +00005667 *__output_iter = *++__fmt_first;
5668 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005669 break;
5670 case '&':
5671 ++__fmt_first;
Alexander Richardsonc9637642017-11-14 11:14:25 +00005672 __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5673 __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005674 break;
5675 case '`':
5676 ++__fmt_first;
Alexander Richardsonc9637642017-11-14 11:14:25 +00005677 __output_iter = _VSTD::copy(__prefix_.first, __prefix_.second, __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005678 break;
5679 case '\'':
5680 ++__fmt_first;
Alexander Richardsonc9637642017-11-14 11:14:25 +00005681 __output_iter = _VSTD::copy(__suffix_.first, __suffix_.second, __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005682 break;
5683 default:
5684 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5685 {
5686 ++__fmt_first;
Marshall Clow266b5ec2017-10-19 22:10:41 +00005687 size_t __idx = *__fmt_first - '0';
Howard Hinnantcbc45252010-08-14 18:14:02 +00005688 if (__fmt_first + 1 != __fmt_last &&
5689 '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5690 {
5691 ++__fmt_first;
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05005692 if (__idx >= numeric_limits<size_t>::max() / 10)
Marshall Clow266b5ec2017-10-19 22:10:41 +00005693 __throw_regex_error<regex_constants::error_escape>();
5694 __idx = 10 * __idx + *__fmt_first - '0';
Howard Hinnantcbc45252010-08-14 18:14:02 +00005695 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00005696 __output_iter = _VSTD::copy((*this)[__idx].first,
5697 (*this)[__idx].second, __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005698 }
5699 else
5700 {
Alexander Richardsonc9637642017-11-14 11:14:25 +00005701 *__output_iter = *__fmt_first;
5702 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005703 }
5704 break;
5705 }
5706 }
5707 else
5708 {
Alexander Richardsonc9637642017-11-14 11:14:25 +00005709 *__output_iter = *__fmt_first;
5710 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005711 }
5712 }
5713 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00005714 return __output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005715}
5716
5717template <class _BidirectionalIterator, class _Allocator>
5718void
5719match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5720{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005721 using _VSTD::swap;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005722 swap(__matches_, __m.__matches_);
5723 swap(__unmatched_, __m.__unmatched_);
5724 swap(__prefix_, __m.__prefix_);
5725 swap(__suffix_, __m.__suffix_);
Howard Hinnantd3925342010-08-16 20:21:16 +00005726 swap(__position_start_, __m.__position_start_);
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005727 swap(__ready_, __m.__ready_);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005728}
5729
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005730template <class _BidirectionalIterator, class _Allocator>
Nikolas Klausera9ad6702022-08-13 13:23:16 +02005731_LIBCPP_HIDE_FROM_ABI bool
Howard Hinnantcbc45252010-08-14 18:14:02 +00005732operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5733 const match_results<_BidirectionalIterator, _Allocator>& __y)
5734{
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005735 if (__x.__ready_ != __y.__ready_)
5736 return false;
5737 if (!__x.__ready_)
5738 return true;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005739 return __x.__matches_ == __y.__matches_ &&
5740 __x.__prefix_ == __y.__prefix_ &&
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005741 __x.__suffix_ == __y.__suffix_;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005742}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005743
5744template <class _BidirectionalIterator, class _Allocator>
Howard Hinnantcbc45252010-08-14 18:14:02 +00005745inline _LIBCPP_INLINE_VISIBILITY
5746bool
5747operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5748 const match_results<_BidirectionalIterator, _Allocator>& __y)
5749{
5750 return !(__x == __y);
5751}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005752
5753template <class _BidirectionalIterator, class _Allocator>
Howard Hinnantcbc45252010-08-14 18:14:02 +00005754inline _LIBCPP_INLINE_VISIBILITY
5755void
5756swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5757 match_results<_BidirectionalIterator, _Allocator>& __y)
5758{
5759 __x.swap(__y);
5760}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005761
5762// regex_search
5763
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005764template <class _CharT, class _Traits>
Howard Hinnant70d27852010-07-27 01:25:38 +00005765template <class _Allocator>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005766bool
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005767basic_regex<_CharT, _Traits>::__match_at_start_ecma(
Howard Hinnant70d27852010-07-27 01:25:38 +00005768 const _CharT* __first, const _CharT* __last,
5769 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00005770 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005771{
Howard Hinnant70d27852010-07-27 01:25:38 +00005772 vector<__state> __states;
Howard Hinnant70d27852010-07-27 01:25:38 +00005773 __node* __st = __start_.get();
5774 if (__st)
5775 {
Marshall Clow8db143c2015-01-28 22:22:35 +00005776 sub_match<const _CharT*> __unmatched;
5777 __unmatched.first = __last;
5778 __unmatched.second = __last;
5779 __unmatched.matched = false;
5780
Howard Hinnant70d27852010-07-27 01:25:38 +00005781 __states.push_back(__state());
5782 __states.back().__do_ = 0;
5783 __states.back().__first_ = __first;
5784 __states.back().__current_ = __first;
5785 __states.back().__last_ = __last;
Marshall Clow8db143c2015-01-28 22:22:35 +00005786 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
Howard Hinnant70d27852010-07-27 01:25:38 +00005787 __states.back().__loop_data_.resize(__loop_count());
5788 __states.back().__node_ = __st;
5789 __states.back().__flags_ = __flags;
Howard Hinnant066ba512011-03-26 20:02:27 +00005790 __states.back().__at_first_ = __at_first;
Marshall Clowd39d21d2017-09-12 17:56:59 +00005791 int __counter = 0;
5792 int __length = __last - __first;
Howard Hinnant70d27852010-07-27 01:25:38 +00005793 do
5794 {
Marshall Clowd39d21d2017-09-12 17:56:59 +00005795 ++__counter;
5796 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5797 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5798 __throw_regex_error<regex_constants::error_complexity>();
Howard Hinnant70d27852010-07-27 01:25:38 +00005799 __state& __s = __states.back();
5800 if (__s.__node_)
5801 __s.__node_->__exec(__s);
5802 switch (__s.__do_)
5803 {
5804 case __state::__end_state:
Tim Shen11113f52016-10-27 21:40:34 +00005805 if ((__flags & regex_constants::match_not_null) &&
Tim Shend5f175a2016-10-21 20:41:47 +00005806 __s.__current_ == __first)
5807 {
5808 __states.pop_back();
5809 break;
5810 }
Tim Shen11113f52016-10-27 21:40:34 +00005811 if ((__flags & regex_constants::__full_match) &&
5812 __s.__current_ != __last)
5813 {
5814 __states.pop_back();
5815 break;
5816 }
Howard Hinnant70d27852010-07-27 01:25:38 +00005817 __m.__matches_[0].first = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005818 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
Howard Hinnant70d27852010-07-27 01:25:38 +00005819 __m.__matches_[0].matched = true;
5820 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5821 __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5822 return true;
5823 case __state::__accept_and_consume:
5824 case __state::__repeat:
5825 case __state::__accept_but_not_consume:
5826 break;
5827 case __state::__split:
5828 {
5829 __state __snext = __s;
5830 __s.__node_->__exec_split(true, __s);
5831 __snext.__node_->__exec_split(false, __snext);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005832 __states.push_back(_VSTD::move(__snext));
Howard Hinnant70d27852010-07-27 01:25:38 +00005833 }
5834 break;
5835 case __state::__reject:
5836 __states.pop_back();
5837 break;
5838 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00005839 __throw_regex_error<regex_constants::__re_err_unknown>();
Howard Hinnant70d27852010-07-27 01:25:38 +00005840 break;
Howard Hinnant72f73582010-08-11 17:04:31 +00005841
Howard Hinnant70d27852010-07-27 01:25:38 +00005842 }
5843 } while (!__states.empty());
5844 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005845 return false;
5846}
5847
5848template <class _CharT, class _Traits>
Howard Hinnant66423212010-07-14 21:14:52 +00005849template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005850bool
5851basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5852 const _CharT* __first, const _CharT* __last,
Howard Hinnant66423212010-07-14 21:14:52 +00005853 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00005854 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005855{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005856 deque<__state> __states;
Howard Hinnant66423212010-07-14 21:14:52 +00005857 ptrdiff_t __highest_j = 0;
Howard Hinnantc834c512011-11-29 18:15:50 +00005858 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005859 __node* __st = __start_.get();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005860 if (__st)
5861 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005862 __states.push_back(__state());
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005863 __states.back().__do_ = 0;
5864 __states.back().__first_ = __first;
5865 __states.back().__current_ = __first;
5866 __states.back().__last_ = __last;
5867 __states.back().__loop_data_.resize(__loop_count());
5868 __states.back().__node_ = __st;
5869 __states.back().__flags_ = __flags;
Howard Hinnant066ba512011-03-26 20:02:27 +00005870 __states.back().__at_first_ = __at_first;
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00005871 bool __matched = false;
Marshall Clowd39d21d2017-09-12 17:56:59 +00005872 int __counter = 0;
5873 int __length = __last - __first;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005874 do
5875 {
Marshall Clowd39d21d2017-09-12 17:56:59 +00005876 ++__counter;
5877 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5878 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5879 __throw_regex_error<regex_constants::error_complexity>();
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005880 __state& __s = __states.back();
5881 if (__s.__node_)
5882 __s.__node_->__exec(__s);
5883 switch (__s.__do_)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005884 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005885 case __state::__end_state:
Tim Shen11113f52016-10-27 21:40:34 +00005886 if ((__flags & regex_constants::match_not_null) &&
Tim Shend5f175a2016-10-21 20:41:47 +00005887 __s.__current_ == __first)
5888 {
5889 __states.pop_back();
5890 break;
5891 }
Tim Shen11113f52016-10-27 21:40:34 +00005892 if ((__flags & regex_constants::__full_match) &&
5893 __s.__current_ != __last)
5894 {
5895 __states.pop_back();
5896 break;
5897 }
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005898 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00005899 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005900 __matched = true;
Howard Hinnantc834c512011-11-29 18:15:50 +00005901 if (__highest_j == _Np)
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005902 __states.clear();
5903 else
5904 __states.pop_back();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005905 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005906 case __state::__consume_input:
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005907 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005908 case __state::__accept_and_consume:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005909 __states.push_front(_VSTD::move(__s));
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005910 __states.pop_back();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005911 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005912 case __state::__repeat:
5913 case __state::__accept_but_not_consume:
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005914 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005915 case __state::__split:
5916 {
5917 __state __snext = __s;
5918 __s.__node_->__exec_split(true, __s);
5919 __snext.__node_->__exec_split(false, __snext);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005920 __states.push_back(_VSTD::move(__snext));
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005921 }
5922 break;
5923 case __state::__reject:
5924 __states.pop_back();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005925 break;
5926 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00005927 __throw_regex_error<regex_constants::__re_err_unknown>();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005928 break;
5929 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005930 } while (!__states.empty());
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00005931 if (__matched)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005932 {
5933 __m.__matches_[0].first = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005934 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005935 __m.__matches_[0].matched = true;
5936 return true;
5937 }
5938 }
5939 return false;
5940}
5941
5942template <class _CharT, class _Traits>
Howard Hinnant66423212010-07-14 21:14:52 +00005943template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005944bool
5945basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
Howard Hinnant66423212010-07-14 21:14:52 +00005946 const _CharT* __first, const _CharT* __last,
5947 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00005948 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005949{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005950 vector<__state> __states;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005951 __state __best_state;
Howard Hinnant66423212010-07-14 21:14:52 +00005952 ptrdiff_t __highest_j = 0;
Howard Hinnantc834c512011-11-29 18:15:50 +00005953 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005954 __node* __st = __start_.get();
Howard Hinnant5bf96132010-07-08 17:43:58 +00005955 if (__st)
5956 {
Marshall Clow8db143c2015-01-28 22:22:35 +00005957 sub_match<const _CharT*> __unmatched;
5958 __unmatched.first = __last;
5959 __unmatched.second = __last;
5960 __unmatched.matched = false;
5961
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005962 __states.push_back(__state());
5963 __states.back().__do_ = 0;
5964 __states.back().__first_ = __first;
5965 __states.back().__current_ = __first;
5966 __states.back().__last_ = __last;
Marshall Clow8db143c2015-01-28 22:22:35 +00005967 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005968 __states.back().__loop_data_.resize(__loop_count());
5969 __states.back().__node_ = __st;
5970 __states.back().__flags_ = __flags;
Howard Hinnant066ba512011-03-26 20:02:27 +00005971 __states.back().__at_first_ = __at_first;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005972 bool __matched = false;
Marshall Clowd39d21d2017-09-12 17:56:59 +00005973 int __counter = 0;
5974 int __length = __last - __first;
Howard Hinnant5bf96132010-07-08 17:43:58 +00005975 do
5976 {
Marshall Clowd39d21d2017-09-12 17:56:59 +00005977 ++__counter;
5978 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5979 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5980 __throw_regex_error<regex_constants::error_complexity>();
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005981 __state& __s = __states.back();
5982 if (__s.__node_)
5983 __s.__node_->__exec(__s);
5984 switch (__s.__do_)
Howard Hinnant5bf96132010-07-08 17:43:58 +00005985 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005986 case __state::__end_state:
Tim Shen11113f52016-10-27 21:40:34 +00005987 if ((__flags & regex_constants::match_not_null) &&
Tim Shend5f175a2016-10-21 20:41:47 +00005988 __s.__current_ == __first)
5989 {
5990 __states.pop_back();
5991 break;
5992 }
Tim Shen11113f52016-10-27 21:40:34 +00005993 if ((__flags & regex_constants::__full_match) &&
5994 __s.__current_ != __last)
5995 {
5996 __states.pop_back();
5997 break;
5998 }
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005999 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant5bf96132010-07-08 17:43:58 +00006000 {
Howard Hinnantebbc2b62010-07-27 17:24:17 +00006001 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006002 __best_state = __s;
Howard Hinnant5bf96132010-07-08 17:43:58 +00006003 }
Howard Hinnantebbc2b62010-07-27 17:24:17 +00006004 __matched = true;
Howard Hinnantc834c512011-11-29 18:15:50 +00006005 if (__highest_j == _Np)
Howard Hinnantebbc2b62010-07-27 17:24:17 +00006006 __states.clear();
6007 else
6008 __states.pop_back();
Howard Hinnant5bf96132010-07-08 17:43:58 +00006009 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006010 case __state::__accept_and_consume:
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006011 case __state::__repeat:
6012 case __state::__accept_but_not_consume:
Howard Hinnant5bf96132010-07-08 17:43:58 +00006013 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006014 case __state::__split:
6015 {
6016 __state __snext = __s;
6017 __s.__node_->__exec_split(true, __s);
6018 __snext.__node_->__exec_split(false, __snext);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006019 __states.push_back(_VSTD::move(__snext));
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006020 }
6021 break;
6022 case __state::__reject:
6023 __states.pop_back();
Howard Hinnant5bf96132010-07-08 17:43:58 +00006024 break;
6025 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00006026 __throw_regex_error<regex_constants::__re_err_unknown>();
Howard Hinnant5bf96132010-07-08 17:43:58 +00006027 break;
6028 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006029 } while (!__states.empty());
6030 if (__matched)
Howard Hinnant5bf96132010-07-08 17:43:58 +00006031 {
6032 __m.__matches_[0].first = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006033 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnant5bf96132010-07-08 17:43:58 +00006034 __m.__matches_[0].matched = true;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006035 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
6036 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
Howard Hinnant5bf96132010-07-08 17:43:58 +00006037 return true;
6038 }
6039 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006040 return false;
6041}
6042
6043template <class _CharT, class _Traits>
Howard Hinnant66423212010-07-14 21:14:52 +00006044template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006045bool
6046basic_regex<_CharT, _Traits>::__match_at_start(
Howard Hinnant66423212010-07-14 21:14:52 +00006047 const _CharT* __first, const _CharT* __last,
6048 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00006049 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006050{
Marshall Clow88a30872019-03-28 17:30:23 +00006051 if (__get_grammar(__flags_) == ECMAScript)
Howard Hinnant066ba512011-03-26 20:02:27 +00006052 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006053 if (mark_count() == 0)
Howard Hinnant066ba512011-03-26 20:02:27 +00006054 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
6055 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006056}
6057
6058template <class _CharT, class _Traits>
Howard Hinnant66423212010-07-14 21:14:52 +00006059template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006060bool
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006061basic_regex<_CharT, _Traits>::__search(
Howard Hinnant66423212010-07-14 21:14:52 +00006062 const _CharT* __first, const _CharT* __last,
6063 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006064 regex_constants::match_flag_type __flags) const
6065{
Diogo Sampaio300ade72020-04-30 23:34:01 +01006066 if (__flags & regex_constants::match_prev_avail)
6067 __flags &= ~(regex_constants::match_not_bol | regex_constants::match_not_bow);
6068
Howard Hinnantd3925342010-08-16 20:21:16 +00006069 __m.__init(1 + mark_count(), __first, __last,
6070 __flags & regex_constants::__no_update_pos);
Louis Dionne173f29e2019-05-29 16:01:36 +00006071 if (__match_at_start(__first, __last, __m, __flags,
Howard Hinnant38d14f72013-07-09 17:29:09 +00006072 !(__flags & regex_constants::__no_update_pos)))
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006073 {
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006074 __m.__prefix_.second = __m[0].first;
6075 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
6076 __m.__suffix_.first = __m[0].second;
6077 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
6078 return true;
6079 }
Howard Hinnant22cf4862010-07-29 01:15:27 +00006080 if (__first != __last && !(__flags & regex_constants::match_continuous))
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006081 {
Howard Hinnant6b2602a2010-07-29 15:17:28 +00006082 __flags |= regex_constants::match_prev_avail;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006083 for (++__first; __first != __last; ++__first)
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006084 {
Howard Hinnant6b2602a2010-07-29 15:17:28 +00006085 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant066ba512011-03-26 20:02:27 +00006086 if (__match_at_start(__first, __last, __m, __flags, false))
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006087 {
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006088 __m.__prefix_.second = __m[0].first;
6089 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
6090 __m.__suffix_.first = __m[0].second;
6091 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
6092 return true;
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006093 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006094 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006095 }
6096 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006097 __m.__matches_.clear();
6098 return false;
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006099}
6100
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006101template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006102inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006103bool
6104regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
6105 match_results<_BidirectionalIterator, _Allocator>& __m,
6106 const basic_regex<_CharT, _Traits>& __e,
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006107 regex_constants::match_flag_type __flags = regex_constants::match_default)
6108{
Howard Hinnant1e5de642013-07-11 15:32:55 +00006109 int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
6110 basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
Howard Hinnant66423212010-07-14 21:14:52 +00006111 match_results<const _CharT*> __mc;
Howard Hinnant1e5de642013-07-11 15:32:55 +00006112 bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
Howard Hinnantd3925342010-08-16 20:21:16 +00006113 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant66423212010-07-14 21:14:52 +00006114 return __r;
6115}
6116
Howard Hinnant4018c482013-06-29 23:45:43 +00006117template <class _Iter, class _Allocator, class _CharT, class _Traits>
6118inline _LIBCPP_INLINE_VISIBILITY
6119bool
6120regex_search(__wrap_iter<_Iter> __first,
6121 __wrap_iter<_Iter> __last,
6122 match_results<__wrap_iter<_Iter>, _Allocator>& __m,
6123 const basic_regex<_CharT, _Traits>& __e,
6124 regex_constants::match_flag_type __flags = regex_constants::match_default)
6125{
6126 match_results<const _CharT*> __mc;
6127 bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
6128 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
6129 return __r;
6130}
6131
Howard Hinnant66423212010-07-14 21:14:52 +00006132template <class _Allocator, class _CharT, class _Traits>
6133inline _LIBCPP_INLINE_VISIBILITY
6134bool
6135regex_search(const _CharT* __first, const _CharT* __last,
6136 match_results<const _CharT*, _Allocator>& __m,
6137 const basic_regex<_CharT, _Traits>& __e,
6138 regex_constants::match_flag_type __flags = regex_constants::match_default)
6139{
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006140 return __e.__search(__first, __last, __m, __flags);
6141}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006142
6143template <class _BidirectionalIterator, class _CharT, class _Traits>
6144inline _LIBCPP_INLINE_VISIBILITY
6145bool
6146regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
6147 const basic_regex<_CharT, _Traits>& __e,
6148 regex_constants::match_flag_type __flags = regex_constants::match_default)
6149{
Howard Hinnant66423212010-07-14 21:14:52 +00006150 basic_string<_CharT> __s(__first, __last);
6151 match_results<const _CharT*> __mc;
6152 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
6153}
6154
6155template <class _CharT, class _Traits>
6156inline _LIBCPP_INLINE_VISIBILITY
6157bool
6158regex_search(const _CharT* __first, const _CharT* __last,
6159 const basic_regex<_CharT, _Traits>& __e,
6160 regex_constants::match_flag_type __flags = regex_constants::match_default)
6161{
6162 match_results<const _CharT*> __mc;
6163 return __e.__search(__first, __last, __mc, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006164}
6165
6166template <class _CharT, class _Allocator, class _Traits>
6167inline _LIBCPP_INLINE_VISIBILITY
6168bool
6169regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6170 const basic_regex<_CharT, _Traits>& __e,
6171 regex_constants::match_flag_type __flags = regex_constants::match_default)
6172{
Howard Hinnant66423212010-07-14 21:14:52 +00006173 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006174}
6175
6176template <class _CharT, class _Traits>
6177inline _LIBCPP_INLINE_VISIBILITY
6178bool
6179regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6180 regex_constants::match_flag_type __flags = regex_constants::match_default)
6181{
Howard Hinnant66423212010-07-14 21:14:52 +00006182 match_results<const _CharT*> __m;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006183 return _VSTD::regex_search(__str, __m, __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006184}
6185
6186template <class _ST, class _SA, class _CharT, class _Traits>
6187inline _LIBCPP_INLINE_VISIBILITY
6188bool
6189regex_search(const basic_string<_CharT, _ST, _SA>& __s,
6190 const basic_regex<_CharT, _Traits>& __e,
6191 regex_constants::match_flag_type __flags = regex_constants::match_default)
6192{
Howard Hinnant66423212010-07-14 21:14:52 +00006193 match_results<const _CharT*> __mc;
6194 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006195}
6196
6197template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6198inline _LIBCPP_INLINE_VISIBILITY
6199bool
6200regex_search(const basic_string<_CharT, _ST, _SA>& __s,
6201 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6202 const basic_regex<_CharT, _Traits>& __e,
6203 regex_constants::match_flag_type __flags = regex_constants::match_default)
6204{
Howard Hinnant66423212010-07-14 21:14:52 +00006205 match_results<const _CharT*> __mc;
6206 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnantd3925342010-08-16 20:21:16 +00006207 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant66423212010-07-14 21:14:52 +00006208 return __r;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006209}
6210
Marshall Clow8c950072014-02-19 21:21:11 +00006211#if _LIBCPP_STD_VER > 11
6212template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
6213bool
6214regex_search(const basic_string<_Cp, _ST, _SA>&& __s,
6215 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
6216 const basic_regex<_Cp, _Tp>& __e,
Louis Dionne173f29e2019-05-29 16:01:36 +00006217 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
Marshall Clow8c950072014-02-19 21:21:11 +00006218#endif
6219
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006220// regex_match
6221
6222template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
Nikolas Klausera9ad6702022-08-13 13:23:16 +02006223_LIBCPP_HIDE_FROM_ABI bool
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006224regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6225 match_results<_BidirectionalIterator, _Allocator>& __m,
6226 const basic_regex<_CharT, _Traits>& __e,
6227 regex_constants::match_flag_type __flags = regex_constants::match_default)
6228{
Tim Shen11113f52016-10-27 21:40:34 +00006229 bool __r = _VSTD::regex_search(
6230 __first, __last, __m, __e,
6231 __flags | regex_constants::match_continuous |
6232 regex_constants::__full_match);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006233 if (__r)
6234 {
6235 __r = !__m.suffix().matched;
6236 if (!__r)
6237 __m.__matches_.clear();
6238 }
6239 return __r;
6240}
6241
6242template <class _BidirectionalIterator, class _CharT, class _Traits>
6243inline _LIBCPP_INLINE_VISIBILITY
6244bool
6245regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6246 const basic_regex<_CharT, _Traits>& __e,
6247 regex_constants::match_flag_type __flags = regex_constants::match_default)
6248{
6249 match_results<_BidirectionalIterator> __m;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006250 return _VSTD::regex_match(__first, __last, __m, __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006251}
6252
6253template <class _CharT, class _Allocator, class _Traits>
6254inline _LIBCPP_INLINE_VISIBILITY
6255bool
6256regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6257 const basic_regex<_CharT, _Traits>& __e,
6258 regex_constants::match_flag_type __flags = regex_constants::match_default)
6259{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006260 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006261}
6262
6263template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6264inline _LIBCPP_INLINE_VISIBILITY
6265bool
6266regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6267 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6268 const basic_regex<_CharT, _Traits>& __e,
6269 regex_constants::match_flag_type __flags = regex_constants::match_default)
6270{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006271 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006272}
6273
Marshall Clow8c950072014-02-19 21:21:11 +00006274#if _LIBCPP_STD_VER > 11
6275template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6276inline _LIBCPP_INLINE_VISIBILITY
6277bool
6278regex_match(const basic_string<_CharT, _ST, _SA>&& __s,
6279 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6280 const basic_regex<_CharT, _Traits>& __e,
Louis Dionne173f29e2019-05-29 16:01:36 +00006281 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
Marshall Clow8c950072014-02-19 21:21:11 +00006282#endif
6283
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006284template <class _CharT, class _Traits>
6285inline _LIBCPP_INLINE_VISIBILITY
6286bool
6287regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6288 regex_constants::match_flag_type __flags = regex_constants::match_default)
6289{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006290 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006291}
6292
6293template <class _ST, class _SA, class _CharT, class _Traits>
6294inline _LIBCPP_INLINE_VISIBILITY
6295bool
6296regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6297 const basic_regex<_CharT, _Traits>& __e,
6298 regex_constants::match_flag_type __flags = regex_constants::match_default)
6299{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006300 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006301}
6302
Howard Hinnantd3925342010-08-16 20:21:16 +00006303// regex_iterator
6304
6305template <class _BidirectionalIterator,
6306 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6307 class _Traits = regex_traits<_CharT> >
Richard Smith256954d2020-11-11 17:12:18 -08006308 class _LIBCPP_TEMPLATE_VIS regex_iterator;
6309
6310typedef regex_iterator<const char*> cregex_iterator;
Richard Smith256954d2020-11-11 17:12:18 -08006311typedef regex_iterator<string::const_iterator> sregex_iterator;
Louis Dionne89258142021-08-23 15:32:36 -04006312#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
6313typedef regex_iterator<const wchar_t*> wcregex_iterator;
Richard Smith256954d2020-11-11 17:12:18 -08006314typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
Louis Dionne89258142021-08-23 15:32:36 -04006315#endif
Richard Smith256954d2020-11-11 17:12:18 -08006316
6317template <class _BidirectionalIterator, class _CharT, class _Traits>
6318class
6319 _LIBCPP_TEMPLATE_VIS
6320 _LIBCPP_PREFERRED_NAME(cregex_iterator)
Louis Dionne89258142021-08-23 15:32:36 -04006321 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_iterator))
Richard Smith256954d2020-11-11 17:12:18 -08006322 _LIBCPP_PREFERRED_NAME(sregex_iterator)
Louis Dionne89258142021-08-23 15:32:36 -04006323 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_iterator))
Richard Smith256954d2020-11-11 17:12:18 -08006324 regex_iterator
Howard Hinnantd3925342010-08-16 20:21:16 +00006325{
6326public:
6327 typedef basic_regex<_CharT, _Traits> regex_type;
6328 typedef match_results<_BidirectionalIterator> value_type;
6329 typedef ptrdiff_t difference_type;
6330 typedef const value_type* pointer;
6331 typedef const value_type& reference;
6332 typedef forward_iterator_tag iterator_category;
6333
6334private:
6335 _BidirectionalIterator __begin_;
6336 _BidirectionalIterator __end_;
6337 const regex_type* __pregex_;
6338 regex_constants::match_flag_type __flags_;
6339 value_type __match_;
6340
6341public:
6342 regex_iterator();
6343 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6344 const regex_type& __re,
Marshall Clow8c950072014-02-19 21:21:11 +00006345 regex_constants::match_flag_type __m
6346 = regex_constants::match_default);
6347#if _LIBCPP_STD_VER > 11
6348 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6349 const regex_type&& __re,
Louis Dionne173f29e2019-05-29 16:01:36 +00006350 regex_constants::match_flag_type __m
Marshall Clow8c950072014-02-19 21:21:11 +00006351 = regex_constants::match_default) = delete;
6352#endif
Howard Hinnantd3925342010-08-16 20:21:16 +00006353
6354 bool operator==(const regex_iterator& __x) const;
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006355 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd3925342010-08-16 20:21:16 +00006356 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
6357
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006358 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd3925342010-08-16 20:21:16 +00006359 reference operator*() const {return __match_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006360 _LIBCPP_INLINE_VISIBILITY
Marshall Clowf01062c2019-01-24 02:02:50 +00006361 pointer operator->() const {return _VSTD::addressof(__match_);}
Howard Hinnantd3925342010-08-16 20:21:16 +00006362
6363 regex_iterator& operator++();
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006364 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd3925342010-08-16 20:21:16 +00006365 regex_iterator operator++(int)
6366 {
6367 regex_iterator __t(*this);
6368 ++(*this);
6369 return __t;
6370 }
6371};
6372
6373template <class _BidirectionalIterator, class _CharT, class _Traits>
6374regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
6375 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
6376{
6377}
6378
6379template <class _BidirectionalIterator, class _CharT, class _Traits>
6380regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6381 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6382 const regex_type& __re, regex_constants::match_flag_type __m)
6383 : __begin_(__a),
6384 __end_(__b),
Marshall Clowf01062c2019-01-24 02:02:50 +00006385 __pregex_(_VSTD::addressof(__re)),
Howard Hinnantd3925342010-08-16 20:21:16 +00006386 __flags_(__m)
6387{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006388 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
Howard Hinnantd3925342010-08-16 20:21:16 +00006389}
6390
6391template <class _BidirectionalIterator, class _CharT, class _Traits>
6392bool
6393regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6394 operator==(const regex_iterator& __x) const
6395{
6396 if (__match_.empty() && __x.__match_.empty())
6397 return true;
6398 if (__match_.empty() || __x.__match_.empty())
6399 return false;
6400 return __begin_ == __x.__begin_ &&
6401 __end_ == __x.__end_ &&
6402 __pregex_ == __x.__pregex_ &&
6403 __flags_ == __x.__flags_ &&
6404 __match_[0] == __x.__match_[0];
6405}
6406
6407template <class _BidirectionalIterator, class _CharT, class _Traits>
6408regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6409regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6410{
6411 __flags_ |= regex_constants::__no_update_pos;
6412 _BidirectionalIterator __start = __match_[0].second;
Marshall Clowfaa964d2017-07-05 16:37:19 +00006413 if (__match_[0].first == __match_[0].second)
Howard Hinnantd3925342010-08-16 20:21:16 +00006414 {
6415 if (__start == __end_)
6416 {
6417 __match_ = value_type();
6418 return *this;
6419 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006420 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
Howard Hinnantd3925342010-08-16 20:21:16 +00006421 __flags_ | regex_constants::match_not_null |
6422 regex_constants::match_continuous))
6423 return *this;
6424 else
6425 ++__start;
6426 }
6427 __flags_ |= regex_constants::match_prev_avail;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006428 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
Howard Hinnantd3925342010-08-16 20:21:16 +00006429 __match_ = value_type();
6430 return *this;
6431}
6432
Howard Hinnantd3925342010-08-16 20:21:16 +00006433// regex_token_iterator
6434
6435template <class _BidirectionalIterator,
6436 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6437 class _Traits = regex_traits<_CharT> >
Richard Smith256954d2020-11-11 17:12:18 -08006438 class _LIBCPP_TEMPLATE_VIS regex_token_iterator;
6439
6440typedef regex_token_iterator<const char*> cregex_token_iterator;
Richard Smith256954d2020-11-11 17:12:18 -08006441typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
Louis Dionne89258142021-08-23 15:32:36 -04006442#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
6443typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
Richard Smith256954d2020-11-11 17:12:18 -08006444typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
Louis Dionne89258142021-08-23 15:32:36 -04006445#endif
Richard Smith256954d2020-11-11 17:12:18 -08006446
6447template <class _BidirectionalIterator, class _CharT, class _Traits>
6448class
6449 _LIBCPP_TEMPLATE_VIS
6450 _LIBCPP_PREFERRED_NAME(cregex_token_iterator)
Louis Dionne89258142021-08-23 15:32:36 -04006451 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_token_iterator))
Richard Smith256954d2020-11-11 17:12:18 -08006452 _LIBCPP_PREFERRED_NAME(sregex_token_iterator)
Louis Dionne89258142021-08-23 15:32:36 -04006453 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_token_iterator))
Richard Smith256954d2020-11-11 17:12:18 -08006454 regex_token_iterator
Howard Hinnantd3925342010-08-16 20:21:16 +00006455{
6456public:
6457 typedef basic_regex<_CharT, _Traits> regex_type;
6458 typedef sub_match<_BidirectionalIterator> value_type;
6459 typedef ptrdiff_t difference_type;
6460 typedef const value_type* pointer;
6461 typedef const value_type& reference;
6462 typedef forward_iterator_tag iterator_category;
6463
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006464private:
6465 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6466
6467 _Position __position_;
6468 const value_type* __result_;
6469 value_type __suffix_;
Eric Fiselier37c22152016-12-24 00:24:44 +00006470 ptrdiff_t __n_;
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006471 vector<int> __subs_;
6472
6473public:
Howard Hinnantd3925342010-08-16 20:21:16 +00006474 regex_token_iterator();
6475 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6476 const regex_type& __re, int __submatch = 0,
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006477 regex_constants::match_flag_type __m =
6478 regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +00006479#if _LIBCPP_STD_VER > 11
6480 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6481 const regex_type&& __re, int __submatch = 0,
6482 regex_constants::match_flag_type __m =
6483 regex_constants::match_default) = delete;
6484#endif
6485
Howard Hinnantd3925342010-08-16 20:21:16 +00006486 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6487 const regex_type& __re, const vector<int>& __submatches,
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006488 regex_constants::match_flag_type __m =
6489 regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +00006490#if _LIBCPP_STD_VER > 11
6491 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6492 const regex_type&& __re, const vector<int>& __submatches,
6493 regex_constants::match_flag_type __m =
6494 regex_constants::match_default) = delete;
6495#endif
6496
Eric Fiselier6f8516f2017-04-18 23:42:15 +00006497#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd3925342010-08-16 20:21:16 +00006498 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006499 const regex_type& __re,
6500 initializer_list<int> __submatches,
6501 regex_constants::match_flag_type __m =
6502 regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +00006503
6504#if _LIBCPP_STD_VER > 11
6505 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6506 const regex_type&& __re,
6507 initializer_list<int> __submatches,
6508 regex_constants::match_flag_type __m =
6509 regex_constants::match_default) = delete;
6510#endif
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04006511#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc834c512011-11-29 18:15:50 +00006512 template <size_t _Np>
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006513 regex_token_iterator(_BidirectionalIterator __a,
6514 _BidirectionalIterator __b,
6515 const regex_type& __re,
Howard Hinnantc834c512011-11-29 18:15:50 +00006516 const int (&__submatches)[_Np],
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006517 regex_constants::match_flag_type __m =
6518 regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +00006519#if _LIBCPP_STD_VER > 11
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05006520 template <size_t _Np>
Marshall Clow8c950072014-02-19 21:21:11 +00006521 regex_token_iterator(_BidirectionalIterator __a,
6522 _BidirectionalIterator __b,
6523 const regex_type&& __re,
6524 const int (&__submatches)[_Np],
6525 regex_constants::match_flag_type __m =
6526 regex_constants::match_default) = delete;
6527#endif
6528
Howard Hinnantd3925342010-08-16 20:21:16 +00006529 regex_token_iterator(const regex_token_iterator&);
6530 regex_token_iterator& operator=(const regex_token_iterator&);
6531
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006532 bool operator==(const regex_token_iterator& __x) const;
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006533 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006534 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
Howard Hinnantd3925342010-08-16 20:21:16 +00006535
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006536 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006537 const value_type& operator*() const {return *__result_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006538 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006539 const value_type* operator->() const {return __result_;}
Howard Hinnantd3925342010-08-16 20:21:16 +00006540
6541 regex_token_iterator& operator++();
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006542 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006543 regex_token_iterator operator++(int)
6544 {
6545 regex_token_iterator __t(*this);
6546 ++(*this);
6547 return __t;
6548 }
6549
6550private:
6551 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
Marshall Clow68083022014-01-09 18:25:57 +00006552 void __establish_result () {
Eric Fiselier37c22152016-12-24 00:24:44 +00006553 if (__subs_[__n_] == -1)
Marshall Clow68083022014-01-09 18:25:57 +00006554 __result_ = &__position_->prefix();
6555 else
Eric Fiselier37c22152016-12-24 00:24:44 +00006556 __result_ = &(*__position_)[__subs_[__n_]];
Louis Dionne173f29e2019-05-29 16:01:36 +00006557 }
Howard Hinnantd3925342010-08-16 20:21:16 +00006558};
6559
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006560template <class _BidirectionalIterator, class _CharT, class _Traits>
6561regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6562 regex_token_iterator()
6563 : __result_(nullptr),
6564 __suffix_(),
Eric Fiselier37c22152016-12-24 00:24:44 +00006565 __n_(0)
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006566{
6567}
6568
6569template <class _BidirectionalIterator, class _CharT, class _Traits>
6570void
6571regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6572 __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6573{
6574 if (__position_ != _Position())
Marshall Clow68083022014-01-09 18:25:57 +00006575 __establish_result ();
Eric Fiselier37c22152016-12-24 00:24:44 +00006576 else if (__subs_[__n_] == -1)
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006577 {
6578 __suffix_.matched = true;
6579 __suffix_.first = __a;
6580 __suffix_.second = __b;
6581 __result_ = &__suffix_;
6582 }
6583 else
6584 __result_ = nullptr;
6585}
6586
6587template <class _BidirectionalIterator, class _CharT, class _Traits>
6588regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6589 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6590 const regex_type& __re, int __submatch,
6591 regex_constants::match_flag_type __m)
6592 : __position_(__a, __b, __re, __m),
Eric Fiselier37c22152016-12-24 00:24:44 +00006593 __n_(0),
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006594 __subs_(1, __submatch)
6595{
6596 __init(__a, __b);
6597}
6598
6599template <class _BidirectionalIterator, class _CharT, class _Traits>
6600regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6601 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6602 const regex_type& __re, const vector<int>& __submatches,
6603 regex_constants::match_flag_type __m)
6604 : __position_(__a, __b, __re, __m),
Eric Fiselier37c22152016-12-24 00:24:44 +00006605 __n_(0),
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006606 __subs_(__submatches)
6607{
6608 __init(__a, __b);
6609}
6610
Eric Fiselier6f8516f2017-04-18 23:42:15 +00006611#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00006612
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006613template <class _BidirectionalIterator, class _CharT, class _Traits>
6614regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6615 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6616 const regex_type& __re,
6617 initializer_list<int> __submatches,
6618 regex_constants::match_flag_type __m)
6619 : __position_(__a, __b, __re, __m),
Eric Fiselier37c22152016-12-24 00:24:44 +00006620 __n_(0),
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006621 __subs_(__submatches)
6622{
6623 __init(__a, __b);
6624}
6625
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04006626#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00006627
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006628template <class _BidirectionalIterator, class _CharT, class _Traits>
Howard Hinnantc834c512011-11-29 18:15:50 +00006629template <size_t _Np>
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006630regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6631 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6632 const regex_type& __re,
Howard Hinnantc834c512011-11-29 18:15:50 +00006633 const int (&__submatches)[_Np],
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006634 regex_constants::match_flag_type __m)
6635 : __position_(__a, __b, __re, __m),
Eric Fiselier37c22152016-12-24 00:24:44 +00006636 __n_(0),
Marshall Clowf01062c2019-01-24 02:02:50 +00006637 __subs_(begin(__submatches), end(__submatches))
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006638{
6639 __init(__a, __b);
6640}
6641
6642template <class _BidirectionalIterator, class _CharT, class _Traits>
6643regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6644 regex_token_iterator(const regex_token_iterator& __x)
6645 : __position_(__x.__position_),
6646 __result_(__x.__result_),
6647 __suffix_(__x.__suffix_),
Eric Fiselier37c22152016-12-24 00:24:44 +00006648 __n_(__x.__n_),
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006649 __subs_(__x.__subs_)
6650{
6651 if (__x.__result_ == &__x.__suffix_)
Marshall Clow20756ac2014-01-13 17:47:08 +00006652 __result_ = &__suffix_;
Marshall Clow68083022014-01-09 18:25:57 +00006653 else if ( __result_ != nullptr )
6654 __establish_result ();
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006655}
6656
6657template <class _BidirectionalIterator, class _CharT, class _Traits>
6658regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6659regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6660 operator=(const regex_token_iterator& __x)
6661{
6662 if (this != &__x)
6663 {
6664 __position_ = __x.__position_;
6665 if (__x.__result_ == &__x.__suffix_)
Marshall Clow68083022014-01-09 18:25:57 +00006666 __result_ = &__suffix_;
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006667 else
6668 __result_ = __x.__result_;
6669 __suffix_ = __x.__suffix_;
Eric Fiselier37c22152016-12-24 00:24:44 +00006670 __n_ = __x.__n_;
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006671 __subs_ = __x.__subs_;
Marshall Clow68083022014-01-09 18:25:57 +00006672
6673 if ( __result_ != nullptr && __result_ != &__suffix_ )
6674 __establish_result();
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006675 }
6676 return *this;
6677}
6678
6679template <class _BidirectionalIterator, class _CharT, class _Traits>
6680bool
6681regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6682 operator==(const regex_token_iterator& __x) const
6683{
6684 if (__result_ == nullptr && __x.__result_ == nullptr)
6685 return true;
6686 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6687 __suffix_ == __x.__suffix_)
6688 return true;
6689 if (__result_ == nullptr || __x.__result_ == nullptr)
6690 return false;
6691 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6692 return false;
Eric Fiselier37c22152016-12-24 00:24:44 +00006693 return __position_ == __x.__position_ && __n_ == __x.__n_ &&
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006694 __subs_ == __x.__subs_;
6695}
6696
6697template <class _BidirectionalIterator, class _CharT, class _Traits>
6698regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6699regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6700{
6701 _Position __prev = __position_;
6702 if (__result_ == &__suffix_)
6703 __result_ = nullptr;
Eric Fiselier37c22152016-12-24 00:24:44 +00006704 else if (static_cast<size_t>(__n_ + 1) < __subs_.size())
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006705 {
Eric Fiselier37c22152016-12-24 00:24:44 +00006706 ++__n_;
Marshall Clow68083022014-01-09 18:25:57 +00006707 __establish_result();
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006708 }
6709 else
6710 {
Eric Fiselier37c22152016-12-24 00:24:44 +00006711 __n_ = 0;
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006712 ++__position_;
6713 if (__position_ != _Position())
Marshall Clow68083022014-01-09 18:25:57 +00006714 __establish_result();
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006715 else
6716 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006717 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006718 && __prev->suffix().length() != 0)
6719 {
6720 __suffix_.matched = true;
6721 __suffix_.first = __prev->suffix().first;
6722 __suffix_.second = __prev->suffix().second;
6723 __result_ = &__suffix_;
6724 }
6725 else
6726 __result_ = nullptr;
6727 }
6728 }
6729 return *this;
6730}
6731
Howard Hinnante90434c2010-08-18 00:13:08 +00006732// regex_replace
6733
6734template <class _OutputIterator, class _BidirectionalIterator,
6735 class _Traits, class _CharT>
Nikolas Klausera9ad6702022-08-13 13:23:16 +02006736_LIBCPP_HIDE_FROM_ABI _OutputIterator
Alexander Richardsonc9637642017-11-14 11:14:25 +00006737regex_replace(_OutputIterator __output_iter,
Howard Hinnante90434c2010-08-18 00:13:08 +00006738 _BidirectionalIterator __first, _BidirectionalIterator __last,
6739 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6740 regex_constants::match_flag_type __flags = regex_constants::match_default)
6741{
6742 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6743 _Iter __i(__first, __last, __e, __flags);
6744 _Iter __eof;
6745 if (__i == __eof)
6746 {
6747 if (!(__flags & regex_constants::format_no_copy))
Alexander Richardsonc9637642017-11-14 11:14:25 +00006748 __output_iter = _VSTD::copy(__first, __last, __output_iter);
Howard Hinnante90434c2010-08-18 00:13:08 +00006749 }
6750 else
6751 {
6752 sub_match<_BidirectionalIterator> __lm;
6753 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6754 {
6755 if (!(__flags & regex_constants::format_no_copy))
Alexander Richardsonc9637642017-11-14 11:14:25 +00006756 __output_iter = _VSTD::copy(__i->prefix().first, __i->prefix().second, __output_iter);
6757 __output_iter = __i->format(__output_iter, __fmt, __fmt + __len, __flags);
Howard Hinnante90434c2010-08-18 00:13:08 +00006758 __lm = __i->suffix();
6759 if (__flags & regex_constants::format_first_only)
6760 break;
6761 }
6762 if (!(__flags & regex_constants::format_no_copy))
Alexander Richardsonc9637642017-11-14 11:14:25 +00006763 __output_iter = _VSTD::copy(__lm.first, __lm.second, __output_iter);
Howard Hinnante90434c2010-08-18 00:13:08 +00006764 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00006765 return __output_iter;
Howard Hinnante90434c2010-08-18 00:13:08 +00006766}
6767
6768template <class _OutputIterator, class _BidirectionalIterator,
6769 class _Traits, class _CharT, class _ST, class _SA>
6770inline _LIBCPP_INLINE_VISIBILITY
6771_OutputIterator
Alexander Richardsonc9637642017-11-14 11:14:25 +00006772regex_replace(_OutputIterator __output_iter,
Howard Hinnante90434c2010-08-18 00:13:08 +00006773 _BidirectionalIterator __first, _BidirectionalIterator __last,
6774 const basic_regex<_CharT, _Traits>& __e,
6775 const basic_string<_CharT, _ST, _SA>& __fmt,
6776 regex_constants::match_flag_type __flags = regex_constants::match_default)
6777{
Alexander Richardsonc9637642017-11-14 11:14:25 +00006778 return _VSTD::regex_replace(__output_iter, __first, __last, __e, __fmt.c_str(), __flags);
Howard Hinnante90434c2010-08-18 00:13:08 +00006779}
6780
6781template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6782 class _FSA>
6783inline _LIBCPP_INLINE_VISIBILITY
6784basic_string<_CharT, _ST, _SA>
6785regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6786 const basic_regex<_CharT, _Traits>& __e,
6787 const basic_string<_CharT, _FST, _FSA>& __fmt,
6788 regex_constants::match_flag_type __flags = regex_constants::match_default)
6789{
6790 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006791 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnante90434c2010-08-18 00:13:08 +00006792 __fmt.c_str(), __flags);
6793 return __r;
6794}
6795
6796template <class _Traits, class _CharT, class _ST, class _SA>
6797inline _LIBCPP_INLINE_VISIBILITY
6798basic_string<_CharT, _ST, _SA>
6799regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6800 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6801 regex_constants::match_flag_type __flags = regex_constants::match_default)
6802{
6803 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006804 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnante90434c2010-08-18 00:13:08 +00006805 __fmt, __flags);
6806 return __r;
6807}
6808
6809template <class _Traits, class _CharT, class _ST, class _SA>
6810inline _LIBCPP_INLINE_VISIBILITY
6811basic_string<_CharT>
6812regex_replace(const _CharT* __s,
6813 const basic_regex<_CharT, _Traits>& __e,
6814 const basic_string<_CharT, _ST, _SA>& __fmt,
6815 regex_constants::match_flag_type __flags = regex_constants::match_default)
6816{
6817 basic_string<_CharT> __r;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006818 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnante90434c2010-08-18 00:13:08 +00006819 __s + char_traits<_CharT>::length(__s), __e,
6820 __fmt.c_str(), __flags);
6821 return __r;
6822}
6823
6824template <class _Traits, class _CharT>
6825inline _LIBCPP_INLINE_VISIBILITY
6826basic_string<_CharT>
6827regex_replace(const _CharT* __s,
6828 const basic_regex<_CharT, _Traits>& __e,
6829 const _CharT* __fmt,
6830 regex_constants::match_flag_type __flags = regex_constants::match_default)
6831{
6832 basic_string<_CharT> __r;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006833 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnante90434c2010-08-18 00:13:08 +00006834 __s + char_traits<_CharT>::length(__s), __e,
6835 __fmt, __flags);
6836 return __r;
6837}
6838
Howard Hinnanta3af5a32010-06-17 00:34:59 +00006839_LIBCPP_END_NAMESPACE_STD
6840
Arthur O'Dwyerebf2d342022-10-06 16:53:30 -04006841#if _LIBCPP_STD_VER > 14
6842_LIBCPP_BEGIN_NAMESPACE_STD
6843namespace pmr {
6844template <class _BidirT>
6845using match_results = std::match_results<_BidirT, polymorphic_allocator<std::sub_match<_BidirT>>>;
6846
6847using cmatch = match_results<const char*>;
6848using wcmatch = match_results<const wchar_t*>;
6849using smatch = match_results<std::pmr::string::const_iterator>;
6850using wsmatch = match_results<std::pmr::wstring::const_iterator>;
6851} // namespace pmr
6852_LIBCPP_END_NAMESPACE_STD
6853#endif
6854
Eric Fiselierf4433a32017-05-31 22:07:49 +00006855_LIBCPP_POP_MACROS
6856
Mark de Weveree5fe272022-09-02 17:53:28 +02006857#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 20
6858# include <iterator>
6859# include <utility>
6860#endif
6861
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04006862#endif // _LIBCPP_REGEX