blob: 661a08b7c30c7752a4156acd0242fa423cb3a16e [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>
Louis Dionne9bdbeb32022-02-14 13:41:09 -0500766#include <__assert>
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000767#include <__config>
Louis Dionne77249522021-06-11 09:55:11 -0400768#include <__iterator/wrap_iter.h>
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000769#include <__locale>
Nikolas Klauser8fccd622022-03-05 19:17:07 +0100770#include <__utility/move.h>
771#include <__utility/swap.h>
Arthur O'Dwyer7deec122021-03-24 18:19:12 -0400772#include <compare>
Howard Hinnantaa0874c2010-07-12 15:51:17 +0000773#include <deque>
Arthur O'Dwyer597cac42021-05-12 23:04:03 -0400774#include <initializer_list>
775#include <iterator>
776#include <memory>
777#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
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000782#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Arthur O'Dwyer6eeaa002022-02-01 20:16:40 -0500783# pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000784#endif
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000785
Eric Fiselierf4433a32017-05-31 22:07:49 +0000786_LIBCPP_PUSH_MACROS
787#include <__undef_macros>
788
789
Marshall Clowd39d21d2017-09-12 17:56:59 +0000790#define _LIBCPP_REGEX_COMPLEXITY_FACTOR 4096
791
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000792_LIBCPP_BEGIN_NAMESPACE_STD
793
794namespace regex_constants
795{
796
797// syntax_option_type
798
799enum syntax_option_type
800{
801 icase = 1 << 0,
802 nosubs = 1 << 1,
803 optimize = 1 << 2,
804 collate = 1 << 3,
Marshall Clow88a30872019-03-28 17:30:23 +0000805#ifdef _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO
806 ECMAScript = 1 << 9,
807#else
Howard Hinnantebbc2b62010-07-27 17:24:17 +0000808 ECMAScript = 0,
Marshall Clow88a30872019-03-28 17:30:23 +0000809#endif
Howard Hinnantebbc2b62010-07-27 17:24:17 +0000810 basic = 1 << 4,
811 extended = 1 << 5,
812 awk = 1 << 6,
813 grep = 1 << 7,
Mark de Wevera989cce2020-11-18 18:09:13 +0100814 egrep = 1 << 8,
815 // 1 << 9 may be used by ECMAScript
816 multiline = 1 << 10
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000817};
818
Marshall Clow88a30872019-03-28 17:30:23 +0000819inline _LIBCPP_CONSTEXPR
820syntax_option_type __get_grammar(syntax_option_type __g)
821{
822#ifdef _LIBCPP_ABI_REGEX_CONSTANTS_NONZERO
823 return static_cast<syntax_option_type>(__g & 0x3F0);
824#else
825 return static_cast<syntax_option_type>(__g & 0x1F0);
826#endif
827}
828
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000829inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000830_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000831syntax_option_type
832operator~(syntax_option_type __x)
833{
Marshall Clow924cffa2013-03-22 02:13:55 +0000834 return syntax_option_type(~int(__x) & 0x1FF);
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000835}
836
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000837inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000838_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000839syntax_option_type
840operator&(syntax_option_type __x, syntax_option_type __y)
841{
842 return syntax_option_type(int(__x) & int(__y));
843}
844
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000845inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000846_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000847syntax_option_type
848operator|(syntax_option_type __x, syntax_option_type __y)
849{
850 return syntax_option_type(int(__x) | int(__y));
851}
852
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000853inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000854_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000855syntax_option_type
856operator^(syntax_option_type __x, syntax_option_type __y)
857{
858 return syntax_option_type(int(__x) ^ int(__y));
859}
860
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000861inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000862syntax_option_type&
863operator&=(syntax_option_type& __x, syntax_option_type __y)
864{
865 __x = __x & __y;
866 return __x;
867}
868
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000869inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000870syntax_option_type&
871operator|=(syntax_option_type& __x, syntax_option_type __y)
872{
873 __x = __x | __y;
874 return __x;
875}
876
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000877inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000878syntax_option_type&
879operator^=(syntax_option_type& __x, syntax_option_type __y)
880{
881 __x = __x ^ __y;
882 return __x;
883}
884
885// match_flag_type
886
887enum match_flag_type
888{
889 match_default = 0,
890 match_not_bol = 1 << 0,
891 match_not_eol = 1 << 1,
892 match_not_bow = 1 << 2,
893 match_not_eow = 1 << 3,
894 match_any = 1 << 4,
895 match_not_null = 1 << 5,
896 match_continuous = 1 << 6,
897 match_prev_avail = 1 << 7,
898 format_default = 0,
899 format_sed = 1 << 8,
900 format_no_copy = 1 << 9,
Howard Hinnantd3925342010-08-16 20:21:16 +0000901 format_first_only = 1 << 10,
Tim Shen11113f52016-10-27 21:40:34 +0000902 __no_update_pos = 1 << 11,
903 __full_match = 1 << 12
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000904};
905
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000906inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000907_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000908match_flag_type
909operator~(match_flag_type __x)
910{
Marshall Clow924cffa2013-03-22 02:13:55 +0000911 return match_flag_type(~int(__x) & 0x0FFF);
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000912}
913
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000914inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000915_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000916match_flag_type
917operator&(match_flag_type __x, match_flag_type __y)
918{
919 return match_flag_type(int(__x) & int(__y));
920}
921
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000922inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000923_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000924match_flag_type
925operator|(match_flag_type __x, match_flag_type __y)
926{
927 return match_flag_type(int(__x) | int(__y));
928}
929
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000930inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000931_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000932match_flag_type
933operator^(match_flag_type __x, match_flag_type __y)
934{
935 return match_flag_type(int(__x) ^ int(__y));
936}
937
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000938inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000939match_flag_type&
940operator&=(match_flag_type& __x, match_flag_type __y)
941{
942 __x = __x & __y;
943 return __x;
944}
945
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000946inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000947match_flag_type&
948operator|=(match_flag_type& __x, match_flag_type __y)
949{
950 __x = __x | __y;
951 return __x;
952}
953
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000954inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000955match_flag_type&
956operator^=(match_flag_type& __x, match_flag_type __y)
957{
958 __x = __x ^ __y;
959 return __x;
960}
961
962enum error_type
963{
964 error_collate = 1,
965 error_ctype,
966 error_escape,
967 error_backref,
968 error_brack,
969 error_paren,
970 error_brace,
971 error_badbrace,
972 error_range,
973 error_space,
974 error_badrepeat,
975 error_complexity,
Howard Hinnant6c891682010-06-24 21:28:00 +0000976 error_stack,
Howard Hinnantebbc2b62010-07-27 17:24:17 +0000977 __re_err_grammar,
978 __re_err_empty,
Mark de Wevera0ad9762019-11-09 17:01:37 +0100979 __re_err_unknown,
980 __re_err_parse
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000981};
982
Nikolas Klauserd26407a2021-12-02 14:12:51 +0100983} // namespace regex_constants
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000984
985class _LIBCPP_EXCEPTION_ABI regex_error
986 : public runtime_error
987{
988 regex_constants::error_type __code_;
989public:
990 explicit regex_error(regex_constants::error_type __ecode);
Dimitry Andric47269ce2020-03-13 19:36:26 +0100991 regex_error(const regex_error&) _NOEXCEPT = default;
992 virtual ~regex_error() _NOEXCEPT;
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000993 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000994 regex_constants::error_type code() const {return __code_;}
995};
996
Marshall Clowc8ccc292015-07-28 13:30:47 +0000997template <regex_constants::error_type _Ev>
Louis Dionne16fe2952018-07-11 23:14:33 +0000998_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
Marshall Clowc8ccc292015-07-28 13:30:47 +0000999void __throw_regex_error()
1000{
1001#ifndef _LIBCPP_NO_EXCEPTIONS
Marshall Clow8bf61bb2015-08-17 21:14:16 +00001002 throw regex_error(_Ev);
1003#else
Marshall Clow8fea1612016-08-25 15:09:01 +00001004 _VSTD::abort();
Marshall Clowc8ccc292015-07-28 13:30:47 +00001005#endif
1006}
1007
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001008template <class _CharT>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001009struct _LIBCPP_TEMPLATE_VIS regex_traits
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001010{
1011public:
1012 typedef _CharT char_type;
1013 typedef basic_string<char_type> string_type;
1014 typedef locale locale_type;
Dan Albert70ee07e2020-04-06 13:34:27 -07001015#ifdef __BIONIC__
1016 // Originally bionic's ctype_base used its own ctype masks because the
1017 // builtin ctype implementation wasn't in libc++ yet. Bionic's ctype mask
1018 // was only 8 bits wide and already saturated, so it used a wider type here
1019 // to make room for __regex_word (then a part of this class rather than
1020 // ctype_base). Bionic has since moved to the builtin ctype_base
1021 // implementation, but this was not updated to match. Since then Android has
1022 // needed to maintain a stable libc++ ABI, and this can't be changed without
1023 // an ABI break.
1024 typedef uint16_t char_class_type;
1025#else
Howard Hinnant40b45e12010-06-21 21:01:43 +00001026 typedef ctype_base::mask char_class_type;
Dan Albert70ee07e2020-04-06 13:34:27 -07001027#endif
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001028
Mikhail Maltsev014ed062019-06-14 09:04:16 +00001029 static const char_class_type __regex_word = ctype_base::__regex_word;
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001030private:
1031 locale __loc_;
1032 const ctype<char_type>* __ct_;
1033 const collate<char_type>* __col_;
1034
1035public:
1036 regex_traits();
1037
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001038 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001039 static size_t length(const char_type* __p)
1040 {return char_traits<char_type>::length(__p);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001041 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001042 char_type translate(char_type __c) const {return __c;}
1043 char_type translate_nocase(char_type __c) const;
1044 template <class _ForwardIterator>
1045 string_type
1046 transform(_ForwardIterator __f, _ForwardIterator __l) const;
1047 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001048 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001049 string_type
1050 transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
1051 {return __transform_primary(__f, __l, char_type());}
1052 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001053 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001054 string_type
1055 lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
1056 {return __lookup_collatename(__f, __l, char_type());}
1057 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001058 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001059 char_class_type
1060 lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
Howard Hinnant40b45e12010-06-21 21:01:43 +00001061 bool __icase = false) const
1062 {return __lookup_classname(__f, __l, __icase, char_type());}
1063 bool isctype(char_type __c, char_class_type __m) const;
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001064 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant40b45e12010-06-21 21:01:43 +00001065 int value(char_type __ch, int __radix) const
Marshall Clowef420192013-10-21 15:43:25 +00001066 {return __regex_traits_value(__ch, __radix);}
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001067 locale_type imbue(locale_type __l);
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001068 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001069 locale_type getloc()const {return __loc_;}
1070
1071private:
1072 void __init();
1073
1074 template <class _ForwardIterator>
1075 string_type
1076 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
Louis Dionne89258142021-08-23 15:32:36 -04001077#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001078 template <class _ForwardIterator>
1079 string_type
1080 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
Louis Dionne89258142021-08-23 15:32:36 -04001081#endif
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001082 template <class _ForwardIterator>
1083 string_type
1084 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
Louis Dionne89258142021-08-23 15:32:36 -04001085#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001086 template <class _ForwardIterator>
1087 string_type
1088 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
Louis Dionne89258142021-08-23 15:32:36 -04001089#endif
Howard Hinnant40b45e12010-06-21 21:01:43 +00001090 template <class _ForwardIterator>
1091 char_class_type
1092 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1093 bool __icase, char) const;
Louis Dionne89258142021-08-23 15:32:36 -04001094#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnant40b45e12010-06-21 21:01:43 +00001095 template <class _ForwardIterator>
1096 char_class_type
1097 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1098 bool __icase, wchar_t) const;
Louis Dionne89258142021-08-23 15:32:36 -04001099#endif
Howard Hinnant40b45e12010-06-21 21:01:43 +00001100
Marshall Clowef420192013-10-21 15:43:25 +00001101 static int __regex_traits_value(unsigned char __ch, int __radix);
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001102 _LIBCPP_INLINE_VISIBILITY
Marshall Clowef420192013-10-21 15:43:25 +00001103 int __regex_traits_value(char __ch, int __radix) const
1104 {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
Louis Dionne89258142021-08-23 15:32:36 -04001105#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001106 _LIBCPP_INLINE_VISIBILITY
Marshall Clowef420192013-10-21 15:43:25 +00001107 int __regex_traits_value(wchar_t __ch, int __radix) const;
Louis Dionne89258142021-08-23 15:32:36 -04001108#endif
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001109};
1110
1111template <class _CharT>
Howard Hinnant592cb612013-03-07 19:38:08 +00001112const typename regex_traits<_CharT>::char_class_type
1113regex_traits<_CharT>::__regex_word;
1114
1115template <class _CharT>
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001116regex_traits<_CharT>::regex_traits()
1117{
1118 __init();
1119}
1120
1121template <class _CharT>
1122typename regex_traits<_CharT>::char_type
1123regex_traits<_CharT>::translate_nocase(char_type __c) const
1124{
1125 return __ct_->tolower(__c);
1126}
1127
1128template <class _CharT>
1129template <class _ForwardIterator>
1130typename regex_traits<_CharT>::string_type
1131regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
1132{
1133 string_type __s(__f, __l);
1134 return __col_->transform(__s.data(), __s.data() + __s.size());
1135}
1136
1137template <class _CharT>
1138void
1139regex_traits<_CharT>::__init()
1140{
1141 __ct_ = &use_facet<ctype<char_type> >(__loc_);
1142 __col_ = &use_facet<collate<char_type> >(__loc_);
1143}
1144
1145template <class _CharT>
1146typename regex_traits<_CharT>::locale_type
1147regex_traits<_CharT>::imbue(locale_type __l)
1148{
1149 locale __r = __loc_;
1150 __loc_ = __l;
1151 __init();
1152 return __r;
1153}
1154
1155// transform_primary is very FreeBSD-specific
1156
1157template <class _CharT>
1158template <class _ForwardIterator>
1159typename regex_traits<_CharT>::string_type
1160regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1161 _ForwardIterator __l, char) const
1162{
1163 const string_type __s(__f, __l);
1164 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1165 switch (__d.size())
1166 {
1167 case 1:
1168 break;
1169 case 12:
1170 __d[11] = __d[3];
1171 break;
1172 default:
1173 __d.clear();
1174 break;
1175 }
1176 return __d;
1177}
1178
Louis Dionne89258142021-08-23 15:32:36 -04001179#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001180template <class _CharT>
1181template <class _ForwardIterator>
1182typename regex_traits<_CharT>::string_type
1183regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1184 _ForwardIterator __l, wchar_t) const
1185{
1186 const string_type __s(__f, __l);
1187 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1188 switch (__d.size())
1189 {
1190 case 1:
1191 break;
1192 case 3:
1193 __d[2] = __d[0];
1194 break;
1195 default:
1196 __d.clear();
1197 break;
1198 }
1199 return __d;
1200}
Louis Dionne89258142021-08-23 15:32:36 -04001201#endif
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001202
1203// lookup_collatename is very FreeBSD-specific
1204
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00001205_LIBCPP_FUNC_VIS string __get_collation_name(const char* __s);
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001206
1207template <class _CharT>
1208template <class _ForwardIterator>
1209typename regex_traits<_CharT>::string_type
1210regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1211 _ForwardIterator __l, char) const
1212{
1213 string_type __s(__f, __l);
1214 string_type __r;
1215 if (!__s.empty())
1216 {
1217 __r = __get_collation_name(__s.c_str());
1218 if (__r.empty() && __s.size() <= 2)
1219 {
1220 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1221 if (__r.size() == 1 || __r.size() == 12)
1222 __r = __s;
1223 else
1224 __r.clear();
1225 }
1226 }
1227 return __r;
1228}
1229
Louis Dionne89258142021-08-23 15:32:36 -04001230#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001231template <class _CharT>
1232template <class _ForwardIterator>
1233typename regex_traits<_CharT>::string_type
1234regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1235 _ForwardIterator __l, wchar_t) const
1236{
1237 string_type __s(__f, __l);
1238 string __n;
1239 __n.reserve(__s.size());
1240 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1241 __i != __e; ++__i)
1242 {
1243 if (static_cast<unsigned>(*__i) >= 127)
1244 return string_type();
1245 __n.push_back(char(*__i));
1246 }
1247 string_type __r;
1248 if (!__s.empty())
1249 {
1250 __n = __get_collation_name(__n.c_str());
1251 if (!__n.empty())
1252 __r.assign(__n.begin(), __n.end());
1253 else if (__s.size() <= 2)
1254 {
1255 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1256 if (__r.size() == 1 || __r.size() == 3)
1257 __r = __s;
1258 else
1259 __r.clear();
1260 }
1261 }
1262 return __r;
1263}
Louis Dionne89258142021-08-23 15:32:36 -04001264#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001265
Howard Hinnant40b45e12010-06-21 21:01:43 +00001266// lookup_classname
1267
Dan Albert49f384c2014-07-29 19:23:39 +00001268regex_traits<char>::char_class_type _LIBCPP_FUNC_VIS
1269__get_classname(const char* __s, bool __icase);
Howard Hinnant40b45e12010-06-21 21:01:43 +00001270
1271template <class _CharT>
1272template <class _ForwardIterator>
1273typename regex_traits<_CharT>::char_class_type
1274regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1275 _ForwardIterator __l,
1276 bool __icase, char) const
1277{
1278 string_type __s(__f, __l);
1279 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1280 return __get_classname(__s.c_str(), __icase);
1281}
1282
Louis Dionne89258142021-08-23 15:32:36 -04001283#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnant40b45e12010-06-21 21:01:43 +00001284template <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, wchar_t) const
1290{
1291 string_type __s(__f, __l);
1292 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1293 string __n;
1294 __n.reserve(__s.size());
1295 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1296 __i != __e; ++__i)
1297 {
1298 if (static_cast<unsigned>(*__i) >= 127)
1299 return char_class_type();
1300 __n.push_back(char(*__i));
1301 }
1302 return __get_classname(__n.c_str(), __icase);
1303}
Louis Dionne89258142021-08-23 15:32:36 -04001304#endif // _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnant40b45e12010-06-21 21:01:43 +00001305
1306template <class _CharT>
1307bool
1308regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
1309{
1310 if (__ct_->is(__m, __c))
1311 return true;
1312 return (__c == '_' && (__m & __regex_word));
1313}
1314
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001315inline _LIBCPP_INLINE_VISIBILITY
1316bool __is_07(unsigned char c)
1317{
1318 return (c & 0xF8u) ==
1319#if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
1320 0xF0;
1321#else
1322 0x30;
1323#endif
1324}
1325
1326inline _LIBCPP_INLINE_VISIBILITY
1327bool __is_89(unsigned char c)
1328{
1329 return (c & 0xFEu) ==
1330#if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
1331 0xF8;
1332#else
1333 0x38;
1334#endif
1335}
1336
1337inline _LIBCPP_INLINE_VISIBILITY
1338unsigned char __to_lower(unsigned char c)
1339{
1340#if defined(__MVS__) && !defined(__NATIVE_ASCII_F)
1341 return c & 0xBF;
1342#else
1343 return c | 0x20;
1344#endif
1345}
1346
Howard Hinnant40b45e12010-06-21 21:01:43 +00001347template <class _CharT>
1348int
Marshall Clowef420192013-10-21 15:43:25 +00001349regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
Howard Hinnant40b45e12010-06-21 21:01:43 +00001350{
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001351 if (__is_07(__ch)) // '0' <= __ch && __ch <= '7'
Howard Hinnant40b45e12010-06-21 21:01:43 +00001352 return __ch - '0';
1353 if (__radix != 8)
1354 {
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001355 if (__is_89(__ch)) // '8' <= __ch && __ch <= '9'
Howard Hinnant40b45e12010-06-21 21:01:43 +00001356 return __ch - '0';
1357 if (__radix == 16)
1358 {
Muiez Ahmed38aa7872022-01-14 11:35:53 -05001359 __ch = __to_lower(__ch); // tolower
Howard Hinnant40b45e12010-06-21 21:01:43 +00001360 if ('a' <= __ch && __ch <= 'f')
Howard Hinnant6c891682010-06-24 21:28:00 +00001361 return __ch - ('a' - 10);
Howard Hinnant40b45e12010-06-21 21:01:43 +00001362 }
1363 }
1364 return -1;
1365}
1366
Louis Dionne89258142021-08-23 15:32:36 -04001367#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnant40b45e12010-06-21 21:01:43 +00001368template <class _CharT>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001369inline
Howard Hinnant40b45e12010-06-21 21:01:43 +00001370int
Marshall Clowef420192013-10-21 15:43:25 +00001371regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
Howard Hinnant40b45e12010-06-21 21:01:43 +00001372{
Marshall Clowef420192013-10-21 15:43:25 +00001373 return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
Howard Hinnant40b45e12010-06-21 21:01:43 +00001374}
Louis Dionne89258142021-08-23 15:32:36 -04001375#endif
Howard Hinnant40b45e12010-06-21 21:01:43 +00001376
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001377template <class _CharT> class __node;
1378
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001379template <class _BidirectionalIterator> class _LIBCPP_TEMPLATE_VIS sub_match;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001380
Howard Hinnant70d27852010-07-27 01:25:38 +00001381template <class _BidirectionalIterator,
1382 class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001383class _LIBCPP_TEMPLATE_VIS match_results;
Howard Hinnant70d27852010-07-27 01:25:38 +00001384
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001385template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001386struct __state
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001387{
1388 enum
1389 {
1390 __end_state = -1000,
1391 __consume_input, // -999
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001392 __begin_marked_expr, // -998
1393 __end_marked_expr, // -997
Howard Hinnant5bf96132010-07-08 17:43:58 +00001394 __pop_state, // -996
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001395 __accept_and_consume, // -995
1396 __accept_but_not_consume, // -994
1397 __reject, // -993
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001398 __split,
1399 __repeat
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001400 };
1401
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001402 int __do_;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001403 const _CharT* __first_;
1404 const _CharT* __current_;
1405 const _CharT* __last_;
1406 vector<sub_match<const _CharT*> > __sub_matches_;
1407 vector<pair<size_t, const _CharT*> > __loop_data_;
1408 const __node<_CharT>* __node_;
1409 regex_constants::match_flag_type __flags_;
Howard Hinnant066ba512011-03-26 20:02:27 +00001410 bool __at_first_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001411
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001412 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001413 __state()
1414 : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
1415 __node_(nullptr), __flags_() {}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001416};
1417
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001418// __node
Howard Hinnant67ad2132010-06-29 18:37:43 +00001419
1420template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001421class __node
Howard Hinnant67ad2132010-06-29 18:37:43 +00001422{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001423 __node(const __node&);
1424 __node& operator=(const __node&);
Howard Hinnant67ad2132010-06-29 18:37:43 +00001425public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001426 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant67ad2132010-06-29 18:37:43 +00001427
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001428 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001429 __node() {}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001430 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001431 virtual ~__node() {}
Howard Hinnant67ad2132010-06-29 18:37:43 +00001432
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001433 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierb41db9a2018-10-01 01:59:37 +00001434 virtual void __exec(__state&) const {}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001435 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierb41db9a2018-10-01 01:59:37 +00001436 virtual void __exec_split(bool, __state&) const {}
Howard Hinnant67ad2132010-06-29 18:37:43 +00001437};
1438
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001439// __end_state
Howard Hinnant67ad2132010-06-29 18:37:43 +00001440
1441template <class _CharT>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001442class __end_state
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001443 : public __node<_CharT>
Howard Hinnant67ad2132010-06-29 18:37:43 +00001444{
Howard Hinnant67ad2132010-06-29 18:37:43 +00001445public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001446 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant67ad2132010-06-29 18:37:43 +00001447
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001448 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001449 __end_state() {}
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00001450
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001451 virtual void __exec(__state&) const;
Howard Hinnant67ad2132010-06-29 18:37:43 +00001452};
1453
1454template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001455void
1456__end_state<_CharT>::__exec(__state& __s) const
Howard Hinnant93ef6552010-06-30 20:30:19 +00001457{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001458 __s.__do_ = __state::__end_state;
Howard Hinnant93ef6552010-06-30 20:30:19 +00001459}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001460
1461// __has_one_state
1462
Howard Hinnant93ef6552010-06-30 20:30:19 +00001463template <class _CharT>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001464class __has_one_state
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001465 : public __node<_CharT>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00001466{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001467 __node<_CharT>* __first_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001468
1469public:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001470 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001471 explicit __has_one_state(__node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001472 : __first_(__s) {}
1473
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001474 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001475 __node<_CharT>* first() const {return __first_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001476 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001477 __node<_CharT>*& first() {return __first_;}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001478};
1479
1480// __owns_one_state
1481
1482template <class _CharT>
1483class __owns_one_state
1484 : public __has_one_state<_CharT>
1485{
1486 typedef __has_one_state<_CharT> base;
1487
1488public:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001489 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001490 explicit __owns_one_state(__node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001491 : base(__s) {}
1492
1493 virtual ~__owns_one_state();
1494};
1495
1496template <class _CharT>
1497__owns_one_state<_CharT>::~__owns_one_state()
1498{
1499 delete this->first();
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00001500}
1501
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001502// __empty_state
1503
1504template <class _CharT>
1505class __empty_state
1506 : public __owns_one_state<_CharT>
1507{
1508 typedef __owns_one_state<_CharT> base;
1509
1510public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001511 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001512
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001513 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001514 explicit __empty_state(__node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001515 : base(__s) {}
1516
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001517 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001518};
1519
1520template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001521void
1522__empty_state<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001523{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001524 __s.__do_ = __state::__accept_but_not_consume;
1525 __s.__node_ = this->first();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001526}
1527
1528// __empty_non_own_state
1529
1530template <class _CharT>
1531class __empty_non_own_state
1532 : public __has_one_state<_CharT>
1533{
1534 typedef __has_one_state<_CharT> base;
1535
1536public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001537 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001538
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001539 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001540 explicit __empty_non_own_state(__node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001541 : base(__s) {}
1542
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001543 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001544};
1545
1546template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001547void
1548__empty_non_own_state<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001549{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001550 __s.__do_ = __state::__accept_but_not_consume;
1551 __s.__node_ = this->first();
1552}
1553
1554// __repeat_one_loop
1555
1556template <class _CharT>
1557class __repeat_one_loop
1558 : public __has_one_state<_CharT>
1559{
1560 typedef __has_one_state<_CharT> base;
1561
1562public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001563 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001564
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001565 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001566 explicit __repeat_one_loop(__node<_CharT>* __s)
1567 : base(__s) {}
1568
1569 virtual void __exec(__state&) const;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001570};
1571
1572template <class _CharT>
1573void
1574__repeat_one_loop<_CharT>::__exec(__state& __s) const
1575{
1576 __s.__do_ = __state::__repeat;
1577 __s.__node_ = this->first();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001578}
1579
1580// __owns_two_states
1581
1582template <class _CharT>
1583class __owns_two_states
1584 : public __owns_one_state<_CharT>
1585{
1586 typedef __owns_one_state<_CharT> base;
1587
1588 base* __second_;
1589
1590public:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001591 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001592 explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001593 : base(__s1), __second_(__s2) {}
1594
1595 virtual ~__owns_two_states();
1596
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001597 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001598 base* second() const {return __second_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001599 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001600 base*& second() {return __second_;}
1601};
1602
1603template <class _CharT>
1604__owns_two_states<_CharT>::~__owns_two_states()
1605{
1606 delete __second_;
1607}
1608
1609// __loop
1610
1611template <class _CharT>
1612class __loop
1613 : public __owns_two_states<_CharT>
1614{
1615 typedef __owns_two_states<_CharT> base;
1616
1617 size_t __min_;
1618 size_t __max_;
1619 unsigned __loop_id_;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001620 unsigned __mexp_begin_;
1621 unsigned __mexp_end_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001622 bool __greedy_;
1623
1624public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001625 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001626
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001627 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001628 explicit __loop(unsigned __loop_id,
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001629 __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
1630 unsigned __mexp_begin, unsigned __mexp_end,
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001631 bool __greedy = true,
1632 size_t __min = 0,
1633 size_t __max = numeric_limits<size_t>::max())
1634 : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001635 __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001636 __greedy_(__greedy) {}
1637
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001638 virtual void __exec(__state& __s) const;
1639 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnant5bf96132010-07-08 17:43:58 +00001640
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001641private:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001642 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001643 void __init_repeat(__state& __s) const
1644 {
1645 __s.__loop_data_[__loop_id_].second = __s.__current_;
1646 for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
1647 {
1648 __s.__sub_matches_[__i].first = __s.__last_;
1649 __s.__sub_matches_[__i].second = __s.__last_;
1650 __s.__sub_matches_[__i].matched = false;
1651 }
1652 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001653};
1654
1655template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001656void
1657__loop<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001658{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001659 if (__s.__do_ == __state::__repeat)
1660 {
1661 bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
1662 bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
1663 if (__do_repeat && __do_alt &&
1664 __s.__loop_data_[__loop_id_].second == __s.__current_)
1665 __do_repeat = false;
1666 if (__do_repeat && __do_alt)
1667 __s.__do_ = __state::__split;
1668 else if (__do_repeat)
1669 {
1670 __s.__do_ = __state::__accept_but_not_consume;
1671 __s.__node_ = this->first();
1672 __init_repeat(__s);
1673 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001674 else
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001675 {
1676 __s.__do_ = __state::__accept_but_not_consume;
1677 __s.__node_ = this->second();
1678 }
1679 }
1680 else
1681 {
Howard Hinnantebbc2b62010-07-27 17:24:17 +00001682 __s.__loop_data_[__loop_id_].first = 0;
1683 bool __do_repeat = 0 < __max_;
1684 bool __do_alt = 0 >= __min_;
1685 if (__do_repeat && __do_alt)
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001686 __s.__do_ = __state::__split;
Howard Hinnantebbc2b62010-07-27 17:24:17 +00001687 else if (__do_repeat)
1688 {
1689 __s.__do_ = __state::__accept_but_not_consume;
1690 __s.__node_ = this->first();
1691 __init_repeat(__s);
1692 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001693 else
1694 {
1695 __s.__do_ = __state::__accept_but_not_consume;
1696 __s.__node_ = this->second();
1697 }
1698 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001699}
1700
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001701template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001702void
1703__loop<_CharT>::__exec_split(bool __second, __state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001704{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001705 __s.__do_ = __state::__accept_but_not_consume;
1706 if (__greedy_ != __second)
Howard Hinnant5bf96132010-07-08 17:43:58 +00001707 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001708 __s.__node_ = this->first();
1709 __init_repeat(__s);
Howard Hinnant5bf96132010-07-08 17:43:58 +00001710 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001711 else
1712 __s.__node_ = this->second();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001713}
1714
Howard Hinnant16d65422010-07-16 19:08:36 +00001715// __alternate
1716
1717template <class _CharT>
1718class __alternate
1719 : public __owns_two_states<_CharT>
1720{
1721 typedef __owns_two_states<_CharT> base;
1722
1723public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001724 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant16d65422010-07-16 19:08:36 +00001725
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001726 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant16d65422010-07-16 19:08:36 +00001727 explicit __alternate(__owns_one_state<_CharT>* __s1,
1728 __owns_one_state<_CharT>* __s2)
1729 : base(__s1, __s2) {}
1730
1731 virtual void __exec(__state& __s) const;
1732 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnant16d65422010-07-16 19:08:36 +00001733};
1734
1735template <class _CharT>
1736void
1737__alternate<_CharT>::__exec(__state& __s) const
1738{
1739 __s.__do_ = __state::__split;
1740}
1741
1742template <class _CharT>
1743void
1744__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
1745{
1746 __s.__do_ = __state::__accept_but_not_consume;
Howard Hinnantcbf2f3f2010-07-22 14:12:20 +00001747 if (__second)
Howard Hinnant16d65422010-07-16 19:08:36 +00001748 __s.__node_ = this->second();
Howard Hinnantcbf2f3f2010-07-22 14:12:20 +00001749 else
1750 __s.__node_ = this->first();
Howard Hinnant16d65422010-07-16 19:08:36 +00001751}
1752
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001753// __begin_marked_subexpression
1754
1755template <class _CharT>
1756class __begin_marked_subexpression
1757 : public __owns_one_state<_CharT>
1758{
1759 typedef __owns_one_state<_CharT> base;
1760
Howard Hinnant5bf96132010-07-08 17:43:58 +00001761 unsigned __mexp_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001762public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001763 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001764
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001765 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001766 explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnant5bf96132010-07-08 17:43:58 +00001767 : base(__s), __mexp_(__mexp) {}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001768
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001769 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001770};
1771
1772template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001773void
1774__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001775{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001776 __s.__do_ = __state::__accept_but_not_consume;
1777 __s.__sub_matches_[__mexp_-1].first = __s.__current_;
1778 __s.__node_ = this->first();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001779}
1780
1781// __end_marked_subexpression
1782
1783template <class _CharT>
1784class __end_marked_subexpression
1785 : public __owns_one_state<_CharT>
1786{
1787 typedef __owns_one_state<_CharT> base;
1788
Howard Hinnant5bf96132010-07-08 17:43:58 +00001789 unsigned __mexp_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001790public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001791 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001792
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001793 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001794 explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnant5bf96132010-07-08 17:43:58 +00001795 : base(__s), __mexp_(__mexp) {}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001796
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001797 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001798};
1799
1800template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001801void
1802__end_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001803{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001804 __s.__do_ = __state::__accept_but_not_consume;
1805 __s.__sub_matches_[__mexp_-1].second = __s.__current_;
1806 __s.__sub_matches_[__mexp_-1].matched = true;
1807 __s.__node_ = this->first();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001808}
1809
Howard Hinnant2a315e32010-07-12 18:16:05 +00001810// __back_ref
1811
1812template <class _CharT>
1813class __back_ref
1814 : public __owns_one_state<_CharT>
1815{
1816 typedef __owns_one_state<_CharT> base;
1817
1818 unsigned __mexp_;
1819public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001820 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant2a315e32010-07-12 18:16:05 +00001821
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001822 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2a315e32010-07-12 18:16:05 +00001823 explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
1824 : base(__s), __mexp_(__mexp) {}
1825
1826 virtual void __exec(__state&) const;
Howard Hinnant2a315e32010-07-12 18:16:05 +00001827};
1828
1829template <class _CharT>
1830void
1831__back_ref<_CharT>::__exec(__state& __s) const
1832{
Marshall Clow360e8392015-08-24 15:57:09 +00001833 if (__mexp_ > __s.__sub_matches_.size())
1834 __throw_regex_error<regex_constants::error_backref>();
Howard Hinnant2a315e32010-07-12 18:16:05 +00001835 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1836 if (__sm.matched)
1837 {
1838 ptrdiff_t __len = __sm.second - __sm.first;
1839 if (__s.__last_ - __s.__current_ >= __len &&
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001840 _VSTD::equal(__sm.first, __sm.second, __s.__current_))
Howard Hinnant2a315e32010-07-12 18:16:05 +00001841 {
1842 __s.__do_ = __state::__accept_but_not_consume;
1843 __s.__current_ += __len;
1844 __s.__node_ = this->first();
1845 }
1846 else
1847 {
1848 __s.__do_ = __state::__reject;
1849 __s.__node_ = nullptr;
1850 }
1851 }
1852 else
1853 {
1854 __s.__do_ = __state::__reject;
1855 __s.__node_ = nullptr;
1856 }
1857}
1858
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001859// __back_ref_icase
1860
1861template <class _CharT, class _Traits>
1862class __back_ref_icase
1863 : public __owns_one_state<_CharT>
1864{
1865 typedef __owns_one_state<_CharT> base;
1866
1867 _Traits __traits_;
1868 unsigned __mexp_;
1869public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001870 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001871
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001872 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001873 explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
1874 __node<_CharT>* __s)
1875 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1876
1877 virtual void __exec(__state&) const;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001878};
1879
1880template <class _CharT, class _Traits>
1881void
1882__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
1883{
1884 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1885 if (__sm.matched)
1886 {
1887 ptrdiff_t __len = __sm.second - __sm.first;
1888 if (__s.__last_ - __s.__current_ >= __len)
1889 {
1890 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1891 {
1892 if (__traits_.translate_nocase(__sm.first[__i]) !=
1893 __traits_.translate_nocase(__s.__current_[__i]))
1894 goto __not_equal;
1895 }
1896 __s.__do_ = __state::__accept_but_not_consume;
1897 __s.__current_ += __len;
1898 __s.__node_ = this->first();
1899 }
1900 else
1901 {
1902 __s.__do_ = __state::__reject;
1903 __s.__node_ = nullptr;
1904 }
1905 }
1906 else
1907 {
1908__not_equal:
1909 __s.__do_ = __state::__reject;
1910 __s.__node_ = nullptr;
1911 }
1912}
1913
1914// __back_ref_collate
1915
1916template <class _CharT, class _Traits>
1917class __back_ref_collate
1918 : public __owns_one_state<_CharT>
1919{
1920 typedef __owns_one_state<_CharT> base;
1921
1922 _Traits __traits_;
1923 unsigned __mexp_;
1924public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001925 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001926
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001927 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001928 explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
1929 __node<_CharT>* __s)
1930 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1931
1932 virtual void __exec(__state&) const;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001933};
1934
1935template <class _CharT, class _Traits>
1936void
1937__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
1938{
1939 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1940 if (__sm.matched)
1941 {
1942 ptrdiff_t __len = __sm.second - __sm.first;
1943 if (__s.__last_ - __s.__current_ >= __len)
1944 {
1945 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1946 {
1947 if (__traits_.translate(__sm.first[__i]) !=
1948 __traits_.translate(__s.__current_[__i]))
1949 goto __not_equal;
1950 }
1951 __s.__do_ = __state::__accept_but_not_consume;
1952 __s.__current_ += __len;
1953 __s.__node_ = this->first();
1954 }
1955 else
1956 {
1957 __s.__do_ = __state::__reject;
1958 __s.__node_ = nullptr;
1959 }
1960 }
1961 else
1962 {
1963__not_equal:
1964 __s.__do_ = __state::__reject;
1965 __s.__node_ = nullptr;
1966 }
1967}
1968
Howard Hinnant70d27852010-07-27 01:25:38 +00001969// __word_boundary
1970
1971template <class _CharT, class _Traits>
1972class __word_boundary
1973 : public __owns_one_state<_CharT>
1974{
1975 typedef __owns_one_state<_CharT> base;
1976
1977 _Traits __traits_;
1978 bool __invert_;
1979public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001980 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant70d27852010-07-27 01:25:38 +00001981
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001982 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70d27852010-07-27 01:25:38 +00001983 explicit __word_boundary(const _Traits& __traits, bool __invert,
1984 __node<_CharT>* __s)
1985 : base(__s), __traits_(__traits), __invert_(__invert) {}
1986
1987 virtual void __exec(__state&) const;
Howard Hinnant70d27852010-07-27 01:25:38 +00001988};
1989
1990template <class _CharT, class _Traits>
1991void
1992__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
1993{
1994 bool __is_word_b = false;
1995 if (__s.__first_ != __s.__last_)
1996 {
1997 if (__s.__current_ == __s.__last_)
1998 {
1999 if (!(__s.__flags_ & regex_constants::match_not_eow))
2000 {
2001 _CharT __c = __s.__current_[-1];
2002 __is_word_b = __c == '_' ||
2003 __traits_.isctype(__c, ctype_base::alnum);
2004 }
2005 }
Howard Hinnant6b2602a2010-07-29 15:17:28 +00002006 else if (__s.__current_ == __s.__first_ &&
2007 !(__s.__flags_ & regex_constants::match_prev_avail))
Howard Hinnant70d27852010-07-27 01:25:38 +00002008 {
2009 if (!(__s.__flags_ & regex_constants::match_not_bow))
2010 {
2011 _CharT __c = *__s.__current_;
2012 __is_word_b = __c == '_' ||
2013 __traits_.isctype(__c, ctype_base::alnum);
2014 }
2015 }
2016 else
2017 {
2018 _CharT __c1 = __s.__current_[-1];
2019 _CharT __c2 = *__s.__current_;
2020 bool __is_c1_b = __c1 == '_' ||
2021 __traits_.isctype(__c1, ctype_base::alnum);
2022 bool __is_c2_b = __c2 == '_' ||
2023 __traits_.isctype(__c2, ctype_base::alnum);
2024 __is_word_b = __is_c1_b != __is_c2_b;
2025 }
2026 }
2027 if (__is_word_b != __invert_)
2028 {
2029 __s.__do_ = __state::__accept_but_not_consume;
2030 __s.__node_ = this->first();
2031 }
2032 else
2033 {
2034 __s.__do_ = __state::__reject;
2035 __s.__node_ = nullptr;
2036 }
2037}
2038
Howard Hinnant066ba512011-03-26 20:02:27 +00002039// __l_anchor
2040
2041template <class _CharT>
Mark de Wevera989cce2020-11-18 18:09:13 +01002042_LIBCPP_INLINE_VISIBILITY _LIBCPP_CONSTEXPR
2043bool __is_eol(_CharT c)
2044{
2045 return c == '\r' || c == '\n';
2046}
2047
2048template <class _CharT>
2049class __l_anchor_multiline
Howard Hinnant066ba512011-03-26 20:02:27 +00002050 : public __owns_one_state<_CharT>
2051{
2052 typedef __owns_one_state<_CharT> base;
2053
Louis Dionneaf6be622021-07-27 17:30:47 -04002054 bool __multiline_;
Mark de Wevera989cce2020-11-18 18:09:13 +01002055
Howard Hinnant066ba512011-03-26 20:02:27 +00002056public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002057 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant066ba512011-03-26 20:02:27 +00002058
2059 _LIBCPP_INLINE_VISIBILITY
Mark de Wevera989cce2020-11-18 18:09:13 +01002060 __l_anchor_multiline(bool __multiline, __node<_CharT>* __s)
Louis Dionneaf6be622021-07-27 17:30:47 -04002061 : base(__s), __multiline_(__multiline) {}
Howard Hinnant066ba512011-03-26 20:02:27 +00002062
2063 virtual void __exec(__state&) const;
2064};
2065
2066template <class _CharT>
2067void
Mark de Wevera989cce2020-11-18 18:09:13 +01002068__l_anchor_multiline<_CharT>::__exec(__state& __s) const
Howard Hinnant066ba512011-03-26 20:02:27 +00002069{
Marshall Clow54404392015-03-19 17:05:59 +00002070 if (__s.__at_first_ && __s.__current_ == __s.__first_ &&
2071 !(__s.__flags_ & regex_constants::match_not_bol))
Howard Hinnant066ba512011-03-26 20:02:27 +00002072 {
2073 __s.__do_ = __state::__accept_but_not_consume;
2074 __s.__node_ = this->first();
2075 }
Louis Dionneaf6be622021-07-27 17:30:47 -04002076 else if (__multiline_ &&
Mark de Wevera989cce2020-11-18 18:09:13 +01002077 !__s.__at_first_ &&
2078 __is_eol(*_VSTD::prev(__s.__current_)))
2079 {
2080 __s.__do_ = __state::__accept_but_not_consume;
2081 __s.__node_ = this->first();
2082 }
Howard Hinnant066ba512011-03-26 20:02:27 +00002083 else
2084 {
2085 __s.__do_ = __state::__reject;
2086 __s.__node_ = nullptr;
2087 }
2088}
2089
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002090// __r_anchor
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002091
2092template <class _CharT>
Mark de Wevera989cce2020-11-18 18:09:13 +01002093class __r_anchor_multiline
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002094 : public __owns_one_state<_CharT>
2095{
2096 typedef __owns_one_state<_CharT> base;
2097
Louis Dionne6209e9f2022-03-03 13:39:12 -05002098 bool __multiline_;
Mark de Wevera989cce2020-11-18 18:09:13 +01002099
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002100public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002101 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002102
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002103 _LIBCPP_INLINE_VISIBILITY
Mark de Wevera989cce2020-11-18 18:09:13 +01002104 __r_anchor_multiline(bool __multiline, __node<_CharT>* __s)
Louis Dionne6209e9f2022-03-03 13:39:12 -05002105 : base(__s), __multiline_(__multiline) {}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002106
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002107 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002108};
2109
2110template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002111void
Mark de Wevera989cce2020-11-18 18:09:13 +01002112__r_anchor_multiline<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002113{
Marshall Clow54404392015-03-19 17:05:59 +00002114 if (__s.__current_ == __s.__last_ &&
2115 !(__s.__flags_ & regex_constants::match_not_eol))
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002116 {
2117 __s.__do_ = __state::__accept_but_not_consume;
2118 __s.__node_ = this->first();
2119 }
Louis Dionne6209e9f2022-03-03 13:39:12 -05002120 else if (__multiline_ && __is_eol(*__s.__current_))
Mark de Wevera989cce2020-11-18 18:09:13 +01002121 {
2122 __s.__do_ = __state::__accept_but_not_consume;
2123 __s.__node_ = this->first();
2124 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002125 else
2126 {
2127 __s.__do_ = __state::__reject;
2128 __s.__node_ = nullptr;
2129 }
2130}
2131
2132// __match_any
2133
2134template <class _CharT>
2135class __match_any
2136 : public __owns_one_state<_CharT>
2137{
2138 typedef __owns_one_state<_CharT> base;
2139
2140public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002141 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002142
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002143 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002144 __match_any(__node<_CharT>* __s)
2145 : base(__s) {}
2146
2147 virtual void __exec(__state&) const;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002148};
2149
2150template <class _CharT>
2151void
2152__match_any<_CharT>::__exec(__state& __s) const
2153{
2154 if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
2155 {
2156 __s.__do_ = __state::__accept_and_consume;
2157 ++__s.__current_;
2158 __s.__node_ = this->first();
2159 }
2160 else
2161 {
2162 __s.__do_ = __state::__reject;
2163 __s.__node_ = nullptr;
2164 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002165}
2166
Howard Hinnant70d27852010-07-27 01:25:38 +00002167// __match_any_but_newline
2168
2169template <class _CharT>
2170class __match_any_but_newline
2171 : public __owns_one_state<_CharT>
2172{
2173 typedef __owns_one_state<_CharT> base;
2174
2175public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002176 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant70d27852010-07-27 01:25:38 +00002177
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002178 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70d27852010-07-27 01:25:38 +00002179 __match_any_but_newline(__node<_CharT>* __s)
2180 : base(__s) {}
2181
2182 virtual void __exec(__state&) const;
Howard Hinnant70d27852010-07-27 01:25:38 +00002183};
2184
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00002185template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
Louis Dionne89258142021-08-23 15:32:36 -04002186#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00002187template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
Louis Dionne89258142021-08-23 15:32:36 -04002188#endif
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00002189
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002190// __match_char
2191
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002192template <class _CharT>
Howard Hinnant67ad2132010-06-29 18:37:43 +00002193class __match_char
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002194 : public __owns_one_state<_CharT>
Howard Hinnant67ad2132010-06-29 18:37:43 +00002195{
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002196 typedef __owns_one_state<_CharT> base;
2197
Howard Hinnant67ad2132010-06-29 18:37:43 +00002198 _CharT __c_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002199
2200 __match_char(const __match_char&);
2201 __match_char& operator=(const __match_char&);
Howard Hinnant67ad2132010-06-29 18:37:43 +00002202public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002203 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant93ef6552010-06-30 20:30:19 +00002204
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002205 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002206 __match_char(_CharT __c, __node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002207 : base(__s), __c_(__c) {}
Howard Hinnant67ad2132010-06-29 18:37:43 +00002208
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002209 virtual void __exec(__state&) const;
Howard Hinnant67ad2132010-06-29 18:37:43 +00002210};
2211
Howard Hinnant93ef6552010-06-30 20:30:19 +00002212template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002213void
2214__match_char<_CharT>::__exec(__state& __s) const
Howard Hinnant93ef6552010-06-30 20:30:19 +00002215{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002216 if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2217 {
2218 __s.__do_ = __state::__accept_and_consume;
2219 ++__s.__current_;
2220 __s.__node_ = this->first();
2221 }
2222 else
2223 {
2224 __s.__do_ = __state::__reject;
2225 __s.__node_ = nullptr;
2226 }
Howard Hinnant93ef6552010-06-30 20:30:19 +00002227}
Howard Hinnant93ef6552010-06-30 20:30:19 +00002228
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002229// __match_char_icase
2230
2231template <class _CharT, class _Traits>
2232class __match_char_icase
2233 : public __owns_one_state<_CharT>
2234{
2235 typedef __owns_one_state<_CharT> base;
2236
2237 _Traits __traits_;
2238 _CharT __c_;
2239
2240 __match_char_icase(const __match_char_icase&);
2241 __match_char_icase& operator=(const __match_char_icase&);
2242public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002243 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002244
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002245 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002246 __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2247 : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2248
2249 virtual void __exec(__state&) const;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002250};
2251
2252template <class _CharT, class _Traits>
2253void
2254__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2255{
2256 if (__s.__current_ != __s.__last_ &&
2257 __traits_.translate_nocase(*__s.__current_) == __c_)
2258 {
2259 __s.__do_ = __state::__accept_and_consume;
2260 ++__s.__current_;
2261 __s.__node_ = this->first();
2262 }
2263 else
2264 {
2265 __s.__do_ = __state::__reject;
2266 __s.__node_ = nullptr;
2267 }
2268}
2269
2270// __match_char_collate
2271
2272template <class _CharT, class _Traits>
2273class __match_char_collate
2274 : public __owns_one_state<_CharT>
2275{
2276 typedef __owns_one_state<_CharT> base;
2277
2278 _Traits __traits_;
2279 _CharT __c_;
2280
2281 __match_char_collate(const __match_char_collate&);
2282 __match_char_collate& operator=(const __match_char_collate&);
2283public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002284 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002285
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002286 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002287 __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2288 : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2289
2290 virtual void __exec(__state&) const;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002291};
2292
2293template <class _CharT, class _Traits>
2294void
2295__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2296{
2297 if (__s.__current_ != __s.__last_ &&
2298 __traits_.translate(*__s.__current_) == __c_)
2299 {
2300 __s.__do_ = __state::__accept_and_consume;
2301 ++__s.__current_;
2302 __s.__node_ = this->first();
2303 }
2304 else
2305 {
2306 __s.__do_ = __state::__reject;
2307 __s.__node_ = nullptr;
2308 }
2309}
2310
Howard Hinnant3034c902010-07-13 21:48:06 +00002311// __bracket_expression
2312
2313template <class _CharT, class _Traits>
2314class __bracket_expression
2315 : public __owns_one_state<_CharT>
2316{
2317 typedef __owns_one_state<_CharT> base;
2318 typedef typename _Traits::string_type string_type;
2319
2320 _Traits __traits_;
2321 vector<_CharT> __chars_;
Howard Hinnant70b3e192010-07-28 17:35:27 +00002322 vector<_CharT> __neg_chars_;
Howard Hinnant3034c902010-07-13 21:48:06 +00002323 vector<pair<string_type, string_type> > __ranges_;
2324 vector<pair<_CharT, _CharT> > __digraphs_;
2325 vector<string_type> __equivalences_;
Dan Albert49f384c2014-07-29 19:23:39 +00002326 typename regex_traits<_CharT>::char_class_type __mask_;
2327 typename regex_traits<_CharT>::char_class_type __neg_mask_;
Howard Hinnant3034c902010-07-13 21:48:06 +00002328 bool __negate_;
2329 bool __icase_;
2330 bool __collate_;
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002331 bool __might_have_digraph_;
Howard Hinnant3034c902010-07-13 21:48:06 +00002332
2333 __bracket_expression(const __bracket_expression&);
2334 __bracket_expression& operator=(const __bracket_expression&);
2335public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002336 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant3034c902010-07-13 21:48:06 +00002337
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002338 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002339 __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2340 bool __negate, bool __icase, bool __collate)
Howard Hinnant70b3e192010-07-28 17:35:27 +00002341 : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2342 __negate_(__negate), __icase_(__icase), __collate_(__collate),
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002343 __might_have_digraph_(__traits_.getloc().name() != "C") {}
Howard Hinnant3034c902010-07-13 21:48:06 +00002344
2345 virtual void __exec(__state&) const;
2346
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002347 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70b3e192010-07-28 17:35:27 +00002348 bool __negated() const {return __negate_;}
2349
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002350 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002351 void __add_char(_CharT __c)
2352 {
2353 if (__icase_)
2354 __chars_.push_back(__traits_.translate_nocase(__c));
2355 else if (__collate_)
2356 __chars_.push_back(__traits_.translate(__c));
2357 else
2358 __chars_.push_back(__c);
2359 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002360 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70b3e192010-07-28 17:35:27 +00002361 void __add_neg_char(_CharT __c)
2362 {
2363 if (__icase_)
2364 __neg_chars_.push_back(__traits_.translate_nocase(__c));
2365 else if (__collate_)
2366 __neg_chars_.push_back(__traits_.translate(__c));
2367 else
2368 __neg_chars_.push_back(__c);
2369 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002370 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002371 void __add_range(string_type __b, string_type __e)
2372 {
2373 if (__collate_)
2374 {
2375 if (__icase_)
2376 {
2377 for (size_t __i = 0; __i < __b.size(); ++__i)
2378 __b[__i] = __traits_.translate_nocase(__b[__i]);
2379 for (size_t __i = 0; __i < __e.size(); ++__i)
2380 __e[__i] = __traits_.translate_nocase(__e[__i]);
2381 }
2382 else
2383 {
2384 for (size_t __i = 0; __i < __b.size(); ++__i)
2385 __b[__i] = __traits_.translate(__b[__i]);
2386 for (size_t __i = 0; __i < __e.size(); ++__i)
2387 __e[__i] = __traits_.translate(__e[__i]);
2388 }
2389 __ranges_.push_back(make_pair(
2390 __traits_.transform(__b.begin(), __b.end()),
2391 __traits_.transform(__e.begin(), __e.end())));
2392 }
2393 else
2394 {
2395 if (__b.size() != 1 || __e.size() != 1)
Marshall Clowa5212112019-05-28 22:42:32 +00002396 __throw_regex_error<regex_constants::error_range>();
Howard Hinnant3034c902010-07-13 21:48:06 +00002397 if (__icase_)
2398 {
2399 __b[0] = __traits_.translate_nocase(__b[0]);
2400 __e[0] = __traits_.translate_nocase(__e[0]);
2401 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002402 __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
Howard Hinnant3034c902010-07-13 21:48:06 +00002403 }
2404 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002405 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002406 void __add_digraph(_CharT __c1, _CharT __c2)
2407 {
2408 if (__icase_)
2409 __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
2410 __traits_.translate_nocase(__c2)));
2411 else if (__collate_)
2412 __digraphs_.push_back(make_pair(__traits_.translate(__c1),
2413 __traits_.translate(__c2)));
2414 else
2415 __digraphs_.push_back(make_pair(__c1, __c2));
2416 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002417 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002418 void __add_equivalence(const string_type& __s)
2419 {__equivalences_.push_back(__s);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002420 _LIBCPP_INLINE_VISIBILITY
Dan Albert49f384c2014-07-29 19:23:39 +00002421 void __add_class(typename regex_traits<_CharT>::char_class_type __mask)
Howard Hinnant3034c902010-07-13 21:48:06 +00002422 {__mask_ |= __mask;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002423 _LIBCPP_INLINE_VISIBILITY
Dan Albert49f384c2014-07-29 19:23:39 +00002424 void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask)
Howard Hinnant70b3e192010-07-28 17:35:27 +00002425 {__neg_mask_ |= __mask;}
Howard Hinnant3034c902010-07-13 21:48:06 +00002426};
2427
2428template <class _CharT, class _Traits>
2429void
2430__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2431{
2432 bool __found = false;
2433 unsigned __consumed = 0;
2434 if (__s.__current_ != __s.__last_)
2435 {
2436 ++__consumed;
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002437 if (__might_have_digraph_)
Howard Hinnant3034c902010-07-13 21:48:06 +00002438 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002439 const _CharT* __next = _VSTD::next(__s.__current_);
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002440 if (__next != __s.__last_)
Howard Hinnant3034c902010-07-13 21:48:06 +00002441 {
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002442 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2443 if (__icase_)
Howard Hinnant3034c902010-07-13 21:48:06 +00002444 {
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002445 __ch2.first = __traits_.translate_nocase(__ch2.first);
2446 __ch2.second = __traits_.translate_nocase(__ch2.second);
2447 }
2448 else if (__collate_)
2449 {
2450 __ch2.first = __traits_.translate(__ch2.first);
2451 __ch2.second = __traits_.translate(__ch2.second);
2452 }
2453 if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2454 {
2455 // __ch2 is a digraph in this locale
2456 ++__consumed;
2457 for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2458 {
2459 if (__ch2 == __digraphs_[__i])
2460 {
2461 __found = true;
2462 goto __exit;
2463 }
2464 }
2465 if (__collate_ && !__ranges_.empty())
2466 {
2467 string_type __s2 = __traits_.transform(&__ch2.first,
2468 &__ch2.first + 2);
2469 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2470 {
2471 if (__ranges_[__i].first <= __s2 &&
2472 __s2 <= __ranges_[__i].second)
2473 {
2474 __found = true;
2475 goto __exit;
2476 }
2477 }
2478 }
2479 if (!__equivalences_.empty())
2480 {
2481 string_type __s2 = __traits_.transform_primary(&__ch2.first,
2482 &__ch2.first + 2);
2483 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2484 {
2485 if (__s2 == __equivalences_[__i])
2486 {
2487 __found = true;
2488 goto __exit;
2489 }
2490 }
2491 }
2492 if (__traits_.isctype(__ch2.first, __mask_) &&
2493 __traits_.isctype(__ch2.second, __mask_))
Howard Hinnant3034c902010-07-13 21:48:06 +00002494 {
2495 __found = true;
2496 goto __exit;
2497 }
Howard Hinnant70b3e192010-07-28 17:35:27 +00002498 if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2499 !__traits_.isctype(__ch2.second, __neg_mask_))
2500 {
2501 __found = true;
2502 goto __exit;
2503 }
Howard Hinnant3034c902010-07-13 21:48:06 +00002504 goto __exit;
2505 }
Howard Hinnant3034c902010-07-13 21:48:06 +00002506 }
2507 }
2508 // test *__s.__current_ as not a digraph
2509 _CharT __ch = *__s.__current_;
2510 if (__icase_)
2511 __ch = __traits_.translate_nocase(__ch);
2512 else if (__collate_)
2513 __ch = __traits_.translate(__ch);
2514 for (size_t __i = 0; __i < __chars_.size(); ++__i)
2515 {
2516 if (__ch == __chars_[__i])
2517 {
2518 __found = true;
2519 goto __exit;
2520 }
2521 }
Louis Dionne9023f022018-08-24 14:10:28 +00002522 // When there's at least one of __neg_chars_ and __neg_mask_, the set
2523 // of "__found" chars is
Marshall Clow42af8d92017-10-18 16:49:22 +00002524 // union(complement(union(__neg_chars_, __neg_mask_)),
2525 // other cases...)
2526 //
Louis Dionne9023f022018-08-24 14:10:28 +00002527 // It doesn't make sense to check this when there are no __neg_chars_
2528 // and no __neg_mask_.
2529 if (!(__neg_mask_ == 0 && __neg_chars_.empty()))
Howard Hinnant70b3e192010-07-28 17:35:27 +00002530 {
Louis Dionne9023f022018-08-24 14:10:28 +00002531 const bool __in_neg_mask = __traits_.isctype(__ch, __neg_mask_);
Marshall Clow42af8d92017-10-18 16:49:22 +00002532 const bool __in_neg_chars =
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05002533 _VSTD::find(__neg_chars_.begin(), __neg_chars_.end(), __ch) !=
Marshall Clow42af8d92017-10-18 16:49:22 +00002534 __neg_chars_.end();
2535 if (!(__in_neg_mask || __in_neg_chars))
2536 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00002537 __found = true;
2538 goto __exit;
Marshall Clow42af8d92017-10-18 16:49:22 +00002539 }
Howard Hinnant70b3e192010-07-28 17:35:27 +00002540 }
Howard Hinnant3034c902010-07-13 21:48:06 +00002541 if (!__ranges_.empty())
2542 {
2543 string_type __s2 = __collate_ ?
2544 __traits_.transform(&__ch, &__ch + 1) :
2545 string_type(1, __ch);
2546 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2547 {
2548 if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2549 {
2550 __found = true;
2551 goto __exit;
2552 }
2553 }
2554 }
2555 if (!__equivalences_.empty())
2556 {
2557 string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2558 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2559 {
2560 if (__s2 == __equivalences_[__i])
2561 {
2562 __found = true;
2563 goto __exit;
2564 }
2565 }
2566 }
2567 if (__traits_.isctype(__ch, __mask_))
Howard Hinnant70b3e192010-07-28 17:35:27 +00002568 {
Howard Hinnant3034c902010-07-13 21:48:06 +00002569 __found = true;
Howard Hinnant70b3e192010-07-28 17:35:27 +00002570 goto __exit;
2571 }
Howard Hinnant3034c902010-07-13 21:48:06 +00002572 }
2573 else
2574 __found = __negate_; // force reject
2575__exit:
2576 if (__found != __negate_)
2577 {
Howard Hinnant3034c902010-07-13 21:48:06 +00002578 __s.__do_ = __state::__accept_and_consume;
2579 __s.__current_ += __consumed;
2580 __s.__node_ = this->first();
2581 }
2582 else
2583 {
2584 __s.__do_ = __state::__reject;
2585 __s.__node_ = nullptr;
2586 }
2587}
2588
Howard Hinnant944510a2011-06-14 19:58:17 +00002589template <class _CharT, class _Traits> class __lookahead;
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002590
Howard Hinnant6c891682010-06-24 21:28:00 +00002591template <class _CharT, class _Traits = regex_traits<_CharT> >
Richard Smith256954d2020-11-11 17:12:18 -08002592 class _LIBCPP_TEMPLATE_VIS basic_regex;
2593
2594typedef basic_regex<char> regex;
Louis Dionne89258142021-08-23 15:32:36 -04002595#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
Richard Smith256954d2020-11-11 17:12:18 -08002596typedef basic_regex<wchar_t> wregex;
Louis Dionne89258142021-08-23 15:32:36 -04002597#endif
Richard Smith256954d2020-11-11 17:12:18 -08002598
2599template <class _CharT, class _Traits>
2600class
2601 _LIBCPP_TEMPLATE_VIS
2602 _LIBCPP_PREFERRED_NAME(regex)
Louis Dionne89258142021-08-23 15:32:36 -04002603 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wregex))
Richard Smith256954d2020-11-11 17:12:18 -08002604 basic_regex
Howard Hinnant6c891682010-06-24 21:28:00 +00002605{
2606public:
2607 // types:
2608 typedef _CharT value_type;
Hubert Tong1f1ae9c2016-08-02 21:34:48 +00002609 typedef _Traits traits_type;
2610 typedef typename _Traits::string_type string_type;
Howard Hinnant6c891682010-06-24 21:28:00 +00002611 typedef regex_constants::syntax_option_type flag_type;
2612 typedef typename _Traits::locale_type locale_type;
2613
2614private:
2615 _Traits __traits_;
2616 flag_type __flags_;
2617 unsigned __marked_count_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002618 unsigned __loop_count_;
Howard Hinnant67ad2132010-06-29 18:37:43 +00002619 int __open_count_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002620 shared_ptr<__empty_state<_CharT> > __start_;
2621 __owns_one_state<_CharT>* __end_;
2622
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002623 typedef _VSTD::__state<_CharT> __state;
2624 typedef _VSTD::__node<_CharT> __node;
Howard Hinnant6c891682010-06-24 21:28:00 +00002625
2626public:
2627 // constants:
Howard Hinnant5ddd33c2012-07-21 01:31:58 +00002628 static const regex_constants::syntax_option_type icase = regex_constants::icase;
2629 static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2630 static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
2631 static const regex_constants::syntax_option_type collate = regex_constants::collate;
2632 static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2633 static const regex_constants::syntax_option_type basic = regex_constants::basic;
2634 static const regex_constants::syntax_option_type extended = regex_constants::extended;
2635 static const regex_constants::syntax_option_type awk = regex_constants::awk;
2636 static const regex_constants::syntax_option_type grep = regex_constants::grep;
2637 static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
Mark de Wevera989cce2020-11-18 18:09:13 +01002638 static const regex_constants::syntax_option_type multiline = regex_constants::multiline;
Howard Hinnant6c891682010-06-24 21:28:00 +00002639
2640 // construct/copy/destroy:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002641 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002642 basic_regex()
Marshall Clow88a30872019-03-28 17:30:23 +00002643 : __flags_(regex_constants::ECMAScript), __marked_count_(0), __loop_count_(0), __open_count_(0),
Bruce Mitchener170d8972020-11-24 12:53:53 -05002644 __end_(nullptr)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002645 {}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002646 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002647 explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002648 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Bruce Mitchener170d8972020-11-24 12:53:53 -05002649 __end_(nullptr)
Marshall Clow88a30872019-03-28 17:30:23 +00002650 {
Mark de Wevera0ad9762019-11-09 17:01:37 +01002651 __init(__p, __p + __traits_.length(__p));
Marshall Clow88a30872019-03-28 17:30:23 +00002652 }
2653
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002654 _LIBCPP_INLINE_VISIBILITY
Hubert Tong19662862016-08-07 22:26:04 +00002655 basic_regex(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002656 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Bruce Mitchener170d8972020-11-24 12:53:53 -05002657 __end_(nullptr)
Marshall Clow88a30872019-03-28 17:30:23 +00002658 {
Mark de Wevera0ad9762019-11-09 17:01:37 +01002659 __init(__p, __p + __len);
Marshall Clow88a30872019-03-28 17:30:23 +00002660 }
2661
Howard Hinnant126da6a2010-07-27 22:20:32 +00002662// basic_regex(const basic_regex&) = default;
2663// basic_regex(basic_regex&&) = default;
Howard Hinnant6c891682010-06-24 21:28:00 +00002664 template <class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002665 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002666 explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2667 flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002668 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Bruce Mitchener170d8972020-11-24 12:53:53 -05002669 __end_(nullptr)
Marshall Clow88a30872019-03-28 17:30:23 +00002670 {
Mark de Wevera0ad9762019-11-09 17:01:37 +01002671 __init(__p.begin(), __p.end());
Marshall Clow88a30872019-03-28 17:30:23 +00002672 }
2673
Howard Hinnant6c891682010-06-24 21:28:00 +00002674 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002675 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002676 basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2677 flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002678 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Bruce Mitchener170d8972020-11-24 12:53:53 -05002679 __end_(nullptr)
Marshall Clow88a30872019-03-28 17:30:23 +00002680 {
Mark de Wevera0ad9762019-11-09 17:01:37 +01002681 __init(__first, __last);
Marshall Clow88a30872019-03-28 17:30:23 +00002682 }
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002683#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002684 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002685 basic_regex(initializer_list<value_type> __il,
2686 flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002687 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Bruce Mitchener170d8972020-11-24 12:53:53 -05002688 __end_(nullptr)
Marshall Clow88a30872019-03-28 17:30:23 +00002689 {
Mark de Wevera0ad9762019-11-09 17:01:37 +01002690 __init(__il.begin(), __il.end());
Marshall Clow88a30872019-03-28 17:30:23 +00002691 }
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002692#endif // _LIBCPP_CXX03_LANG
Howard Hinnant6c891682010-06-24 21:28:00 +00002693
Howard Hinnant997621e2010-08-13 18:11:23 +00002694// ~basic_regex() = default;
Howard Hinnant6c891682010-06-24 21:28:00 +00002695
Howard Hinnant126da6a2010-07-27 22:20:32 +00002696// basic_regex& operator=(const basic_regex&) = default;
2697// basic_regex& operator=(basic_regex&&) = default;
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002698 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002699 basic_regex& operator=(const value_type* __p)
2700 {return assign(__p);}
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002701#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002702 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002703 basic_regex& operator=(initializer_list<value_type> __il)
2704 {return assign(__il);}
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002705#endif // _LIBCPP_CXX03_LANG
Howard Hinnant6c891682010-06-24 21:28:00 +00002706 template <class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002707 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002708 basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2709 {return assign(__p);}
Howard Hinnant6c891682010-06-24 21:28:00 +00002710
2711 // assign:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002712 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002713 basic_regex& assign(const basic_regex& __that)
2714 {return *this = __that;}
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002715#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant5ddd33c2012-07-21 01:31:58 +00002716 _LIBCPP_INLINE_VISIBILITY
2717 basic_regex& assign(basic_regex&& __that) _NOEXCEPT
2718 {return *this = _VSTD::move(__that);}
2719#endif
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002720 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002721 basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2722 {return assign(__p, __p + __traits_.length(__p), __f);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002723 _LIBCPP_INLINE_VISIBILITY
Marshall Clowd4028932019-09-25 16:40:30 +00002724 basic_regex& assign(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
Howard Hinnant997621e2010-08-13 18:11:23 +00002725 {return assign(__p, __p + __len, __f);}
Howard Hinnant6c891682010-06-24 21:28:00 +00002726 template <class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002727 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002728 basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
Howard Hinnant997621e2010-08-13 18:11:23 +00002729 flag_type __f = regex_constants::ECMAScript)
2730 {return assign(__s.begin(), __s.end(), __f);}
2731
Howard Hinnant6c891682010-06-24 21:28:00 +00002732 template <class _InputIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002733 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002734 typename enable_if
2735 <
Eric Fiseliercd5a6772019-11-18 01:46:58 -05002736 __is_cpp17_input_iterator <_InputIterator>::value &&
2737 !__is_cpp17_forward_iterator<_InputIterator>::value,
Howard Hinnant997621e2010-08-13 18:11:23 +00002738 basic_regex&
2739 >::type
2740 assign(_InputIterator __first, _InputIterator __last,
2741 flag_type __f = regex_constants::ECMAScript)
2742 {
2743 basic_string<_CharT> __t(__first, __last);
2744 return assign(__t.begin(), __t.end(), __f);
2745 }
2746
2747private:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002748 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002749 void __member_init(flag_type __f)
2750 {
2751 __flags_ = __f;
2752 __marked_count_ = 0;
2753 __loop_count_ = 0;
2754 __open_count_ = 0;
2755 __end_ = nullptr;
Howard Hinnant997621e2010-08-13 18:11:23 +00002756 }
2757public:
2758
2759 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002760 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002761 typename enable_if
2762 <
Eric Fiseliercd5a6772019-11-18 01:46:58 -05002763 __is_cpp17_forward_iterator<_ForwardIterator>::value,
Howard Hinnant997621e2010-08-13 18:11:23 +00002764 basic_regex&
2765 >::type
2766 assign(_ForwardIterator __first, _ForwardIterator __last,
2767 flag_type __f = regex_constants::ECMAScript)
2768 {
Marshall Clowce03dc12015-01-13 16:49:52 +00002769 return assign(basic_regex(__first, __last, __f));
Howard Hinnant997621e2010-08-13 18:11:23 +00002770 }
2771
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002772#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002773
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002774 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002775 basic_regex& assign(initializer_list<value_type> __il,
Howard Hinnant997621e2010-08-13 18:11:23 +00002776 flag_type __f = regex_constants::ECMAScript)
2777 {return assign(__il.begin(), __il.end(), __f);}
Howard Hinnant6c891682010-06-24 21:28:00 +00002778
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04002779#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002780
Howard Hinnant6c891682010-06-24 21:28:00 +00002781 // const operations:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002782 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002783 unsigned mark_count() const {return __marked_count_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002784 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002785 flag_type flags() const {return __flags_;}
2786
2787 // locale:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002788 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002789 locale_type imbue(locale_type __loc)
2790 {
2791 __member_init(ECMAScript);
2792 __start_.reset();
2793 return __traits_.imbue(__loc);
2794 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002795 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002796 locale_type getloc() const {return __traits_.getloc();}
2797
2798 // swap:
Howard Hinnant997621e2010-08-13 18:11:23 +00002799 void swap(basic_regex& __r);
Howard Hinnant6c891682010-06-24 21:28:00 +00002800
2801private:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002802 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002803 unsigned __loop_count() const {return __loop_count_;}
2804
Mark de Wevera989cce2020-11-18 18:09:13 +01002805 _LIBCPP_INLINE_VISIBILITY
2806 bool __use_multiline() const
2807 {
2808 return __get_grammar(__flags_) == ECMAScript && (__flags_ & multiline);
2809 }
2810
Howard Hinnant6c891682010-06-24 21:28:00 +00002811 template <class _ForwardIterator>
Mark de Wevera0ad9762019-11-09 17:01:37 +01002812 void
2813 __init(_ForwardIterator __first, _ForwardIterator __last);
2814 template <class _ForwardIterator>
Howard Hinnant126da6a2010-07-27 22:20:32 +00002815 _ForwardIterator
2816 __parse(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00002817 template <class _ForwardIterator>
2818 _ForwardIterator
2819 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2820 template <class _ForwardIterator>
2821 _ForwardIterator
2822 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2823 template <class _ForwardIterator>
2824 _ForwardIterator
2825 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2826 template <class _ForwardIterator>
2827 _ForwardIterator
2828 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2829 template <class _ForwardIterator>
2830 _ForwardIterator
2831 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2832 template <class _ForwardIterator>
2833 _ForwardIterator
2834 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2835 template <class _ForwardIterator>
2836 _ForwardIterator
2837 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2838 template <class _ForwardIterator>
2839 _ForwardIterator
2840 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2841 template <class _ForwardIterator>
2842 _ForwardIterator
2843 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2844 template <class _ForwardIterator>
2845 _ForwardIterator
2846 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2847 template <class _ForwardIterator>
2848 _ForwardIterator
2849 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2850 template <class _ForwardIterator>
2851 _ForwardIterator
2852 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2853 template <class _ForwardIterator>
2854 _ForwardIterator
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002855 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnant5bf96132010-07-08 17:43:58 +00002856 __owns_one_state<_CharT>* __s,
2857 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant89a40572010-06-25 20:56:08 +00002858 template <class _ForwardIterator>
2859 _ForwardIterator
Howard Hinnant16d65422010-07-16 19:08:36 +00002860 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2861 __owns_one_state<_CharT>* __s,
2862 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00002863 template <class _ForwardIterator>
2864 _ForwardIterator
Howard Hinnant89a40572010-06-25 20:56:08 +00002865 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2866 template <class _ForwardIterator>
2867 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002868 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2869 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00002870 template <class _ForwardIterator>
2871 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002872 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2873 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00002874 template <class _ForwardIterator>
2875 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002876 __parse_equivalence_class(_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_character_class(_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_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2885 basic_string<_CharT>& __col_sym);
Howard Hinnant89a40572010-06-25 20:56:08 +00002886 template <class _ForwardIterator>
2887 _ForwardIterator
2888 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
Howard Hinnant67ad2132010-06-29 18:37:43 +00002889 template <class _ForwardIterator>
2890 _ForwardIterator
2891 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2892 template <class _ForwardIterator>
2893 _ForwardIterator
2894 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2895 template <class _ForwardIterator>
2896 _ForwardIterator
2897 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2898 template <class _ForwardIterator>
2899 _ForwardIterator
2900 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2901 template <class _ForwardIterator>
2902 _ForwardIterator
2903 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2904 template <class _ForwardIterator>
2905 _ForwardIterator
2906 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante1053822010-07-22 17:53:24 +00002907 template <class _ForwardIterator>
2908 _ForwardIterator
2909 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2910 template <class _ForwardIterator>
2911 _ForwardIterator
2912 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2913 template <class _ForwardIterator>
2914 _ForwardIterator
2915 __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2916 template <class _ForwardIterator>
2917 _ForwardIterator
2918 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2919 template <class _ForwardIterator>
2920 _ForwardIterator
2921 __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2922 template <class _ForwardIterator>
2923 _ForwardIterator
Howard Hinnant70d27852010-07-27 01:25:38 +00002924 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2925 template <class _ForwardIterator>
2926 _ForwardIterator
2927 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2928 template <class _ForwardIterator>
2929 _ForwardIterator
2930 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2931 template <class _ForwardIterator>
2932 _ForwardIterator
Howard Hinnant70b3e192010-07-28 17:35:27 +00002933 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2934 basic_string<_CharT>* __str = nullptr);
Howard Hinnant70d27852010-07-27 01:25:38 +00002935 template <class _ForwardIterator>
2936 _ForwardIterator
2937 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnanteaf649e2010-07-27 19:53:10 +00002938 template <class _ForwardIterator>
2939 _ForwardIterator
2940 __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2941 template <class _ForwardIterator>
2942 _ForwardIterator
2943 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant70b3e192010-07-28 17:35:27 +00002944 template <class _ForwardIterator>
2945 _ForwardIterator
2946 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2947 basic_string<_CharT>& __str,
2948 __bracket_expression<_CharT, _Traits>* __ml);
2949 template <class _ForwardIterator>
2950 _ForwardIterator
2951 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2952 basic_string<_CharT>* __str = nullptr);
Howard Hinnant6c891682010-06-24 21:28:00 +00002953
Louis Dionnef16eb592020-02-19 15:56:15 -05002954 bool __test_back_ref(_CharT c);
2955
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002956 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant066ba512011-03-26 20:02:27 +00002957 void __push_l_anchor();
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002958 void __push_r_anchor();
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002959 void __push_match_any();
Howard Hinnant70d27852010-07-27 01:25:38 +00002960 void __push_match_any_but_newline();
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002961 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5bf96132010-07-08 17:43:58 +00002962 void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2963 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2964 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2965 __mexp_begin, __mexp_end);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002966 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70d27852010-07-27 01:25:38 +00002967 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2968 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2969 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2970 __mexp_begin, __mexp_end, false);}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002971 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
2972 size_t __mexp_begin = 0, size_t __mexp_end = 0,
2973 bool __greedy = true);
Howard Hinnant3034c902010-07-13 21:48:06 +00002974 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
Howard Hinnant67ad2132010-06-29 18:37:43 +00002975 void __push_char(value_type __c);
Howard Hinnant2a315e32010-07-12 18:16:05 +00002976 void __push_back_ref(int __i);
Howard Hinnant16d65422010-07-16 19:08:36 +00002977 void __push_alternation(__owns_one_state<_CharT>* __sa,
2978 __owns_one_state<_CharT>* __sb);
Howard Hinnant93ef6552010-06-30 20:30:19 +00002979 void __push_begin_marked_subexpression();
2980 void __push_end_marked_subexpression(unsigned);
Howard Hinnante1053822010-07-22 17:53:24 +00002981 void __push_empty();
Howard Hinnant70d27852010-07-27 01:25:38 +00002982 void __push_word_boundary(bool);
Howard Hinnant3efac712013-07-23 16:18:04 +00002983 void __push_lookahead(const basic_regex&, bool, unsigned);
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002984
Howard Hinnant66423212010-07-14 21:14:52 +00002985 template <class _Allocator>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002986 bool
Howard Hinnant66423212010-07-14 21:14:52 +00002987 __search(const _CharT* __first, const _CharT* __last,
2988 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002989 regex_constants::match_flag_type __flags) const;
2990
Howard Hinnant66423212010-07-14 21:14:52 +00002991 template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002992 bool
Howard Hinnant66423212010-07-14 21:14:52 +00002993 __match_at_start(const _CharT* __first, const _CharT* __last,
2994 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00002995 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant70d27852010-07-27 01:25:38 +00002996 template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002997 bool
Howard Hinnant70d27852010-07-27 01:25:38 +00002998 __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
2999 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00003000 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant66423212010-07-14 21:14:52 +00003001 template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003002 bool
3003 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
Howard Hinnant66423212010-07-14 21:14:52 +00003004 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00003005 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant66423212010-07-14 21:14:52 +00003006 template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003007 bool
Howard Hinnant66423212010-07-14 21:14:52 +00003008 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
3009 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00003010 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003011
Howard Hinnantc834c512011-11-29 18:15:50 +00003012 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00003013 friend
3014 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003015 regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00003016 regex_constants::match_flag_type);
Howard Hinnant6c891682010-06-24 21:28:00 +00003017
Howard Hinnantc834c512011-11-29 18:15:50 +00003018 template <class _Ap, class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00003019 friend
3020 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003021 regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
3022 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant66423212010-07-14 21:14:52 +00003023
Howard Hinnantc834c512011-11-29 18:15:50 +00003024 template <class _Bp, class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00003025 friend
3026 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003027 regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
Howard Hinnant66423212010-07-14 21:14:52 +00003028 regex_constants::match_flag_type);
3029
Howard Hinnantc834c512011-11-29 18:15:50 +00003030 template <class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00003031 friend
3032 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003033 regex_search(const _Cp*, const _Cp*,
3034 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant66423212010-07-14 21:14:52 +00003035
Howard Hinnantc834c512011-11-29 18:15:50 +00003036 template <class _Cp, class _Ap, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00003037 friend
3038 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003039 regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant66423212010-07-14 21:14:52 +00003040 regex_constants::match_flag_type);
3041
Howard Hinnantc834c512011-11-29 18:15:50 +00003042 template <class _ST, class _SA, class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00003043 friend
3044 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003045 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
3046 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant66423212010-07-14 21:14:52 +00003047 regex_constants::match_flag_type __flags);
3048
Howard Hinnantc834c512011-11-29 18:15:50 +00003049 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00003050 friend
3051 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00003052 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
3053 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
3054 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant66423212010-07-14 21:14:52 +00003055 regex_constants::match_flag_type __flags);
Howard Hinnant126da6a2010-07-27 22:20:32 +00003056
Howard Hinnant4018c482013-06-29 23:45:43 +00003057 template <class _Iter, class _Ap, class _Cp, class _Tp>
3058 friend
3059 bool
3060 regex_search(__wrap_iter<_Iter> __first,
3061 __wrap_iter<_Iter> __last,
3062 match_results<__wrap_iter<_Iter>, _Ap>& __m,
3063 const basic_regex<_Cp, _Tp>& __e,
3064 regex_constants::match_flag_type __flags);
3065
Howard Hinnant126da6a2010-07-27 22:20:32 +00003066 template <class, class> friend class __lookahead;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003067};
Howard Hinnant6c891682010-06-24 21:28:00 +00003068
Louis Dionned59f8a52021-08-17 11:59:07 -04003069#if _LIBCPP_STD_VER >= 17
Marshall Clow2dce1f42018-05-23 01:57:02 +00003070template <class _ForwardIterator,
Eric Fiseliercd5a6772019-11-18 01:46:58 -05003071 class = typename enable_if<__is_cpp17_forward_iterator<_ForwardIterator>::value, nullptr_t>::type
Marshall Clow2dce1f42018-05-23 01:57:02 +00003072>
3073basic_regex(_ForwardIterator, _ForwardIterator,
3074 regex_constants::syntax_option_type = regex_constants::ECMAScript)
3075 -> basic_regex<typename iterator_traits<_ForwardIterator>::value_type>;
3076#endif
3077
Howard Hinnant6c891682010-06-24 21:28:00 +00003078template <class _CharT, class _Traits>
Howard Hinnant2c45cb42012-12-12 21:14:28 +00003079 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
3080template <class _CharT, class _Traits>
3081 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
3082template <class _CharT, class _Traits>
3083 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
3084template <class _CharT, class _Traits>
3085 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
3086template <class _CharT, class _Traits>
3087 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
3088template <class _CharT, class _Traits>
3089 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
3090template <class _CharT, class _Traits>
3091 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
3092template <class _CharT, class _Traits>
3093 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
3094template <class _CharT, class _Traits>
3095 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
3096template <class _CharT, class _Traits>
3097 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
3098
3099template <class _CharT, class _Traits>
Howard Hinnant997621e2010-08-13 18:11:23 +00003100void
3101basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
Howard Hinnant6c891682010-06-24 21:28:00 +00003102{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003103 using _VSTD::swap;
Howard Hinnant997621e2010-08-13 18:11:23 +00003104 swap(__traits_, __r.__traits_);
3105 swap(__flags_, __r.__flags_);
3106 swap(__marked_count_, __r.__marked_count_);
3107 swap(__loop_count_, __r.__loop_count_);
3108 swap(__open_count_, __r.__open_count_);
3109 swap(__start_, __r.__start_);
3110 swap(__end_, __r.__end_);
Howard Hinnant997621e2010-08-13 18:11:23 +00003111}
3112
3113template <class _CharT, class _Traits>
3114inline _LIBCPP_INLINE_VISIBILITY
3115void
3116swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
3117{
3118 return __x.swap(__y);
Howard Hinnant6c891682010-06-24 21:28:00 +00003119}
3120
Howard Hinnant126da6a2010-07-27 22:20:32 +00003121// __lookahead
3122
3123template <class _CharT, class _Traits>
3124class __lookahead
3125 : public __owns_one_state<_CharT>
3126{
3127 typedef __owns_one_state<_CharT> base;
3128
3129 basic_regex<_CharT, _Traits> __exp_;
Howard Hinnant3efac712013-07-23 16:18:04 +00003130 unsigned __mexp_;
Howard Hinnant126da6a2010-07-27 22:20:32 +00003131 bool __invert_;
3132
3133 __lookahead(const __lookahead&);
3134 __lookahead& operator=(const __lookahead&);
3135public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003136 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant126da6a2010-07-27 22:20:32 +00003137
Howard Hinnant7ca9d942010-09-23 15:13:20 +00003138 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3efac712013-07-23 16:18:04 +00003139 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
Eric Fiseliera75ee262015-07-22 01:29:41 +00003140 : base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {}
Howard Hinnant126da6a2010-07-27 22:20:32 +00003141
3142 virtual void __exec(__state&) const;
Howard Hinnant126da6a2010-07-27 22:20:32 +00003143};
3144
3145template <class _CharT, class _Traits>
3146void
3147__lookahead<_CharT, _Traits>::__exec(__state& __s) const
3148{
3149 match_results<const _CharT*> __m;
3150 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
Tim Shen11113f52016-10-27 21:40:34 +00003151 bool __matched = __exp_.__match_at_start_ecma(
3152 __s.__current_, __s.__last_,
3153 __m,
3154 (__s.__flags_ | regex_constants::match_continuous) &
3155 ~regex_constants::__full_match,
3156 __s.__at_first_ && __s.__current_ == __s.__first_);
Howard Hinnant126da6a2010-07-27 22:20:32 +00003157 if (__matched != __invert_)
3158 {
3159 __s.__do_ = __state::__accept_but_not_consume;
3160 __s.__node_ = this->first();
Howard Hinnant3efac712013-07-23 16:18:04 +00003161 for (unsigned __i = 1; __i < __m.size(); ++__i) {
3162 __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
3163 }
Howard Hinnant126da6a2010-07-27 22:20:32 +00003164 }
3165 else
3166 {
3167 __s.__do_ = __state::__reject;
3168 __s.__node_ = nullptr;
3169 }
3170}
3171
Howard Hinnant6c891682010-06-24 21:28:00 +00003172template <class _CharT, class _Traits>
3173template <class _ForwardIterator>
Mark de Wevera0ad9762019-11-09 17:01:37 +01003174void
3175basic_regex<_CharT, _Traits>::__init(_ForwardIterator __first, _ForwardIterator __last)
3176{
3177 if (__get_grammar(__flags_) == 0) __flags_ |= regex_constants::ECMAScript;
3178 _ForwardIterator __temp = __parse(__first, __last);
3179 if ( __temp != __last)
3180 __throw_regex_error<regex_constants::__re_err_parse>();
3181}
3182
3183template <class _CharT, class _Traits>
3184template <class _ForwardIterator>
Howard Hinnant126da6a2010-07-27 22:20:32 +00003185_ForwardIterator
Howard Hinnant6c891682010-06-24 21:28:00 +00003186basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
3187 _ForwardIterator __last)
3188{
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003189 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00003190 unique_ptr<__node> __h(new __end_state<_CharT>);
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003191 __start_.reset(new __empty_state<_CharT>(__h.get()));
3192 __h.release();
3193 __end_ = __start_.get();
3194 }
Marshall Clow88a30872019-03-28 17:30:23 +00003195 switch (__get_grammar(__flags_))
Howard Hinnant6c891682010-06-24 21:28:00 +00003196 {
3197 case ECMAScript:
Howard Hinnant126da6a2010-07-27 22:20:32 +00003198 __first = __parse_ecma_exp(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003199 break;
3200 case basic:
Howard Hinnant126da6a2010-07-27 22:20:32 +00003201 __first = __parse_basic_reg_exp(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003202 break;
3203 case extended:
Howard Hinnant6c891682010-06-24 21:28:00 +00003204 case awk:
Howard Hinnant70b3e192010-07-28 17:35:27 +00003205 __first = __parse_extended_reg_exp(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003206 break;
3207 case grep:
Howard Hinnant126da6a2010-07-27 22:20:32 +00003208 __first = __parse_grep(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003209 break;
3210 case egrep:
Howard Hinnant126da6a2010-07-27 22:20:32 +00003211 __first = __parse_egrep(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003212 break;
3213 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00003214 __throw_regex_error<regex_constants::__re_err_grammar>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003215 }
Howard Hinnant126da6a2010-07-27 22:20:32 +00003216 return __first;
Howard Hinnant6c891682010-06-24 21:28:00 +00003217}
3218
3219template <class _CharT, class _Traits>
3220template <class _ForwardIterator>
3221_ForwardIterator
3222basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
3223 _ForwardIterator __last)
3224{
3225 if (__first != __last)
3226 {
3227 if (*__first == '^')
3228 {
3229 __push_l_anchor();
3230 ++__first;
3231 }
3232 if (__first != __last)
3233 {
3234 __first = __parse_RE_expression(__first, __last);
3235 if (__first != __last)
3236 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003237 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003238 if (__temp == __last && *__first == '$')
3239 {
3240 __push_r_anchor();
3241 ++__first;
3242 }
3243 }
3244 }
3245 if (__first != __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003246 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003247 }
3248 return __first;
3249}
3250
3251template <class _CharT, class _Traits>
3252template <class _ForwardIterator>
3253_ForwardIterator
Howard Hinnant67ad2132010-06-29 18:37:43 +00003254basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
3255 _ForwardIterator __last)
3256{
Howard Hinnant16d65422010-07-16 19:08:36 +00003257 __owns_one_state<_CharT>* __sa = __end_;
3258 _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
3259 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003260 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant16d65422010-07-16 19:08:36 +00003261 __first = __temp;
3262 while (__first != __last && *__first == '|')
Howard Hinnant67ad2132010-06-29 18:37:43 +00003263 {
Howard Hinnant16d65422010-07-16 19:08:36 +00003264 __owns_one_state<_CharT>* __sb = __end_;
3265 __temp = __parse_ERE_branch(++__first, __last);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003266 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003267 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant16d65422010-07-16 19:08:36 +00003268 __push_alternation(__sa, __sb);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003269 __first = __temp;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003270 }
3271 return __first;
3272}
3273
3274template <class _CharT, class _Traits>
3275template <class _ForwardIterator>
3276_ForwardIterator
3277basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3278 _ForwardIterator __last)
3279{
3280 _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
3281 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003282 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003283 do
3284 {
3285 __first = __temp;
3286 __temp = __parse_ERE_expression(__first, __last);
3287 } while (__temp != __first);
3288 return __first;
3289}
3290
3291template <class _CharT, class _Traits>
3292template <class _ForwardIterator>
3293_ForwardIterator
3294basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3295 _ForwardIterator __last)
3296{
Howard Hinnant16d65422010-07-16 19:08:36 +00003297 __owns_one_state<_CharT>* __e = __end_;
3298 unsigned __mexp_begin = __marked_count_;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003299 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3300 if (__temp == __first && __temp != __last)
3301 {
3302 switch (*__temp)
3303 {
3304 case '^':
3305 __push_l_anchor();
3306 ++__temp;
3307 break;
3308 case '$':
3309 __push_r_anchor();
3310 ++__temp;
3311 break;
3312 case '(':
Howard Hinnant93ef6552010-06-30 20:30:19 +00003313 __push_begin_marked_subexpression();
3314 unsigned __temp_count = __marked_count_;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003315 ++__open_count_;
3316 __temp = __parse_extended_reg_exp(++__temp, __last);
3317 if (__temp == __last || *__temp != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00003318 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant93ef6552010-06-30 20:30:19 +00003319 __push_end_marked_subexpression(__temp_count);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003320 --__open_count_;
3321 ++__temp;
3322 break;
3323 }
3324 }
3325 if (__temp != __first)
Howard Hinnant16d65422010-07-16 19:08:36 +00003326 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3327 __marked_count_+1);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003328 __first = __temp;
3329 return __first;
3330}
3331
3332template <class _CharT, class _Traits>
3333template <class _ForwardIterator>
3334_ForwardIterator
Howard Hinnant6c891682010-06-24 21:28:00 +00003335basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3336 _ForwardIterator __last)
3337{
3338 while (true)
3339 {
3340 _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3341 if (__temp == __first)
3342 break;
3343 __first = __temp;
3344 }
3345 return __first;
3346}
3347
3348template <class _CharT, class _Traits>
3349template <class _ForwardIterator>
3350_ForwardIterator
3351basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3352 _ForwardIterator __last)
3353{
3354 if (__first != __last)
3355 {
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003356 __owns_one_state<_CharT>* __e = __end_;
Howard Hinnant5bf96132010-07-08 17:43:58 +00003357 unsigned __mexp_begin = __marked_count_;
Howard Hinnant6c891682010-06-24 21:28:00 +00003358 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3359 if (__temp != __first)
Howard Hinnant5bf96132010-07-08 17:43:58 +00003360 __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3361 __mexp_begin+1, __marked_count_+1);
Howard Hinnant6c891682010-06-24 21:28:00 +00003362 }
3363 return __first;
3364}
3365
3366template <class _CharT, class _Traits>
3367template <class _ForwardIterator>
3368_ForwardIterator
3369basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3370 _ForwardIterator __last)
3371{
3372 _ForwardIterator __temp = __first;
3373 __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3374 if (__temp == __first)
3375 {
3376 __temp = __parse_Back_open_paren(__first, __last);
3377 if (__temp != __first)
3378 {
Howard Hinnant93ef6552010-06-30 20:30:19 +00003379 __push_begin_marked_subexpression();
3380 unsigned __temp_count = __marked_count_;
Howard Hinnant6c891682010-06-24 21:28:00 +00003381 __first = __parse_RE_expression(__temp, __last);
3382 __temp = __parse_Back_close_paren(__first, __last);
3383 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003384 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant93ef6552010-06-30 20:30:19 +00003385 __push_end_marked_subexpression(__temp_count);
Howard Hinnant6c891682010-06-24 21:28:00 +00003386 __first = __temp;
Howard Hinnant6c891682010-06-24 21:28:00 +00003387 }
3388 else
3389 __first = __parse_BACKREF(__first, __last);
3390 }
3391 return __first;
3392}
3393
3394template <class _CharT, class _Traits>
3395template <class _ForwardIterator>
3396_ForwardIterator
3397basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3398 _ForwardIterator __first,
3399 _ForwardIterator __last)
3400{
Howard Hinnant67ad2132010-06-29 18:37:43 +00003401 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003402 if (__temp == __first)
3403 {
Howard Hinnant67ad2132010-06-29 18:37:43 +00003404 __temp = __parse_QUOTED_CHAR(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003405 if (__temp == __first)
3406 {
Howard Hinnant67ad2132010-06-29 18:37:43 +00003407 if (__temp != __last && *__temp == '.')
Howard Hinnant6c891682010-06-24 21:28:00 +00003408 {
3409 __push_match_any();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003410 ++__temp;
Howard Hinnant6c891682010-06-24 21:28:00 +00003411 }
3412 else
Howard Hinnant67ad2132010-06-29 18:37:43 +00003413 __temp = __parse_bracket_expression(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003414 }
3415 }
Howard Hinnant67ad2132010-06-29 18:37:43 +00003416 __first = __temp;
3417 return __first;
3418}
3419
3420template <class _CharT, class _Traits>
3421template <class _ForwardIterator>
3422_ForwardIterator
3423basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3424 _ForwardIterator __first,
3425 _ForwardIterator __last)
3426{
3427 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3428 if (__temp == __first)
3429 {
3430 __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3431 if (__temp == __first)
3432 {
3433 if (__temp != __last && *__temp == '.')
3434 {
3435 __push_match_any();
3436 ++__temp;
3437 }
3438 else
3439 __temp = __parse_bracket_expression(__first, __last);
3440 }
3441 }
3442 __first = __temp;
Howard Hinnant6c891682010-06-24 21:28:00 +00003443 return __first;
3444}
3445
3446template <class _CharT, class _Traits>
3447template <class _ForwardIterator>
3448_ForwardIterator
3449basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3450 _ForwardIterator __last)
3451{
3452 if (__first != __last)
3453 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003454 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003455 if (__temp != __last)
3456 {
3457 if (*__first == '\\' && *__temp == '(')
3458 __first = ++__temp;
3459 }
3460 }
3461 return __first;
3462}
3463
3464template <class _CharT, class _Traits>
3465template <class _ForwardIterator>
3466_ForwardIterator
3467basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3468 _ForwardIterator __last)
3469{
3470 if (__first != __last)
3471 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003472 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003473 if (__temp != __last)
3474 {
3475 if (*__first == '\\' && *__temp == ')')
3476 __first = ++__temp;
3477 }
3478 }
3479 return __first;
3480}
3481
3482template <class _CharT, class _Traits>
3483template <class _ForwardIterator>
3484_ForwardIterator
3485basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3486 _ForwardIterator __last)
3487{
3488 if (__first != __last)
3489 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003490 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003491 if (__temp != __last)
3492 {
3493 if (*__first == '\\' && *__temp == '{')
3494 __first = ++__temp;
3495 }
3496 }
3497 return __first;
3498}
3499
3500template <class _CharT, class _Traits>
3501template <class _ForwardIterator>
3502_ForwardIterator
3503basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3504 _ForwardIterator __last)
3505{
3506 if (__first != __last)
3507 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003508 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003509 if (__temp != __last)
3510 {
3511 if (*__first == '\\' && *__temp == '}')
3512 __first = ++__temp;
3513 }
3514 }
3515 return __first;
3516}
3517
3518template <class _CharT, class _Traits>
3519template <class _ForwardIterator>
3520_ForwardIterator
3521basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3522 _ForwardIterator __last)
3523{
3524 if (__first != __last)
3525 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003526 _ForwardIterator __temp = _VSTD::next(__first);
Louis Dionnef16eb592020-02-19 15:56:15 -05003527 if (__temp != __last && *__first == '\\' && __test_back_ref(*__temp))
3528 __first = ++__temp;
Howard Hinnant6c891682010-06-24 21:28:00 +00003529 }
3530 return __first;
3531}
3532
3533template <class _CharT, class _Traits>
3534template <class _ForwardIterator>
3535_ForwardIterator
3536basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3537 _ForwardIterator __last)
3538{
3539 if (__first != __last)
3540 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003541 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003542 if (__temp == __last && *__first == '$')
3543 return __first;
3544 // Not called inside a bracket
3545 if (*__first == '.' || *__first == '\\' || *__first == '[')
3546 return __first;
Howard Hinnant89a40572010-06-25 20:56:08 +00003547 __push_char(*__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003548 ++__first;
3549 }
3550 return __first;
3551}
3552
3553template <class _CharT, class _Traits>
3554template <class _ForwardIterator>
3555_ForwardIterator
Howard Hinnant67ad2132010-06-29 18:37:43 +00003556basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3557 _ForwardIterator __last)
3558{
3559 if (__first != __last)
3560 {
3561 switch (*__first)
3562 {
3563 case '^':
3564 case '.':
3565 case '[':
3566 case '$':
3567 case '(':
3568 case '|':
3569 case '*':
3570 case '+':
3571 case '?':
3572 case '{':
3573 case '\\':
3574 break;
3575 case ')':
3576 if (__open_count_ == 0)
3577 {
3578 __push_char(*__first);
3579 ++__first;
3580 }
3581 break;
3582 default:
3583 __push_char(*__first);
3584 ++__first;
3585 break;
3586 }
3587 }
3588 return __first;
3589}
3590
3591template <class _CharT, class _Traits>
3592template <class _ForwardIterator>
3593_ForwardIterator
Howard Hinnant6c891682010-06-24 21:28:00 +00003594basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3595 _ForwardIterator __last)
3596{
3597 if (__first != __last)
3598 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003599 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003600 if (__temp != __last)
3601 {
3602 if (*__first == '\\')
3603 {
3604 switch (*__temp)
3605 {
3606 case '^':
3607 case '.':
3608 case '*':
3609 case '[':
3610 case '$':
3611 case '\\':
Howard Hinnant89a40572010-06-25 20:56:08 +00003612 __push_char(*__temp);
Howard Hinnant6c891682010-06-24 21:28:00 +00003613 __first = ++__temp;
3614 break;
3615 }
3616 }
3617 }
3618 }
3619 return __first;
3620}
3621
3622template <class _CharT, class _Traits>
3623template <class _ForwardIterator>
3624_ForwardIterator
Howard Hinnant67ad2132010-06-29 18:37:43 +00003625basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3626 _ForwardIterator __last)
3627{
3628 if (__first != __last)
3629 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003630 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003631 if (__temp != __last)
3632 {
3633 if (*__first == '\\')
3634 {
3635 switch (*__temp)
3636 {
3637 case '^':
3638 case '.':
3639 case '*':
3640 case '[':
3641 case '$':
3642 case '\\':
3643 case '(':
3644 case ')':
3645 case '|':
3646 case '+':
3647 case '?':
3648 case '{':
Howard Hinnant73072eb2013-06-28 20:31:05 +00003649 case '}':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003650 __push_char(*__temp);
3651 __first = ++__temp;
3652 break;
Howard Hinnant70b3e192010-07-28 17:35:27 +00003653 default:
Marshall Clow88a30872019-03-28 17:30:23 +00003654 if (__get_grammar(__flags_) == awk)
Howard Hinnant70b3e192010-07-28 17:35:27 +00003655 __first = __parse_awk_escape(++__first, __last);
Louis Dionnef16eb592020-02-19 15:56:15 -05003656 else if(__test_back_ref(*__temp))
3657 __first = ++__temp;
Howard Hinnant70b3e192010-07-28 17:35:27 +00003658 break;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003659 }
3660 }
3661 }
3662 }
3663 return __first;
3664}
3665
3666template <class _CharT, class _Traits>
3667template <class _ForwardIterator>
3668_ForwardIterator
Howard Hinnant6c891682010-06-24 21:28:00 +00003669basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003670 _ForwardIterator __last,
Howard Hinnant5bf96132010-07-08 17:43:58 +00003671 __owns_one_state<_CharT>* __s,
3672 unsigned __mexp_begin,
3673 unsigned __mexp_end)
Howard Hinnant6c891682010-06-24 21:28:00 +00003674{
3675 if (__first != __last)
3676 {
Howard Hinnant89a40572010-06-25 20:56:08 +00003677 if (*__first == '*')
Howard Hinnant6c891682010-06-24 21:28:00 +00003678 {
Howard Hinnant5bf96132010-07-08 17:43:58 +00003679 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant6c891682010-06-24 21:28:00 +00003680 ++__first;
3681 }
3682 else
3683 {
3684 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3685 if (__temp != __first)
3686 {
3687 int __min = 0;
3688 __first = __temp;
3689 __temp = __parse_DUP_COUNT(__first, __last, __min);
3690 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003691 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003692 __first = __temp;
3693 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003694 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003695 if (*__first != ',')
3696 {
3697 __temp = __parse_Back_close_brace(__first, __last);
3698 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003699 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant2a315e32010-07-12 18:16:05 +00003700 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3701 true);
Howard Hinnant6c891682010-06-24 21:28:00 +00003702 __first = __temp;
3703 }
3704 else
3705 {
3706 ++__first; // consume ','
3707 int __max = -1;
3708 __first = __parse_DUP_COUNT(__first, __last, __max);
3709 __temp = __parse_Back_close_brace(__first, __last);
3710 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003711 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003712 if (__max == -1)
Howard Hinnant16d65422010-07-16 19:08:36 +00003713 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant6c891682010-06-24 21:28:00 +00003714 else
3715 {
3716 if (__max < __min)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003717 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant2a315e32010-07-12 18:16:05 +00003718 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3719 true);
Howard Hinnant6c891682010-06-24 21:28:00 +00003720 }
3721 __first = __temp;
3722 }
3723 }
3724 }
3725 }
3726 return __first;
3727}
3728
Howard Hinnant89a40572010-06-25 20:56:08 +00003729template <class _CharT, class _Traits>
3730template <class _ForwardIterator>
3731_ForwardIterator
Howard Hinnant67ad2132010-06-29 18:37:43 +00003732basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
Howard Hinnant16d65422010-07-16 19:08:36 +00003733 _ForwardIterator __last,
3734 __owns_one_state<_CharT>* __s,
3735 unsigned __mexp_begin,
3736 unsigned __mexp_end)
Howard Hinnant67ad2132010-06-29 18:37:43 +00003737{
3738 if (__first != __last)
3739 {
Marshall Clow88a30872019-03-28 17:30:23 +00003740 unsigned __grammar = __get_grammar(__flags_);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003741 switch (*__first)
3742 {
3743 case '*':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003744 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003745 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003746 {
3747 ++__first;
3748 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3749 }
3750 else
3751 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003752 break;
3753 case '+':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003754 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003755 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003756 {
3757 ++__first;
3758 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3759 }
3760 else
3761 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003762 break;
3763 case '?':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003764 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003765 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003766 {
3767 ++__first;
3768 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3769 }
3770 else
3771 __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003772 break;
3773 case '{':
3774 {
3775 int __min;
Howard Hinnant16d65422010-07-16 19:08:36 +00003776 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003777 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003778 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003779 __first = __temp;
3780 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003781 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003782 switch (*__first)
3783 {
3784 case '}':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003785 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003786 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003787 {
3788 ++__first;
3789 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3790 }
3791 else
3792 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003793 break;
3794 case ',':
Howard Hinnant72f73582010-08-11 17:04:31 +00003795 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00003796 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003797 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003798 if (*__first == '}')
3799 {
Howard Hinnant67ad2132010-06-29 18:37:43 +00003800 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003801 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003802 {
3803 ++__first;
3804 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3805 }
3806 else
3807 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003808 }
3809 else
3810 {
Howard Hinnant16d65422010-07-16 19:08:36 +00003811 int __max = -1;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003812 __temp = __parse_DUP_COUNT(__first, __last, __max);
3813 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003814 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003815 __first = __temp;
3816 if (__first == __last || *__first != '}')
Marshall Clowc8ccc292015-07-28 13:30:47 +00003817 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003818 ++__first;
3819 if (__max < __min)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003820 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant446e9c62010-07-29 00:36:00 +00003821 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003822 {
3823 ++__first;
3824 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3825 }
3826 else
3827 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003828 }
Howard Hinnant16d65422010-07-16 19:08:36 +00003829 break;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003830 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00003831 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003832 }
3833 }
3834 break;
3835 }
3836 }
3837 return __first;
3838}
3839
3840template <class _CharT, class _Traits>
3841template <class _ForwardIterator>
3842_ForwardIterator
Howard Hinnant89a40572010-06-25 20:56:08 +00003843basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3844 _ForwardIterator __last)
3845{
3846 if (__first != __last && *__first == '[')
3847 {
Howard Hinnant72f73582010-08-11 17:04:31 +00003848 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00003849 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003850 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant3034c902010-07-13 21:48:06 +00003851 bool __negate = false;
Howard Hinnant89a40572010-06-25 20:56:08 +00003852 if (*__first == '^')
3853 {
3854 ++__first;
Howard Hinnant3034c902010-07-13 21:48:06 +00003855 __negate = true;
Howard Hinnant89a40572010-06-25 20:56:08 +00003856 }
Howard Hinnant3034c902010-07-13 21:48:06 +00003857 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3858 // __ml owned by *this
Howard Hinnant89a40572010-06-25 20:56:08 +00003859 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003860 __throw_regex_error<regex_constants::error_brack>();
Marshall Clow88a30872019-03-28 17:30:23 +00003861 if (__get_grammar(__flags_) != ECMAScript && *__first == ']')
Howard Hinnant89a40572010-06-25 20:56:08 +00003862 {
Howard Hinnant3034c902010-07-13 21:48:06 +00003863 __ml->__add_char(']');
Howard Hinnant89a40572010-06-25 20:56:08 +00003864 ++__first;
3865 }
Howard Hinnant3034c902010-07-13 21:48:06 +00003866 __first = __parse_follow_list(__first, __last, __ml);
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>();
Howard Hinnant89a40572010-06-25 20:56:08 +00003869 if (*__first == '-')
3870 {
Howard Hinnant3034c902010-07-13 21:48:06 +00003871 __ml->__add_char('-');
Howard Hinnant89a40572010-06-25 20:56:08 +00003872 ++__first;
3873 }
3874 if (__first == __last || *__first != ']')
Marshall Clowc8ccc292015-07-28 13:30:47 +00003875 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00003876 ++__first;
3877 }
3878 return __first;
3879}
3880
3881template <class _CharT, class _Traits>
3882template <class _ForwardIterator>
3883_ForwardIterator
3884basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00003885 _ForwardIterator __last,
3886 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant89a40572010-06-25 20:56:08 +00003887{
3888 if (__first != __last)
3889 {
3890 while (true)
3891 {
Howard Hinnant3034c902010-07-13 21:48:06 +00003892 _ForwardIterator __temp = __parse_expression_term(__first, __last,
3893 __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00003894 if (__temp == __first)
3895 break;
3896 __first = __temp;
3897 }
3898 }
3899 return __first;
3900}
3901
3902template <class _CharT, class _Traits>
3903template <class _ForwardIterator>
3904_ForwardIterator
3905basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00003906 _ForwardIterator __last,
3907 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant89a40572010-06-25 20:56:08 +00003908{
3909 if (__first != __last && *__first != ']')
3910 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003911 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant3034c902010-07-13 21:48:06 +00003912 basic_string<_CharT> __start_range;
Howard Hinnant89a40572010-06-25 20:56:08 +00003913 if (__temp != __last && *__first == '[')
3914 {
3915 if (*__temp == '=')
Howard Hinnant3034c902010-07-13 21:48:06 +00003916 return __parse_equivalence_class(++__temp, __last, __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00003917 else if (*__temp == ':')
Howard Hinnant3034c902010-07-13 21:48:06 +00003918 return __parse_character_class(++__temp, __last, __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00003919 else if (*__temp == '.')
Howard Hinnant3034c902010-07-13 21:48:06 +00003920 __first = __parse_collating_symbol(++__temp, __last, __start_range);
Howard Hinnant89a40572010-06-25 20:56:08 +00003921 }
Marshall Clow88a30872019-03-28 17:30:23 +00003922 unsigned __grammar = __get_grammar(__flags_);
Howard Hinnant70b3e192010-07-28 17:35:27 +00003923 if (__start_range.empty())
Howard Hinnant89a40572010-06-25 20:56:08 +00003924 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00003925 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3926 {
3927 if (__grammar == ECMAScript)
3928 __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3929 else
3930 __first = __parse_awk_escape(++__first, __last, &__start_range);
3931 }
3932 else
3933 {
3934 __start_range = *__first;
3935 ++__first;
3936 }
Howard Hinnant89a40572010-06-25 20:56:08 +00003937 }
3938 if (__first != __last && *__first != ']')
3939 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003940 __temp = _VSTD::next(__first);
Howard Hinnant89a40572010-06-25 20:56:08 +00003941 if (__temp != __last && *__first == '-' && *__temp != ']')
3942 {
3943 // parse a range
Howard Hinnant3034c902010-07-13 21:48:06 +00003944 basic_string<_CharT> __end_range;
Howard Hinnant89a40572010-06-25 20:56:08 +00003945 __first = __temp;
3946 ++__temp;
3947 if (__temp != __last && *__first == '[' && *__temp == '.')
Howard Hinnant3034c902010-07-13 21:48:06 +00003948 __first = __parse_collating_symbol(++__temp, __last, __end_range);
Howard Hinnant89a40572010-06-25 20:56:08 +00003949 else
3950 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00003951 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3952 {
3953 if (__grammar == ECMAScript)
3954 __first = __parse_class_escape(++__first, __last,
3955 __end_range, __ml);
3956 else
3957 __first = __parse_awk_escape(++__first, __last,
3958 &__end_range);
3959 }
3960 else
3961 {
3962 __end_range = *__first;
3963 ++__first;
3964 }
Howard Hinnant89a40572010-06-25 20:56:08 +00003965 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003966 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
Howard Hinnant89a40572010-06-25 20:56:08 +00003967 }
Howard Hinnant8ea98242013-08-23 17:37:05 +00003968 else if (!__start_range.empty())
Howard Hinnant3034c902010-07-13 21:48:06 +00003969 {
3970 if (__start_range.size() == 1)
3971 __ml->__add_char(__start_range[0]);
3972 else
3973 __ml->__add_digraph(__start_range[0], __start_range[1]);
3974 }
3975 }
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]);
Howard Hinnant89a40572010-06-25 20:56:08 +00003982 }
3983 }
3984 return __first;
3985}
3986
3987template <class _CharT, class _Traits>
3988template <class _ForwardIterator>
3989_ForwardIterator
Howard Hinnant70b3e192010-07-28 17:35:27 +00003990basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
3991 _ForwardIterator __last,
3992 basic_string<_CharT>& __str,
3993 __bracket_expression<_CharT, _Traits>* __ml)
3994{
3995 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003996 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70b3e192010-07-28 17:35:27 +00003997 switch (*__first)
3998 {
3999 case 0:
4000 __str = *__first;
4001 return ++__first;
4002 case 'b':
4003 __str = _CharT(8);
4004 return ++__first;
4005 case 'd':
4006 __ml->__add_class(ctype_base::digit);
4007 return ++__first;
4008 case 'D':
4009 __ml->__add_neg_class(ctype_base::digit);
4010 return ++__first;
4011 case 's':
4012 __ml->__add_class(ctype_base::space);
4013 return ++__first;
4014 case 'S':
4015 __ml->__add_neg_class(ctype_base::space);
4016 return ++__first;
4017 case 'w':
4018 __ml->__add_class(ctype_base::alnum);
4019 __ml->__add_char('_');
4020 return ++__first;
4021 case 'W':
4022 __ml->__add_neg_class(ctype_base::alnum);
4023 __ml->__add_neg_char('_');
4024 return ++__first;
4025 }
4026 __first = __parse_character_escape(__first, __last, &__str);
4027 return __first;
4028}
4029
4030template <class _CharT, class _Traits>
4031template <class _ForwardIterator>
4032_ForwardIterator
4033basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
4034 _ForwardIterator __last,
4035 basic_string<_CharT>* __str)
4036{
4037 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004038 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70b3e192010-07-28 17:35:27 +00004039 switch (*__first)
4040 {
4041 case '\\':
4042 case '"':
4043 case '/':
4044 if (__str)
4045 *__str = *__first;
4046 else
4047 __push_char(*__first);
4048 return ++__first;
4049 case 'a':
4050 if (__str)
4051 *__str = _CharT(7);
4052 else
4053 __push_char(_CharT(7));
4054 return ++__first;
4055 case 'b':
4056 if (__str)
4057 *__str = _CharT(8);
4058 else
4059 __push_char(_CharT(8));
4060 return ++__first;
4061 case 'f':
4062 if (__str)
4063 *__str = _CharT(0xC);
4064 else
4065 __push_char(_CharT(0xC));
4066 return ++__first;
4067 case 'n':
4068 if (__str)
4069 *__str = _CharT(0xA);
4070 else
4071 __push_char(_CharT(0xA));
4072 return ++__first;
4073 case 'r':
4074 if (__str)
4075 *__str = _CharT(0xD);
4076 else
4077 __push_char(_CharT(0xD));
4078 return ++__first;
4079 case 't':
4080 if (__str)
4081 *__str = _CharT(0x9);
4082 else
4083 __push_char(_CharT(0x9));
4084 return ++__first;
4085 case 'v':
4086 if (__str)
4087 *__str = _CharT(0xB);
4088 else
4089 __push_char(_CharT(0xB));
4090 return ++__first;
4091 }
4092 if ('0' <= *__first && *__first <= '7')
4093 {
4094 unsigned __val = *__first - '0';
4095 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
4096 {
4097 __val = 8 * __val + *__first - '0';
4098 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
Howard Hinnanta3096872013-07-02 17:43:31 +00004099 __val = 8 * __val + *__first++ - '0';
Howard Hinnant70b3e192010-07-28 17:35:27 +00004100 }
4101 if (__str)
4102 *__str = _CharT(__val);
4103 else
4104 __push_char(_CharT(__val));
4105 }
4106 else
Marshall Clowc8ccc292015-07-28 13:30:47 +00004107 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70b3e192010-07-28 17:35:27 +00004108 return __first;
4109}
4110
4111template <class _CharT, class _Traits>
4112template <class _ForwardIterator>
4113_ForwardIterator
Howard Hinnant89a40572010-06-25 20:56:08 +00004114basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00004115 _ForwardIterator __last,
4116 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant89a40572010-06-25 20:56:08 +00004117{
4118 // Found [=
4119 // This means =] must exist
4120 value_type _Equal_close[2] = {'=', ']'};
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004121 _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
Howard Hinnant89a40572010-06-25 20:56:08 +00004122 _Equal_close+2);
4123 if (__temp == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004124 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00004125 // [__first, __temp) contains all text in [= ... =]
Howard Hinnant89a40572010-06-25 20:56:08 +00004126 string_type __collate_name =
4127 __traits_.lookup_collatename(__first, __temp);
4128 if (__collate_name.empty())
Marshall Clowc8ccc292015-07-28 13:30:47 +00004129 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant89a40572010-06-25 20:56:08 +00004130 string_type __equiv_name =
4131 __traits_.transform_primary(__collate_name.begin(),
4132 __collate_name.end());
4133 if (!__equiv_name.empty())
Howard Hinnant3034c902010-07-13 21:48:06 +00004134 __ml->__add_equivalence(__equiv_name);
Howard Hinnant89a40572010-06-25 20:56:08 +00004135 else
Howard Hinnant3034c902010-07-13 21:48:06 +00004136 {
4137 switch (__collate_name.size())
4138 {
4139 case 1:
4140 __ml->__add_char(__collate_name[0]);
4141 break;
4142 case 2:
4143 __ml->__add_digraph(__collate_name[0], __collate_name[1]);
4144 break;
4145 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00004146 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant3034c902010-07-13 21:48:06 +00004147 }
4148 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004149 __first = _VSTD::next(__temp, 2);
Howard Hinnant89a40572010-06-25 20:56:08 +00004150 return __first;
4151}
4152
4153template <class _CharT, class _Traits>
4154template <class _ForwardIterator>
4155_ForwardIterator
4156basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00004157 _ForwardIterator __last,
4158 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant89a40572010-06-25 20:56:08 +00004159{
4160 // Found [:
4161 // This means :] must exist
4162 value_type _Colon_close[2] = {':', ']'};
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004163 _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
Howard Hinnant89a40572010-06-25 20:56:08 +00004164 _Colon_close+2);
4165 if (__temp == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004166 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00004167 // [__first, __temp) contains all text in [: ... :]
4168 typedef typename _Traits::char_class_type char_class_type;
4169 char_class_type __class_type =
4170 __traits_.lookup_classname(__first, __temp, __flags_ & icase);
4171 if (__class_type == 0)
Mikhail Maltsev6ef945b2018-01-24 12:45:18 +00004172 __throw_regex_error<regex_constants::error_ctype>();
Howard Hinnant3034c902010-07-13 21:48:06 +00004173 __ml->__add_class(__class_type);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004174 __first = _VSTD::next(__temp, 2);
Howard Hinnant89a40572010-06-25 20:56:08 +00004175 return __first;
4176}
4177
4178template <class _CharT, class _Traits>
4179template <class _ForwardIterator>
4180_ForwardIterator
4181basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00004182 _ForwardIterator __last,
4183 basic_string<_CharT>& __col_sym)
Howard Hinnant89a40572010-06-25 20:56:08 +00004184{
4185 // Found [.
4186 // This means .] must exist
4187 value_type _Dot_close[2] = {'.', ']'};
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004188 _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
Howard Hinnant89a40572010-06-25 20:56:08 +00004189 _Dot_close+2);
4190 if (__temp == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004191 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00004192 // [__first, __temp) contains all text in [. ... .]
Howard Hinnant3034c902010-07-13 21:48:06 +00004193 __col_sym = __traits_.lookup_collatename(__first, __temp);
4194 switch (__col_sym.size())
4195 {
4196 case 1:
4197 case 2:
4198 break;
4199 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00004200 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant3034c902010-07-13 21:48:06 +00004201 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004202 __first = _VSTD::next(__temp, 2);
Howard Hinnant89a40572010-06-25 20:56:08 +00004203 return __first;
4204}
4205
4206template <class _CharT, class _Traits>
4207template <class _ForwardIterator>
4208_ForwardIterator
4209basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4210 _ForwardIterator __last,
4211 int& __c)
4212{
Marshall Clowaa38d972014-01-18 03:40:03 +00004213 if (__first != __last )
Howard Hinnant89a40572010-06-25 20:56:08 +00004214 {
Marshall Clowaa38d972014-01-18 03:40:03 +00004215 int __val = __traits_.value(*__first, 10);
4216 if ( __val != -1 )
Howard Hinnant89a40572010-06-25 20:56:08 +00004217 {
Marshall Clowaa38d972014-01-18 03:40:03 +00004218 __c = __val;
Louis Dionne173f29e2019-05-29 16:01:36 +00004219 for (++__first;
Marshall Clowaa38d972014-01-18 03:40:03 +00004220 __first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
4221 ++__first)
4222 {
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05004223 if (__c >= numeric_limits<int>::max() / 10)
Marshall Clow863ae382017-10-19 17:39:16 +00004224 __throw_regex_error<regex_constants::error_badbrace>();
Marshall Clowaa38d972014-01-18 03:40:03 +00004225 __c *= 10;
4226 __c += __val;
4227 }
Howard Hinnant89a40572010-06-25 20:56:08 +00004228 }
4229 }
4230 return __first;
4231}
4232
Howard Hinnant67ad2132010-06-29 18:37:43 +00004233template <class _CharT, class _Traits>
Howard Hinnante1053822010-07-22 17:53:24 +00004234template <class _ForwardIterator>
4235_ForwardIterator
4236basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4237 _ForwardIterator __last)
4238{
4239 __owns_one_state<_CharT>* __sa = __end_;
4240 _ForwardIterator __temp = __parse_alternative(__first, __last);
4241 if (__temp == __first)
4242 __push_empty();
4243 __first = __temp;
4244 while (__first != __last && *__first == '|')
4245 {
4246 __owns_one_state<_CharT>* __sb = __end_;
4247 __temp = __parse_alternative(++__first, __last);
4248 if (__temp == __first)
4249 __push_empty();
4250 __push_alternation(__sa, __sb);
4251 __first = __temp;
4252 }
4253 return __first;
4254}
4255
4256template <class _CharT, class _Traits>
4257template <class _ForwardIterator>
4258_ForwardIterator
4259basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4260 _ForwardIterator __last)
4261{
4262 while (true)
4263 {
4264 _ForwardIterator __temp = __parse_term(__first, __last);
4265 if (__temp == __first)
4266 break;
4267 __first = __temp;
4268 }
4269 return __first;
4270}
4271
4272template <class _CharT, class _Traits>
4273template <class _ForwardIterator>
4274_ForwardIterator
4275basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4276 _ForwardIterator __last)
4277{
4278 _ForwardIterator __temp = __parse_assertion(__first, __last);
4279 if (__temp == __first)
4280 {
Howard Hinnant70d27852010-07-27 01:25:38 +00004281 __owns_one_state<_CharT>* __e = __end_;
4282 unsigned __mexp_begin = __marked_count_;
Howard Hinnante1053822010-07-22 17:53:24 +00004283 __temp = __parse_atom(__first, __last);
4284 if (__temp != __first)
Howard Hinnant70d27852010-07-27 01:25:38 +00004285 __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4286 __mexp_begin+1, __marked_count_+1);
Howard Hinnante1053822010-07-22 17:53:24 +00004287 }
Howard Hinnant70d27852010-07-27 01:25:38 +00004288 else
4289 __first = __temp;
Howard Hinnante1053822010-07-22 17:53:24 +00004290 return __first;
4291}
4292
4293template <class _CharT, class _Traits>
4294template <class _ForwardIterator>
4295_ForwardIterator
4296basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4297 _ForwardIterator __last)
4298{
4299 if (__first != __last)
4300 {
4301 switch (*__first)
4302 {
4303 case '^':
4304 __push_l_anchor();
4305 ++__first;
4306 break;
4307 case '$':
4308 __push_r_anchor();
4309 ++__first;
4310 break;
4311 case '\\':
4312 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004313 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnante1053822010-07-22 17:53:24 +00004314 if (__temp != __last)
4315 {
4316 if (*__temp == 'b')
4317 {
Howard Hinnant70d27852010-07-27 01:25:38 +00004318 __push_word_boundary(false);
Howard Hinnante1053822010-07-22 17:53:24 +00004319 __first = ++__temp;
4320 }
4321 else if (*__temp == 'B')
4322 {
Howard Hinnant70d27852010-07-27 01:25:38 +00004323 __push_word_boundary(true);
Howard Hinnante1053822010-07-22 17:53:24 +00004324 __first = ++__temp;
4325 }
4326 }
4327 }
4328 break;
4329 case '(':
4330 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004331 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnante1053822010-07-22 17:53:24 +00004332 if (__temp != __last && *__temp == '?')
4333 {
4334 if (++__temp != __last)
4335 {
4336 switch (*__temp)
4337 {
4338 case '=':
Howard Hinnant126da6a2010-07-27 22:20:32 +00004339 {
4340 basic_regex __exp;
4341 __exp.__flags_ = __flags_;
4342 __temp = __exp.__parse(++__temp, __last);
Howard Hinnant3efac712013-07-23 16:18:04 +00004343 unsigned __mexp = __exp.__marked_count_;
4344 __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
4345 __marked_count_ += __mexp;
Howard Hinnant126da6a2010-07-27 22:20:32 +00004346 if (__temp == __last || *__temp != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00004347 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant126da6a2010-07-27 22:20:32 +00004348 __first = ++__temp;
4349 }
Howard Hinnante1053822010-07-22 17:53:24 +00004350 break;
4351 case '!':
Howard Hinnant126da6a2010-07-27 22:20:32 +00004352 {
4353 basic_regex __exp;
4354 __exp.__flags_ = __flags_;
4355 __temp = __exp.__parse(++__temp, __last);
Howard Hinnant3efac712013-07-23 16:18:04 +00004356 unsigned __mexp = __exp.__marked_count_;
4357 __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
4358 __marked_count_ += __mexp;
Howard Hinnant126da6a2010-07-27 22:20:32 +00004359 if (__temp == __last || *__temp != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00004360 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant126da6a2010-07-27 22:20:32 +00004361 __first = ++__temp;
4362 }
Howard Hinnante1053822010-07-22 17:53:24 +00004363 break;
4364 }
4365 }
4366 }
4367 }
4368 break;
4369 }
4370 }
4371 return __first;
4372}
4373
4374template <class _CharT, class _Traits>
4375template <class _ForwardIterator>
4376_ForwardIterator
4377basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4378 _ForwardIterator __last)
4379{
Howard Hinnant70d27852010-07-27 01:25:38 +00004380 if (__first != __last)
4381 {
4382 switch (*__first)
4383 {
4384 case '.':
4385 __push_match_any_but_newline();
4386 ++__first;
4387 break;
4388 case '\\':
4389 __first = __parse_atom_escape(__first, __last);
4390 break;
4391 case '[':
4392 __first = __parse_bracket_expression(__first, __last);
4393 break;
4394 case '(':
4395 {
Howard Hinnant72f73582010-08-11 17:04:31 +00004396 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004397 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004398 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004399 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant70d27852010-07-27 01:25:38 +00004400 if (__temp != __last && *__first == '?' && *__temp == ':')
4401 {
4402 ++__open_count_;
4403 __first = __parse_ecma_exp(++__temp, __last);
4404 if (__first == __last || *__first != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00004405 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004406 --__open_count_;
4407 ++__first;
4408 }
4409 else
4410 {
4411 __push_begin_marked_subexpression();
4412 unsigned __temp_count = __marked_count_;
4413 ++__open_count_;
4414 __first = __parse_ecma_exp(__first, __last);
4415 if (__first == __last || *__first != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00004416 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004417 __push_end_marked_subexpression(__temp_count);
4418 --__open_count_;
4419 ++__first;
4420 }
4421 }
4422 break;
Marshall Clow82058212015-07-23 18:27:51 +00004423 case '*':
4424 case '+':
4425 case '?':
4426 case '{':
Marshall Clowc8ccc292015-07-28 13:30:47 +00004427 __throw_regex_error<regex_constants::error_badrepeat>();
Marshall Clow82058212015-07-23 18:27:51 +00004428 break;
Howard Hinnant70d27852010-07-27 01:25:38 +00004429 default:
4430 __first = __parse_pattern_character(__first, __last);
4431 break;
4432 }
4433 }
4434 return __first;
4435}
4436
4437template <class _CharT, class _Traits>
4438template <class _ForwardIterator>
4439_ForwardIterator
4440basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4441 _ForwardIterator __last)
4442{
4443 if (__first != __last && *__first == '\\')
4444 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004445 _ForwardIterator __t1 = _VSTD::next(__first);
Marshall Clowdb9633c2016-01-19 00:50:37 +00004446 if (__t1 == __last)
4447 __throw_regex_error<regex_constants::error_escape>();
4448
Howard Hinnant70d27852010-07-27 01:25:38 +00004449 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4450 if (__t2 != __t1)
4451 __first = __t2;
4452 else
4453 {
4454 __t2 = __parse_character_class_escape(__t1, __last);
4455 if (__t2 != __t1)
4456 __first = __t2;
4457 else
4458 {
4459 __t2 = __parse_character_escape(__t1, __last);
4460 if (__t2 != __t1)
4461 __first = __t2;
4462 }
4463 }
4464 }
4465 return __first;
4466}
4467
4468template <class _CharT, class _Traits>
4469template <class _ForwardIterator>
4470_ForwardIterator
4471basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4472 _ForwardIterator __last)
4473{
4474 if (__first != __last)
4475 {
4476 if (*__first == '0')
4477 {
4478 __push_char(_CharT());
4479 ++__first;
4480 }
4481 else if ('1' <= *__first && *__first <= '9')
4482 {
4483 unsigned __v = *__first - '0';
Marshall Clowdc03ec72016-12-24 17:21:03 +00004484 for (++__first;
4485 __first != __last && '0' <= *__first && *__first <= '9'; ++__first)
Marshall Clow266b5ec2017-10-19 22:10:41 +00004486 {
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05004487 if (__v >= numeric_limits<unsigned>::max() / 10)
Marshall Clow266b5ec2017-10-19 22:10:41 +00004488 __throw_regex_error<regex_constants::error_backref>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004489 __v = 10 * __v + *__first - '0';
Marshall Clow266b5ec2017-10-19 22:10:41 +00004490 }
4491 if (__v == 0 || __v > mark_count())
Marshall Clowc8ccc292015-07-28 13:30:47 +00004492 __throw_regex_error<regex_constants::error_backref>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004493 __push_back_ref(__v);
4494 }
4495 }
4496 return __first;
4497}
4498
4499template <class _CharT, class _Traits>
4500template <class _ForwardIterator>
4501_ForwardIterator
4502basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4503 _ForwardIterator __last)
4504{
4505 if (__first != __last)
4506 {
4507 __bracket_expression<_CharT, _Traits>* __ml;
4508 switch (*__first)
4509 {
4510 case 'd':
4511 __ml = __start_matching_list(false);
4512 __ml->__add_class(ctype_base::digit);
4513 ++__first;
4514 break;
4515 case 'D':
4516 __ml = __start_matching_list(true);
4517 __ml->__add_class(ctype_base::digit);
4518 ++__first;
4519 break;
4520 case 's':
4521 __ml = __start_matching_list(false);
4522 __ml->__add_class(ctype_base::space);
4523 ++__first;
4524 break;
4525 case 'S':
4526 __ml = __start_matching_list(true);
4527 __ml->__add_class(ctype_base::space);
4528 ++__first;
4529 break;
4530 case 'w':
4531 __ml = __start_matching_list(false);
4532 __ml->__add_class(ctype_base::alnum);
4533 __ml->__add_char('_');
4534 ++__first;
4535 break;
4536 case 'W':
4537 __ml = __start_matching_list(true);
4538 __ml->__add_class(ctype_base::alnum);
4539 __ml->__add_char('_');
4540 ++__first;
4541 break;
4542 }
4543 }
4544 return __first;
4545}
4546
4547template <class _CharT, class _Traits>
4548template <class _ForwardIterator>
4549_ForwardIterator
4550basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
Howard Hinnant70b3e192010-07-28 17:35:27 +00004551 _ForwardIterator __last,
4552 basic_string<_CharT>* __str)
Howard Hinnant70d27852010-07-27 01:25:38 +00004553{
4554 if (__first != __last)
4555 {
4556 _ForwardIterator __t;
4557 unsigned __sum = 0;
4558 int __hd;
4559 switch (*__first)
4560 {
4561 case 'f':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004562 if (__str)
4563 *__str = _CharT(0xC);
4564 else
4565 __push_char(_CharT(0xC));
Howard Hinnant70d27852010-07-27 01:25:38 +00004566 ++__first;
4567 break;
4568 case 'n':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004569 if (__str)
4570 *__str = _CharT(0xA);
4571 else
4572 __push_char(_CharT(0xA));
Howard Hinnant70d27852010-07-27 01:25:38 +00004573 ++__first;
4574 break;
4575 case 'r':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004576 if (__str)
4577 *__str = _CharT(0xD);
4578 else
4579 __push_char(_CharT(0xD));
Howard Hinnant70d27852010-07-27 01:25:38 +00004580 ++__first;
4581 break;
4582 case 't':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004583 if (__str)
4584 *__str = _CharT(0x9);
4585 else
4586 __push_char(_CharT(0x9));
Howard Hinnant70d27852010-07-27 01:25:38 +00004587 ++__first;
4588 break;
4589 case 'v':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004590 if (__str)
4591 *__str = _CharT(0xB);
4592 else
4593 __push_char(_CharT(0xB));
Howard Hinnant70d27852010-07-27 01:25:38 +00004594 ++__first;
4595 break;
4596 case 'c':
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004597 if ((__t = _VSTD::next(__first)) != __last)
Howard Hinnant70d27852010-07-27 01:25:38 +00004598 {
Louis Dionne173f29e2019-05-29 16:01:36 +00004599 if (('A' <= *__t && *__t <= 'Z') ||
Howard Hinnantd04741b2013-07-15 18:21:11 +00004600 ('a' <= *__t && *__t <= 'z'))
Howard Hinnant70d27852010-07-27 01:25:38 +00004601 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00004602 if (__str)
4603 *__str = _CharT(*__t % 32);
4604 else
4605 __push_char(_CharT(*__t % 32));
Howard Hinnant70d27852010-07-27 01:25:38 +00004606 __first = ++__t;
4607 }
Louis Dionne173f29e2019-05-29 16:01:36 +00004608 else
Marshall Clowc8ccc292015-07-28 13:30:47 +00004609 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004610 }
Howard Hinnantd04741b2013-07-15 18:21:11 +00004611 else
Marshall Clowc8ccc292015-07-28 13:30:47 +00004612 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004613 break;
4614 case 'u':
Howard Hinnant72f73582010-08-11 17:04:31 +00004615 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004616 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004617 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004618 __hd = __traits_.value(*__first, 16);
4619 if (__hd == -1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004620 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant28b24882011-12-01 20:21:04 +00004621 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant72f73582010-08-11 17:04:31 +00004622 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004623 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004624 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004625 __hd = __traits_.value(*__first, 16);
4626 if (__hd == -1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004627 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant28b24882011-12-01 20:21:04 +00004628 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Louis Dionneaf6be622021-07-27 17:30:47 -04004629 // fallthrough
Howard Hinnant70d27852010-07-27 01:25:38 +00004630 case 'x':
Howard Hinnant72f73582010-08-11 17:04:31 +00004631 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004632 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004633 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004634 __hd = __traits_.value(*__first, 16);
4635 if (__hd == -1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004636 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant28b24882011-12-01 20:21:04 +00004637 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant72f73582010-08-11 17:04:31 +00004638 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004639 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004640 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004641 __hd = __traits_.value(*__first, 16);
4642 if (__hd == -1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004643 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant28b24882011-12-01 20:21:04 +00004644 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant70b3e192010-07-28 17:35:27 +00004645 if (__str)
4646 *__str = _CharT(__sum);
4647 else
4648 __push_char(_CharT(__sum));
Howard Hinnant70d27852010-07-27 01:25:38 +00004649 ++__first;
4650 break;
Marshall Clowf6cef0d2014-05-21 16:29:50 +00004651 case '0':
4652 if (__str)
4653 *__str = _CharT(0);
4654 else
4655 __push_char(_CharT(0));
4656 ++__first;
4657 break;
Howard Hinnant70d27852010-07-27 01:25:38 +00004658 default:
4659 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4660 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00004661 if (__str)
4662 *__str = *__first;
4663 else
4664 __push_char(*__first);
Howard Hinnant70d27852010-07-27 01:25:38 +00004665 ++__first;
4666 }
Howard Hinnant4f7a1f52013-06-28 18:57:30 +00004667 else
Marshall Clowc8ccc292015-07-28 13:30:47 +00004668 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004669 break;
4670 }
4671 }
4672 return __first;
4673}
4674
4675template <class _CharT, class _Traits>
4676template <class _ForwardIterator>
4677_ForwardIterator
4678basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4679 _ForwardIterator __last)
4680{
4681 if (__first != __last)
4682 {
4683 switch (*__first)
4684 {
4685 case '^':
4686 case '$':
4687 case '\\':
4688 case '.':
4689 case '*':
4690 case '+':
4691 case '?':
4692 case '(':
4693 case ')':
4694 case '[':
4695 case ']':
4696 case '{':
4697 case '}':
4698 case '|':
4699 break;
4700 default:
4701 __push_char(*__first);
4702 ++__first;
4703 break;
4704 }
4705 }
4706 return __first;
Howard Hinnante1053822010-07-22 17:53:24 +00004707}
4708
4709template <class _CharT, class _Traits>
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004710template <class _ForwardIterator>
4711_ForwardIterator
4712basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4713 _ForwardIterator __last)
4714{
4715 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004716 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004717 if (__t1 != __first)
4718 __parse_basic_reg_exp(__first, __t1);
4719 else
4720 __push_empty();
4721 __first = __t1;
4722 if (__first != __last)
4723 ++__first;
4724 while (__first != __last)
4725 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004726 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004727 __owns_one_state<_CharT>* __sb = __end_;
4728 if (__t1 != __first)
4729 __parse_basic_reg_exp(__first, __t1);
4730 else
4731 __push_empty();
4732 __push_alternation(__sa, __sb);
4733 __first = __t1;
4734 if (__first != __last)
4735 ++__first;
4736 }
4737 return __first;
4738}
4739
4740template <class _CharT, class _Traits>
4741template <class _ForwardIterator>
4742_ForwardIterator
4743basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4744 _ForwardIterator __last)
4745{
4746 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004747 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004748 if (__t1 != __first)
4749 __parse_extended_reg_exp(__first, __t1);
4750 else
4751 __push_empty();
4752 __first = __t1;
4753 if (__first != __last)
4754 ++__first;
4755 while (__first != __last)
4756 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004757 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004758 __owns_one_state<_CharT>* __sb = __end_;
4759 if (__t1 != __first)
4760 __parse_extended_reg_exp(__first, __t1);
4761 else
4762 __push_empty();
4763 __push_alternation(__sa, __sb);
4764 __first = __t1;
4765 if (__first != __last)
4766 ++__first;
4767 }
4768 return __first;
4769}
4770
4771template <class _CharT, class _Traits>
Louis Dionnef16eb592020-02-19 15:56:15 -05004772bool
4773basic_regex<_CharT, _Traits>::__test_back_ref(_CharT c)
4774{
4775 unsigned __val = __traits_.value(c, 10);
4776 if (__val >= 1 && __val <= 9)
4777 {
Mark de Weverd324e5f2020-02-20 18:13:38 -05004778 if (__val > mark_count())
4779 __throw_regex_error<regex_constants::error_backref>();
Louis Dionnef16eb592020-02-19 15:56:15 -05004780 __push_back_ref(__val);
4781 return true;
4782 }
4783
4784 return false;
4785}
4786
4787template <class _CharT, class _Traits>
Howard Hinnant67ad2132010-06-29 18:37:43 +00004788void
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00004789basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4790 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4791 bool __greedy)
4792{
4793 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4794 __end_->first() = nullptr;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00004795 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4796 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4797 __min, __max));
4798 __s->first() = nullptr;
4799 __e1.release();
4800 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00004801 __end_ = __e2->second();
Howard Hinnantaa0874c2010-07-12 15:51:17 +00004802 __s->first() = __e2.release();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00004803 ++__loop_count_;
4804}
4805
4806template <class _CharT, class _Traits>
4807void
Howard Hinnant67ad2132010-06-29 18:37:43 +00004808basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4809{
Howard Hinnant3034c902010-07-13 21:48:06 +00004810 if (flags() & icase)
Howard Hinnantcfe8d272010-07-12 19:11:27 +00004811 __end_->first() = new __match_char_icase<_CharT, _Traits>
4812 (__traits_, __c, __end_->first());
Howard Hinnant3034c902010-07-13 21:48:06 +00004813 else if (flags() & collate)
Howard Hinnantcfe8d272010-07-12 19:11:27 +00004814 __end_->first() = new __match_char_collate<_CharT, _Traits>
4815 (__traits_, __c, __end_->first());
4816 else
4817 __end_->first() = new __match_char<_CharT>(__c, __end_->first());
Howard Hinnant5bf96132010-07-08 17:43:58 +00004818 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
Howard Hinnant67ad2132010-06-29 18:37:43 +00004819}
4820
Howard Hinnant93ef6552010-06-30 20:30:19 +00004821template <class _CharT, class _Traits>
4822void
4823basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4824{
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00004825 if (!(__flags_ & nosubs))
4826 {
4827 __end_->first() =
4828 new __begin_marked_subexpression<_CharT>(++__marked_count_,
4829 __end_->first());
4830 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4831 }
Howard Hinnant93ef6552010-06-30 20:30:19 +00004832}
4833
4834template <class _CharT, class _Traits>
4835void
4836basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4837{
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00004838 if (!(__flags_ & nosubs))
4839 {
4840 __end_->first() =
4841 new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4842 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4843 }
Howard Hinnant93ef6552010-06-30 20:30:19 +00004844}
4845
Howard Hinnantaad0aa62010-07-09 00:15:26 +00004846template <class _CharT, class _Traits>
4847void
Howard Hinnant066ba512011-03-26 20:02:27 +00004848basic_regex<_CharT, _Traits>::__push_l_anchor()
4849{
Mark de Wevera989cce2020-11-18 18:09:13 +01004850 __end_->first() = new __l_anchor_multiline<_CharT>(__use_multiline(), __end_->first());
Howard Hinnant066ba512011-03-26 20:02:27 +00004851 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4852}
4853
4854template <class _CharT, class _Traits>
4855void
Howard Hinnantaad0aa62010-07-09 00:15:26 +00004856basic_regex<_CharT, _Traits>::__push_r_anchor()
4857{
Mark de Wevera989cce2020-11-18 18:09:13 +01004858 __end_->first() = new __r_anchor_multiline<_CharT>(__use_multiline(), __end_->first());
Howard Hinnantaad0aa62010-07-09 00:15:26 +00004859 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4860}
4861
Howard Hinnantaa0874c2010-07-12 15:51:17 +00004862template <class _CharT, class _Traits>
4863void
4864basic_regex<_CharT, _Traits>::__push_match_any()
4865{
4866 __end_->first() = new __match_any<_CharT>(__end_->first());
4867 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4868}
Howard Hinnantaad0aa62010-07-09 00:15:26 +00004869
Howard Hinnant2a315e32010-07-12 18:16:05 +00004870template <class _CharT, class _Traits>
4871void
Howard Hinnant70d27852010-07-27 01:25:38 +00004872basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4873{
4874 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4875 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4876}
4877
4878template <class _CharT, class _Traits>
4879void
Howard Hinnante1053822010-07-22 17:53:24 +00004880basic_regex<_CharT, _Traits>::__push_empty()
4881{
4882 __end_->first() = new __empty_state<_CharT>(__end_->first());
4883 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4884}
4885
4886template <class _CharT, class _Traits>
4887void
Howard Hinnant70d27852010-07-27 01:25:38 +00004888basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4889{
4890 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4891 __end_->first());
4892 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4893}
4894
4895template <class _CharT, class _Traits>
4896void
Howard Hinnant2a315e32010-07-12 18:16:05 +00004897basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4898{
Howard Hinnant3034c902010-07-13 21:48:06 +00004899 if (flags() & icase)
Howard Hinnantcfe8d272010-07-12 19:11:27 +00004900 __end_->first() = new __back_ref_icase<_CharT, _Traits>
4901 (__traits_, __i, __end_->first());
Howard Hinnant3034c902010-07-13 21:48:06 +00004902 else if (flags() & collate)
Howard Hinnantcfe8d272010-07-12 19:11:27 +00004903 __end_->first() = new __back_ref_collate<_CharT, _Traits>
4904 (__traits_, __i, __end_->first());
4905 else
4906 __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
Howard Hinnant2a315e32010-07-12 18:16:05 +00004907 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4908}
4909
Howard Hinnant3034c902010-07-13 21:48:06 +00004910template <class _CharT, class _Traits>
Howard Hinnant16d65422010-07-16 19:08:36 +00004911void
4912basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4913 __owns_one_state<_CharT>* __ea)
4914{
4915 __sa->first() = new __alternate<_CharT>(
4916 static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4917 static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4918 __ea->first() = nullptr;
4919 __ea->first() = new __empty_state<_CharT>(__end_->first());
4920 __end_->first() = nullptr;
4921 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4922 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4923}
4924
4925template <class _CharT, class _Traits>
Howard Hinnant3034c902010-07-13 21:48:06 +00004926__bracket_expression<_CharT, _Traits>*
4927basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4928{
4929 __bracket_expression<_CharT, _Traits>* __r =
4930 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4931 __negate, __flags_ & icase,
4932 __flags_ & collate);
4933 __end_->first() = __r;
4934 __end_ = __r;
4935 return __r;
4936}
4937
Howard Hinnant126da6a2010-07-27 22:20:32 +00004938template <class _CharT, class _Traits>
4939void
4940basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
Howard Hinnant3efac712013-07-23 16:18:04 +00004941 bool __invert,
4942 unsigned __mexp)
Howard Hinnant126da6a2010-07-27 22:20:32 +00004943{
4944 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
Howard Hinnant3efac712013-07-23 16:18:04 +00004945 __end_->first(), __mexp);
Howard Hinnant126da6a2010-07-27 22:20:32 +00004946 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4947}
4948
Howard Hinnant67ad2132010-06-29 18:37:43 +00004949// sub_match
4950
Richard Smith256954d2020-11-11 17:12:18 -08004951typedef sub_match<const char*> csub_match;
Richard Smith256954d2020-11-11 17:12:18 -08004952typedef sub_match<string::const_iterator> ssub_match;
Louis Dionne89258142021-08-23 15:32:36 -04004953#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
4954typedef sub_match<const wchar_t*> wcsub_match;
Richard Smith256954d2020-11-11 17:12:18 -08004955typedef sub_match<wstring::const_iterator> wssub_match;
Louis Dionne89258142021-08-23 15:32:36 -04004956#endif
Richard Smith256954d2020-11-11 17:12:18 -08004957
Howard Hinnant67ad2132010-06-29 18:37:43 +00004958template <class _BidirectionalIterator>
Richard Smith256954d2020-11-11 17:12:18 -08004959class
4960 _LIBCPP_TEMPLATE_VIS
4961 _LIBCPP_PREFERRED_NAME(csub_match)
Louis Dionne89258142021-08-23 15:32:36 -04004962 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcsub_match))
Richard Smith256954d2020-11-11 17:12:18 -08004963 _LIBCPP_PREFERRED_NAME(ssub_match)
Louis Dionne89258142021-08-23 15:32:36 -04004964 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wssub_match))
Richard Smith256954d2020-11-11 17:12:18 -08004965 sub_match
Howard Hinnant67ad2132010-06-29 18:37:43 +00004966 : public pair<_BidirectionalIterator, _BidirectionalIterator>
4967{
4968public:
4969 typedef _BidirectionalIterator iterator;
4970 typedef typename iterator_traits<iterator>::value_type value_type;
4971 typedef typename iterator_traits<iterator>::difference_type difference_type;
4972 typedef basic_string<value_type> string_type;
4973
4974 bool matched;
4975
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004976 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +00004977 _LIBCPP_CONSTEXPR sub_match() : matched() {}
Howard Hinnantb5c53a82010-12-08 21:07:55 +00004978
4979 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004980 difference_type length() const
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004981 {return matched ? _VSTD::distance(this->first, this->second) : 0;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004982 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004983 string_type str() const
4984 {return matched ? string_type(this->first, this->second) : string_type();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004985 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004986 operator string_type() const
4987 {return str();}
4988
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004989 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004990 int compare(const sub_match& __s) const
4991 {return str().compare(__s.str());}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004992 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004993 int compare(const string_type& __s) const
4994 {return str().compare(__s);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004995 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004996 int compare(const value_type* __s) const
4997 {return str().compare(__s);}
4998};
4999
Howard Hinnant67ad2132010-06-29 18:37:43 +00005000template <class _BiIter>
5001inline _LIBCPP_INLINE_VISIBILITY
5002bool
5003operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5004{
5005 return __x.compare(__y) == 0;
5006}
5007
5008template <class _BiIter>
5009inline _LIBCPP_INLINE_VISIBILITY
5010bool
5011operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5012{
5013 return !(__x == __y);
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.compare(__y) < 0;
5022}
5023
5024template <class _BiIter>
5025inline _LIBCPP_INLINE_VISIBILITY
5026bool
5027operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5028{
5029 return !(__y < __x);
5030}
5031
5032template <class _BiIter>
5033inline _LIBCPP_INLINE_VISIBILITY
5034bool
5035operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5036{
5037 return !(__x < __y);
5038}
5039
5040template <class _BiIter>
5041inline _LIBCPP_INLINE_VISIBILITY
5042bool
5043operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
5044{
5045 return __y < __x;
5046}
5047
5048template <class _BiIter, class _ST, class _SA>
5049inline _LIBCPP_INLINE_VISIBILITY
5050bool
5051operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5052 const sub_match<_BiIter>& __y)
5053{
Marshall Clow54a46342014-12-15 23:57:56 +00005054 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00005055}
5056
5057template <class _BiIter, class _ST, class _SA>
5058inline _LIBCPP_INLINE_VISIBILITY
5059bool
5060operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5061 const sub_match<_BiIter>& __y)
5062{
5063 return !(__x == __y);
5064}
5065
5066template <class _BiIter, class _ST, class _SA>
5067inline _LIBCPP_INLINE_VISIBILITY
5068bool
5069operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5070 const sub_match<_BiIter>& __y)
5071{
Marshall Clow54a46342014-12-15 23:57:56 +00005072 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00005073}
5074
5075template <class _BiIter, class _ST, class _SA>
5076inline _LIBCPP_INLINE_VISIBILITY
5077bool
5078operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5079 const sub_match<_BiIter>& __y)
5080{
5081 return __y < __x;
5082}
5083
5084template <class _BiIter, class _ST, class _SA>
5085inline _LIBCPP_INLINE_VISIBILITY
5086bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5087 const sub_match<_BiIter>& __y)
5088{
5089 return !(__x < __y);
5090}
5091
5092template <class _BiIter, class _ST, class _SA>
5093inline _LIBCPP_INLINE_VISIBILITY
5094bool
5095operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
5096 const sub_match<_BiIter>& __y)
5097{
5098 return !(__y < __x);
5099}
5100
5101template <class _BiIter, class _ST, class _SA>
5102inline _LIBCPP_INLINE_VISIBILITY
5103bool
5104operator==(const sub_match<_BiIter>& __x,
5105 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5106{
Marshall Clow54a46342014-12-15 23:57:56 +00005107 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00005108}
5109
5110template <class _BiIter, class _ST, class _SA>
5111inline _LIBCPP_INLINE_VISIBILITY
5112bool
5113operator!=(const sub_match<_BiIter>& __x,
5114 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5115{
5116 return !(__x == __y);
5117}
5118
5119template <class _BiIter, class _ST, class _SA>
5120inline _LIBCPP_INLINE_VISIBILITY
5121bool
5122operator<(const sub_match<_BiIter>& __x,
5123 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5124{
Marshall Clow54a46342014-12-15 23:57:56 +00005125 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00005126}
5127
5128template <class _BiIter, class _ST, class _SA>
5129inline _LIBCPP_INLINE_VISIBILITY
5130bool operator>(const sub_match<_BiIter>& __x,
5131 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5132{
5133 return __y < __x;
5134}
5135
5136template <class _BiIter, class _ST, class _SA>
5137inline _LIBCPP_INLINE_VISIBILITY
5138bool
5139operator>=(const sub_match<_BiIter>& __x,
5140 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5141{
5142 return !(__x < __y);
5143}
5144
5145template <class _BiIter, class _ST, class _SA>
5146inline _LIBCPP_INLINE_VISIBILITY
5147bool
5148operator<=(const sub_match<_BiIter>& __x,
5149 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5150{
5151 return !(__y < __x);
5152}
5153
5154template <class _BiIter>
5155inline _LIBCPP_INLINE_VISIBILITY
5156bool
5157operator==(typename iterator_traits<_BiIter>::value_type const* __x,
5158 const sub_match<_BiIter>& __y)
5159{
5160 return __y.compare(__x) == 0;
5161}
5162
5163template <class _BiIter>
5164inline _LIBCPP_INLINE_VISIBILITY
5165bool
5166operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
5167 const sub_match<_BiIter>& __y)
5168{
5169 return !(__x == __y);
5170}
5171
5172template <class _BiIter>
5173inline _LIBCPP_INLINE_VISIBILITY
5174bool
5175operator<(typename iterator_traits<_BiIter>::value_type const* __x,
5176 const sub_match<_BiIter>& __y)
5177{
5178 return __y.compare(__x) > 0;
5179}
5180
5181template <class _BiIter>
5182inline _LIBCPP_INLINE_VISIBILITY
5183bool
5184operator>(typename iterator_traits<_BiIter>::value_type const* __x,
5185 const sub_match<_BiIter>& __y)
5186{
5187 return __y < __x;
5188}
5189
5190template <class _BiIter>
5191inline _LIBCPP_INLINE_VISIBILITY
5192bool
5193operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
5194 const sub_match<_BiIter>& __y)
5195{
5196 return !(__x < __y);
5197}
5198
5199template <class _BiIter>
5200inline _LIBCPP_INLINE_VISIBILITY
5201bool
5202operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
5203 const sub_match<_BiIter>& __y)
5204{
5205 return !(__y < __x);
5206}
5207
5208template <class _BiIter>
5209inline _LIBCPP_INLINE_VISIBILITY
5210bool
5211operator==(const sub_match<_BiIter>& __x,
5212 typename iterator_traits<_BiIter>::value_type const* __y)
5213{
5214 return __x.compare(__y) == 0;
5215}
5216
5217template <class _BiIter>
5218inline _LIBCPP_INLINE_VISIBILITY
5219bool
5220operator!=(const sub_match<_BiIter>& __x,
5221 typename iterator_traits<_BiIter>::value_type const* __y)
5222{
5223 return !(__x == __y);
5224}
5225
5226template <class _BiIter>
5227inline _LIBCPP_INLINE_VISIBILITY
5228bool
5229operator<(const sub_match<_BiIter>& __x,
5230 typename iterator_traits<_BiIter>::value_type const* __y)
5231{
5232 return __x.compare(__y) < 0;
5233}
5234
5235template <class _BiIter>
5236inline _LIBCPP_INLINE_VISIBILITY
5237bool
5238operator>(const sub_match<_BiIter>& __x,
5239 typename iterator_traits<_BiIter>::value_type const* __y)
5240{
5241 return __y < __x;
5242}
5243
5244template <class _BiIter>
5245inline _LIBCPP_INLINE_VISIBILITY
5246bool
5247operator>=(const sub_match<_BiIter>& __x,
5248 typename iterator_traits<_BiIter>::value_type const* __y)
5249{
5250 return !(__x < __y);
5251}
5252
5253template <class _BiIter>
5254inline _LIBCPP_INLINE_VISIBILITY
5255bool
5256operator<=(const sub_match<_BiIter>& __x,
5257 typename iterator_traits<_BiIter>::value_type const* __y)
5258{
5259 return !(__y < __x);
5260}
5261
5262template <class _BiIter>
5263inline _LIBCPP_INLINE_VISIBILITY
5264bool
5265operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5266 const sub_match<_BiIter>& __y)
5267{
5268 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5269 return __y.compare(string_type(1, __x)) == 0;
5270}
5271
5272template <class _BiIter>
5273inline _LIBCPP_INLINE_VISIBILITY
5274bool
5275operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5276 const sub_match<_BiIter>& __y)
5277{
5278 return !(__x == __y);
5279}
5280
5281template <class _BiIter>
5282inline _LIBCPP_INLINE_VISIBILITY
5283bool
5284operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5285 const sub_match<_BiIter>& __y)
5286{
5287 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5288 return __y.compare(string_type(1, __x)) > 0;
5289}
5290
5291template <class _BiIter>
5292inline _LIBCPP_INLINE_VISIBILITY
5293bool
5294operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5295 const sub_match<_BiIter>& __y)
5296{
5297 return __y < __x;
5298}
5299
5300template <class _BiIter>
5301inline _LIBCPP_INLINE_VISIBILITY
5302bool
5303operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5304 const sub_match<_BiIter>& __y)
5305{
5306 return !(__x < __y);
5307}
5308
5309template <class _BiIter>
5310inline _LIBCPP_INLINE_VISIBILITY
5311bool
5312operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5313 const sub_match<_BiIter>& __y)
5314{
5315 return !(__y < __x);
5316}
5317
5318template <class _BiIter>
5319inline _LIBCPP_INLINE_VISIBILITY
5320bool
5321operator==(const sub_match<_BiIter>& __x,
5322 typename iterator_traits<_BiIter>::value_type const& __y)
5323{
5324 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5325 return __x.compare(string_type(1, __y)) == 0;
5326}
5327
5328template <class _BiIter>
5329inline _LIBCPP_INLINE_VISIBILITY
5330bool
5331operator!=(const sub_match<_BiIter>& __x,
5332 typename iterator_traits<_BiIter>::value_type const& __y)
5333{
5334 return !(__x == __y);
5335}
5336
5337template <class _BiIter>
5338inline _LIBCPP_INLINE_VISIBILITY
5339bool
5340operator<(const sub_match<_BiIter>& __x,
5341 typename iterator_traits<_BiIter>::value_type const& __y)
5342{
5343 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5344 return __x.compare(string_type(1, __y)) < 0;
5345}
5346
5347template <class _BiIter>
5348inline _LIBCPP_INLINE_VISIBILITY
5349bool
5350operator>(const sub_match<_BiIter>& __x,
5351 typename iterator_traits<_BiIter>::value_type const& __y)
5352{
5353 return __y < __x;
5354}
5355
5356template <class _BiIter>
5357inline _LIBCPP_INLINE_VISIBILITY
5358bool
5359operator>=(const sub_match<_BiIter>& __x,
5360 typename iterator_traits<_BiIter>::value_type const& __y)
5361{
5362 return !(__x < __y);
5363}
5364
5365template <class _BiIter>
5366inline _LIBCPP_INLINE_VISIBILITY
5367bool
5368operator<=(const sub_match<_BiIter>& __x,
5369 typename iterator_traits<_BiIter>::value_type const& __y)
5370{
5371 return !(__y < __x);
5372}
5373
5374template <class _CharT, class _ST, class _BiIter>
5375inline _LIBCPP_INLINE_VISIBILITY
5376basic_ostream<_CharT, _ST>&
5377operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5378{
5379 return __os << __m.str();
5380}
5381
Richard Smith256954d2020-11-11 17:12:18 -08005382typedef match_results<const char*> cmatch;
Richard Smith256954d2020-11-11 17:12:18 -08005383typedef match_results<string::const_iterator> smatch;
Louis Dionne89258142021-08-23 15:32:36 -04005384#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
5385typedef match_results<const wchar_t*> wcmatch;
Richard Smith256954d2020-11-11 17:12:18 -08005386typedef match_results<wstring::const_iterator> wsmatch;
Louis Dionne89258142021-08-23 15:32:36 -04005387#endif
Richard Smith256954d2020-11-11 17:12:18 -08005388
Howard Hinnant70d27852010-07-27 01:25:38 +00005389template <class _BidirectionalIterator, class _Allocator>
Richard Smith256954d2020-11-11 17:12:18 -08005390class
5391 _LIBCPP_TEMPLATE_VIS
5392 _LIBCPP_PREFERRED_NAME(cmatch)
Louis Dionne89258142021-08-23 15:32:36 -04005393 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcmatch))
Richard Smith256954d2020-11-11 17:12:18 -08005394 _LIBCPP_PREFERRED_NAME(smatch)
Louis Dionne89258142021-08-23 15:32:36 -04005395 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsmatch))
Richard Smith256954d2020-11-11 17:12:18 -08005396 match_results
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005397{
5398public:
5399 typedef _Allocator allocator_type;
5400 typedef sub_match<_BidirectionalIterator> value_type;
5401private:
5402 typedef vector<value_type, allocator_type> __container_type;
5403
5404 __container_type __matches_;
5405 value_type __unmatched_;
5406 value_type __prefix_;
5407 value_type __suffix_;
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005408 bool __ready_;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005409public:
Howard Hinnantd3925342010-08-16 20:21:16 +00005410 _BidirectionalIterator __position_start_;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005411 typedef const value_type& const_reference;
Marshall Clow96e06142014-02-26 01:56:31 +00005412 typedef value_type& reference;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005413 typedef typename __container_type::const_iterator const_iterator;
5414 typedef const_iterator iterator;
5415 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5416 typedef typename allocator_traits<allocator_type>::size_type size_type;
5417 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5418 typedef basic_string<char_type> string_type;
5419
5420 // construct/copy/destroy:
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +01005421#ifndef _LIBCPP_CXX03_LANG
5422 match_results() : match_results(allocator_type()) {}
5423 explicit match_results(const allocator_type& __a);
5424#else
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005425 explicit match_results(const allocator_type& __a = allocator_type());
Marek Kurdejcd0bd6a2021-01-19 08:21:09 +01005426#endif
5427
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005428// match_results(const match_results&) = default;
5429// match_results& operator=(const match_results&) = default;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005430// match_results(match_results&& __m) = default;
5431// match_results& operator=(match_results&& __m) = default;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005432// ~match_results() = default;
5433
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005434 _LIBCPP_INLINE_VISIBILITY
5435 bool ready() const {return __ready_;}
5436
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005437 // size:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005438 _LIBCPP_INLINE_VISIBILITY
Marshall Clow081bcd22017-11-16 04:48:34 +00005439 size_type size() const _NOEXCEPT {return __matches_.size();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005440 _LIBCPP_INLINE_VISIBILITY
Marshall Clow081bcd22017-11-16 04:48:34 +00005441 size_type max_size() const _NOEXCEPT {return __matches_.max_size();}
5442 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
5443 bool empty() const _NOEXCEPT {return size() == 0;}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005444
5445 // element access:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005446 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005447 difference_type length(size_type __sub = 0) const
Marshall Clow14d319a2019-04-26 17:10:03 +00005448 {
5449 _LIBCPP_ASSERT(ready(), "match_results::length() called when not ready");
5450 return (*this)[__sub].length();
5451 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005452 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005453 difference_type position(size_type __sub = 0) const
Marshall Clow14d319a2019-04-26 17:10:03 +00005454 {
5455 _LIBCPP_ASSERT(ready(), "match_results::position() called when not ready");
5456 return _VSTD::distance(__position_start_, (*this)[__sub].first);
5457 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005458 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005459 string_type str(size_type __sub = 0) const
Marshall Clow14d319a2019-04-26 17:10:03 +00005460 {
5461 _LIBCPP_ASSERT(ready(), "match_results::str() called when not ready");
5462 return (*this)[__sub].str();
5463 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005464 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005465 const_reference operator[](size_type __n) const
Marshall Clow14d319a2019-04-26 17:10:03 +00005466 {
5467 _LIBCPP_ASSERT(ready(), "match_results::operator[]() called when not ready");
5468 return __n < __matches_.size() ? __matches_[__n] : __unmatched_;
5469 }
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005470
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005471 _LIBCPP_INLINE_VISIBILITY
Marshall Clow14d319a2019-04-26 17:10:03 +00005472 const_reference prefix() const
5473 {
5474 _LIBCPP_ASSERT(ready(), "match_results::prefix() called when not ready");
5475 return __prefix_;
5476 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005477 _LIBCPP_INLINE_VISIBILITY
Marshall Clow14d319a2019-04-26 17:10:03 +00005478 const_reference suffix() const
5479 {
5480 _LIBCPP_ASSERT(ready(), "match_results::suffix() called when not ready");
5481 return __suffix_;
5482 }
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005483
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005484 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f4191f2011-10-08 14:36:16 +00005485 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005486 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005487 const_iterator end() const {return __matches_.end();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005488 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f4191f2011-10-08 14:36:16 +00005489 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005490 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005491 const_iterator cend() const {return __matches_.end();}
5492
5493 // format:
5494 template <class _OutputIter>
5495 _OutputIter
Alexander Richardsonc9637642017-11-14 11:14:25 +00005496 format(_OutputIter __output_iter, const char_type* __fmt_first,
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005497 const char_type* __fmt_last,
5498 regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5499 template <class _OutputIter, class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005500 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005501 _OutputIter
Alexander Richardsonc9637642017-11-14 11:14:25 +00005502 format(_OutputIter __output_iter, const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnantcbc45252010-08-14 18:14:02 +00005503 regex_constants::match_flag_type __flags = regex_constants::format_default) const
Alexander Richardsonc9637642017-11-14 11:14:25 +00005504 {return format(__output_iter, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005505 template <class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005506 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005507 basic_string<char_type, _ST, _SA>
5508 format(const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnantcbc45252010-08-14 18:14:02 +00005509 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5510 {
5511 basic_string<char_type, _ST, _SA> __r;
5512 format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5513 __flags);
5514 return __r;
5515 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005516 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005517 string_type
5518 format(const char_type* __fmt,
Howard Hinnantcbc45252010-08-14 18:14:02 +00005519 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5520 {
5521 string_type __r;
5522 format(back_inserter(__r), __fmt,
5523 __fmt + char_traits<char_type>::length(__fmt), __flags);
5524 return __r;
5525 }
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005526
5527 // allocator:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005528 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005529 allocator_type get_allocator() const {return __matches_.get_allocator();}
5530
5531 // swap:
5532 void swap(match_results& __m);
5533
Howard Hinnantc834c512011-11-29 18:15:50 +00005534 template <class _Bp, class _Ap>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005535 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66423212010-07-14 21:14:52 +00005536 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
Howard Hinnantc834c512011-11-29 18:15:50 +00005537 const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
Howard Hinnant66423212010-07-14 21:14:52 +00005538 {
Howard Hinnantc834c512011-11-29 18:15:50 +00005539 _Bp __mf = __m.prefix().first;
Howard Hinnant66423212010-07-14 21:14:52 +00005540 __matches_.resize(__m.size());
5541 for (size_type __i = 0; __i < __matches_.size(); ++__i)
5542 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005543 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5544 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
Howard Hinnant66423212010-07-14 21:14:52 +00005545 __matches_[__i].matched = __m[__i].matched;
5546 }
5547 __unmatched_.first = __l;
5548 __unmatched_.second = __l;
5549 __unmatched_.matched = false;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005550 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5551 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
Howard Hinnant66423212010-07-14 21:14:52 +00005552 __prefix_.matched = __m.prefix().matched;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005553 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5554 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
Howard Hinnant66423212010-07-14 21:14:52 +00005555 __suffix_.matched = __m.suffix().matched;
Howard Hinnantd3925342010-08-16 20:21:16 +00005556 if (!__no_update_pos)
5557 __position_start_ = __prefix_.first;
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005558 __ready_ = __m.ready();
Howard Hinnant66423212010-07-14 21:14:52 +00005559 }
5560
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005561private:
5562 void __init(unsigned __s,
Howard Hinnantd3925342010-08-16 20:21:16 +00005563 _BidirectionalIterator __f, _BidirectionalIterator __l,
5564 bool __no_update_pos = false);
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005565
5566 template <class, class> friend class basic_regex;
5567
Howard Hinnantc834c512011-11-29 18:15:50 +00005568 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005569 friend
5570 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00005571 regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005572 regex_constants::match_flag_type);
Howard Hinnant126da6a2010-07-27 22:20:32 +00005573
Howard Hinnantc834c512011-11-29 18:15:50 +00005574 template <class _Bp, class _Ap>
Howard Hinnantcbc45252010-08-14 18:14:02 +00005575 friend
5576 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00005577 operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005578
Howard Hinnant126da6a2010-07-27 22:20:32 +00005579 template <class, class> friend class __lookahead;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005580};
5581
5582template <class _BidirectionalIterator, class _Allocator>
5583match_results<_BidirectionalIterator, _Allocator>::match_results(
5584 const allocator_type& __a)
5585 : __matches_(__a),
5586 __unmatched_(),
5587 __prefix_(),
Howard Hinnantd3925342010-08-16 20:21:16 +00005588 __suffix_(),
Eric Fiseliera75ee262015-07-22 01:29:41 +00005589 __ready_(false),
5590 __position_start_()
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005591{
5592}
5593
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005594template <class _BidirectionalIterator, class _Allocator>
5595void
5596match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
Howard Hinnantd3925342010-08-16 20:21:16 +00005597 _BidirectionalIterator __f, _BidirectionalIterator __l,
5598 bool __no_update_pos)
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005599{
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005600 __unmatched_.first = __l;
5601 __unmatched_.second = __l;
5602 __unmatched_.matched = false;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005603 __matches_.assign(__s, __unmatched_);
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005604 __prefix_.first = __f;
5605 __prefix_.second = __f;
5606 __prefix_.matched = false;
Howard Hinnant5bf96132010-07-08 17:43:58 +00005607 __suffix_ = __unmatched_;
Howard Hinnantd3925342010-08-16 20:21:16 +00005608 if (!__no_update_pos)
5609 __position_start_ = __prefix_.first;
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005610 __ready_ = true;
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005611}
5612
Howard Hinnantcbc45252010-08-14 18:14:02 +00005613template <class _BidirectionalIterator, class _Allocator>
5614template <class _OutputIter>
5615_OutputIter
Alexander Richardsonc9637642017-11-14 11:14:25 +00005616match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __output_iter,
Howard Hinnantcbc45252010-08-14 18:14:02 +00005617 const char_type* __fmt_first, const char_type* __fmt_last,
5618 regex_constants::match_flag_type __flags) const
5619{
Marshall Clow14d319a2019-04-26 17:10:03 +00005620 _LIBCPP_ASSERT(ready(), "match_results::format() called when not ready");
Howard Hinnantcbc45252010-08-14 18:14:02 +00005621 if (__flags & regex_constants::format_sed)
5622 {
5623 for (; __fmt_first != __fmt_last; ++__fmt_first)
5624 {
5625 if (*__fmt_first == '&')
Alexander Richardsonc9637642017-11-14 11:14:25 +00005626 __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5627 __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005628 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5629 {
5630 ++__fmt_first;
5631 if ('0' <= *__fmt_first && *__fmt_first <= '9')
5632 {
5633 size_t __i = *__fmt_first - '0';
Alexander Richardsonc9637642017-11-14 11:14:25 +00005634 __output_iter = _VSTD::copy((*this)[__i].first,
5635 (*this)[__i].second, __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005636 }
5637 else
5638 {
Alexander Richardsonc9637642017-11-14 11:14:25 +00005639 *__output_iter = *__fmt_first;
5640 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005641 }
5642 }
5643 else
5644 {
Alexander Richardsonc9637642017-11-14 11:14:25 +00005645 *__output_iter = *__fmt_first;
5646 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005647 }
5648 }
5649 }
5650 else
5651 {
5652 for (; __fmt_first != __fmt_last; ++__fmt_first)
5653 {
5654 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5655 {
5656 switch (__fmt_first[1])
5657 {
5658 case '$':
Alexander Richardsonc9637642017-11-14 11:14:25 +00005659 *__output_iter = *++__fmt_first;
5660 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005661 break;
5662 case '&':
5663 ++__fmt_first;
Alexander Richardsonc9637642017-11-14 11:14:25 +00005664 __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5665 __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005666 break;
5667 case '`':
5668 ++__fmt_first;
Alexander Richardsonc9637642017-11-14 11:14:25 +00005669 __output_iter = _VSTD::copy(__prefix_.first, __prefix_.second, __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005670 break;
5671 case '\'':
5672 ++__fmt_first;
Alexander Richardsonc9637642017-11-14 11:14:25 +00005673 __output_iter = _VSTD::copy(__suffix_.first, __suffix_.second, __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005674 break;
5675 default:
5676 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5677 {
5678 ++__fmt_first;
Marshall Clow266b5ec2017-10-19 22:10:41 +00005679 size_t __idx = *__fmt_first - '0';
Howard Hinnantcbc45252010-08-14 18:14:02 +00005680 if (__fmt_first + 1 != __fmt_last &&
5681 '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5682 {
5683 ++__fmt_first;
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05005684 if (__idx >= numeric_limits<size_t>::max() / 10)
Marshall Clow266b5ec2017-10-19 22:10:41 +00005685 __throw_regex_error<regex_constants::error_escape>();
5686 __idx = 10 * __idx + *__fmt_first - '0';
Howard Hinnantcbc45252010-08-14 18:14:02 +00005687 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00005688 __output_iter = _VSTD::copy((*this)[__idx].first,
5689 (*this)[__idx].second, __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005690 }
5691 else
5692 {
Alexander Richardsonc9637642017-11-14 11:14:25 +00005693 *__output_iter = *__fmt_first;
5694 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005695 }
5696 break;
5697 }
5698 }
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 }
5705 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00005706 return __output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005707}
5708
5709template <class _BidirectionalIterator, class _Allocator>
5710void
5711match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5712{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005713 using _VSTD::swap;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005714 swap(__matches_, __m.__matches_);
5715 swap(__unmatched_, __m.__unmatched_);
5716 swap(__prefix_, __m.__prefix_);
5717 swap(__suffix_, __m.__suffix_);
Howard Hinnantd3925342010-08-16 20:21:16 +00005718 swap(__position_start_, __m.__position_start_);
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005719 swap(__ready_, __m.__ready_);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005720}
5721
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005722template <class _BidirectionalIterator, class _Allocator>
Howard Hinnantcbc45252010-08-14 18:14:02 +00005723bool
5724operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5725 const match_results<_BidirectionalIterator, _Allocator>& __y)
5726{
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005727 if (__x.__ready_ != __y.__ready_)
5728 return false;
5729 if (!__x.__ready_)
5730 return true;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005731 return __x.__matches_ == __y.__matches_ &&
5732 __x.__prefix_ == __y.__prefix_ &&
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005733 __x.__suffix_ == __y.__suffix_;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005734}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005735
5736template <class _BidirectionalIterator, class _Allocator>
Howard Hinnantcbc45252010-08-14 18:14:02 +00005737inline _LIBCPP_INLINE_VISIBILITY
5738bool
5739operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5740 const match_results<_BidirectionalIterator, _Allocator>& __y)
5741{
5742 return !(__x == __y);
5743}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005744
5745template <class _BidirectionalIterator, class _Allocator>
Howard Hinnantcbc45252010-08-14 18:14:02 +00005746inline _LIBCPP_INLINE_VISIBILITY
5747void
5748swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5749 match_results<_BidirectionalIterator, _Allocator>& __y)
5750{
5751 __x.swap(__y);
5752}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005753
5754// regex_search
5755
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005756template <class _CharT, class _Traits>
Howard Hinnant70d27852010-07-27 01:25:38 +00005757template <class _Allocator>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005758bool
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005759basic_regex<_CharT, _Traits>::__match_at_start_ecma(
Howard Hinnant70d27852010-07-27 01:25:38 +00005760 const _CharT* __first, const _CharT* __last,
5761 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00005762 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005763{
Howard Hinnant70d27852010-07-27 01:25:38 +00005764 vector<__state> __states;
Howard Hinnant70d27852010-07-27 01:25:38 +00005765 __node* __st = __start_.get();
5766 if (__st)
5767 {
Marshall Clow8db143c2015-01-28 22:22:35 +00005768 sub_match<const _CharT*> __unmatched;
5769 __unmatched.first = __last;
5770 __unmatched.second = __last;
5771 __unmatched.matched = false;
5772
Howard Hinnant70d27852010-07-27 01:25:38 +00005773 __states.push_back(__state());
5774 __states.back().__do_ = 0;
5775 __states.back().__first_ = __first;
5776 __states.back().__current_ = __first;
5777 __states.back().__last_ = __last;
Marshall Clow8db143c2015-01-28 22:22:35 +00005778 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
Howard Hinnant70d27852010-07-27 01:25:38 +00005779 __states.back().__loop_data_.resize(__loop_count());
5780 __states.back().__node_ = __st;
5781 __states.back().__flags_ = __flags;
Howard Hinnant066ba512011-03-26 20:02:27 +00005782 __states.back().__at_first_ = __at_first;
Marshall Clowd39d21d2017-09-12 17:56:59 +00005783 int __counter = 0;
5784 int __length = __last - __first;
Howard Hinnant70d27852010-07-27 01:25:38 +00005785 do
5786 {
Marshall Clowd39d21d2017-09-12 17:56:59 +00005787 ++__counter;
5788 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5789 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5790 __throw_regex_error<regex_constants::error_complexity>();
Howard Hinnant70d27852010-07-27 01:25:38 +00005791 __state& __s = __states.back();
5792 if (__s.__node_)
5793 __s.__node_->__exec(__s);
5794 switch (__s.__do_)
5795 {
5796 case __state::__end_state:
Tim Shen11113f52016-10-27 21:40:34 +00005797 if ((__flags & regex_constants::match_not_null) &&
Tim Shend5f175a2016-10-21 20:41:47 +00005798 __s.__current_ == __first)
5799 {
5800 __states.pop_back();
5801 break;
5802 }
Tim Shen11113f52016-10-27 21:40:34 +00005803 if ((__flags & regex_constants::__full_match) &&
5804 __s.__current_ != __last)
5805 {
5806 __states.pop_back();
5807 break;
5808 }
Howard Hinnant70d27852010-07-27 01:25:38 +00005809 __m.__matches_[0].first = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005810 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
Howard Hinnant70d27852010-07-27 01:25:38 +00005811 __m.__matches_[0].matched = true;
5812 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5813 __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5814 return true;
5815 case __state::__accept_and_consume:
5816 case __state::__repeat:
5817 case __state::__accept_but_not_consume:
5818 break;
5819 case __state::__split:
5820 {
5821 __state __snext = __s;
5822 __s.__node_->__exec_split(true, __s);
5823 __snext.__node_->__exec_split(false, __snext);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005824 __states.push_back(_VSTD::move(__snext));
Howard Hinnant70d27852010-07-27 01:25:38 +00005825 }
5826 break;
5827 case __state::__reject:
5828 __states.pop_back();
5829 break;
5830 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00005831 __throw_regex_error<regex_constants::__re_err_unknown>();
Howard Hinnant70d27852010-07-27 01:25:38 +00005832 break;
Howard Hinnant72f73582010-08-11 17:04:31 +00005833
Howard Hinnant70d27852010-07-27 01:25:38 +00005834 }
5835 } while (!__states.empty());
5836 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005837 return false;
5838}
5839
5840template <class _CharT, class _Traits>
Howard Hinnant66423212010-07-14 21:14:52 +00005841template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005842bool
5843basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5844 const _CharT* __first, const _CharT* __last,
Howard Hinnant66423212010-07-14 21:14:52 +00005845 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00005846 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005847{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005848 deque<__state> __states;
Howard Hinnant66423212010-07-14 21:14:52 +00005849 ptrdiff_t __highest_j = 0;
Howard Hinnantc834c512011-11-29 18:15:50 +00005850 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005851 __node* __st = __start_.get();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005852 if (__st)
5853 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005854 __states.push_back(__state());
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005855 __states.back().__do_ = 0;
5856 __states.back().__first_ = __first;
5857 __states.back().__current_ = __first;
5858 __states.back().__last_ = __last;
5859 __states.back().__loop_data_.resize(__loop_count());
5860 __states.back().__node_ = __st;
5861 __states.back().__flags_ = __flags;
Howard Hinnant066ba512011-03-26 20:02:27 +00005862 __states.back().__at_first_ = __at_first;
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00005863 bool __matched = false;
Marshall Clowd39d21d2017-09-12 17:56:59 +00005864 int __counter = 0;
5865 int __length = __last - __first;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005866 do
5867 {
Marshall Clowd39d21d2017-09-12 17:56:59 +00005868 ++__counter;
5869 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5870 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5871 __throw_regex_error<regex_constants::error_complexity>();
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005872 __state& __s = __states.back();
5873 if (__s.__node_)
5874 __s.__node_->__exec(__s);
5875 switch (__s.__do_)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005876 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005877 case __state::__end_state:
Tim Shen11113f52016-10-27 21:40:34 +00005878 if ((__flags & regex_constants::match_not_null) &&
Tim Shend5f175a2016-10-21 20:41:47 +00005879 __s.__current_ == __first)
5880 {
5881 __states.pop_back();
5882 break;
5883 }
Tim Shen11113f52016-10-27 21:40:34 +00005884 if ((__flags & regex_constants::__full_match) &&
5885 __s.__current_ != __last)
5886 {
5887 __states.pop_back();
5888 break;
5889 }
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005890 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00005891 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005892 __matched = true;
Howard Hinnantc834c512011-11-29 18:15:50 +00005893 if (__highest_j == _Np)
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005894 __states.clear();
5895 else
5896 __states.pop_back();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005897 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005898 case __state::__consume_input:
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005899 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005900 case __state::__accept_and_consume:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005901 __states.push_front(_VSTD::move(__s));
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005902 __states.pop_back();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005903 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005904 case __state::__repeat:
5905 case __state::__accept_but_not_consume:
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005906 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005907 case __state::__split:
5908 {
5909 __state __snext = __s;
5910 __s.__node_->__exec_split(true, __s);
5911 __snext.__node_->__exec_split(false, __snext);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005912 __states.push_back(_VSTD::move(__snext));
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005913 }
5914 break;
5915 case __state::__reject:
5916 __states.pop_back();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005917 break;
5918 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00005919 __throw_regex_error<regex_constants::__re_err_unknown>();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005920 break;
5921 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005922 } while (!__states.empty());
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00005923 if (__matched)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005924 {
5925 __m.__matches_[0].first = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005926 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005927 __m.__matches_[0].matched = true;
5928 return true;
5929 }
5930 }
5931 return false;
5932}
5933
5934template <class _CharT, class _Traits>
Howard Hinnant66423212010-07-14 21:14:52 +00005935template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005936bool
5937basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
Howard Hinnant66423212010-07-14 21:14:52 +00005938 const _CharT* __first, const _CharT* __last,
5939 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00005940 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005941{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005942 vector<__state> __states;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005943 __state __best_state;
Howard Hinnant66423212010-07-14 21:14:52 +00005944 ptrdiff_t __highest_j = 0;
Howard Hinnantc834c512011-11-29 18:15:50 +00005945 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005946 __node* __st = __start_.get();
Howard Hinnant5bf96132010-07-08 17:43:58 +00005947 if (__st)
5948 {
Marshall Clow8db143c2015-01-28 22:22:35 +00005949 sub_match<const _CharT*> __unmatched;
5950 __unmatched.first = __last;
5951 __unmatched.second = __last;
5952 __unmatched.matched = false;
5953
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005954 __states.push_back(__state());
5955 __states.back().__do_ = 0;
5956 __states.back().__first_ = __first;
5957 __states.back().__current_ = __first;
5958 __states.back().__last_ = __last;
Marshall Clow8db143c2015-01-28 22:22:35 +00005959 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005960 __states.back().__loop_data_.resize(__loop_count());
5961 __states.back().__node_ = __st;
5962 __states.back().__flags_ = __flags;
Howard Hinnant066ba512011-03-26 20:02:27 +00005963 __states.back().__at_first_ = __at_first;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005964 bool __matched = false;
Marshall Clowd39d21d2017-09-12 17:56:59 +00005965 int __counter = 0;
5966 int __length = __last - __first;
Howard Hinnant5bf96132010-07-08 17:43:58 +00005967 do
5968 {
Marshall Clowd39d21d2017-09-12 17:56:59 +00005969 ++__counter;
5970 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5971 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5972 __throw_regex_error<regex_constants::error_complexity>();
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005973 __state& __s = __states.back();
5974 if (__s.__node_)
5975 __s.__node_->__exec(__s);
5976 switch (__s.__do_)
Howard Hinnant5bf96132010-07-08 17:43:58 +00005977 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005978 case __state::__end_state:
Tim Shen11113f52016-10-27 21:40:34 +00005979 if ((__flags & regex_constants::match_not_null) &&
Tim Shend5f175a2016-10-21 20:41:47 +00005980 __s.__current_ == __first)
5981 {
5982 __states.pop_back();
5983 break;
5984 }
Tim Shen11113f52016-10-27 21:40:34 +00005985 if ((__flags & regex_constants::__full_match) &&
5986 __s.__current_ != __last)
5987 {
5988 __states.pop_back();
5989 break;
5990 }
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005991 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant5bf96132010-07-08 17:43:58 +00005992 {
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005993 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005994 __best_state = __s;
Howard Hinnant5bf96132010-07-08 17:43:58 +00005995 }
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005996 __matched = true;
Howard Hinnantc834c512011-11-29 18:15:50 +00005997 if (__highest_j == _Np)
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005998 __states.clear();
5999 else
6000 __states.pop_back();
Howard Hinnant5bf96132010-07-08 17:43:58 +00006001 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006002 case __state::__accept_and_consume:
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006003 case __state::__repeat:
6004 case __state::__accept_but_not_consume:
Howard Hinnant5bf96132010-07-08 17:43:58 +00006005 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006006 case __state::__split:
6007 {
6008 __state __snext = __s;
6009 __s.__node_->__exec_split(true, __s);
6010 __snext.__node_->__exec_split(false, __snext);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006011 __states.push_back(_VSTD::move(__snext));
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006012 }
6013 break;
6014 case __state::__reject:
6015 __states.pop_back();
Howard Hinnant5bf96132010-07-08 17:43:58 +00006016 break;
6017 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00006018 __throw_regex_error<regex_constants::__re_err_unknown>();
Howard Hinnant5bf96132010-07-08 17:43:58 +00006019 break;
6020 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006021 } while (!__states.empty());
6022 if (__matched)
Howard Hinnant5bf96132010-07-08 17:43:58 +00006023 {
6024 __m.__matches_[0].first = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006025 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnant5bf96132010-07-08 17:43:58 +00006026 __m.__matches_[0].matched = true;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00006027 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
6028 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
Howard Hinnant5bf96132010-07-08 17:43:58 +00006029 return true;
6030 }
6031 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006032 return false;
6033}
6034
6035template <class _CharT, class _Traits>
Howard Hinnant66423212010-07-14 21:14:52 +00006036template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006037bool
6038basic_regex<_CharT, _Traits>::__match_at_start(
Howard Hinnant66423212010-07-14 21:14:52 +00006039 const _CharT* __first, const _CharT* __last,
6040 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00006041 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006042{
Marshall Clow88a30872019-03-28 17:30:23 +00006043 if (__get_grammar(__flags_) == ECMAScript)
Howard Hinnant066ba512011-03-26 20:02:27 +00006044 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006045 if (mark_count() == 0)
Howard Hinnant066ba512011-03-26 20:02:27 +00006046 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
6047 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006048}
6049
6050template <class _CharT, class _Traits>
Howard Hinnant66423212010-07-14 21:14:52 +00006051template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006052bool
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006053basic_regex<_CharT, _Traits>::__search(
Howard Hinnant66423212010-07-14 21:14:52 +00006054 const _CharT* __first, const _CharT* __last,
6055 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006056 regex_constants::match_flag_type __flags) const
6057{
Diogo Sampaio300ade72020-04-30 23:34:01 +01006058 if (__flags & regex_constants::match_prev_avail)
6059 __flags &= ~(regex_constants::match_not_bol | regex_constants::match_not_bow);
6060
Howard Hinnantd3925342010-08-16 20:21:16 +00006061 __m.__init(1 + mark_count(), __first, __last,
6062 __flags & regex_constants::__no_update_pos);
Louis Dionne173f29e2019-05-29 16:01:36 +00006063 if (__match_at_start(__first, __last, __m, __flags,
Howard Hinnant38d14f72013-07-09 17:29:09 +00006064 !(__flags & regex_constants::__no_update_pos)))
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006065 {
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006066 __m.__prefix_.second = __m[0].first;
6067 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
6068 __m.__suffix_.first = __m[0].second;
6069 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
6070 return true;
6071 }
Howard Hinnant22cf4862010-07-29 01:15:27 +00006072 if (__first != __last && !(__flags & regex_constants::match_continuous))
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006073 {
Howard Hinnant6b2602a2010-07-29 15:17:28 +00006074 __flags |= regex_constants::match_prev_avail;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006075 for (++__first; __first != __last; ++__first)
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006076 {
Howard Hinnant6b2602a2010-07-29 15:17:28 +00006077 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant066ba512011-03-26 20:02:27 +00006078 if (__match_at_start(__first, __last, __m, __flags, false))
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006079 {
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006080 __m.__prefix_.second = __m[0].first;
6081 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
6082 __m.__suffix_.first = __m[0].second;
6083 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
6084 return true;
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006085 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006086 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006087 }
6088 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00006089 __m.__matches_.clear();
6090 return false;
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006091}
6092
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006093template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006094inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006095bool
6096regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
6097 match_results<_BidirectionalIterator, _Allocator>& __m,
6098 const basic_regex<_CharT, _Traits>& __e,
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006099 regex_constants::match_flag_type __flags = regex_constants::match_default)
6100{
Howard Hinnant1e5de642013-07-11 15:32:55 +00006101 int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
6102 basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
Howard Hinnant66423212010-07-14 21:14:52 +00006103 match_results<const _CharT*> __mc;
Howard Hinnant1e5de642013-07-11 15:32:55 +00006104 bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
Howard Hinnantd3925342010-08-16 20:21:16 +00006105 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant66423212010-07-14 21:14:52 +00006106 return __r;
6107}
6108
Howard Hinnant4018c482013-06-29 23:45:43 +00006109template <class _Iter, class _Allocator, class _CharT, class _Traits>
6110inline _LIBCPP_INLINE_VISIBILITY
6111bool
6112regex_search(__wrap_iter<_Iter> __first,
6113 __wrap_iter<_Iter> __last,
6114 match_results<__wrap_iter<_Iter>, _Allocator>& __m,
6115 const basic_regex<_CharT, _Traits>& __e,
6116 regex_constants::match_flag_type __flags = regex_constants::match_default)
6117{
6118 match_results<const _CharT*> __mc;
6119 bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
6120 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
6121 return __r;
6122}
6123
Howard Hinnant66423212010-07-14 21:14:52 +00006124template <class _Allocator, class _CharT, class _Traits>
6125inline _LIBCPP_INLINE_VISIBILITY
6126bool
6127regex_search(const _CharT* __first, const _CharT* __last,
6128 match_results<const _CharT*, _Allocator>& __m,
6129 const basic_regex<_CharT, _Traits>& __e,
6130 regex_constants::match_flag_type __flags = regex_constants::match_default)
6131{
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00006132 return __e.__search(__first, __last, __m, __flags);
6133}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006134
6135template <class _BidirectionalIterator, class _CharT, class _Traits>
6136inline _LIBCPP_INLINE_VISIBILITY
6137bool
6138regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
6139 const basic_regex<_CharT, _Traits>& __e,
6140 regex_constants::match_flag_type __flags = regex_constants::match_default)
6141{
Howard Hinnant66423212010-07-14 21:14:52 +00006142 basic_string<_CharT> __s(__first, __last);
6143 match_results<const _CharT*> __mc;
6144 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
6145}
6146
6147template <class _CharT, class _Traits>
6148inline _LIBCPP_INLINE_VISIBILITY
6149bool
6150regex_search(const _CharT* __first, const _CharT* __last,
6151 const basic_regex<_CharT, _Traits>& __e,
6152 regex_constants::match_flag_type __flags = regex_constants::match_default)
6153{
6154 match_results<const _CharT*> __mc;
6155 return __e.__search(__first, __last, __mc, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006156}
6157
6158template <class _CharT, class _Allocator, class _Traits>
6159inline _LIBCPP_INLINE_VISIBILITY
6160bool
6161regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6162 const basic_regex<_CharT, _Traits>& __e,
6163 regex_constants::match_flag_type __flags = regex_constants::match_default)
6164{
Howard Hinnant66423212010-07-14 21:14:52 +00006165 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006166}
6167
6168template <class _CharT, class _Traits>
6169inline _LIBCPP_INLINE_VISIBILITY
6170bool
6171regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6172 regex_constants::match_flag_type __flags = regex_constants::match_default)
6173{
Howard Hinnant66423212010-07-14 21:14:52 +00006174 match_results<const _CharT*> __m;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006175 return _VSTD::regex_search(__str, __m, __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006176}
6177
6178template <class _ST, class _SA, class _CharT, class _Traits>
6179inline _LIBCPP_INLINE_VISIBILITY
6180bool
6181regex_search(const basic_string<_CharT, _ST, _SA>& __s,
6182 const basic_regex<_CharT, _Traits>& __e,
6183 regex_constants::match_flag_type __flags = regex_constants::match_default)
6184{
Howard Hinnant66423212010-07-14 21:14:52 +00006185 match_results<const _CharT*> __mc;
6186 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006187}
6188
6189template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6190inline _LIBCPP_INLINE_VISIBILITY
6191bool
6192regex_search(const basic_string<_CharT, _ST, _SA>& __s,
6193 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6194 const basic_regex<_CharT, _Traits>& __e,
6195 regex_constants::match_flag_type __flags = regex_constants::match_default)
6196{
Howard Hinnant66423212010-07-14 21:14:52 +00006197 match_results<const _CharT*> __mc;
6198 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnantd3925342010-08-16 20:21:16 +00006199 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant66423212010-07-14 21:14:52 +00006200 return __r;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006201}
6202
Marshall Clow8c950072014-02-19 21:21:11 +00006203#if _LIBCPP_STD_VER > 11
6204template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
6205bool
6206regex_search(const basic_string<_Cp, _ST, _SA>&& __s,
6207 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
6208 const basic_regex<_Cp, _Tp>& __e,
Louis Dionne173f29e2019-05-29 16:01:36 +00006209 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
Marshall Clow8c950072014-02-19 21:21:11 +00006210#endif
6211
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006212// regex_match
6213
6214template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
6215bool
6216regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6217 match_results<_BidirectionalIterator, _Allocator>& __m,
6218 const basic_regex<_CharT, _Traits>& __e,
6219 regex_constants::match_flag_type __flags = regex_constants::match_default)
6220{
Tim Shen11113f52016-10-27 21:40:34 +00006221 bool __r = _VSTD::regex_search(
6222 __first, __last, __m, __e,
6223 __flags | regex_constants::match_continuous |
6224 regex_constants::__full_match);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006225 if (__r)
6226 {
6227 __r = !__m.suffix().matched;
6228 if (!__r)
6229 __m.__matches_.clear();
6230 }
6231 return __r;
6232}
6233
6234template <class _BidirectionalIterator, class _CharT, class _Traits>
6235inline _LIBCPP_INLINE_VISIBILITY
6236bool
6237regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6238 const basic_regex<_CharT, _Traits>& __e,
6239 regex_constants::match_flag_type __flags = regex_constants::match_default)
6240{
6241 match_results<_BidirectionalIterator> __m;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006242 return _VSTD::regex_match(__first, __last, __m, __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006243}
6244
6245template <class _CharT, class _Allocator, class _Traits>
6246inline _LIBCPP_INLINE_VISIBILITY
6247bool
6248regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6249 const basic_regex<_CharT, _Traits>& __e,
6250 regex_constants::match_flag_type __flags = regex_constants::match_default)
6251{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006252 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006253}
6254
6255template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6256inline _LIBCPP_INLINE_VISIBILITY
6257bool
6258regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6259 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6260 const basic_regex<_CharT, _Traits>& __e,
6261 regex_constants::match_flag_type __flags = regex_constants::match_default)
6262{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006263 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006264}
6265
Marshall Clow8c950072014-02-19 21:21:11 +00006266#if _LIBCPP_STD_VER > 11
6267template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6268inline _LIBCPP_INLINE_VISIBILITY
6269bool
6270regex_match(const basic_string<_CharT, _ST, _SA>&& __s,
6271 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6272 const basic_regex<_CharT, _Traits>& __e,
Louis Dionne173f29e2019-05-29 16:01:36 +00006273 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
Marshall Clow8c950072014-02-19 21:21:11 +00006274#endif
6275
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006276template <class _CharT, class _Traits>
6277inline _LIBCPP_INLINE_VISIBILITY
6278bool
6279regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6280 regex_constants::match_flag_type __flags = regex_constants::match_default)
6281{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006282 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006283}
6284
6285template <class _ST, class _SA, class _CharT, class _Traits>
6286inline _LIBCPP_INLINE_VISIBILITY
6287bool
6288regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6289 const basic_regex<_CharT, _Traits>& __e,
6290 regex_constants::match_flag_type __flags = regex_constants::match_default)
6291{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006292 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006293}
6294
Howard Hinnantd3925342010-08-16 20:21:16 +00006295// regex_iterator
6296
6297template <class _BidirectionalIterator,
6298 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6299 class _Traits = regex_traits<_CharT> >
Richard Smith256954d2020-11-11 17:12:18 -08006300 class _LIBCPP_TEMPLATE_VIS regex_iterator;
6301
6302typedef regex_iterator<const char*> cregex_iterator;
Richard Smith256954d2020-11-11 17:12:18 -08006303typedef regex_iterator<string::const_iterator> sregex_iterator;
Louis Dionne89258142021-08-23 15:32:36 -04006304#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
6305typedef regex_iterator<const wchar_t*> wcregex_iterator;
Richard Smith256954d2020-11-11 17:12:18 -08006306typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
Louis Dionne89258142021-08-23 15:32:36 -04006307#endif
Richard Smith256954d2020-11-11 17:12:18 -08006308
6309template <class _BidirectionalIterator, class _CharT, class _Traits>
6310class
6311 _LIBCPP_TEMPLATE_VIS
6312 _LIBCPP_PREFERRED_NAME(cregex_iterator)
Louis Dionne89258142021-08-23 15:32:36 -04006313 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_iterator))
Richard Smith256954d2020-11-11 17:12:18 -08006314 _LIBCPP_PREFERRED_NAME(sregex_iterator)
Louis Dionne89258142021-08-23 15:32:36 -04006315 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_iterator))
Richard Smith256954d2020-11-11 17:12:18 -08006316 regex_iterator
Howard Hinnantd3925342010-08-16 20:21:16 +00006317{
6318public:
6319 typedef basic_regex<_CharT, _Traits> regex_type;
6320 typedef match_results<_BidirectionalIterator> value_type;
6321 typedef ptrdiff_t difference_type;
6322 typedef const value_type* pointer;
6323 typedef const value_type& reference;
6324 typedef forward_iterator_tag iterator_category;
6325
6326private:
6327 _BidirectionalIterator __begin_;
6328 _BidirectionalIterator __end_;
6329 const regex_type* __pregex_;
6330 regex_constants::match_flag_type __flags_;
6331 value_type __match_;
6332
6333public:
6334 regex_iterator();
6335 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6336 const regex_type& __re,
Marshall Clow8c950072014-02-19 21:21:11 +00006337 regex_constants::match_flag_type __m
6338 = regex_constants::match_default);
6339#if _LIBCPP_STD_VER > 11
6340 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6341 const regex_type&& __re,
Louis Dionne173f29e2019-05-29 16:01:36 +00006342 regex_constants::match_flag_type __m
Marshall Clow8c950072014-02-19 21:21:11 +00006343 = regex_constants::match_default) = delete;
6344#endif
Howard Hinnantd3925342010-08-16 20:21:16 +00006345
6346 bool operator==(const regex_iterator& __x) const;
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006347 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd3925342010-08-16 20:21:16 +00006348 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
6349
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006350 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd3925342010-08-16 20:21:16 +00006351 reference operator*() const {return __match_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006352 _LIBCPP_INLINE_VISIBILITY
Marshall Clowf01062c2019-01-24 02:02:50 +00006353 pointer operator->() const {return _VSTD::addressof(__match_);}
Howard Hinnantd3925342010-08-16 20:21:16 +00006354
6355 regex_iterator& operator++();
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006356 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd3925342010-08-16 20:21:16 +00006357 regex_iterator operator++(int)
6358 {
6359 regex_iterator __t(*this);
6360 ++(*this);
6361 return __t;
6362 }
6363};
6364
6365template <class _BidirectionalIterator, class _CharT, class _Traits>
6366regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
6367 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
6368{
6369}
6370
6371template <class _BidirectionalIterator, class _CharT, class _Traits>
6372regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6373 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6374 const regex_type& __re, regex_constants::match_flag_type __m)
6375 : __begin_(__a),
6376 __end_(__b),
Marshall Clowf01062c2019-01-24 02:02:50 +00006377 __pregex_(_VSTD::addressof(__re)),
Howard Hinnantd3925342010-08-16 20:21:16 +00006378 __flags_(__m)
6379{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006380 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
Howard Hinnantd3925342010-08-16 20:21:16 +00006381}
6382
6383template <class _BidirectionalIterator, class _CharT, class _Traits>
6384bool
6385regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6386 operator==(const regex_iterator& __x) const
6387{
6388 if (__match_.empty() && __x.__match_.empty())
6389 return true;
6390 if (__match_.empty() || __x.__match_.empty())
6391 return false;
6392 return __begin_ == __x.__begin_ &&
6393 __end_ == __x.__end_ &&
6394 __pregex_ == __x.__pregex_ &&
6395 __flags_ == __x.__flags_ &&
6396 __match_[0] == __x.__match_[0];
6397}
6398
6399template <class _BidirectionalIterator, class _CharT, class _Traits>
6400regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6401regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6402{
6403 __flags_ |= regex_constants::__no_update_pos;
6404 _BidirectionalIterator __start = __match_[0].second;
Marshall Clowfaa964d2017-07-05 16:37:19 +00006405 if (__match_[0].first == __match_[0].second)
Howard Hinnantd3925342010-08-16 20:21:16 +00006406 {
6407 if (__start == __end_)
6408 {
6409 __match_ = value_type();
6410 return *this;
6411 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006412 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
Howard Hinnantd3925342010-08-16 20:21:16 +00006413 __flags_ | regex_constants::match_not_null |
6414 regex_constants::match_continuous))
6415 return *this;
6416 else
6417 ++__start;
6418 }
6419 __flags_ |= regex_constants::match_prev_avail;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006420 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
Howard Hinnantd3925342010-08-16 20:21:16 +00006421 __match_ = value_type();
6422 return *this;
6423}
6424
Howard Hinnantd3925342010-08-16 20:21:16 +00006425// regex_token_iterator
6426
6427template <class _BidirectionalIterator,
6428 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6429 class _Traits = regex_traits<_CharT> >
Richard Smith256954d2020-11-11 17:12:18 -08006430 class _LIBCPP_TEMPLATE_VIS regex_token_iterator;
6431
6432typedef regex_token_iterator<const char*> cregex_token_iterator;
Richard Smith256954d2020-11-11 17:12:18 -08006433typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
Louis Dionne89258142021-08-23 15:32:36 -04006434#ifndef _LIBCPP_HAS_NO_WIDE_CHARACTERS
6435typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
Richard Smith256954d2020-11-11 17:12:18 -08006436typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
Louis Dionne89258142021-08-23 15:32:36 -04006437#endif
Richard Smith256954d2020-11-11 17:12:18 -08006438
6439template <class _BidirectionalIterator, class _CharT, class _Traits>
6440class
6441 _LIBCPP_TEMPLATE_VIS
6442 _LIBCPP_PREFERRED_NAME(cregex_token_iterator)
Louis Dionne89258142021-08-23 15:32:36 -04006443 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wcregex_token_iterator))
Richard Smith256954d2020-11-11 17:12:18 -08006444 _LIBCPP_PREFERRED_NAME(sregex_token_iterator)
Louis Dionne89258142021-08-23 15:32:36 -04006445 _LIBCPP_IF_WIDE_CHARACTERS(_LIBCPP_PREFERRED_NAME(wsregex_token_iterator))
Richard Smith256954d2020-11-11 17:12:18 -08006446 regex_token_iterator
Howard Hinnantd3925342010-08-16 20:21:16 +00006447{
6448public:
6449 typedef basic_regex<_CharT, _Traits> regex_type;
6450 typedef sub_match<_BidirectionalIterator> value_type;
6451 typedef ptrdiff_t difference_type;
6452 typedef const value_type* pointer;
6453 typedef const value_type& reference;
6454 typedef forward_iterator_tag iterator_category;
6455
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006456private:
6457 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6458
6459 _Position __position_;
6460 const value_type* __result_;
6461 value_type __suffix_;
Eric Fiselier37c22152016-12-24 00:24:44 +00006462 ptrdiff_t __n_;
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006463 vector<int> __subs_;
6464
6465public:
Howard Hinnantd3925342010-08-16 20:21:16 +00006466 regex_token_iterator();
6467 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6468 const regex_type& __re, int __submatch = 0,
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006469 regex_constants::match_flag_type __m =
6470 regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +00006471#if _LIBCPP_STD_VER > 11
6472 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6473 const regex_type&& __re, int __submatch = 0,
6474 regex_constants::match_flag_type __m =
6475 regex_constants::match_default) = delete;
6476#endif
6477
Howard Hinnantd3925342010-08-16 20:21:16 +00006478 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6479 const regex_type& __re, const vector<int>& __submatches,
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006480 regex_constants::match_flag_type __m =
6481 regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +00006482#if _LIBCPP_STD_VER > 11
6483 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6484 const regex_type&& __re, const vector<int>& __submatches,
6485 regex_constants::match_flag_type __m =
6486 regex_constants::match_default) = delete;
6487#endif
6488
Eric Fiselier6f8516f2017-04-18 23:42:15 +00006489#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd3925342010-08-16 20:21:16 +00006490 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006491 const regex_type& __re,
6492 initializer_list<int> __submatches,
6493 regex_constants::match_flag_type __m =
6494 regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +00006495
6496#if _LIBCPP_STD_VER > 11
6497 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6498 const regex_type&& __re,
6499 initializer_list<int> __submatches,
6500 regex_constants::match_flag_type __m =
6501 regex_constants::match_default) = delete;
6502#endif
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04006503#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc834c512011-11-29 18:15:50 +00006504 template <size_t _Np>
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006505 regex_token_iterator(_BidirectionalIterator __a,
6506 _BidirectionalIterator __b,
6507 const regex_type& __re,
Howard Hinnantc834c512011-11-29 18:15:50 +00006508 const int (&__submatches)[_Np],
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006509 regex_constants::match_flag_type __m =
6510 regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +00006511#if _LIBCPP_STD_VER > 11
Arthur O'Dwyer07b22492020-11-27 11:02:06 -05006512 template <size_t _Np>
Marshall Clow8c950072014-02-19 21:21:11 +00006513 regex_token_iterator(_BidirectionalIterator __a,
6514 _BidirectionalIterator __b,
6515 const regex_type&& __re,
6516 const int (&__submatches)[_Np],
6517 regex_constants::match_flag_type __m =
6518 regex_constants::match_default) = delete;
6519#endif
6520
Howard Hinnantd3925342010-08-16 20:21:16 +00006521 regex_token_iterator(const regex_token_iterator&);
6522 regex_token_iterator& operator=(const regex_token_iterator&);
6523
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006524 bool operator==(const regex_token_iterator& __x) const;
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006525 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006526 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
Howard Hinnantd3925342010-08-16 20:21:16 +00006527
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006528 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006529 const value_type& operator*() const {return *__result_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006530 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006531 const value_type* operator->() const {return __result_;}
Howard Hinnantd3925342010-08-16 20:21:16 +00006532
6533 regex_token_iterator& operator++();
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006534 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006535 regex_token_iterator operator++(int)
6536 {
6537 regex_token_iterator __t(*this);
6538 ++(*this);
6539 return __t;
6540 }
6541
6542private:
6543 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
Marshall Clow68083022014-01-09 18:25:57 +00006544 void __establish_result () {
Eric Fiselier37c22152016-12-24 00:24:44 +00006545 if (__subs_[__n_] == -1)
Marshall Clow68083022014-01-09 18:25:57 +00006546 __result_ = &__position_->prefix();
6547 else
Eric Fiselier37c22152016-12-24 00:24:44 +00006548 __result_ = &(*__position_)[__subs_[__n_]];
Louis Dionne173f29e2019-05-29 16:01:36 +00006549 }
Howard Hinnantd3925342010-08-16 20:21:16 +00006550};
6551
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006552template <class _BidirectionalIterator, class _CharT, class _Traits>
6553regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6554 regex_token_iterator()
6555 : __result_(nullptr),
6556 __suffix_(),
Eric Fiselier37c22152016-12-24 00:24:44 +00006557 __n_(0)
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006558{
6559}
6560
6561template <class _BidirectionalIterator, class _CharT, class _Traits>
6562void
6563regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6564 __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6565{
6566 if (__position_ != _Position())
Marshall Clow68083022014-01-09 18:25:57 +00006567 __establish_result ();
Eric Fiselier37c22152016-12-24 00:24:44 +00006568 else if (__subs_[__n_] == -1)
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006569 {
6570 __suffix_.matched = true;
6571 __suffix_.first = __a;
6572 __suffix_.second = __b;
6573 __result_ = &__suffix_;
6574 }
6575 else
6576 __result_ = nullptr;
6577}
6578
6579template <class _BidirectionalIterator, class _CharT, class _Traits>
6580regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6581 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6582 const regex_type& __re, int __submatch,
6583 regex_constants::match_flag_type __m)
6584 : __position_(__a, __b, __re, __m),
Eric Fiselier37c22152016-12-24 00:24:44 +00006585 __n_(0),
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006586 __subs_(1, __submatch)
6587{
6588 __init(__a, __b);
6589}
6590
6591template <class _BidirectionalIterator, class _CharT, class _Traits>
6592regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6593 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6594 const regex_type& __re, const vector<int>& __submatches,
6595 regex_constants::match_flag_type __m)
6596 : __position_(__a, __b, __re, __m),
Eric Fiselier37c22152016-12-24 00:24:44 +00006597 __n_(0),
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006598 __subs_(__submatches)
6599{
6600 __init(__a, __b);
6601}
6602
Eric Fiselier6f8516f2017-04-18 23:42:15 +00006603#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00006604
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006605template <class _BidirectionalIterator, class _CharT, class _Traits>
6606regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6607 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6608 const regex_type& __re,
6609 initializer_list<int> __submatches,
6610 regex_constants::match_flag_type __m)
6611 : __position_(__a, __b, __re, __m),
Eric Fiselier37c22152016-12-24 00:24:44 +00006612 __n_(0),
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006613 __subs_(__submatches)
6614{
6615 __init(__a, __b);
6616}
6617
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04006618#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00006619
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006620template <class _BidirectionalIterator, class _CharT, class _Traits>
Howard Hinnantc834c512011-11-29 18:15:50 +00006621template <size_t _Np>
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006622regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6623 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6624 const regex_type& __re,
Howard Hinnantc834c512011-11-29 18:15:50 +00006625 const int (&__submatches)[_Np],
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006626 regex_constants::match_flag_type __m)
6627 : __position_(__a, __b, __re, __m),
Eric Fiselier37c22152016-12-24 00:24:44 +00006628 __n_(0),
Marshall Clowf01062c2019-01-24 02:02:50 +00006629 __subs_(begin(__submatches), end(__submatches))
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006630{
6631 __init(__a, __b);
6632}
6633
6634template <class _BidirectionalIterator, class _CharT, class _Traits>
6635regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6636 regex_token_iterator(const regex_token_iterator& __x)
6637 : __position_(__x.__position_),
6638 __result_(__x.__result_),
6639 __suffix_(__x.__suffix_),
Eric Fiselier37c22152016-12-24 00:24:44 +00006640 __n_(__x.__n_),
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006641 __subs_(__x.__subs_)
6642{
6643 if (__x.__result_ == &__x.__suffix_)
Marshall Clow20756ac2014-01-13 17:47:08 +00006644 __result_ = &__suffix_;
Marshall Clow68083022014-01-09 18:25:57 +00006645 else if ( __result_ != nullptr )
6646 __establish_result ();
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006647}
6648
6649template <class _BidirectionalIterator, class _CharT, class _Traits>
6650regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6651regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6652 operator=(const regex_token_iterator& __x)
6653{
6654 if (this != &__x)
6655 {
6656 __position_ = __x.__position_;
6657 if (__x.__result_ == &__x.__suffix_)
Marshall Clow68083022014-01-09 18:25:57 +00006658 __result_ = &__suffix_;
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006659 else
6660 __result_ = __x.__result_;
6661 __suffix_ = __x.__suffix_;
Eric Fiselier37c22152016-12-24 00:24:44 +00006662 __n_ = __x.__n_;
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006663 __subs_ = __x.__subs_;
Marshall Clow68083022014-01-09 18:25:57 +00006664
6665 if ( __result_ != nullptr && __result_ != &__suffix_ )
6666 __establish_result();
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006667 }
6668 return *this;
6669}
6670
6671template <class _BidirectionalIterator, class _CharT, class _Traits>
6672bool
6673regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6674 operator==(const regex_token_iterator& __x) const
6675{
6676 if (__result_ == nullptr && __x.__result_ == nullptr)
6677 return true;
6678 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6679 __suffix_ == __x.__suffix_)
6680 return true;
6681 if (__result_ == nullptr || __x.__result_ == nullptr)
6682 return false;
6683 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6684 return false;
Eric Fiselier37c22152016-12-24 00:24:44 +00006685 return __position_ == __x.__position_ && __n_ == __x.__n_ &&
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006686 __subs_ == __x.__subs_;
6687}
6688
6689template <class _BidirectionalIterator, class _CharT, class _Traits>
6690regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6691regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6692{
6693 _Position __prev = __position_;
6694 if (__result_ == &__suffix_)
6695 __result_ = nullptr;
Eric Fiselier37c22152016-12-24 00:24:44 +00006696 else if (static_cast<size_t>(__n_ + 1) < __subs_.size())
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006697 {
Eric Fiselier37c22152016-12-24 00:24:44 +00006698 ++__n_;
Marshall Clow68083022014-01-09 18:25:57 +00006699 __establish_result();
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006700 }
6701 else
6702 {
Eric Fiselier37c22152016-12-24 00:24:44 +00006703 __n_ = 0;
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006704 ++__position_;
6705 if (__position_ != _Position())
Marshall Clow68083022014-01-09 18:25:57 +00006706 __establish_result();
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006707 else
6708 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006709 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006710 && __prev->suffix().length() != 0)
6711 {
6712 __suffix_.matched = true;
6713 __suffix_.first = __prev->suffix().first;
6714 __suffix_.second = __prev->suffix().second;
6715 __result_ = &__suffix_;
6716 }
6717 else
6718 __result_ = nullptr;
6719 }
6720 }
6721 return *this;
6722}
6723
Howard Hinnante90434c2010-08-18 00:13:08 +00006724// regex_replace
6725
6726template <class _OutputIterator, class _BidirectionalIterator,
6727 class _Traits, class _CharT>
6728_OutputIterator
Alexander Richardsonc9637642017-11-14 11:14:25 +00006729regex_replace(_OutputIterator __output_iter,
Howard Hinnante90434c2010-08-18 00:13:08 +00006730 _BidirectionalIterator __first, _BidirectionalIterator __last,
6731 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6732 regex_constants::match_flag_type __flags = regex_constants::match_default)
6733{
6734 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6735 _Iter __i(__first, __last, __e, __flags);
6736 _Iter __eof;
6737 if (__i == __eof)
6738 {
6739 if (!(__flags & regex_constants::format_no_copy))
Alexander Richardsonc9637642017-11-14 11:14:25 +00006740 __output_iter = _VSTD::copy(__first, __last, __output_iter);
Howard Hinnante90434c2010-08-18 00:13:08 +00006741 }
6742 else
6743 {
6744 sub_match<_BidirectionalIterator> __lm;
6745 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6746 {
6747 if (!(__flags & regex_constants::format_no_copy))
Alexander Richardsonc9637642017-11-14 11:14:25 +00006748 __output_iter = _VSTD::copy(__i->prefix().first, __i->prefix().second, __output_iter);
6749 __output_iter = __i->format(__output_iter, __fmt, __fmt + __len, __flags);
Howard Hinnante90434c2010-08-18 00:13:08 +00006750 __lm = __i->suffix();
6751 if (__flags & regex_constants::format_first_only)
6752 break;
6753 }
6754 if (!(__flags & regex_constants::format_no_copy))
Alexander Richardsonc9637642017-11-14 11:14:25 +00006755 __output_iter = _VSTD::copy(__lm.first, __lm.second, __output_iter);
Howard Hinnante90434c2010-08-18 00:13:08 +00006756 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00006757 return __output_iter;
Howard Hinnante90434c2010-08-18 00:13:08 +00006758}
6759
6760template <class _OutputIterator, class _BidirectionalIterator,
6761 class _Traits, class _CharT, class _ST, class _SA>
6762inline _LIBCPP_INLINE_VISIBILITY
6763_OutputIterator
Alexander Richardsonc9637642017-11-14 11:14:25 +00006764regex_replace(_OutputIterator __output_iter,
Howard Hinnante90434c2010-08-18 00:13:08 +00006765 _BidirectionalIterator __first, _BidirectionalIterator __last,
6766 const basic_regex<_CharT, _Traits>& __e,
6767 const basic_string<_CharT, _ST, _SA>& __fmt,
6768 regex_constants::match_flag_type __flags = regex_constants::match_default)
6769{
Alexander Richardsonc9637642017-11-14 11:14:25 +00006770 return _VSTD::regex_replace(__output_iter, __first, __last, __e, __fmt.c_str(), __flags);
Howard Hinnante90434c2010-08-18 00:13:08 +00006771}
6772
6773template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6774 class _FSA>
6775inline _LIBCPP_INLINE_VISIBILITY
6776basic_string<_CharT, _ST, _SA>
6777regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6778 const basic_regex<_CharT, _Traits>& __e,
6779 const basic_string<_CharT, _FST, _FSA>& __fmt,
6780 regex_constants::match_flag_type __flags = regex_constants::match_default)
6781{
6782 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006783 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnante90434c2010-08-18 00:13:08 +00006784 __fmt.c_str(), __flags);
6785 return __r;
6786}
6787
6788template <class _Traits, class _CharT, class _ST, class _SA>
6789inline _LIBCPP_INLINE_VISIBILITY
6790basic_string<_CharT, _ST, _SA>
6791regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6792 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6793 regex_constants::match_flag_type __flags = regex_constants::match_default)
6794{
6795 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006796 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnante90434c2010-08-18 00:13:08 +00006797 __fmt, __flags);
6798 return __r;
6799}
6800
6801template <class _Traits, class _CharT, class _ST, class _SA>
6802inline _LIBCPP_INLINE_VISIBILITY
6803basic_string<_CharT>
6804regex_replace(const _CharT* __s,
6805 const basic_regex<_CharT, _Traits>& __e,
6806 const basic_string<_CharT, _ST, _SA>& __fmt,
6807 regex_constants::match_flag_type __flags = regex_constants::match_default)
6808{
6809 basic_string<_CharT> __r;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006810 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnante90434c2010-08-18 00:13:08 +00006811 __s + char_traits<_CharT>::length(__s), __e,
6812 __fmt.c_str(), __flags);
6813 return __r;
6814}
6815
6816template <class _Traits, class _CharT>
6817inline _LIBCPP_INLINE_VISIBILITY
6818basic_string<_CharT>
6819regex_replace(const _CharT* __s,
6820 const basic_regex<_CharT, _Traits>& __e,
6821 const _CharT* __fmt,
6822 regex_constants::match_flag_type __flags = regex_constants::match_default)
6823{
6824 basic_string<_CharT> __r;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006825 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnante90434c2010-08-18 00:13:08 +00006826 __s + char_traits<_CharT>::length(__s), __e,
6827 __fmt, __flags);
6828 return __r;
6829}
6830
Howard Hinnanta3af5a32010-06-17 00:34:59 +00006831_LIBCPP_END_NAMESPACE_STD
6832
Eric Fiselierf4433a32017-05-31 22:07:49 +00006833_LIBCPP_POP_MACROS
6834
Louis Dionne2b1ceaa2021-04-20 12:03:32 -04006835#endif // _LIBCPP_REGEX