blob: bd83d7c10ca73cdd0739bd2f9aac408f4d89b4ed [file] [log] [blame]
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001// -*- C++ -*-
2//===--------------------------- regex ------------------------------------===//
3//
4// The LLVM Compiler Infrastructure
5//
Howard Hinnantee11c312010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnanta3af5a32010-06-17 00:34:59 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_REGEX
12#define _LIBCPP_REGEX
13
14/*
15 regex synopsis
16
17#include <initializer_list>
18
19namespace std
20{
21
22namespace regex_constants
23{
24
25emum syntax_option_type
26{
27 icase = unspecified,
28 nosubs = unspecified,
29 optimize = unspecified,
30 collate = unspecified,
31 ECMAScript = unspecified,
32 basic = unspecified,
33 extended = unspecified,
34 awk = unspecified,
35 grep = unspecified,
36 egrep = unspecified
37};
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;
146
147 // construct/copy/destroy:
148 basic_regex();
149 explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
Hubert Tong19662862016-08-07 22:26:04 +0000150 basic_regex(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000151 basic_regex(const basic_regex&);
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000152 basic_regex(basic_regex&&) noexcept;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000153 template <class ST, class SA>
154 explicit basic_regex(const basic_string<charT, ST, SA>& p,
155 flag_type f = regex_constants::ECMAScript);
156 template <class ForwardIterator>
157 basic_regex(ForwardIterator first, ForwardIterator last,
158 flag_type f = regex_constants::ECMAScript);
159 basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
160
161 ~basic_regex();
162
163 basic_regex& operator=(const basic_regex&);
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000164 basic_regex& operator=(basic_regex&&) noexcept;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000165 basic_regex& operator=(const charT* ptr);
166 basic_regex& operator=(initializer_list<charT> il);
167 template <class ST, class SA>
168 basic_regex& operator=(const basic_string<charT, ST, SA>& p);
169
170 // assign:
171 basic_regex& assign(const basic_regex& that);
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000172 basic_regex& assign(basic_regex&& that) noexcept;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000173 basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);
174 basic_regex& assign(const charT* p, size_t len, flag_type f);
175 template <class string_traits, class A>
176 basic_regex& assign(const basic_string<charT, string_traits, A>& s,
177 flag_type f = regex_constants::ECMAScript);
178 template <class InputIterator>
179 basic_regex& assign(InputIterator first, InputIterator last,
180 flag_type f = regex_constants::ECMAScript);
181 basic_regex& assign(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
182
183 // const operations:
184 unsigned mark_count() const;
185 flag_type flags() const;
186
187 // locale:
188 locale_type imbue(locale_type loc);
189 locale_type getloc() const;
190
191 // swap:
192 void swap(basic_regex&);
193};
194
Marshall Clow2dce1f42018-05-23 01:57:02 +0000195template<class ForwardIterator>
196basic_regex(ForwardIterator, ForwardIterator,
197 regex_constants::syntax_option_type = regex_constants::ECMAScript)
198 -> basic_regex<typename iterator_traits<ForwardIterator>::value_type>; // C++17
199
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000200typedef basic_regex<char> regex;
201typedef basic_regex<wchar_t> wregex;
202
203template <class charT, class traits>
204 void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
205
206template <class BidirectionalIterator>
207class sub_match
208 : public pair<BidirectionalIterator, BidirectionalIterator>
209{
210public:
211 typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
212 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
213 typedef BidirectionalIterator iterator;
214 typedef basic_string<value_type> string_type;
215
216 bool matched;
217
Howard Hinnantb5c53a82010-12-08 21:07:55 +0000218 constexpr sub_match();
219
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000220 difference_type length() const;
221 operator string_type() const;
222 string_type str() const;
223
224 int compare(const sub_match& s) const;
225 int compare(const string_type& s) const;
226 int compare(const value_type* s) const;
227};
228
229typedef sub_match<const char*> csub_match;
230typedef sub_match<const wchar_t*> wcsub_match;
231typedef sub_match<string::const_iterator> ssub_match;
232typedef sub_match<wstring::const_iterator> wssub_match;
233
234template <class BiIter>
235 bool
236 operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
237
238template <class BiIter>
239 bool
240 operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
241
242template <class BiIter>
243 bool
244 operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
245
246template <class BiIter>
247 bool
248 operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
249
250template <class BiIter>
251 bool
252 operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
253
254template <class BiIter>
255 bool
256 operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
257
258template <class BiIter, class ST, class SA>
259 bool
260 operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
261 const sub_match<BiIter>& rhs);
262
263template <class BiIter, class ST, class SA>
264 bool
265 operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
266 const sub_match<BiIter>& rhs);
267
268template <class BiIter, class ST, class SA>
269 bool
270 operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
271 const sub_match<BiIter>& rhs);
272
273template <class BiIter, class ST, class SA>
274 bool
275 operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
276 const sub_match<BiIter>& rhs);
277
278template <class BiIter, class ST, class SA>
279 bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
280 const sub_match<BiIter>& rhs);
281
282template <class BiIter, class ST, class SA>
283 bool
284 operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
285 const sub_match<BiIter>& rhs);
286
287template <class BiIter, class ST, class SA>
288 bool
289 operator==(const sub_match<BiIter>& lhs,
290 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
291
292template <class BiIter, class ST, class SA>
293 bool
294 operator!=(const sub_match<BiIter>& lhs,
295 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
296
297template <class BiIter, class ST, class SA>
298 bool
299 operator<(const sub_match<BiIter>& lhs,
300 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
301
302template <class BiIter, class ST, class SA>
303 bool operator>(const sub_match<BiIter>& lhs,
304 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
305
306template <class BiIter, class ST, class SA>
307 bool
308 operator>=(const sub_match<BiIter>& lhs,
309 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
310
311template <class BiIter, class ST, class SA>
312 bool
313 operator<=(const sub_match<BiIter>& lhs,
314 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
315
316template <class BiIter>
317 bool
318 operator==(typename iterator_traits<BiIter>::value_type const* lhs,
319 const sub_match<BiIter>& rhs);
320
321template <class BiIter>
322 bool
323 operator!=(typename iterator_traits<BiIter>::value_type const* lhs,
324 const sub_match<BiIter>& rhs);
325
326template <class BiIter>
327 bool
328 operator<(typename iterator_traits<BiIter>::value_type const* lhs,
329 const sub_match<BiIter>& rhs);
330
331template <class BiIter>
332 bool
333 operator>(typename iterator_traits<BiIter>::value_type const* lhs,
334 const sub_match<BiIter>& rhs);
335
336template <class BiIter>
337 bool
338 operator>=(typename iterator_traits<BiIter>::value_type const* lhs,
339 const sub_match<BiIter>& rhs);
340
341template <class BiIter>
342 bool
343 operator<=(typename iterator_traits<BiIter>::value_type const* lhs,
344 const sub_match<BiIter>& rhs);
345
346template <class BiIter>
347 bool
348 operator==(const sub_match<BiIter>& lhs,
349 typename iterator_traits<BiIter>::value_type const* rhs);
350
351template <class BiIter>
352 bool
353 operator!=(const sub_match<BiIter>& lhs,
354 typename iterator_traits<BiIter>::value_type const* rhs);
355
356template <class BiIter>
357 bool
358 operator<(const sub_match<BiIter>& lhs,
359 typename iterator_traits<BiIter>::value_type const* rhs);
360
361template <class BiIter>
362 bool
363 operator>(const sub_match<BiIter>& lhs,
364 typename iterator_traits<BiIter>::value_type const* rhs);
365
366template <class BiIter>
367 bool
368 operator>=(const sub_match<BiIter>& lhs,
369 typename iterator_traits<BiIter>::value_type const* rhs);
370
371template <class BiIter>
372 bool
373 operator<=(const sub_match<BiIter>& lhs,
374 typename iterator_traits<BiIter>::value_type const* rhs);
375
376template <class BiIter>
377 bool
378 operator==(typename iterator_traits<BiIter>::value_type const& lhs,
379 const sub_match<BiIter>& rhs);
380
381template <class BiIter>
382 bool
383 operator!=(typename iterator_traits<BiIter>::value_type const& lhs,
384 const sub_match<BiIter>& rhs);
385
386template <class BiIter>
387 bool
388 operator<(typename iterator_traits<BiIter>::value_type const& lhs,
389 const sub_match<BiIter>& rhs);
390
391template <class BiIter>
392 bool
393 operator>(typename iterator_traits<BiIter>::value_type const& lhs,
394 const sub_match<BiIter>& rhs);
395
396template <class BiIter>
397 bool
398 operator>=(typename iterator_traits<BiIter>::value_type const& lhs,
399 const sub_match<BiIter>& rhs);
400
401template <class BiIter>
402 bool
403 operator<=(typename iterator_traits<BiIter>::value_type const& lhs,
404 const sub_match<BiIter>& rhs);
405
406template <class BiIter>
407 bool
408 operator==(const sub_match<BiIter>& lhs,
409 typename iterator_traits<BiIter>::value_type const& rhs);
410
411template <class BiIter>
412 bool
413 operator!=(const sub_match<BiIter>& lhs,
414 typename iterator_traits<BiIter>::value_type const& rhs);
415
416template <class BiIter>
417 bool
418 operator<(const sub_match<BiIter>& lhs,
419 typename iterator_traits<BiIter>::value_type const& rhs);
420
421template <class BiIter>
422 bool
423 operator>(const sub_match<BiIter>& lhs,
424 typename iterator_traits<BiIter>::value_type const& rhs);
425
426template <class BiIter>
427 bool
428 operator>=(const sub_match<BiIter>& lhs,
429 typename iterator_traits<BiIter>::value_type const& rhs);
430
431template <class BiIter>
432 bool
433 operator<=(const sub_match<BiIter>& lhs,
434 typename iterator_traits<BiIter>::value_type const& rhs);
435
436template <class charT, class ST, class BiIter>
437 basic_ostream<charT, ST>&
438 operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
439
440template <class BidirectionalIterator,
441 class Allocator = allocator<sub_match<BidirectionalIterator>>>
442class match_results
443{
444public:
445 typedef sub_match<BidirectionalIterator> value_type;
446 typedef const value_type& const_reference;
Marshall Clow96e06142014-02-26 01:56:31 +0000447 typedef value_type& reference;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000448 typedef /implementation-defined/ const_iterator;
449 typedef const_iterator iterator;
450 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
451 typedef typename allocator_traits<Allocator>::size_type size_type;
452 typedef Allocator allocator_type;
453 typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
454 typedef basic_string<char_type> string_type;
455
456 // construct/copy/destroy:
457 explicit match_results(const Allocator& a = Allocator());
458 match_results(const match_results& m);
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000459 match_results(match_results&& m) noexcept;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000460 match_results& operator=(const match_results& m);
461 match_results& operator=(match_results&& m);
462 ~match_results();
463
Howard Hinnantb5c53a82010-12-08 21:07:55 +0000464 bool ready() const;
465
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000466 // size:
467 size_type size() const;
468 size_type max_size() const;
469 bool empty() const;
470
471 // element access:
472 difference_type length(size_type sub = 0) const;
473 difference_type position(size_type sub = 0) const;
474 string_type str(size_type sub = 0) const;
475 const_reference operator[](size_type n) const;
476
477 const_reference prefix() const;
478 const_reference suffix() const;
479
480 const_iterator begin() const;
481 const_iterator end() const;
482 const_iterator cbegin() const;
483 const_iterator cend() const;
484
485 // format:
486 template <class OutputIter>
487 OutputIter
488 format(OutputIter out, const char_type* fmt_first,
489 const char_type* fmt_last,
490 regex_constants::match_flag_type flags = regex_constants::format_default) const;
491 template <class OutputIter, class ST, class SA>
492 OutputIter
493 format(OutputIter out, const basic_string<char_type, ST, SA>& fmt,
494 regex_constants::match_flag_type flags = regex_constants::format_default) const;
495 template <class ST, class SA>
496 basic_string<char_type, ST, SA>
497 format(const basic_string<char_type, ST, SA>& fmt,
498 regex_constants::match_flag_type flags = regex_constants::format_default) const;
499 string_type
500 format(const char_type* fmt,
501 regex_constants::match_flag_type flags = regex_constants::format_default) const;
502
503 // allocator:
504 allocator_type get_allocator() const;
505
506 // swap:
507 void swap(match_results& that);
508};
509
510typedef match_results<const char*> cmatch;
511typedef match_results<const wchar_t*> wcmatch;
512typedef match_results<string::const_iterator> smatch;
513typedef match_results<wstring::const_iterator> wsmatch;
514
515template <class BidirectionalIterator, class Allocator>
516 bool
517 operator==(const match_results<BidirectionalIterator, Allocator>& m1,
518 const match_results<BidirectionalIterator, Allocator>& m2);
519
520template <class BidirectionalIterator, class Allocator>
521 bool
522 operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
523 const match_results<BidirectionalIterator, Allocator>& m2);
524
525template <class BidirectionalIterator, class Allocator>
526 void
527 swap(match_results<BidirectionalIterator, Allocator>& m1,
528 match_results<BidirectionalIterator, Allocator>& m2);
529
530template <class BidirectionalIterator, class Allocator, class charT, class traits>
531 bool
532 regex_match(BidirectionalIterator first, BidirectionalIterator last,
533 match_results<BidirectionalIterator, Allocator>& m,
534 const basic_regex<charT, traits>& e,
535 regex_constants::match_flag_type flags = regex_constants::match_default);
536
537template <class BidirectionalIterator, class charT, class traits>
538 bool
539 regex_match(BidirectionalIterator first, BidirectionalIterator last,
540 const basic_regex<charT, traits>& e,
541 regex_constants::match_flag_type flags = regex_constants::match_default);
542
543template <class charT, class Allocator, class traits>
544 bool
545 regex_match(const charT* str, match_results<const charT*, Allocator>& m,
546 const basic_regex<charT, traits>& e,
547 regex_constants::match_flag_type flags = regex_constants::match_default);
548
549template <class ST, class SA, class Allocator, class charT, class traits>
550 bool
551 regex_match(const basic_string<charT, ST, SA>& s,
552 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
553 const basic_regex<charT, traits>& e,
554 regex_constants::match_flag_type flags = regex_constants::match_default);
555
Marshall Clow8c950072014-02-19 21:21:11 +0000556template <class ST, class SA, class Allocator, class charT, class traits>
557 bool
558 regex_match(const basic_string<charT, ST, SA>&& s,
559 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
560 const basic_regex<charT, traits>& e,
561 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
562
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000563template <class charT, class traits>
564 bool
565 regex_match(const charT* str, const basic_regex<charT, traits>& e,
566 regex_constants::match_flag_type flags = regex_constants::match_default);
567
568template <class ST, class SA, class charT, class traits>
569 bool
570 regex_match(const basic_string<charT, ST, SA>& s,
571 const basic_regex<charT, traits>& e,
572 regex_constants::match_flag_type flags = regex_constants::match_default);
573
574template <class BidirectionalIterator, class Allocator, class charT, class traits>
575 bool
576 regex_search(BidirectionalIterator first, BidirectionalIterator last,
577 match_results<BidirectionalIterator, Allocator>& m,
578 const basic_regex<charT, traits>& e,
579 regex_constants::match_flag_type flags = regex_constants::match_default);
580
581template <class BidirectionalIterator, class charT, class traits>
582 bool
583 regex_search(BidirectionalIterator first, BidirectionalIterator last,
584 const basic_regex<charT, traits>& e,
585 regex_constants::match_flag_type flags = regex_constants::match_default);
586
587template <class charT, class Allocator, class traits>
588 bool
589 regex_search(const charT* str, match_results<const charT*, Allocator>& m,
590 const basic_regex<charT, traits>& e,
591 regex_constants::match_flag_type flags = regex_constants::match_default);
592
593template <class charT, class traits>
594 bool
595 regex_search(const charT* str, const basic_regex<charT, traits>& e,
596 regex_constants::match_flag_type flags = regex_constants::match_default);
597
598template <class ST, class SA, class charT, class traits>
599 bool
600 regex_search(const basic_string<charT, ST, SA>& s,
601 const basic_regex<charT, traits>& e,
602 regex_constants::match_flag_type flags = regex_constants::match_default);
603
604template <class ST, class SA, class Allocator, class charT, class traits>
605 bool
606 regex_search(const basic_string<charT, ST, SA>& s,
607 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
608 const basic_regex<charT, traits>& e,
609 regex_constants::match_flag_type flags = regex_constants::match_default);
610
Marshall Clow8c950072014-02-19 21:21:11 +0000611template <class ST, class SA, class Allocator, class charT, class traits>
612 bool
613 regex_search(const basic_string<charT, ST, SA>&& s,
614 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
615 const basic_regex<charT, traits>& e,
616 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
617
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000618template <class OutputIterator, class BidirectionalIterator,
619 class traits, class charT, class ST, class SA>
620 OutputIterator
621 regex_replace(OutputIterator out,
622 BidirectionalIterator first, BidirectionalIterator last,
623 const basic_regex<charT, traits>& e,
624 const basic_string<charT, ST, SA>& fmt,
625 regex_constants::match_flag_type flags = regex_constants::match_default);
626
627template <class OutputIterator, class BidirectionalIterator,
628 class traits, class charT>
629 OutputIterator
630 regex_replace(OutputIterator out,
631 BidirectionalIterator first, BidirectionalIterator last,
632 const basic_regex<charT, traits>& e, const charT* fmt,
633 regex_constants::match_flag_type flags = regex_constants::match_default);
634
635template <class traits, class charT, class ST, class SA, class FST, class FSA>>
636 basic_string<charT, ST, SA>
637 regex_replace(const basic_string<charT, ST, SA>& s,
638 const basic_regex<charT, traits>& e,
639 const basic_string<charT, FST, FSA>& fmt,
640 regex_constants::match_flag_type flags = regex_constants::match_default);
641
642template <class traits, class charT, class ST, class SA>
643 basic_string<charT, ST, SA>
644 regex_replace(const basic_string<charT, ST, SA>& s,
645 const basic_regex<charT, traits>& e, const charT* fmt,
646 regex_constants::match_flag_type flags = regex_constants::match_default);
647
648template <class traits, class charT, class ST, class SA>
649 basic_string<charT>
650 regex_replace(const charT* s,
651 const basic_regex<charT, traits>& e,
652 const basic_string<charT, ST, SA>& fmt,
653 regex_constants::match_flag_type flags = regex_constants::match_default);
654
655template <class traits, class charT>
656 basic_string<charT>
657 regex_replace(const charT* s,
658 const basic_regex<charT, traits>& e,
659 const charT* fmt,
660 regex_constants::match_flag_type flags = regex_constants::match_default);
661
662template <class BidirectionalIterator,
663 class charT = typename iterator_traits< BidirectionalIterator>::value_type,
664 class traits = regex_traits<charT>>
665class regex_iterator
666{
667public:
668 typedef basic_regex<charT, traits> regex_type;
669 typedef match_results<BidirectionalIterator> value_type;
670 typedef ptrdiff_t difference_type;
671 typedef const value_type* pointer;
672 typedef const value_type& reference;
673 typedef forward_iterator_tag iterator_category;
674
675 regex_iterator();
676 regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
677 const regex_type& re,
678 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +0000679 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
680 const regex_type&& __re,
681 regex_constants::match_flag_type __m
682 = regex_constants::match_default) = delete; // C++14
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000683 regex_iterator(const regex_iterator&);
684 regex_iterator& operator=(const regex_iterator&);
685
686 bool operator==(const regex_iterator&) const;
687 bool operator!=(const regex_iterator&) const;
688
689 const value_type& operator*() const;
690 const value_type* operator->() const;
691
692 regex_iterator& operator++();
693 regex_iterator operator++(int);
694};
695
696typedef regex_iterator<const char*> cregex_iterator;
697typedef regex_iterator<const wchar_t*> wcregex_iterator;
698typedef regex_iterator<string::const_iterator> sregex_iterator;
699typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
700
701template <class BidirectionalIterator,
702 class charT = typename iterator_traits< BidirectionalIterator>::value_type,
703 class traits = regex_traits<charT>>
704class regex_token_iterator
705{
706public:
707 typedef basic_regex<charT, traits> regex_type;
708 typedef sub_match<BidirectionalIterator> value_type;
709 typedef ptrdiff_t difference_type;
710 typedef const value_type* pointer;
711 typedef const value_type& reference;
712 typedef forward_iterator_tag iterator_category;
713
714 regex_token_iterator();
715 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
716 const regex_type& re, int submatch = 0,
717 regex_constants::match_flag_type m = regex_constants::match_default);
718 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Marshall Clow8c950072014-02-19 21:21:11 +0000719 const regex_type&& re, int submatch = 0,
720 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
721 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000722 const regex_type& re, const vector<int>& submatches,
723 regex_constants::match_flag_type m = regex_constants::match_default);
724 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Marshall Clow8c950072014-02-19 21:21:11 +0000725 const regex_type&& re, const vector<int>& submatches,
726 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
727 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000728 const regex_type& re, initializer_list<int> submatches,
729 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +0000730 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
731 const regex_type&& re, initializer_list<int> submatches,
732 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000733 template <size_t N>
734 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
735 const regex_type& re, const int (&submatches)[N],
736 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +0000737 template <size_t N>
738 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
739 const regex_type& re, const int (&submatches)[N],
740 regex_constants::match_flag_type m = regex_constants::match_default) = delete // C++14;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000741 regex_token_iterator(const regex_token_iterator&);
742 regex_token_iterator& operator=(const regex_token_iterator&);
743
744 bool operator==(const regex_token_iterator&) const;
745 bool operator!=(const regex_token_iterator&) const;
746
747 const value_type& operator*() const;
748 const value_type* operator->() const;
749
750 regex_token_iterator& operator++();
751 regex_token_iterator operator++(int);
752};
753
754typedef regex_token_iterator<const char*> cregex_token_iterator;
755typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
756typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
757typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
758
759} // std
760*/
761
762#include <__config>
763#include <stdexcept>
764#include <__locale>
Howard Hinnant6c891682010-06-24 21:28:00 +0000765#include <initializer_list>
Howard Hinnant67ad2132010-06-29 18:37:43 +0000766#include <utility>
767#include <iterator>
768#include <string>
Howard Hinnant65a3f3d2010-06-30 00:21:42 +0000769#include <memory>
770#include <vector>
Howard Hinnantaa0874c2010-07-12 15:51:17 +0000771#include <deque>
Marshall Clow0a1e7502018-09-12 19:41:40 +0000772#include <version>
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000773
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000774#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000775#pragma GCC system_header
Howard Hinnantaaaa52b2011-10-17 20:05:10 +0000776#endif
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000777
Eric Fiselierf4433a32017-05-31 22:07:49 +0000778_LIBCPP_PUSH_MACROS
779#include <__undef_macros>
780
781
Marshall Clowd39d21d2017-09-12 17:56:59 +0000782#define _LIBCPP_REGEX_COMPLEXITY_FACTOR 4096
783
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000784_LIBCPP_BEGIN_NAMESPACE_STD
785
786namespace regex_constants
787{
788
789// syntax_option_type
790
791enum syntax_option_type
792{
793 icase = 1 << 0,
794 nosubs = 1 << 1,
795 optimize = 1 << 2,
796 collate = 1 << 3,
Howard Hinnantebbc2b62010-07-27 17:24:17 +0000797 ECMAScript = 0,
798 basic = 1 << 4,
799 extended = 1 << 5,
800 awk = 1 << 6,
801 grep = 1 << 7,
802 egrep = 1 << 8
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000803};
804
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000805inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000806_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000807syntax_option_type
808operator~(syntax_option_type __x)
809{
Marshall Clow924cffa2013-03-22 02:13:55 +0000810 return syntax_option_type(~int(__x) & 0x1FF);
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000811}
812
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000813inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000814_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000815syntax_option_type
816operator&(syntax_option_type __x, syntax_option_type __y)
817{
818 return syntax_option_type(int(__x) & int(__y));
819}
820
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000821inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000822_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000823syntax_option_type
824operator|(syntax_option_type __x, syntax_option_type __y)
825{
826 return syntax_option_type(int(__x) | int(__y));
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, syntax_option_type __y)
833{
834 return syntax_option_type(int(__x) ^ int(__y));
835}
836
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000837inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000838syntax_option_type&
839operator&=(syntax_option_type& __x, syntax_option_type __y)
840{
841 __x = __x & __y;
842 return __x;
843}
844
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000845inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000846syntax_option_type&
847operator|=(syntax_option_type& __x, syntax_option_type __y)
848{
849 __x = __x | __y;
850 return __x;
851}
852
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000853inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000854syntax_option_type&
855operator^=(syntax_option_type& __x, syntax_option_type __y)
856{
857 __x = __x ^ __y;
858 return __x;
859}
860
861// match_flag_type
862
863enum match_flag_type
864{
865 match_default = 0,
866 match_not_bol = 1 << 0,
867 match_not_eol = 1 << 1,
868 match_not_bow = 1 << 2,
869 match_not_eow = 1 << 3,
870 match_any = 1 << 4,
871 match_not_null = 1 << 5,
872 match_continuous = 1 << 6,
873 match_prev_avail = 1 << 7,
874 format_default = 0,
875 format_sed = 1 << 8,
876 format_no_copy = 1 << 9,
Howard Hinnantd3925342010-08-16 20:21:16 +0000877 format_first_only = 1 << 10,
Tim Shen11113f52016-10-27 21:40:34 +0000878 __no_update_pos = 1 << 11,
879 __full_match = 1 << 12
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000880};
881
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000882inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000883_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000884match_flag_type
885operator~(match_flag_type __x)
886{
Marshall Clow924cffa2013-03-22 02:13:55 +0000887 return match_flag_type(~int(__x) & 0x0FFF);
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000888}
889
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000890inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000891_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000892match_flag_type
893operator&(match_flag_type __x, match_flag_type __y)
894{
895 return match_flag_type(int(__x) & int(__y));
896}
897
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000898inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +0000899_LIBCPP_CONSTEXPR
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000900match_flag_type
901operator|(match_flag_type __x, match_flag_type __y)
902{
903 return match_flag_type(int(__x) | int(__y));
904}
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, match_flag_type __y)
910{
911 return match_flag_type(int(__x) ^ int(__y));
912}
913
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000914inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000915match_flag_type&
916operator&=(match_flag_type& __x, match_flag_type __y)
917{
918 __x = __x & __y;
919 return __x;
920}
921
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000922inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000923match_flag_type&
924operator|=(match_flag_type& __x, match_flag_type __y)
925{
926 __x = __x | __y;
927 return __x;
928}
929
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000930inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000931match_flag_type&
932operator^=(match_flag_type& __x, match_flag_type __y)
933{
934 __x = __x ^ __y;
935 return __x;
936}
937
938enum error_type
939{
940 error_collate = 1,
941 error_ctype,
942 error_escape,
943 error_backref,
944 error_brack,
945 error_paren,
946 error_brace,
947 error_badbrace,
948 error_range,
949 error_space,
950 error_badrepeat,
951 error_complexity,
Howard Hinnant6c891682010-06-24 21:28:00 +0000952 error_stack,
Howard Hinnantebbc2b62010-07-27 17:24:17 +0000953 __re_err_grammar,
954 __re_err_empty,
955 __re_err_unknown
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000956};
957
958} // regex_constants
959
960class _LIBCPP_EXCEPTION_ABI regex_error
961 : public runtime_error
962{
963 regex_constants::error_type __code_;
964public:
965 explicit regex_error(regex_constants::error_type __ecode);
966 virtual ~regex_error() throw();
Howard Hinnant7ca9d942010-09-23 15:13:20 +0000967 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000968 regex_constants::error_type code() const {return __code_;}
969};
970
Marshall Clowc8ccc292015-07-28 13:30:47 +0000971template <regex_constants::error_type _Ev>
Louis Dionne16fe2952018-07-11 23:14:33 +0000972_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
Marshall Clowc8ccc292015-07-28 13:30:47 +0000973void __throw_regex_error()
974{
975#ifndef _LIBCPP_NO_EXCEPTIONS
Marshall Clow8bf61bb2015-08-17 21:14:16 +0000976 throw regex_error(_Ev);
977#else
Marshall Clow8fea1612016-08-25 15:09:01 +0000978 _VSTD::abort();
Marshall Clowc8ccc292015-07-28 13:30:47 +0000979#endif
980}
981
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000982template <class _CharT>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +0000983struct _LIBCPP_TEMPLATE_VIS regex_traits
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000984{
985public:
986 typedef _CharT char_type;
987 typedef basic_string<char_type> string_type;
988 typedef locale locale_type;
Howard Hinnant40b45e12010-06-21 21:01:43 +0000989 typedef ctype_base::mask char_class_type;
Howard Hinnanta3af5a32010-06-17 00:34:59 +0000990
Daniel Sanders81c0eea2016-02-17 13:16:31 +0000991#if defined(__mips__) && defined(__GLIBC__)
992 static const char_class_type __regex_word = static_cast<char_class_type>(_ISbit(15));
Michal Gorny3fbe8232018-12-16 09:18:26 +0000993#elif defined(__NetBSD__)
994 // NetBSD defines classes up to 0x2000
995 // see sys/ctype_bits.h, _CTYPE_Q
996 static const char_class_type __regex_word = 0x8000;
Daniel Sanders81c0eea2016-02-17 13:16:31 +0000997#else
Howard Hinnant40b45e12010-06-21 21:01:43 +0000998 static const char_class_type __regex_word = 0x80;
Daniel Sanders81c0eea2016-02-17 13:16:31 +0000999#endif
1000
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001001private:
1002 locale __loc_;
1003 const ctype<char_type>* __ct_;
1004 const collate<char_type>* __col_;
1005
1006public:
1007 regex_traits();
1008
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001009 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001010 static size_t length(const char_type* __p)
1011 {return char_traits<char_type>::length(__p);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001012 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001013 char_type translate(char_type __c) const {return __c;}
1014 char_type translate_nocase(char_type __c) const;
1015 template <class _ForwardIterator>
1016 string_type
1017 transform(_ForwardIterator __f, _ForwardIterator __l) const;
1018 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001019 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001020 string_type
1021 transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
1022 {return __transform_primary(__f, __l, char_type());}
1023 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001024 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001025 string_type
1026 lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
1027 {return __lookup_collatename(__f, __l, char_type());}
1028 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001029 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001030 char_class_type
1031 lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
Howard Hinnant40b45e12010-06-21 21:01:43 +00001032 bool __icase = false) const
1033 {return __lookup_classname(__f, __l, __icase, char_type());}
1034 bool isctype(char_type __c, char_class_type __m) const;
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001035 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant40b45e12010-06-21 21:01:43 +00001036 int value(char_type __ch, int __radix) const
Marshall Clowef420192013-10-21 15:43:25 +00001037 {return __regex_traits_value(__ch, __radix);}
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001038 locale_type imbue(locale_type __l);
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001039 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001040 locale_type getloc()const {return __loc_;}
1041
1042private:
1043 void __init();
1044
1045 template <class _ForwardIterator>
1046 string_type
1047 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
1048 template <class _ForwardIterator>
1049 string_type
1050 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
1051
1052 template <class _ForwardIterator>
1053 string_type
1054 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
1055 template <class _ForwardIterator>
1056 string_type
1057 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
Howard Hinnant40b45e12010-06-21 21:01:43 +00001058
1059 template <class _ForwardIterator>
1060 char_class_type
1061 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1062 bool __icase, char) const;
1063 template <class _ForwardIterator>
1064 char_class_type
1065 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1066 bool __icase, wchar_t) const;
1067
Marshall Clowef420192013-10-21 15:43:25 +00001068 static int __regex_traits_value(unsigned char __ch, int __radix);
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001069 _LIBCPP_INLINE_VISIBILITY
Marshall Clowef420192013-10-21 15:43:25 +00001070 int __regex_traits_value(char __ch, int __radix) const
1071 {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001072 _LIBCPP_INLINE_VISIBILITY
Marshall Clowef420192013-10-21 15:43:25 +00001073 int __regex_traits_value(wchar_t __ch, int __radix) const;
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001074};
1075
1076template <class _CharT>
Howard Hinnant592cb612013-03-07 19:38:08 +00001077const typename regex_traits<_CharT>::char_class_type
1078regex_traits<_CharT>::__regex_word;
1079
1080template <class _CharT>
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001081regex_traits<_CharT>::regex_traits()
1082{
1083 __init();
1084}
1085
1086template <class _CharT>
1087typename regex_traits<_CharT>::char_type
1088regex_traits<_CharT>::translate_nocase(char_type __c) const
1089{
1090 return __ct_->tolower(__c);
1091}
1092
1093template <class _CharT>
1094template <class _ForwardIterator>
1095typename regex_traits<_CharT>::string_type
1096regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
1097{
1098 string_type __s(__f, __l);
1099 return __col_->transform(__s.data(), __s.data() + __s.size());
1100}
1101
1102template <class _CharT>
1103void
1104regex_traits<_CharT>::__init()
1105{
1106 __ct_ = &use_facet<ctype<char_type> >(__loc_);
1107 __col_ = &use_facet<collate<char_type> >(__loc_);
1108}
1109
1110template <class _CharT>
1111typename regex_traits<_CharT>::locale_type
1112regex_traits<_CharT>::imbue(locale_type __l)
1113{
1114 locale __r = __loc_;
1115 __loc_ = __l;
1116 __init();
1117 return __r;
1118}
1119
1120// transform_primary is very FreeBSD-specific
1121
1122template <class _CharT>
1123template <class _ForwardIterator>
1124typename regex_traits<_CharT>::string_type
1125regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1126 _ForwardIterator __l, char) const
1127{
1128 const string_type __s(__f, __l);
1129 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1130 switch (__d.size())
1131 {
1132 case 1:
1133 break;
1134 case 12:
1135 __d[11] = __d[3];
1136 break;
1137 default:
1138 __d.clear();
1139 break;
1140 }
1141 return __d;
1142}
1143
1144template <class _CharT>
1145template <class _ForwardIterator>
1146typename regex_traits<_CharT>::string_type
1147regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1148 _ForwardIterator __l, wchar_t) const
1149{
1150 const string_type __s(__f, __l);
1151 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1152 switch (__d.size())
1153 {
1154 case 1:
1155 break;
1156 case 3:
1157 __d[2] = __d[0];
1158 break;
1159 default:
1160 __d.clear();
1161 break;
1162 }
1163 return __d;
1164}
1165
1166// lookup_collatename is very FreeBSD-specific
1167
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00001168_LIBCPP_FUNC_VIS string __get_collation_name(const char* __s);
Howard Hinnanta3af5a32010-06-17 00:34:59 +00001169
1170template <class _CharT>
1171template <class _ForwardIterator>
1172typename regex_traits<_CharT>::string_type
1173regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1174 _ForwardIterator __l, char) const
1175{
1176 string_type __s(__f, __l);
1177 string_type __r;
1178 if (!__s.empty())
1179 {
1180 __r = __get_collation_name(__s.c_str());
1181 if (__r.empty() && __s.size() <= 2)
1182 {
1183 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1184 if (__r.size() == 1 || __r.size() == 12)
1185 __r = __s;
1186 else
1187 __r.clear();
1188 }
1189 }
1190 return __r;
1191}
1192
1193template <class _CharT>
1194template <class _ForwardIterator>
1195typename regex_traits<_CharT>::string_type
1196regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1197 _ForwardIterator __l, wchar_t) const
1198{
1199 string_type __s(__f, __l);
1200 string __n;
1201 __n.reserve(__s.size());
1202 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1203 __i != __e; ++__i)
1204 {
1205 if (static_cast<unsigned>(*__i) >= 127)
1206 return string_type();
1207 __n.push_back(char(*__i));
1208 }
1209 string_type __r;
1210 if (!__s.empty())
1211 {
1212 __n = __get_collation_name(__n.c_str());
1213 if (!__n.empty())
1214 __r.assign(__n.begin(), __n.end());
1215 else if (__s.size() <= 2)
1216 {
1217 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1218 if (__r.size() == 1 || __r.size() == 3)
1219 __r = __s;
1220 else
1221 __r.clear();
1222 }
1223 }
1224 return __r;
1225}
1226
Howard Hinnant40b45e12010-06-21 21:01:43 +00001227// lookup_classname
1228
Dan Albert49f384c2014-07-29 19:23:39 +00001229regex_traits<char>::char_class_type _LIBCPP_FUNC_VIS
1230__get_classname(const char* __s, bool __icase);
Howard Hinnant40b45e12010-06-21 21:01:43 +00001231
1232template <class _CharT>
1233template <class _ForwardIterator>
1234typename regex_traits<_CharT>::char_class_type
1235regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1236 _ForwardIterator __l,
1237 bool __icase, char) const
1238{
1239 string_type __s(__f, __l);
1240 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1241 return __get_classname(__s.c_str(), __icase);
1242}
1243
1244template <class _CharT>
1245template <class _ForwardIterator>
1246typename regex_traits<_CharT>::char_class_type
1247regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1248 _ForwardIterator __l,
1249 bool __icase, wchar_t) const
1250{
1251 string_type __s(__f, __l);
1252 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1253 string __n;
1254 __n.reserve(__s.size());
1255 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1256 __i != __e; ++__i)
1257 {
1258 if (static_cast<unsigned>(*__i) >= 127)
1259 return char_class_type();
1260 __n.push_back(char(*__i));
1261 }
1262 return __get_classname(__n.c_str(), __icase);
1263}
1264
1265template <class _CharT>
1266bool
1267regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
1268{
1269 if (__ct_->is(__m, __c))
1270 return true;
1271 return (__c == '_' && (__m & __regex_word));
1272}
1273
1274template <class _CharT>
1275int
Marshall Clowef420192013-10-21 15:43:25 +00001276regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
Howard Hinnant40b45e12010-06-21 21:01:43 +00001277{
1278 if ((__ch & 0xF8u) == 0x30) // '0' <= __ch && __ch <= '7'
1279 return __ch - '0';
1280 if (__radix != 8)
1281 {
1282 if ((__ch & 0xFEu) == 0x38) // '8' <= __ch && __ch <= '9'
1283 return __ch - '0';
1284 if (__radix == 16)
1285 {
1286 __ch |= 0x20; // tolower
1287 if ('a' <= __ch && __ch <= 'f')
Howard Hinnant6c891682010-06-24 21:28:00 +00001288 return __ch - ('a' - 10);
Howard Hinnant40b45e12010-06-21 21:01:43 +00001289 }
1290 }
1291 return -1;
1292}
1293
1294template <class _CharT>
Evgeniy Stepanov2fb1cb62015-11-07 01:22:13 +00001295inline
Howard Hinnant40b45e12010-06-21 21:01:43 +00001296int
Marshall Clowef420192013-10-21 15:43:25 +00001297regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
Howard Hinnant40b45e12010-06-21 21:01:43 +00001298{
Marshall Clowef420192013-10-21 15:43:25 +00001299 return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
Howard Hinnant40b45e12010-06-21 21:01:43 +00001300}
1301
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001302template <class _CharT> class __node;
1303
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001304template <class _BidirectionalIterator> class _LIBCPP_TEMPLATE_VIS sub_match;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001305
Howard Hinnant70d27852010-07-27 01:25:38 +00001306template <class _BidirectionalIterator,
1307 class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00001308class _LIBCPP_TEMPLATE_VIS match_results;
Howard Hinnant70d27852010-07-27 01:25:38 +00001309
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001310template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001311struct __state
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001312{
1313 enum
1314 {
1315 __end_state = -1000,
1316 __consume_input, // -999
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001317 __begin_marked_expr, // -998
1318 __end_marked_expr, // -997
Howard Hinnant5bf96132010-07-08 17:43:58 +00001319 __pop_state, // -996
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001320 __accept_and_consume, // -995
1321 __accept_but_not_consume, // -994
1322 __reject, // -993
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001323 __split,
1324 __repeat
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001325 };
1326
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001327 int __do_;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001328 const _CharT* __first_;
1329 const _CharT* __current_;
1330 const _CharT* __last_;
1331 vector<sub_match<const _CharT*> > __sub_matches_;
1332 vector<pair<size_t, const _CharT*> > __loop_data_;
1333 const __node<_CharT>* __node_;
1334 regex_constants::match_flag_type __flags_;
Howard Hinnant066ba512011-03-26 20:02:27 +00001335 bool __at_first_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001336
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001337 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001338 __state()
1339 : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
1340 __node_(nullptr), __flags_() {}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001341};
1342
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001343// __node
Howard Hinnant67ad2132010-06-29 18:37:43 +00001344
1345template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001346class __node
Howard Hinnant67ad2132010-06-29 18:37:43 +00001347{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001348 __node(const __node&);
1349 __node& operator=(const __node&);
Howard Hinnant67ad2132010-06-29 18:37:43 +00001350public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001351 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant67ad2132010-06-29 18:37:43 +00001352
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001353 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001354 __node() {}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001355 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001356 virtual ~__node() {}
Howard Hinnant67ad2132010-06-29 18:37:43 +00001357
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001358 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierb41db9a2018-10-01 01:59:37 +00001359 virtual void __exec(__state&) const {}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001360 _LIBCPP_INLINE_VISIBILITY
Eric Fiselierb41db9a2018-10-01 01:59:37 +00001361 virtual void __exec_split(bool, __state&) const {}
Howard Hinnant67ad2132010-06-29 18:37:43 +00001362};
1363
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001364// __end_state
Howard Hinnant67ad2132010-06-29 18:37:43 +00001365
1366template <class _CharT>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001367class __end_state
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001368 : public __node<_CharT>
Howard Hinnant67ad2132010-06-29 18:37:43 +00001369{
Howard Hinnant67ad2132010-06-29 18:37:43 +00001370public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001371 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant67ad2132010-06-29 18:37:43 +00001372
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001373 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001374 __end_state() {}
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00001375
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001376 virtual void __exec(__state&) const;
Howard Hinnant67ad2132010-06-29 18:37:43 +00001377};
1378
1379template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001380void
1381__end_state<_CharT>::__exec(__state& __s) const
Howard Hinnant93ef6552010-06-30 20:30:19 +00001382{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001383 __s.__do_ = __state::__end_state;
Howard Hinnant93ef6552010-06-30 20:30:19 +00001384}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001385
1386// __has_one_state
1387
Howard Hinnant93ef6552010-06-30 20:30:19 +00001388template <class _CharT>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001389class __has_one_state
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001390 : public __node<_CharT>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00001391{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001392 __node<_CharT>* __first_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001393
1394public:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001395 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001396 explicit __has_one_state(__node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001397 : __first_(__s) {}
1398
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001399 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001400 __node<_CharT>* first() const {return __first_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001401 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001402 __node<_CharT>*& first() {return __first_;}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001403};
1404
1405// __owns_one_state
1406
1407template <class _CharT>
1408class __owns_one_state
1409 : public __has_one_state<_CharT>
1410{
1411 typedef __has_one_state<_CharT> base;
1412
1413public:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001414 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001415 explicit __owns_one_state(__node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001416 : base(__s) {}
1417
1418 virtual ~__owns_one_state();
1419};
1420
1421template <class _CharT>
1422__owns_one_state<_CharT>::~__owns_one_state()
1423{
1424 delete this->first();
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00001425}
1426
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001427// __empty_state
1428
1429template <class _CharT>
1430class __empty_state
1431 : public __owns_one_state<_CharT>
1432{
1433 typedef __owns_one_state<_CharT> base;
1434
1435public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001436 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001437
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001438 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001439 explicit __empty_state(__node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001440 : base(__s) {}
1441
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001442 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001443};
1444
1445template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001446void
1447__empty_state<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001448{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001449 __s.__do_ = __state::__accept_but_not_consume;
1450 __s.__node_ = this->first();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001451}
1452
1453// __empty_non_own_state
1454
1455template <class _CharT>
1456class __empty_non_own_state
1457 : public __has_one_state<_CharT>
1458{
1459 typedef __has_one_state<_CharT> base;
1460
1461public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001462 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001463
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001464 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001465 explicit __empty_non_own_state(__node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001466 : base(__s) {}
1467
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001468 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001469};
1470
1471template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001472void
1473__empty_non_own_state<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001474{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001475 __s.__do_ = __state::__accept_but_not_consume;
1476 __s.__node_ = this->first();
1477}
1478
1479// __repeat_one_loop
1480
1481template <class _CharT>
1482class __repeat_one_loop
1483 : public __has_one_state<_CharT>
1484{
1485 typedef __has_one_state<_CharT> base;
1486
1487public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001488 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001489
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001490 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001491 explicit __repeat_one_loop(__node<_CharT>* __s)
1492 : base(__s) {}
1493
1494 virtual void __exec(__state&) const;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001495};
1496
1497template <class _CharT>
1498void
1499__repeat_one_loop<_CharT>::__exec(__state& __s) const
1500{
1501 __s.__do_ = __state::__repeat;
1502 __s.__node_ = this->first();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001503}
1504
1505// __owns_two_states
1506
1507template <class _CharT>
1508class __owns_two_states
1509 : public __owns_one_state<_CharT>
1510{
1511 typedef __owns_one_state<_CharT> base;
1512
1513 base* __second_;
1514
1515public:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001516 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001517 explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001518 : base(__s1), __second_(__s2) {}
1519
1520 virtual ~__owns_two_states();
1521
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001522 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001523 base* second() const {return __second_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001524 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001525 base*& second() {return __second_;}
1526};
1527
1528template <class _CharT>
1529__owns_two_states<_CharT>::~__owns_two_states()
1530{
1531 delete __second_;
1532}
1533
1534// __loop
1535
1536template <class _CharT>
1537class __loop
1538 : public __owns_two_states<_CharT>
1539{
1540 typedef __owns_two_states<_CharT> base;
1541
1542 size_t __min_;
1543 size_t __max_;
1544 unsigned __loop_id_;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001545 unsigned __mexp_begin_;
1546 unsigned __mexp_end_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001547 bool __greedy_;
1548
1549public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001550 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001551
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001552 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001553 explicit __loop(unsigned __loop_id,
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001554 __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
1555 unsigned __mexp_begin, unsigned __mexp_end,
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001556 bool __greedy = true,
1557 size_t __min = 0,
1558 size_t __max = numeric_limits<size_t>::max())
1559 : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001560 __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001561 __greedy_(__greedy) {}
1562
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001563 virtual void __exec(__state& __s) const;
1564 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnant5bf96132010-07-08 17:43:58 +00001565
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001566private:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001567 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001568 void __init_repeat(__state& __s) const
1569 {
1570 __s.__loop_data_[__loop_id_].second = __s.__current_;
1571 for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
1572 {
1573 __s.__sub_matches_[__i].first = __s.__last_;
1574 __s.__sub_matches_[__i].second = __s.__last_;
1575 __s.__sub_matches_[__i].matched = false;
1576 }
1577 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001578};
1579
1580template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001581void
1582__loop<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001583{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001584 if (__s.__do_ == __state::__repeat)
1585 {
1586 bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
1587 bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
1588 if (__do_repeat && __do_alt &&
1589 __s.__loop_data_[__loop_id_].second == __s.__current_)
1590 __do_repeat = false;
1591 if (__do_repeat && __do_alt)
1592 __s.__do_ = __state::__split;
1593 else if (__do_repeat)
1594 {
1595 __s.__do_ = __state::__accept_but_not_consume;
1596 __s.__node_ = this->first();
1597 __init_repeat(__s);
1598 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001599 else
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001600 {
1601 __s.__do_ = __state::__accept_but_not_consume;
1602 __s.__node_ = this->second();
1603 }
1604 }
1605 else
1606 {
Howard Hinnantebbc2b62010-07-27 17:24:17 +00001607 __s.__loop_data_[__loop_id_].first = 0;
1608 bool __do_repeat = 0 < __max_;
1609 bool __do_alt = 0 >= __min_;
1610 if (__do_repeat && __do_alt)
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001611 __s.__do_ = __state::__split;
Howard Hinnantebbc2b62010-07-27 17:24:17 +00001612 else if (__do_repeat)
1613 {
1614 __s.__do_ = __state::__accept_but_not_consume;
1615 __s.__node_ = this->first();
1616 __init_repeat(__s);
1617 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001618 else
1619 {
1620 __s.__do_ = __state::__accept_but_not_consume;
1621 __s.__node_ = this->second();
1622 }
1623 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001624}
1625
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001626template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001627void
1628__loop<_CharT>::__exec_split(bool __second, __state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001629{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001630 __s.__do_ = __state::__accept_but_not_consume;
1631 if (__greedy_ != __second)
Howard Hinnant5bf96132010-07-08 17:43:58 +00001632 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001633 __s.__node_ = this->first();
1634 __init_repeat(__s);
Howard Hinnant5bf96132010-07-08 17:43:58 +00001635 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001636 else
1637 __s.__node_ = this->second();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001638}
1639
Howard Hinnant16d65422010-07-16 19:08:36 +00001640// __alternate
1641
1642template <class _CharT>
1643class __alternate
1644 : public __owns_two_states<_CharT>
1645{
1646 typedef __owns_two_states<_CharT> base;
1647
1648public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001649 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant16d65422010-07-16 19:08:36 +00001650
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001651 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant16d65422010-07-16 19:08:36 +00001652 explicit __alternate(__owns_one_state<_CharT>* __s1,
1653 __owns_one_state<_CharT>* __s2)
1654 : base(__s1, __s2) {}
1655
1656 virtual void __exec(__state& __s) const;
1657 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnant16d65422010-07-16 19:08:36 +00001658};
1659
1660template <class _CharT>
1661void
1662__alternate<_CharT>::__exec(__state& __s) const
1663{
1664 __s.__do_ = __state::__split;
1665}
1666
1667template <class _CharT>
1668void
1669__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
1670{
1671 __s.__do_ = __state::__accept_but_not_consume;
Howard Hinnantcbf2f3f2010-07-22 14:12:20 +00001672 if (__second)
Howard Hinnant16d65422010-07-16 19:08:36 +00001673 __s.__node_ = this->second();
Howard Hinnantcbf2f3f2010-07-22 14:12:20 +00001674 else
1675 __s.__node_ = this->first();
Howard Hinnant16d65422010-07-16 19:08:36 +00001676}
1677
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001678// __begin_marked_subexpression
1679
1680template <class _CharT>
1681class __begin_marked_subexpression
1682 : public __owns_one_state<_CharT>
1683{
1684 typedef __owns_one_state<_CharT> base;
1685
Howard Hinnant5bf96132010-07-08 17:43:58 +00001686 unsigned __mexp_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001687public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001688 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001689
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001690 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001691 explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnant5bf96132010-07-08 17:43:58 +00001692 : base(__s), __mexp_(__mexp) {}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001693
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001694 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001695};
1696
1697template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001698void
1699__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001700{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001701 __s.__do_ = __state::__accept_but_not_consume;
1702 __s.__sub_matches_[__mexp_-1].first = __s.__current_;
1703 __s.__node_ = this->first();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001704}
1705
1706// __end_marked_subexpression
1707
1708template <class _CharT>
1709class __end_marked_subexpression
1710 : public __owns_one_state<_CharT>
1711{
1712 typedef __owns_one_state<_CharT> base;
1713
Howard Hinnant5bf96132010-07-08 17:43:58 +00001714 unsigned __mexp_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001715public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001716 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001717
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001718 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001719 explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnant5bf96132010-07-08 17:43:58 +00001720 : base(__s), __mexp_(__mexp) {}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001721
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001722 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001723};
1724
1725template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001726void
1727__end_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001728{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00001729 __s.__do_ = __state::__accept_but_not_consume;
1730 __s.__sub_matches_[__mexp_-1].second = __s.__current_;
1731 __s.__sub_matches_[__mexp_-1].matched = true;
1732 __s.__node_ = this->first();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00001733}
1734
Howard Hinnant2a315e32010-07-12 18:16:05 +00001735// __back_ref
1736
1737template <class _CharT>
1738class __back_ref
1739 : public __owns_one_state<_CharT>
1740{
1741 typedef __owns_one_state<_CharT> base;
1742
1743 unsigned __mexp_;
1744public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001745 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant2a315e32010-07-12 18:16:05 +00001746
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001747 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2a315e32010-07-12 18:16:05 +00001748 explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
1749 : base(__s), __mexp_(__mexp) {}
1750
1751 virtual void __exec(__state&) const;
Howard Hinnant2a315e32010-07-12 18:16:05 +00001752};
1753
1754template <class _CharT>
1755void
1756__back_ref<_CharT>::__exec(__state& __s) const
1757{
Marshall Clow360e8392015-08-24 15:57:09 +00001758 if (__mexp_ > __s.__sub_matches_.size())
1759 __throw_regex_error<regex_constants::error_backref>();
Howard Hinnant2a315e32010-07-12 18:16:05 +00001760 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1761 if (__sm.matched)
1762 {
1763 ptrdiff_t __len = __sm.second - __sm.first;
1764 if (__s.__last_ - __s.__current_ >= __len &&
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001765 _VSTD::equal(__sm.first, __sm.second, __s.__current_))
Howard Hinnant2a315e32010-07-12 18:16:05 +00001766 {
1767 __s.__do_ = __state::__accept_but_not_consume;
1768 __s.__current_ += __len;
1769 __s.__node_ = this->first();
1770 }
1771 else
1772 {
1773 __s.__do_ = __state::__reject;
1774 __s.__node_ = nullptr;
1775 }
1776 }
1777 else
1778 {
1779 __s.__do_ = __state::__reject;
1780 __s.__node_ = nullptr;
1781 }
1782}
1783
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001784// __back_ref_icase
1785
1786template <class _CharT, class _Traits>
1787class __back_ref_icase
1788 : public __owns_one_state<_CharT>
1789{
1790 typedef __owns_one_state<_CharT> base;
1791
1792 _Traits __traits_;
1793 unsigned __mexp_;
1794public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001795 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001796
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001797 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001798 explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
1799 __node<_CharT>* __s)
1800 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1801
1802 virtual void __exec(__state&) const;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001803};
1804
1805template <class _CharT, class _Traits>
1806void
1807__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
1808{
1809 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1810 if (__sm.matched)
1811 {
1812 ptrdiff_t __len = __sm.second - __sm.first;
1813 if (__s.__last_ - __s.__current_ >= __len)
1814 {
1815 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1816 {
1817 if (__traits_.translate_nocase(__sm.first[__i]) !=
1818 __traits_.translate_nocase(__s.__current_[__i]))
1819 goto __not_equal;
1820 }
1821 __s.__do_ = __state::__accept_but_not_consume;
1822 __s.__current_ += __len;
1823 __s.__node_ = this->first();
1824 }
1825 else
1826 {
1827 __s.__do_ = __state::__reject;
1828 __s.__node_ = nullptr;
1829 }
1830 }
1831 else
1832 {
1833__not_equal:
1834 __s.__do_ = __state::__reject;
1835 __s.__node_ = nullptr;
1836 }
1837}
1838
1839// __back_ref_collate
1840
1841template <class _CharT, class _Traits>
1842class __back_ref_collate
1843 : public __owns_one_state<_CharT>
1844{
1845 typedef __owns_one_state<_CharT> base;
1846
1847 _Traits __traits_;
1848 unsigned __mexp_;
1849public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001850 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001851
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001852 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001853 explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
1854 __node<_CharT>* __s)
1855 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1856
1857 virtual void __exec(__state&) const;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00001858};
1859
1860template <class _CharT, class _Traits>
1861void
1862__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
1863{
1864 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1865 if (__sm.matched)
1866 {
1867 ptrdiff_t __len = __sm.second - __sm.first;
1868 if (__s.__last_ - __s.__current_ >= __len)
1869 {
1870 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1871 {
1872 if (__traits_.translate(__sm.first[__i]) !=
1873 __traits_.translate(__s.__current_[__i]))
1874 goto __not_equal;
1875 }
1876 __s.__do_ = __state::__accept_but_not_consume;
1877 __s.__current_ += __len;
1878 __s.__node_ = this->first();
1879 }
1880 else
1881 {
1882 __s.__do_ = __state::__reject;
1883 __s.__node_ = nullptr;
1884 }
1885 }
1886 else
1887 {
1888__not_equal:
1889 __s.__do_ = __state::__reject;
1890 __s.__node_ = nullptr;
1891 }
1892}
1893
Howard Hinnant70d27852010-07-27 01:25:38 +00001894// __word_boundary
1895
1896template <class _CharT, class _Traits>
1897class __word_boundary
1898 : public __owns_one_state<_CharT>
1899{
1900 typedef __owns_one_state<_CharT> base;
1901
1902 _Traits __traits_;
1903 bool __invert_;
1904public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001905 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant70d27852010-07-27 01:25:38 +00001906
Howard Hinnant7ca9d942010-09-23 15:13:20 +00001907 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70d27852010-07-27 01:25:38 +00001908 explicit __word_boundary(const _Traits& __traits, bool __invert,
1909 __node<_CharT>* __s)
1910 : base(__s), __traits_(__traits), __invert_(__invert) {}
1911
1912 virtual void __exec(__state&) const;
Howard Hinnant70d27852010-07-27 01:25:38 +00001913};
1914
1915template <class _CharT, class _Traits>
1916void
1917__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
1918{
1919 bool __is_word_b = false;
1920 if (__s.__first_ != __s.__last_)
1921 {
1922 if (__s.__current_ == __s.__last_)
1923 {
1924 if (!(__s.__flags_ & regex_constants::match_not_eow))
1925 {
1926 _CharT __c = __s.__current_[-1];
1927 __is_word_b = __c == '_' ||
1928 __traits_.isctype(__c, ctype_base::alnum);
1929 }
1930 }
Howard Hinnant6b2602a2010-07-29 15:17:28 +00001931 else if (__s.__current_ == __s.__first_ &&
1932 !(__s.__flags_ & regex_constants::match_prev_avail))
Howard Hinnant70d27852010-07-27 01:25:38 +00001933 {
1934 if (!(__s.__flags_ & regex_constants::match_not_bow))
1935 {
1936 _CharT __c = *__s.__current_;
1937 __is_word_b = __c == '_' ||
1938 __traits_.isctype(__c, ctype_base::alnum);
1939 }
1940 }
1941 else
1942 {
1943 _CharT __c1 = __s.__current_[-1];
1944 _CharT __c2 = *__s.__current_;
1945 bool __is_c1_b = __c1 == '_' ||
1946 __traits_.isctype(__c1, ctype_base::alnum);
1947 bool __is_c2_b = __c2 == '_' ||
1948 __traits_.isctype(__c2, ctype_base::alnum);
1949 __is_word_b = __is_c1_b != __is_c2_b;
1950 }
1951 }
1952 if (__is_word_b != __invert_)
1953 {
1954 __s.__do_ = __state::__accept_but_not_consume;
1955 __s.__node_ = this->first();
1956 }
1957 else
1958 {
1959 __s.__do_ = __state::__reject;
1960 __s.__node_ = nullptr;
1961 }
1962}
1963
Howard Hinnant066ba512011-03-26 20:02:27 +00001964// __l_anchor
1965
1966template <class _CharT>
1967class __l_anchor
1968 : public __owns_one_state<_CharT>
1969{
1970 typedef __owns_one_state<_CharT> base;
1971
1972public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00001973 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant066ba512011-03-26 20:02:27 +00001974
1975 _LIBCPP_INLINE_VISIBILITY
1976 __l_anchor(__node<_CharT>* __s)
1977 : base(__s) {}
1978
1979 virtual void __exec(__state&) const;
1980};
1981
1982template <class _CharT>
1983void
1984__l_anchor<_CharT>::__exec(__state& __s) const
1985{
Marshall Clow54404392015-03-19 17:05:59 +00001986 if (__s.__at_first_ && __s.__current_ == __s.__first_ &&
1987 !(__s.__flags_ & regex_constants::match_not_bol))
Howard Hinnant066ba512011-03-26 20:02:27 +00001988 {
1989 __s.__do_ = __state::__accept_but_not_consume;
1990 __s.__node_ = this->first();
1991 }
1992 else
1993 {
1994 __s.__do_ = __state::__reject;
1995 __s.__node_ = nullptr;
1996 }
1997}
1998
Howard Hinnantaad0aa62010-07-09 00:15:26 +00001999// __r_anchor
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002000
2001template <class _CharT>
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002002class __r_anchor
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002003 : public __owns_one_state<_CharT>
2004{
2005 typedef __owns_one_state<_CharT> base;
2006
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002007public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002008 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002009
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002010 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002011 __r_anchor(__node<_CharT>* __s)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002012 : base(__s) {}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002013
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002014 virtual void __exec(__state&) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002015};
2016
2017template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002018void
2019__r_anchor<_CharT>::__exec(__state& __s) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002020{
Marshall Clow54404392015-03-19 17:05:59 +00002021 if (__s.__current_ == __s.__last_ &&
2022 !(__s.__flags_ & regex_constants::match_not_eol))
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002023 {
2024 __s.__do_ = __state::__accept_but_not_consume;
2025 __s.__node_ = this->first();
2026 }
2027 else
2028 {
2029 __s.__do_ = __state::__reject;
2030 __s.__node_ = nullptr;
2031 }
2032}
2033
2034// __match_any
2035
2036template <class _CharT>
2037class __match_any
2038 : public __owns_one_state<_CharT>
2039{
2040 typedef __owns_one_state<_CharT> base;
2041
2042public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002043 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002044
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002045 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002046 __match_any(__node<_CharT>* __s)
2047 : base(__s) {}
2048
2049 virtual void __exec(__state&) const;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002050};
2051
2052template <class _CharT>
2053void
2054__match_any<_CharT>::__exec(__state& __s) const
2055{
2056 if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
2057 {
2058 __s.__do_ = __state::__accept_and_consume;
2059 ++__s.__current_;
2060 __s.__node_ = this->first();
2061 }
2062 else
2063 {
2064 __s.__do_ = __state::__reject;
2065 __s.__node_ = nullptr;
2066 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002067}
2068
Howard Hinnant70d27852010-07-27 01:25:38 +00002069// __match_any_but_newline
2070
2071template <class _CharT>
2072class __match_any_but_newline
2073 : public __owns_one_state<_CharT>
2074{
2075 typedef __owns_one_state<_CharT> base;
2076
2077public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002078 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant70d27852010-07-27 01:25:38 +00002079
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002080 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70d27852010-07-27 01:25:38 +00002081 __match_any_but_newline(__node<_CharT>* __s)
2082 : base(__s) {}
2083
2084 virtual void __exec(__state&) const;
Howard Hinnant70d27852010-07-27 01:25:38 +00002085};
2086
Howard Hinnanta37d3cf2013-08-12 18:38:34 +00002087template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
2088template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
2089
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002090// __match_char
2091
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002092template <class _CharT>
Howard Hinnant67ad2132010-06-29 18:37:43 +00002093class __match_char
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002094 : public __owns_one_state<_CharT>
Howard Hinnant67ad2132010-06-29 18:37:43 +00002095{
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002096 typedef __owns_one_state<_CharT> base;
2097
Howard Hinnant67ad2132010-06-29 18:37:43 +00002098 _CharT __c_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002099
2100 __match_char(const __match_char&);
2101 __match_char& operator=(const __match_char&);
Howard Hinnant67ad2132010-06-29 18:37:43 +00002102public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002103 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant93ef6552010-06-30 20:30:19 +00002104
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002105 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002106 __match_char(_CharT __c, __node<_CharT>* __s)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002107 : base(__s), __c_(__c) {}
Howard Hinnant67ad2132010-06-29 18:37:43 +00002108
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002109 virtual void __exec(__state&) const;
Howard Hinnant67ad2132010-06-29 18:37:43 +00002110};
2111
Howard Hinnant93ef6552010-06-30 20:30:19 +00002112template <class _CharT>
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002113void
2114__match_char<_CharT>::__exec(__state& __s) const
Howard Hinnant93ef6552010-06-30 20:30:19 +00002115{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002116 if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2117 {
2118 __s.__do_ = __state::__accept_and_consume;
2119 ++__s.__current_;
2120 __s.__node_ = this->first();
2121 }
2122 else
2123 {
2124 __s.__do_ = __state::__reject;
2125 __s.__node_ = nullptr;
2126 }
Howard Hinnant93ef6552010-06-30 20:30:19 +00002127}
Howard Hinnant93ef6552010-06-30 20:30:19 +00002128
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002129// __match_char_icase
2130
2131template <class _CharT, class _Traits>
2132class __match_char_icase
2133 : public __owns_one_state<_CharT>
2134{
2135 typedef __owns_one_state<_CharT> base;
2136
2137 _Traits __traits_;
2138 _CharT __c_;
2139
2140 __match_char_icase(const __match_char_icase&);
2141 __match_char_icase& operator=(const __match_char_icase&);
2142public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002143 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002144
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002145 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002146 __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2147 : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2148
2149 virtual void __exec(__state&) const;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002150};
2151
2152template <class _CharT, class _Traits>
2153void
2154__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2155{
2156 if (__s.__current_ != __s.__last_ &&
2157 __traits_.translate_nocase(*__s.__current_) == __c_)
2158 {
2159 __s.__do_ = __state::__accept_and_consume;
2160 ++__s.__current_;
2161 __s.__node_ = this->first();
2162 }
2163 else
2164 {
2165 __s.__do_ = __state::__reject;
2166 __s.__node_ = nullptr;
2167 }
2168}
2169
2170// __match_char_collate
2171
2172template <class _CharT, class _Traits>
2173class __match_char_collate
2174 : public __owns_one_state<_CharT>
2175{
2176 typedef __owns_one_state<_CharT> base;
2177
2178 _Traits __traits_;
2179 _CharT __c_;
2180
2181 __match_char_collate(const __match_char_collate&);
2182 __match_char_collate& operator=(const __match_char_collate&);
2183public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002184 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002185
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002186 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002187 __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2188 : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2189
2190 virtual void __exec(__state&) const;
Howard Hinnantcfe8d272010-07-12 19:11:27 +00002191};
2192
2193template <class _CharT, class _Traits>
2194void
2195__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2196{
2197 if (__s.__current_ != __s.__last_ &&
2198 __traits_.translate(*__s.__current_) == __c_)
2199 {
2200 __s.__do_ = __state::__accept_and_consume;
2201 ++__s.__current_;
2202 __s.__node_ = this->first();
2203 }
2204 else
2205 {
2206 __s.__do_ = __state::__reject;
2207 __s.__node_ = nullptr;
2208 }
2209}
2210
Howard Hinnant3034c902010-07-13 21:48:06 +00002211// __bracket_expression
2212
2213template <class _CharT, class _Traits>
2214class __bracket_expression
2215 : public __owns_one_state<_CharT>
2216{
2217 typedef __owns_one_state<_CharT> base;
2218 typedef typename _Traits::string_type string_type;
2219
2220 _Traits __traits_;
2221 vector<_CharT> __chars_;
Howard Hinnant70b3e192010-07-28 17:35:27 +00002222 vector<_CharT> __neg_chars_;
Howard Hinnant3034c902010-07-13 21:48:06 +00002223 vector<pair<string_type, string_type> > __ranges_;
2224 vector<pair<_CharT, _CharT> > __digraphs_;
2225 vector<string_type> __equivalences_;
Dan Albert49f384c2014-07-29 19:23:39 +00002226 typename regex_traits<_CharT>::char_class_type __mask_;
2227 typename regex_traits<_CharT>::char_class_type __neg_mask_;
Howard Hinnant3034c902010-07-13 21:48:06 +00002228 bool __negate_;
2229 bool __icase_;
2230 bool __collate_;
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002231 bool __might_have_digraph_;
Howard Hinnant3034c902010-07-13 21:48:06 +00002232
2233 __bracket_expression(const __bracket_expression&);
2234 __bracket_expression& operator=(const __bracket_expression&);
2235public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002236 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant3034c902010-07-13 21:48:06 +00002237
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002238 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002239 __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2240 bool __negate, bool __icase, bool __collate)
Howard Hinnant70b3e192010-07-28 17:35:27 +00002241 : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2242 __negate_(__negate), __icase_(__icase), __collate_(__collate),
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002243 __might_have_digraph_(__traits_.getloc().name() != "C") {}
Howard Hinnant3034c902010-07-13 21:48:06 +00002244
2245 virtual void __exec(__state&) const;
2246
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002247 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70b3e192010-07-28 17:35:27 +00002248 bool __negated() const {return __negate_;}
2249
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002250 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002251 void __add_char(_CharT __c)
2252 {
2253 if (__icase_)
2254 __chars_.push_back(__traits_.translate_nocase(__c));
2255 else if (__collate_)
2256 __chars_.push_back(__traits_.translate(__c));
2257 else
2258 __chars_.push_back(__c);
2259 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002260 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70b3e192010-07-28 17:35:27 +00002261 void __add_neg_char(_CharT __c)
2262 {
2263 if (__icase_)
2264 __neg_chars_.push_back(__traits_.translate_nocase(__c));
2265 else if (__collate_)
2266 __neg_chars_.push_back(__traits_.translate(__c));
2267 else
2268 __neg_chars_.push_back(__c);
2269 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002270 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002271 void __add_range(string_type __b, string_type __e)
2272 {
2273 if (__collate_)
2274 {
2275 if (__icase_)
2276 {
2277 for (size_t __i = 0; __i < __b.size(); ++__i)
2278 __b[__i] = __traits_.translate_nocase(__b[__i]);
2279 for (size_t __i = 0; __i < __e.size(); ++__i)
2280 __e[__i] = __traits_.translate_nocase(__e[__i]);
2281 }
2282 else
2283 {
2284 for (size_t __i = 0; __i < __b.size(); ++__i)
2285 __b[__i] = __traits_.translate(__b[__i]);
2286 for (size_t __i = 0; __i < __e.size(); ++__i)
2287 __e[__i] = __traits_.translate(__e[__i]);
2288 }
2289 __ranges_.push_back(make_pair(
2290 __traits_.transform(__b.begin(), __b.end()),
2291 __traits_.transform(__e.begin(), __e.end())));
2292 }
2293 else
2294 {
2295 if (__b.size() != 1 || __e.size() != 1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00002296 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant3034c902010-07-13 21:48:06 +00002297 if (__icase_)
2298 {
2299 __b[0] = __traits_.translate_nocase(__b[0]);
2300 __e[0] = __traits_.translate_nocase(__e[0]);
2301 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002302 __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
Howard Hinnant3034c902010-07-13 21:48:06 +00002303 }
2304 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002306 void __add_digraph(_CharT __c1, _CharT __c2)
2307 {
2308 if (__icase_)
2309 __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
2310 __traits_.translate_nocase(__c2)));
2311 else if (__collate_)
2312 __digraphs_.push_back(make_pair(__traits_.translate(__c1),
2313 __traits_.translate(__c2)));
2314 else
2315 __digraphs_.push_back(make_pair(__c1, __c2));
2316 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002317 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3034c902010-07-13 21:48:06 +00002318 void __add_equivalence(const string_type& __s)
2319 {__equivalences_.push_back(__s);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002320 _LIBCPP_INLINE_VISIBILITY
Dan Albert49f384c2014-07-29 19:23:39 +00002321 void __add_class(typename regex_traits<_CharT>::char_class_type __mask)
Howard Hinnant3034c902010-07-13 21:48:06 +00002322 {__mask_ |= __mask;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002323 _LIBCPP_INLINE_VISIBILITY
Dan Albert49f384c2014-07-29 19:23:39 +00002324 void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask)
Howard Hinnant70b3e192010-07-28 17:35:27 +00002325 {__neg_mask_ |= __mask;}
Howard Hinnant3034c902010-07-13 21:48:06 +00002326};
2327
2328template <class _CharT, class _Traits>
2329void
2330__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2331{
2332 bool __found = false;
2333 unsigned __consumed = 0;
2334 if (__s.__current_ != __s.__last_)
2335 {
2336 ++__consumed;
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002337 if (__might_have_digraph_)
Howard Hinnant3034c902010-07-13 21:48:06 +00002338 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002339 const _CharT* __next = _VSTD::next(__s.__current_);
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002340 if (__next != __s.__last_)
Howard Hinnant3034c902010-07-13 21:48:06 +00002341 {
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002342 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2343 if (__icase_)
Howard Hinnant3034c902010-07-13 21:48:06 +00002344 {
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00002345 __ch2.first = __traits_.translate_nocase(__ch2.first);
2346 __ch2.second = __traits_.translate_nocase(__ch2.second);
2347 }
2348 else if (__collate_)
2349 {
2350 __ch2.first = __traits_.translate(__ch2.first);
2351 __ch2.second = __traits_.translate(__ch2.second);
2352 }
2353 if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2354 {
2355 // __ch2 is a digraph in this locale
2356 ++__consumed;
2357 for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2358 {
2359 if (__ch2 == __digraphs_[__i])
2360 {
2361 __found = true;
2362 goto __exit;
2363 }
2364 }
2365 if (__collate_ && !__ranges_.empty())
2366 {
2367 string_type __s2 = __traits_.transform(&__ch2.first,
2368 &__ch2.first + 2);
2369 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2370 {
2371 if (__ranges_[__i].first <= __s2 &&
2372 __s2 <= __ranges_[__i].second)
2373 {
2374 __found = true;
2375 goto __exit;
2376 }
2377 }
2378 }
2379 if (!__equivalences_.empty())
2380 {
2381 string_type __s2 = __traits_.transform_primary(&__ch2.first,
2382 &__ch2.first + 2);
2383 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2384 {
2385 if (__s2 == __equivalences_[__i])
2386 {
2387 __found = true;
2388 goto __exit;
2389 }
2390 }
2391 }
2392 if (__traits_.isctype(__ch2.first, __mask_) &&
2393 __traits_.isctype(__ch2.second, __mask_))
Howard Hinnant3034c902010-07-13 21:48:06 +00002394 {
2395 __found = true;
2396 goto __exit;
2397 }
Howard Hinnant70b3e192010-07-28 17:35:27 +00002398 if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2399 !__traits_.isctype(__ch2.second, __neg_mask_))
2400 {
2401 __found = true;
2402 goto __exit;
2403 }
Howard Hinnant3034c902010-07-13 21:48:06 +00002404 goto __exit;
2405 }
Howard Hinnant3034c902010-07-13 21:48:06 +00002406 }
2407 }
2408 // test *__s.__current_ as not a digraph
2409 _CharT __ch = *__s.__current_;
2410 if (__icase_)
2411 __ch = __traits_.translate_nocase(__ch);
2412 else if (__collate_)
2413 __ch = __traits_.translate(__ch);
2414 for (size_t __i = 0; __i < __chars_.size(); ++__i)
2415 {
2416 if (__ch == __chars_[__i])
2417 {
2418 __found = true;
2419 goto __exit;
2420 }
2421 }
Louis Dionne9023f022018-08-24 14:10:28 +00002422 // When there's at least one of __neg_chars_ and __neg_mask_, the set
2423 // of "__found" chars is
Marshall Clow42af8d92017-10-18 16:49:22 +00002424 // union(complement(union(__neg_chars_, __neg_mask_)),
2425 // other cases...)
2426 //
Louis Dionne9023f022018-08-24 14:10:28 +00002427 // It doesn't make sense to check this when there are no __neg_chars_
2428 // and no __neg_mask_.
2429 if (!(__neg_mask_ == 0 && __neg_chars_.empty()))
Howard Hinnant70b3e192010-07-28 17:35:27 +00002430 {
Louis Dionne9023f022018-08-24 14:10:28 +00002431 const bool __in_neg_mask = __traits_.isctype(__ch, __neg_mask_);
Marshall Clow42af8d92017-10-18 16:49:22 +00002432 const bool __in_neg_chars =
Marshall Clow42af8d92017-10-18 16:49:22 +00002433 std::find(__neg_chars_.begin(), __neg_chars_.end(), __ch) !=
2434 __neg_chars_.end();
2435 if (!(__in_neg_mask || __in_neg_chars))
2436 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00002437 __found = true;
2438 goto __exit;
Marshall Clow42af8d92017-10-18 16:49:22 +00002439 }
Howard Hinnant70b3e192010-07-28 17:35:27 +00002440 }
Howard Hinnant3034c902010-07-13 21:48:06 +00002441 if (!__ranges_.empty())
2442 {
2443 string_type __s2 = __collate_ ?
2444 __traits_.transform(&__ch, &__ch + 1) :
2445 string_type(1, __ch);
2446 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2447 {
2448 if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2449 {
2450 __found = true;
2451 goto __exit;
2452 }
2453 }
2454 }
2455 if (!__equivalences_.empty())
2456 {
2457 string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2458 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2459 {
2460 if (__s2 == __equivalences_[__i])
2461 {
2462 __found = true;
2463 goto __exit;
2464 }
2465 }
2466 }
2467 if (__traits_.isctype(__ch, __mask_))
Howard Hinnant70b3e192010-07-28 17:35:27 +00002468 {
Howard Hinnant3034c902010-07-13 21:48:06 +00002469 __found = true;
Howard Hinnant70b3e192010-07-28 17:35:27 +00002470 goto __exit;
2471 }
Howard Hinnant3034c902010-07-13 21:48:06 +00002472 }
2473 else
2474 __found = __negate_; // force reject
2475__exit:
2476 if (__found != __negate_)
2477 {
Howard Hinnant3034c902010-07-13 21:48:06 +00002478 __s.__do_ = __state::__accept_and_consume;
2479 __s.__current_ += __consumed;
2480 __s.__node_ = this->first();
2481 }
2482 else
2483 {
2484 __s.__do_ = __state::__reject;
2485 __s.__node_ = nullptr;
2486 }
2487}
2488
Howard Hinnant944510a2011-06-14 19:58:17 +00002489template <class _CharT, class _Traits> class __lookahead;
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002490
Howard Hinnant6c891682010-06-24 21:28:00 +00002491template <class _CharT, class _Traits = regex_traits<_CharT> >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00002492class _LIBCPP_TEMPLATE_VIS basic_regex
Howard Hinnant6c891682010-06-24 21:28:00 +00002493{
2494public:
2495 // types:
2496 typedef _CharT value_type;
Hubert Tong1f1ae9c2016-08-02 21:34:48 +00002497 typedef _Traits traits_type;
2498 typedef typename _Traits::string_type string_type;
Howard Hinnant6c891682010-06-24 21:28:00 +00002499 typedef regex_constants::syntax_option_type flag_type;
2500 typedef typename _Traits::locale_type locale_type;
2501
2502private:
2503 _Traits __traits_;
2504 flag_type __flags_;
2505 unsigned __marked_count_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002506 unsigned __loop_count_;
Howard Hinnant67ad2132010-06-29 18:37:43 +00002507 int __open_count_;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002508 shared_ptr<__empty_state<_CharT> > __start_;
2509 __owns_one_state<_CharT>* __end_;
2510
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002511 typedef _VSTD::__state<_CharT> __state;
2512 typedef _VSTD::__node<_CharT> __node;
Howard Hinnant6c891682010-06-24 21:28:00 +00002513
2514public:
2515 // constants:
Howard Hinnant5ddd33c2012-07-21 01:31:58 +00002516 static const regex_constants::syntax_option_type icase = regex_constants::icase;
2517 static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2518 static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
2519 static const regex_constants::syntax_option_type collate = regex_constants::collate;
2520 static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2521 static const regex_constants::syntax_option_type basic = regex_constants::basic;
2522 static const regex_constants::syntax_option_type extended = regex_constants::extended;
2523 static const regex_constants::syntax_option_type awk = regex_constants::awk;
2524 static const regex_constants::syntax_option_type grep = regex_constants::grep;
2525 static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
Howard Hinnant6c891682010-06-24 21:28:00 +00002526
2527 // construct/copy/destroy:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002528 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002529 basic_regex()
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002530 : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant066ba512011-03-26 20:02:27 +00002531 __end_(0)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002532 {}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002533 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002534 explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002535 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant066ba512011-03-26 20:02:27 +00002536 __end_(0)
Howard Hinnant6c891682010-06-24 21:28:00 +00002537 {__parse(__p, __p + __traits_.length(__p));}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002538 _LIBCPP_INLINE_VISIBILITY
Hubert Tong19662862016-08-07 22:26:04 +00002539 basic_regex(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002540 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant066ba512011-03-26 20:02:27 +00002541 __end_(0)
Howard Hinnant6c891682010-06-24 21:28:00 +00002542 {__parse(__p, __p + __len);}
Howard Hinnant126da6a2010-07-27 22:20:32 +00002543// basic_regex(const basic_regex&) = default;
2544// basic_regex(basic_regex&&) = default;
Howard Hinnant6c891682010-06-24 21:28:00 +00002545 template <class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002546 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002547 explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2548 flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002549 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant066ba512011-03-26 20:02:27 +00002550 __end_(0)
Howard Hinnant6c891682010-06-24 21:28:00 +00002551 {__parse(__p.begin(), __p.end());}
2552 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002554 basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2555 flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002556 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant066ba512011-03-26 20:02:27 +00002557 __end_(0)
Howard Hinnant6c891682010-06-24 21:28:00 +00002558 {__parse(__first, __last);}
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002559#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002560 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002561 basic_regex(initializer_list<value_type> __il,
2562 flag_type __f = regex_constants::ECMAScript)
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002563 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant066ba512011-03-26 20:02:27 +00002564 __end_(0)
Howard Hinnant6c891682010-06-24 21:28:00 +00002565 {__parse(__il.begin(), __il.end());}
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002566#endif // _LIBCPP_CXX03_LANG
Howard Hinnant6c891682010-06-24 21:28:00 +00002567
Howard Hinnant997621e2010-08-13 18:11:23 +00002568// ~basic_regex() = default;
Howard Hinnant6c891682010-06-24 21:28:00 +00002569
Howard Hinnant126da6a2010-07-27 22:20:32 +00002570// basic_regex& operator=(const basic_regex&) = default;
2571// basic_regex& operator=(basic_regex&&) = default;
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002572 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002573 basic_regex& operator=(const value_type* __p)
2574 {return assign(__p);}
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002575#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002576 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002577 basic_regex& operator=(initializer_list<value_type> __il)
2578 {return assign(__il);}
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002579#endif // _LIBCPP_CXX03_LANG
Howard Hinnant6c891682010-06-24 21:28:00 +00002580 template <class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002581 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002582 basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2583 {return assign(__p);}
Howard Hinnant6c891682010-06-24 21:28:00 +00002584
2585 // assign:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002586 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002587 basic_regex& assign(const basic_regex& __that)
2588 {return *this = __that;}
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002589#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant5ddd33c2012-07-21 01:31:58 +00002590 _LIBCPP_INLINE_VISIBILITY
2591 basic_regex& assign(basic_regex&& __that) _NOEXCEPT
2592 {return *this = _VSTD::move(__that);}
2593#endif
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002594 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002595 basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2596 {return assign(__p, __p + __traits_.length(__p), __f);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002597 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002598 basic_regex& assign(const value_type* __p, size_t __len, flag_type __f)
2599 {return assign(__p, __p + __len, __f);}
Howard Hinnant6c891682010-06-24 21:28:00 +00002600 template <class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002601 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002602 basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
Howard Hinnant997621e2010-08-13 18:11:23 +00002603 flag_type __f = regex_constants::ECMAScript)
2604 {return assign(__s.begin(), __s.end(), __f);}
2605
Howard Hinnant6c891682010-06-24 21:28:00 +00002606 template <class _InputIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002607 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002608 typename enable_if
2609 <
2610 __is_input_iterator <_InputIterator>::value &&
2611 !__is_forward_iterator<_InputIterator>::value,
2612 basic_regex&
2613 >::type
2614 assign(_InputIterator __first, _InputIterator __last,
2615 flag_type __f = regex_constants::ECMAScript)
2616 {
2617 basic_string<_CharT> __t(__first, __last);
2618 return assign(__t.begin(), __t.end(), __f);
2619 }
2620
2621private:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002622 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002623 void __member_init(flag_type __f)
2624 {
2625 __flags_ = __f;
2626 __marked_count_ = 0;
2627 __loop_count_ = 0;
2628 __open_count_ = 0;
2629 __end_ = nullptr;
Howard Hinnant997621e2010-08-13 18:11:23 +00002630 }
2631public:
2632
2633 template <class _ForwardIterator>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002634 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002635 typename enable_if
2636 <
2637 __is_forward_iterator<_ForwardIterator>::value,
2638 basic_regex&
2639 >::type
2640 assign(_ForwardIterator __first, _ForwardIterator __last,
2641 flag_type __f = regex_constants::ECMAScript)
2642 {
Marshall Clowce03dc12015-01-13 16:49:52 +00002643 return assign(basic_regex(__first, __last, __f));
Howard Hinnant997621e2010-08-13 18:11:23 +00002644 }
2645
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002646#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002647
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002648 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002649 basic_regex& assign(initializer_list<value_type> __il,
Howard Hinnant997621e2010-08-13 18:11:23 +00002650 flag_type __f = regex_constants::ECMAScript)
2651 {return assign(__il.begin(), __il.end(), __f);}
Howard Hinnant6c891682010-06-24 21:28:00 +00002652
Eric Fiselier6f8516f2017-04-18 23:42:15 +00002653#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00002654
Howard Hinnant6c891682010-06-24 21:28:00 +00002655 // const operations:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002656 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002657 unsigned mark_count() const {return __marked_count_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002658 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002659 flag_type flags() const {return __flags_;}
2660
2661 // locale:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002662 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant997621e2010-08-13 18:11:23 +00002663 locale_type imbue(locale_type __loc)
2664 {
2665 __member_init(ECMAScript);
2666 __start_.reset();
2667 return __traits_.imbue(__loc);
2668 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002669 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant6c891682010-06-24 21:28:00 +00002670 locale_type getloc() const {return __traits_.getloc();}
2671
2672 // swap:
Howard Hinnant997621e2010-08-13 18:11:23 +00002673 void swap(basic_regex& __r);
Howard Hinnant6c891682010-06-24 21:28:00 +00002674
2675private:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002676 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002677 unsigned __loop_count() const {return __loop_count_;}
2678
Howard Hinnant6c891682010-06-24 21:28:00 +00002679 template <class _ForwardIterator>
Howard Hinnant126da6a2010-07-27 22:20:32 +00002680 _ForwardIterator
2681 __parse(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00002682 template <class _ForwardIterator>
2683 _ForwardIterator
2684 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2685 template <class _ForwardIterator>
2686 _ForwardIterator
2687 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2688 template <class _ForwardIterator>
2689 _ForwardIterator
2690 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2691 template <class _ForwardIterator>
2692 _ForwardIterator
2693 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2694 template <class _ForwardIterator>
2695 _ForwardIterator
2696 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2697 template <class _ForwardIterator>
2698 _ForwardIterator
2699 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2700 template <class _ForwardIterator>
2701 _ForwardIterator
2702 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2703 template <class _ForwardIterator>
2704 _ForwardIterator
2705 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2706 template <class _ForwardIterator>
2707 _ForwardIterator
2708 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2709 template <class _ForwardIterator>
2710 _ForwardIterator
2711 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2712 template <class _ForwardIterator>
2713 _ForwardIterator
2714 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2715 template <class _ForwardIterator>
2716 _ForwardIterator
2717 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2718 template <class _ForwardIterator>
2719 _ForwardIterator
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002720 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnant5bf96132010-07-08 17:43:58 +00002721 __owns_one_state<_CharT>* __s,
2722 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant89a40572010-06-25 20:56:08 +00002723 template <class _ForwardIterator>
2724 _ForwardIterator
Howard Hinnant16d65422010-07-16 19:08:36 +00002725 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2726 __owns_one_state<_CharT>* __s,
2727 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00002728 template <class _ForwardIterator>
2729 _ForwardIterator
Howard Hinnant89a40572010-06-25 20:56:08 +00002730 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2731 template <class _ForwardIterator>
2732 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002733 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2734 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00002735 template <class _ForwardIterator>
2736 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002737 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2738 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00002739 template <class _ForwardIterator>
2740 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002741 __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2742 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00002743 template <class _ForwardIterator>
2744 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002745 __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2746 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00002747 template <class _ForwardIterator>
2748 _ForwardIterator
Howard Hinnant3034c902010-07-13 21:48:06 +00002749 __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2750 basic_string<_CharT>& __col_sym);
Howard Hinnant89a40572010-06-25 20:56:08 +00002751 template <class _ForwardIterator>
2752 _ForwardIterator
2753 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
Howard Hinnant67ad2132010-06-29 18:37:43 +00002754 template <class _ForwardIterator>
2755 _ForwardIterator
2756 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2757 template <class _ForwardIterator>
2758 _ForwardIterator
2759 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2760 template <class _ForwardIterator>
2761 _ForwardIterator
2762 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2763 template <class _ForwardIterator>
2764 _ForwardIterator
2765 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2766 template <class _ForwardIterator>
2767 _ForwardIterator
2768 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2769 template <class _ForwardIterator>
2770 _ForwardIterator
2771 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnante1053822010-07-22 17:53:24 +00002772 template <class _ForwardIterator>
2773 _ForwardIterator
2774 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2775 template <class _ForwardIterator>
2776 _ForwardIterator
2777 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2778 template <class _ForwardIterator>
2779 _ForwardIterator
2780 __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2781 template <class _ForwardIterator>
2782 _ForwardIterator
2783 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2784 template <class _ForwardIterator>
2785 _ForwardIterator
2786 __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2787 template <class _ForwardIterator>
2788 _ForwardIterator
Howard Hinnant70d27852010-07-27 01:25:38 +00002789 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2790 template <class _ForwardIterator>
2791 _ForwardIterator
2792 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2793 template <class _ForwardIterator>
2794 _ForwardIterator
2795 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2796 template <class _ForwardIterator>
2797 _ForwardIterator
Howard Hinnant70b3e192010-07-28 17:35:27 +00002798 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2799 basic_string<_CharT>* __str = nullptr);
Howard Hinnant70d27852010-07-27 01:25:38 +00002800 template <class _ForwardIterator>
2801 _ForwardIterator
2802 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnanteaf649e2010-07-27 19:53:10 +00002803 template <class _ForwardIterator>
2804 _ForwardIterator
2805 __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2806 template <class _ForwardIterator>
2807 _ForwardIterator
2808 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant70b3e192010-07-28 17:35:27 +00002809 template <class _ForwardIterator>
2810 _ForwardIterator
2811 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2812 basic_string<_CharT>& __str,
2813 __bracket_expression<_CharT, _Traits>* __ml);
2814 template <class _ForwardIterator>
2815 _ForwardIterator
2816 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2817 basic_string<_CharT>* __str = nullptr);
Howard Hinnant6c891682010-06-24 21:28:00 +00002818
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002819 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant066ba512011-03-26 20:02:27 +00002820 void __push_l_anchor();
Howard Hinnantaad0aa62010-07-09 00:15:26 +00002821 void __push_r_anchor();
Howard Hinnantaa0874c2010-07-12 15:51:17 +00002822 void __push_match_any();
Howard Hinnant70d27852010-07-27 01:25:38 +00002823 void __push_match_any_but_newline();
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002824 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5bf96132010-07-08 17:43:58 +00002825 void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2826 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2827 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2828 __mexp_begin, __mexp_end);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00002829 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant70d27852010-07-27 01:25:38 +00002830 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2831 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2832 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2833 __mexp_begin, __mexp_end, false);}
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002834 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
2835 size_t __mexp_begin = 0, size_t __mexp_end = 0,
2836 bool __greedy = true);
Howard Hinnant3034c902010-07-13 21:48:06 +00002837 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
Howard Hinnant67ad2132010-06-29 18:37:43 +00002838 void __push_char(value_type __c);
Howard Hinnant2a315e32010-07-12 18:16:05 +00002839 void __push_back_ref(int __i);
Howard Hinnant16d65422010-07-16 19:08:36 +00002840 void __push_alternation(__owns_one_state<_CharT>* __sa,
2841 __owns_one_state<_CharT>* __sb);
Howard Hinnant93ef6552010-06-30 20:30:19 +00002842 void __push_begin_marked_subexpression();
2843 void __push_end_marked_subexpression(unsigned);
Howard Hinnante1053822010-07-22 17:53:24 +00002844 void __push_empty();
Howard Hinnant70d27852010-07-27 01:25:38 +00002845 void __push_word_boundary(bool);
Howard Hinnant3efac712013-07-23 16:18:04 +00002846 void __push_lookahead(const basic_regex&, bool, unsigned);
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002847
Howard Hinnant66423212010-07-14 21:14:52 +00002848 template <class _Allocator>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002849 bool
Howard Hinnant66423212010-07-14 21:14:52 +00002850 __search(const _CharT* __first, const _CharT* __last,
2851 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002852 regex_constants::match_flag_type __flags) const;
2853
Howard Hinnant66423212010-07-14 21:14:52 +00002854 template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002855 bool
Howard Hinnant66423212010-07-14 21:14:52 +00002856 __match_at_start(const _CharT* __first, const _CharT* __last,
2857 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00002858 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant70d27852010-07-27 01:25:38 +00002859 template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002860 bool
Howard Hinnant70d27852010-07-27 01:25:38 +00002861 __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
2862 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00002863 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant66423212010-07-14 21:14:52 +00002864 template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002865 bool
2866 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
Howard Hinnant66423212010-07-14 21:14:52 +00002867 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00002868 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant66423212010-07-14 21:14:52 +00002869 template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002870 bool
Howard Hinnant66423212010-07-14 21:14:52 +00002871 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
2872 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00002873 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002874
Howard Hinnantc834c512011-11-29 18:15:50 +00002875 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002876 friend
2877 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00002878 regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00002879 regex_constants::match_flag_type);
Howard Hinnant6c891682010-06-24 21:28:00 +00002880
Howard Hinnantc834c512011-11-29 18:15:50 +00002881 template <class _Ap, class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00002882 friend
2883 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00002884 regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
2885 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant66423212010-07-14 21:14:52 +00002886
Howard Hinnantc834c512011-11-29 18:15:50 +00002887 template <class _Bp, class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00002888 friend
2889 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00002890 regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
Howard Hinnant66423212010-07-14 21:14:52 +00002891 regex_constants::match_flag_type);
2892
Howard Hinnantc834c512011-11-29 18:15:50 +00002893 template <class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00002894 friend
2895 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00002896 regex_search(const _Cp*, const _Cp*,
2897 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant66423212010-07-14 21:14:52 +00002898
Howard Hinnantc834c512011-11-29 18:15:50 +00002899 template <class _Cp, class _Ap, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00002900 friend
2901 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00002902 regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant66423212010-07-14 21:14:52 +00002903 regex_constants::match_flag_type);
2904
Howard Hinnantc834c512011-11-29 18:15:50 +00002905 template <class _ST, class _SA, class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00002906 friend
2907 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00002908 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2909 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant66423212010-07-14 21:14:52 +00002910 regex_constants::match_flag_type __flags);
2911
Howard Hinnantc834c512011-11-29 18:15:50 +00002912 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
Howard Hinnant66423212010-07-14 21:14:52 +00002913 friend
2914 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00002915 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2916 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
2917 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant66423212010-07-14 21:14:52 +00002918 regex_constants::match_flag_type __flags);
Howard Hinnant126da6a2010-07-27 22:20:32 +00002919
Howard Hinnant4018c482013-06-29 23:45:43 +00002920 template <class _Iter, class _Ap, class _Cp, class _Tp>
2921 friend
2922 bool
2923 regex_search(__wrap_iter<_Iter> __first,
2924 __wrap_iter<_Iter> __last,
2925 match_results<__wrap_iter<_Iter>, _Ap>& __m,
2926 const basic_regex<_Cp, _Tp>& __e,
2927 regex_constants::match_flag_type __flags);
2928
Howard Hinnant126da6a2010-07-27 22:20:32 +00002929 template <class, class> friend class __lookahead;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00002930};
Howard Hinnant6c891682010-06-24 21:28:00 +00002931
Marshall Clow2dce1f42018-05-23 01:57:02 +00002932#ifndef _LIBCPP_HAS_NO_DEDUCTION_GUIDES
2933template <class _ForwardIterator,
2934 class = typename enable_if<__is_forward_iterator<_ForwardIterator>::value, nullptr_t>::type
2935>
2936basic_regex(_ForwardIterator, _ForwardIterator,
2937 regex_constants::syntax_option_type = regex_constants::ECMAScript)
2938 -> basic_regex<typename iterator_traits<_ForwardIterator>::value_type>;
2939#endif
2940
Howard Hinnant6c891682010-06-24 21:28:00 +00002941template <class _CharT, class _Traits>
Howard Hinnant2c45cb42012-12-12 21:14:28 +00002942 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
2943template <class _CharT, class _Traits>
2944 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
2945template <class _CharT, class _Traits>
2946 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
2947template <class _CharT, class _Traits>
2948 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
2949template <class _CharT, class _Traits>
2950 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
2951template <class _CharT, class _Traits>
2952 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
2953template <class _CharT, class _Traits>
2954 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
2955template <class _CharT, class _Traits>
2956 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
2957template <class _CharT, class _Traits>
2958 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
2959template <class _CharT, class _Traits>
2960 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
2961
2962template <class _CharT, class _Traits>
Howard Hinnant997621e2010-08-13 18:11:23 +00002963void
2964basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
Howard Hinnant6c891682010-06-24 21:28:00 +00002965{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002966 using _VSTD::swap;
Howard Hinnant997621e2010-08-13 18:11:23 +00002967 swap(__traits_, __r.__traits_);
2968 swap(__flags_, __r.__flags_);
2969 swap(__marked_count_, __r.__marked_count_);
2970 swap(__loop_count_, __r.__loop_count_);
2971 swap(__open_count_, __r.__open_count_);
2972 swap(__start_, __r.__start_);
2973 swap(__end_, __r.__end_);
Howard Hinnant997621e2010-08-13 18:11:23 +00002974}
2975
2976template <class _CharT, class _Traits>
2977inline _LIBCPP_INLINE_VISIBILITY
2978void
2979swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
2980{
2981 return __x.swap(__y);
Howard Hinnant6c891682010-06-24 21:28:00 +00002982}
2983
Howard Hinnant126da6a2010-07-27 22:20:32 +00002984// __lookahead
2985
2986template <class _CharT, class _Traits>
2987class __lookahead
2988 : public __owns_one_state<_CharT>
2989{
2990 typedef __owns_one_state<_CharT> base;
2991
2992 basic_regex<_CharT, _Traits> __exp_;
Howard Hinnant3efac712013-07-23 16:18:04 +00002993 unsigned __mexp_;
Howard Hinnant126da6a2010-07-27 22:20:32 +00002994 bool __invert_;
2995
2996 __lookahead(const __lookahead&);
2997 __lookahead& operator=(const __lookahead&);
2998public:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00002999 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant126da6a2010-07-27 22:20:32 +00003000
Howard Hinnant7ca9d942010-09-23 15:13:20 +00003001 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3efac712013-07-23 16:18:04 +00003002 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
Eric Fiseliera75ee262015-07-22 01:29:41 +00003003 : base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {}
Howard Hinnant126da6a2010-07-27 22:20:32 +00003004
3005 virtual void __exec(__state&) const;
Howard Hinnant126da6a2010-07-27 22:20:32 +00003006};
3007
3008template <class _CharT, class _Traits>
3009void
3010__lookahead<_CharT, _Traits>::__exec(__state& __s) const
3011{
3012 match_results<const _CharT*> __m;
3013 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
Tim Shen11113f52016-10-27 21:40:34 +00003014 bool __matched = __exp_.__match_at_start_ecma(
3015 __s.__current_, __s.__last_,
3016 __m,
3017 (__s.__flags_ | regex_constants::match_continuous) &
3018 ~regex_constants::__full_match,
3019 __s.__at_first_ && __s.__current_ == __s.__first_);
Howard Hinnant126da6a2010-07-27 22:20:32 +00003020 if (__matched != __invert_)
3021 {
3022 __s.__do_ = __state::__accept_but_not_consume;
3023 __s.__node_ = this->first();
Howard Hinnant3efac712013-07-23 16:18:04 +00003024 for (unsigned __i = 1; __i < __m.size(); ++__i) {
3025 __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
3026 }
Howard Hinnant126da6a2010-07-27 22:20:32 +00003027 }
3028 else
3029 {
3030 __s.__do_ = __state::__reject;
3031 __s.__node_ = nullptr;
3032 }
3033}
3034
Howard Hinnant6c891682010-06-24 21:28:00 +00003035template <class _CharT, class _Traits>
3036template <class _ForwardIterator>
Howard Hinnant126da6a2010-07-27 22:20:32 +00003037_ForwardIterator
Howard Hinnant6c891682010-06-24 21:28:00 +00003038basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
3039 _ForwardIterator __last)
3040{
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003041 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00003042 unique_ptr<__node> __h(new __end_state<_CharT>);
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003043 __start_.reset(new __empty_state<_CharT>(__h.get()));
3044 __h.release();
3045 __end_ = __start_.get();
3046 }
Howard Hinnantebbc2b62010-07-27 17:24:17 +00003047 switch (__flags_ & 0x1F0)
Howard Hinnant6c891682010-06-24 21:28:00 +00003048 {
3049 case ECMAScript:
Howard Hinnant126da6a2010-07-27 22:20:32 +00003050 __first = __parse_ecma_exp(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003051 break;
3052 case basic:
Howard Hinnant126da6a2010-07-27 22:20:32 +00003053 __first = __parse_basic_reg_exp(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003054 break;
3055 case extended:
Howard Hinnant6c891682010-06-24 21:28:00 +00003056 case awk:
Howard Hinnant70b3e192010-07-28 17:35:27 +00003057 __first = __parse_extended_reg_exp(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003058 break;
3059 case grep:
Howard Hinnant126da6a2010-07-27 22:20:32 +00003060 __first = __parse_grep(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003061 break;
3062 case egrep:
Howard Hinnant126da6a2010-07-27 22:20:32 +00003063 __first = __parse_egrep(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003064 break;
3065 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00003066 __throw_regex_error<regex_constants::__re_err_grammar>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003067 }
Howard Hinnant126da6a2010-07-27 22:20:32 +00003068 return __first;
Howard Hinnant6c891682010-06-24 21:28:00 +00003069}
3070
3071template <class _CharT, class _Traits>
3072template <class _ForwardIterator>
3073_ForwardIterator
3074basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
3075 _ForwardIterator __last)
3076{
3077 if (__first != __last)
3078 {
3079 if (*__first == '^')
3080 {
3081 __push_l_anchor();
3082 ++__first;
3083 }
3084 if (__first != __last)
3085 {
3086 __first = __parse_RE_expression(__first, __last);
3087 if (__first != __last)
3088 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003089 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003090 if (__temp == __last && *__first == '$')
3091 {
3092 __push_r_anchor();
3093 ++__first;
3094 }
3095 }
3096 }
3097 if (__first != __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003098 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003099 }
3100 return __first;
3101}
3102
3103template <class _CharT, class _Traits>
3104template <class _ForwardIterator>
3105_ForwardIterator
Howard Hinnant67ad2132010-06-29 18:37:43 +00003106basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
3107 _ForwardIterator __last)
3108{
Howard Hinnant16d65422010-07-16 19:08:36 +00003109 __owns_one_state<_CharT>* __sa = __end_;
3110 _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
3111 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003112 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant16d65422010-07-16 19:08:36 +00003113 __first = __temp;
3114 while (__first != __last && *__first == '|')
Howard Hinnant67ad2132010-06-29 18:37:43 +00003115 {
Howard Hinnant16d65422010-07-16 19:08:36 +00003116 __owns_one_state<_CharT>* __sb = __end_;
3117 __temp = __parse_ERE_branch(++__first, __last);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003118 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003119 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant16d65422010-07-16 19:08:36 +00003120 __push_alternation(__sa, __sb);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003121 __first = __temp;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003122 }
3123 return __first;
3124}
3125
3126template <class _CharT, class _Traits>
3127template <class _ForwardIterator>
3128_ForwardIterator
3129basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3130 _ForwardIterator __last)
3131{
3132 _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
3133 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003134 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003135 do
3136 {
3137 __first = __temp;
3138 __temp = __parse_ERE_expression(__first, __last);
3139 } while (__temp != __first);
3140 return __first;
3141}
3142
3143template <class _CharT, class _Traits>
3144template <class _ForwardIterator>
3145_ForwardIterator
3146basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3147 _ForwardIterator __last)
3148{
Howard Hinnant16d65422010-07-16 19:08:36 +00003149 __owns_one_state<_CharT>* __e = __end_;
3150 unsigned __mexp_begin = __marked_count_;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003151 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3152 if (__temp == __first && __temp != __last)
3153 {
3154 switch (*__temp)
3155 {
3156 case '^':
3157 __push_l_anchor();
3158 ++__temp;
3159 break;
3160 case '$':
3161 __push_r_anchor();
3162 ++__temp;
3163 break;
3164 case '(':
Howard Hinnant93ef6552010-06-30 20:30:19 +00003165 __push_begin_marked_subexpression();
3166 unsigned __temp_count = __marked_count_;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003167 ++__open_count_;
3168 __temp = __parse_extended_reg_exp(++__temp, __last);
3169 if (__temp == __last || *__temp != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00003170 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant93ef6552010-06-30 20:30:19 +00003171 __push_end_marked_subexpression(__temp_count);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003172 --__open_count_;
3173 ++__temp;
3174 break;
3175 }
3176 }
3177 if (__temp != __first)
Howard Hinnant16d65422010-07-16 19:08:36 +00003178 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3179 __marked_count_+1);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003180 __first = __temp;
3181 return __first;
3182}
3183
3184template <class _CharT, class _Traits>
3185template <class _ForwardIterator>
3186_ForwardIterator
Howard Hinnant6c891682010-06-24 21:28:00 +00003187basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3188 _ForwardIterator __last)
3189{
3190 while (true)
3191 {
3192 _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3193 if (__temp == __first)
3194 break;
3195 __first = __temp;
3196 }
3197 return __first;
3198}
3199
3200template <class _CharT, class _Traits>
3201template <class _ForwardIterator>
3202_ForwardIterator
3203basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3204 _ForwardIterator __last)
3205{
3206 if (__first != __last)
3207 {
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003208 __owns_one_state<_CharT>* __e = __end_;
Howard Hinnant5bf96132010-07-08 17:43:58 +00003209 unsigned __mexp_begin = __marked_count_;
Howard Hinnant6c891682010-06-24 21:28:00 +00003210 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3211 if (__temp != __first)
Howard Hinnant5bf96132010-07-08 17:43:58 +00003212 __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3213 __mexp_begin+1, __marked_count_+1);
Howard Hinnant6c891682010-06-24 21:28:00 +00003214 }
3215 return __first;
3216}
3217
3218template <class _CharT, class _Traits>
3219template <class _ForwardIterator>
3220_ForwardIterator
3221basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3222 _ForwardIterator __last)
3223{
3224 _ForwardIterator __temp = __first;
3225 __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3226 if (__temp == __first)
3227 {
3228 __temp = __parse_Back_open_paren(__first, __last);
3229 if (__temp != __first)
3230 {
Howard Hinnant93ef6552010-06-30 20:30:19 +00003231 __push_begin_marked_subexpression();
3232 unsigned __temp_count = __marked_count_;
Howard Hinnant6c891682010-06-24 21:28:00 +00003233 __first = __parse_RE_expression(__temp, __last);
3234 __temp = __parse_Back_close_paren(__first, __last);
3235 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003236 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant93ef6552010-06-30 20:30:19 +00003237 __push_end_marked_subexpression(__temp_count);
Howard Hinnant6c891682010-06-24 21:28:00 +00003238 __first = __temp;
Howard Hinnant6c891682010-06-24 21:28:00 +00003239 }
3240 else
3241 __first = __parse_BACKREF(__first, __last);
3242 }
3243 return __first;
3244}
3245
3246template <class _CharT, class _Traits>
3247template <class _ForwardIterator>
3248_ForwardIterator
3249basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3250 _ForwardIterator __first,
3251 _ForwardIterator __last)
3252{
Howard Hinnant67ad2132010-06-29 18:37:43 +00003253 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003254 if (__temp == __first)
3255 {
Howard Hinnant67ad2132010-06-29 18:37:43 +00003256 __temp = __parse_QUOTED_CHAR(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003257 if (__temp == __first)
3258 {
Howard Hinnant67ad2132010-06-29 18:37:43 +00003259 if (__temp != __last && *__temp == '.')
Howard Hinnant6c891682010-06-24 21:28:00 +00003260 {
3261 __push_match_any();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003262 ++__temp;
Howard Hinnant6c891682010-06-24 21:28:00 +00003263 }
3264 else
Howard Hinnant67ad2132010-06-29 18:37:43 +00003265 __temp = __parse_bracket_expression(__first, __last);
Howard Hinnant6c891682010-06-24 21:28:00 +00003266 }
3267 }
Howard Hinnant67ad2132010-06-29 18:37:43 +00003268 __first = __temp;
3269 return __first;
3270}
3271
3272template <class _CharT, class _Traits>
3273template <class _ForwardIterator>
3274_ForwardIterator
3275basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3276 _ForwardIterator __first,
3277 _ForwardIterator __last)
3278{
3279 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3280 if (__temp == __first)
3281 {
3282 __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3283 if (__temp == __first)
3284 {
3285 if (__temp != __last && *__temp == '.')
3286 {
3287 __push_match_any();
3288 ++__temp;
3289 }
3290 else
3291 __temp = __parse_bracket_expression(__first, __last);
3292 }
3293 }
3294 __first = __temp;
Howard Hinnant6c891682010-06-24 21:28:00 +00003295 return __first;
3296}
3297
3298template <class _CharT, class _Traits>
3299template <class _ForwardIterator>
3300_ForwardIterator
3301basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3302 _ForwardIterator __last)
3303{
3304 if (__first != __last)
3305 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003306 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003307 if (__temp != __last)
3308 {
3309 if (*__first == '\\' && *__temp == '(')
3310 __first = ++__temp;
3311 }
3312 }
3313 return __first;
3314}
3315
3316template <class _CharT, class _Traits>
3317template <class _ForwardIterator>
3318_ForwardIterator
3319basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3320 _ForwardIterator __last)
3321{
3322 if (__first != __last)
3323 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003324 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003325 if (__temp != __last)
3326 {
3327 if (*__first == '\\' && *__temp == ')')
3328 __first = ++__temp;
3329 }
3330 }
3331 return __first;
3332}
3333
3334template <class _CharT, class _Traits>
3335template <class _ForwardIterator>
3336_ForwardIterator
3337basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3338 _ForwardIterator __last)
3339{
3340 if (__first != __last)
3341 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003342 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003343 if (__temp != __last)
3344 {
3345 if (*__first == '\\' && *__temp == '{')
3346 __first = ++__temp;
3347 }
3348 }
3349 return __first;
3350}
3351
3352template <class _CharT, class _Traits>
3353template <class _ForwardIterator>
3354_ForwardIterator
3355basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3356 _ForwardIterator __last)
3357{
3358 if (__first != __last)
3359 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003360 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003361 if (__temp != __last)
3362 {
3363 if (*__first == '\\' && *__temp == '}')
3364 __first = ++__temp;
3365 }
3366 }
3367 return __first;
3368}
3369
3370template <class _CharT, class _Traits>
3371template <class _ForwardIterator>
3372_ForwardIterator
3373basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3374 _ForwardIterator __last)
3375{
3376 if (__first != __last)
3377 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003378 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003379 if (__temp != __last)
3380 {
Marshall Clowaa38d972014-01-18 03:40:03 +00003381 if (*__first == '\\')
3382 {
3383 int __val = __traits_.value(*__temp, 10);
3384 if (__val >= 1 && __val <= 9)
3385 {
3386 __push_back_ref(__val);
3387 __first = ++__temp;
3388 }
Howard Hinnant6c891682010-06-24 21:28:00 +00003389 }
3390 }
3391 }
3392 return __first;
3393}
3394
3395template <class _CharT, class _Traits>
3396template <class _ForwardIterator>
3397_ForwardIterator
3398basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3399 _ForwardIterator __last)
3400{
3401 if (__first != __last)
3402 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003403 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003404 if (__temp == __last && *__first == '$')
3405 return __first;
3406 // Not called inside a bracket
3407 if (*__first == '.' || *__first == '\\' || *__first == '[')
3408 return __first;
Howard Hinnant89a40572010-06-25 20:56:08 +00003409 __push_char(*__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003410 ++__first;
3411 }
3412 return __first;
3413}
3414
3415template <class _CharT, class _Traits>
3416template <class _ForwardIterator>
3417_ForwardIterator
Howard Hinnant67ad2132010-06-29 18:37:43 +00003418basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3419 _ForwardIterator __last)
3420{
3421 if (__first != __last)
3422 {
3423 switch (*__first)
3424 {
3425 case '^':
3426 case '.':
3427 case '[':
3428 case '$':
3429 case '(':
3430 case '|':
3431 case '*':
3432 case '+':
3433 case '?':
3434 case '{':
3435 case '\\':
3436 break;
3437 case ')':
3438 if (__open_count_ == 0)
3439 {
3440 __push_char(*__first);
3441 ++__first;
3442 }
3443 break;
3444 default:
3445 __push_char(*__first);
3446 ++__first;
3447 break;
3448 }
3449 }
3450 return __first;
3451}
3452
3453template <class _CharT, class _Traits>
3454template <class _ForwardIterator>
3455_ForwardIterator
Howard Hinnant6c891682010-06-24 21:28:00 +00003456basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3457 _ForwardIterator __last)
3458{
3459 if (__first != __last)
3460 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003461 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant6c891682010-06-24 21:28:00 +00003462 if (__temp != __last)
3463 {
3464 if (*__first == '\\')
3465 {
3466 switch (*__temp)
3467 {
3468 case '^':
3469 case '.':
3470 case '*':
3471 case '[':
3472 case '$':
3473 case '\\':
Howard Hinnant89a40572010-06-25 20:56:08 +00003474 __push_char(*__temp);
Howard Hinnant6c891682010-06-24 21:28:00 +00003475 __first = ++__temp;
3476 break;
3477 }
3478 }
3479 }
3480 }
3481 return __first;
3482}
3483
3484template <class _CharT, class _Traits>
3485template <class _ForwardIterator>
3486_ForwardIterator
Howard Hinnant67ad2132010-06-29 18:37:43 +00003487basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3488 _ForwardIterator __last)
3489{
3490 if (__first != __last)
3491 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003492 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003493 if (__temp != __last)
3494 {
3495 if (*__first == '\\')
3496 {
3497 switch (*__temp)
3498 {
3499 case '^':
3500 case '.':
3501 case '*':
3502 case '[':
3503 case '$':
3504 case '\\':
3505 case '(':
3506 case ')':
3507 case '|':
3508 case '+':
3509 case '?':
3510 case '{':
Howard Hinnant73072eb2013-06-28 20:31:05 +00003511 case '}':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003512 __push_char(*__temp);
3513 __first = ++__temp;
3514 break;
Howard Hinnant70b3e192010-07-28 17:35:27 +00003515 default:
3516 if ((__flags_ & 0x1F0) == awk)
3517 __first = __parse_awk_escape(++__first, __last);
3518 break;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003519 }
3520 }
3521 }
3522 }
3523 return __first;
3524}
3525
3526template <class _CharT, class _Traits>
3527template <class _ForwardIterator>
3528_ForwardIterator
Howard Hinnant6c891682010-06-24 21:28:00 +00003529basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00003530 _ForwardIterator __last,
Howard Hinnant5bf96132010-07-08 17:43:58 +00003531 __owns_one_state<_CharT>* __s,
3532 unsigned __mexp_begin,
3533 unsigned __mexp_end)
Howard Hinnant6c891682010-06-24 21:28:00 +00003534{
3535 if (__first != __last)
3536 {
Howard Hinnant89a40572010-06-25 20:56:08 +00003537 if (*__first == '*')
Howard Hinnant6c891682010-06-24 21:28:00 +00003538 {
Howard Hinnant5bf96132010-07-08 17:43:58 +00003539 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant6c891682010-06-24 21:28:00 +00003540 ++__first;
3541 }
3542 else
3543 {
3544 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3545 if (__temp != __first)
3546 {
3547 int __min = 0;
3548 __first = __temp;
3549 __temp = __parse_DUP_COUNT(__first, __last, __min);
3550 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003551 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003552 __first = __temp;
3553 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003554 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003555 if (*__first != ',')
3556 {
3557 __temp = __parse_Back_close_brace(__first, __last);
3558 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003559 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant2a315e32010-07-12 18:16:05 +00003560 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3561 true);
Howard Hinnant6c891682010-06-24 21:28:00 +00003562 __first = __temp;
3563 }
3564 else
3565 {
3566 ++__first; // consume ','
3567 int __max = -1;
3568 __first = __parse_DUP_COUNT(__first, __last, __max);
3569 __temp = __parse_Back_close_brace(__first, __last);
3570 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003571 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant6c891682010-06-24 21:28:00 +00003572 if (__max == -1)
Howard Hinnant16d65422010-07-16 19:08:36 +00003573 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant6c891682010-06-24 21:28:00 +00003574 else
3575 {
3576 if (__max < __min)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003577 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant2a315e32010-07-12 18:16:05 +00003578 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3579 true);
Howard Hinnant6c891682010-06-24 21:28:00 +00003580 }
3581 __first = __temp;
3582 }
3583 }
3584 }
3585 }
3586 return __first;
3587}
3588
Howard Hinnant89a40572010-06-25 20:56:08 +00003589template <class _CharT, class _Traits>
3590template <class _ForwardIterator>
3591_ForwardIterator
Howard Hinnant67ad2132010-06-29 18:37:43 +00003592basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
Howard Hinnant16d65422010-07-16 19:08:36 +00003593 _ForwardIterator __last,
3594 __owns_one_state<_CharT>* __s,
3595 unsigned __mexp_begin,
3596 unsigned __mexp_end)
Howard Hinnant67ad2132010-06-29 18:37:43 +00003597{
3598 if (__first != __last)
3599 {
Howard Hinnant446e9c62010-07-29 00:36:00 +00003600 unsigned __grammar = __flags_ & 0x1F0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003601 switch (*__first)
3602 {
3603 case '*':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003604 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003605 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003606 {
3607 ++__first;
3608 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3609 }
3610 else
3611 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003612 break;
3613 case '+':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003614 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003615 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003616 {
3617 ++__first;
3618 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3619 }
3620 else
3621 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003622 break;
3623 case '?':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003624 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003625 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003626 {
3627 ++__first;
3628 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3629 }
3630 else
3631 __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003632 break;
3633 case '{':
3634 {
3635 int __min;
Howard Hinnant16d65422010-07-16 19:08:36 +00003636 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003637 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003638 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003639 __first = __temp;
3640 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003641 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003642 switch (*__first)
3643 {
3644 case '}':
Howard Hinnant67ad2132010-06-29 18:37:43 +00003645 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003646 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003647 {
3648 ++__first;
3649 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3650 }
3651 else
3652 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003653 break;
3654 case ',':
Howard Hinnant72f73582010-08-11 17:04:31 +00003655 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00003656 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003657 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003658 if (*__first == '}')
3659 {
Howard Hinnant67ad2132010-06-29 18:37:43 +00003660 ++__first;
Howard Hinnant446e9c62010-07-29 00:36:00 +00003661 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003662 {
3663 ++__first;
3664 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3665 }
3666 else
3667 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003668 }
3669 else
3670 {
Howard Hinnant16d65422010-07-16 19:08:36 +00003671 int __max = -1;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003672 __temp = __parse_DUP_COUNT(__first, __last, __max);
3673 if (__temp == __first)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003674 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003675 __first = __temp;
3676 if (__first == __last || *__first != '}')
Marshall Clowc8ccc292015-07-28 13:30:47 +00003677 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003678 ++__first;
3679 if (__max < __min)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003680 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant446e9c62010-07-29 00:36:00 +00003681 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant70d27852010-07-27 01:25:38 +00003682 {
3683 ++__first;
3684 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3685 }
3686 else
3687 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
Howard Hinnant67ad2132010-06-29 18:37:43 +00003688 }
Howard Hinnant16d65422010-07-16 19:08:36 +00003689 break;
Howard Hinnant67ad2132010-06-29 18:37:43 +00003690 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00003691 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant67ad2132010-06-29 18:37:43 +00003692 }
3693 }
3694 break;
3695 }
3696 }
3697 return __first;
3698}
3699
3700template <class _CharT, class _Traits>
3701template <class _ForwardIterator>
3702_ForwardIterator
Howard Hinnant89a40572010-06-25 20:56:08 +00003703basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3704 _ForwardIterator __last)
3705{
3706 if (__first != __last && *__first == '[')
3707 {
Howard Hinnant72f73582010-08-11 17:04:31 +00003708 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00003709 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003710 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant3034c902010-07-13 21:48:06 +00003711 bool __negate = false;
Howard Hinnant89a40572010-06-25 20:56:08 +00003712 if (*__first == '^')
3713 {
3714 ++__first;
Howard Hinnant3034c902010-07-13 21:48:06 +00003715 __negate = true;
Howard Hinnant89a40572010-06-25 20:56:08 +00003716 }
Howard Hinnant3034c902010-07-13 21:48:06 +00003717 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3718 // __ml owned by *this
Howard Hinnant89a40572010-06-25 20:56:08 +00003719 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003720 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant70b3e192010-07-28 17:35:27 +00003721 if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']')
Howard Hinnant89a40572010-06-25 20:56:08 +00003722 {
Howard Hinnant3034c902010-07-13 21:48:06 +00003723 __ml->__add_char(']');
Howard Hinnant89a40572010-06-25 20:56:08 +00003724 ++__first;
3725 }
Howard Hinnant3034c902010-07-13 21:48:06 +00003726 __first = __parse_follow_list(__first, __last, __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00003727 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003728 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00003729 if (*__first == '-')
3730 {
Howard Hinnant3034c902010-07-13 21:48:06 +00003731 __ml->__add_char('-');
Howard Hinnant89a40572010-06-25 20:56:08 +00003732 ++__first;
3733 }
3734 if (__first == __last || *__first != ']')
Marshall Clowc8ccc292015-07-28 13:30:47 +00003735 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00003736 ++__first;
3737 }
3738 return __first;
3739}
3740
3741template <class _CharT, class _Traits>
3742template <class _ForwardIterator>
3743_ForwardIterator
3744basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00003745 _ForwardIterator __last,
3746 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant89a40572010-06-25 20:56:08 +00003747{
3748 if (__first != __last)
3749 {
3750 while (true)
3751 {
Howard Hinnant3034c902010-07-13 21:48:06 +00003752 _ForwardIterator __temp = __parse_expression_term(__first, __last,
3753 __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00003754 if (__temp == __first)
3755 break;
3756 __first = __temp;
3757 }
3758 }
3759 return __first;
3760}
3761
3762template <class _CharT, class _Traits>
3763template <class _ForwardIterator>
3764_ForwardIterator
3765basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00003766 _ForwardIterator __last,
3767 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant89a40572010-06-25 20:56:08 +00003768{
3769 if (__first != __last && *__first != ']')
3770 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003771 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant3034c902010-07-13 21:48:06 +00003772 basic_string<_CharT> __start_range;
Howard Hinnant89a40572010-06-25 20:56:08 +00003773 if (__temp != __last && *__first == '[')
3774 {
3775 if (*__temp == '=')
Howard Hinnant3034c902010-07-13 21:48:06 +00003776 return __parse_equivalence_class(++__temp, __last, __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00003777 else if (*__temp == ':')
Howard Hinnant3034c902010-07-13 21:48:06 +00003778 return __parse_character_class(++__temp, __last, __ml);
Howard Hinnant89a40572010-06-25 20:56:08 +00003779 else if (*__temp == '.')
Howard Hinnant3034c902010-07-13 21:48:06 +00003780 __first = __parse_collating_symbol(++__temp, __last, __start_range);
Howard Hinnant89a40572010-06-25 20:56:08 +00003781 }
Howard Hinnant70b3e192010-07-28 17:35:27 +00003782 unsigned __grammar = __flags_ & 0x1F0;
3783 if (__start_range.empty())
Howard Hinnant89a40572010-06-25 20:56:08 +00003784 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00003785 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3786 {
3787 if (__grammar == ECMAScript)
3788 __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3789 else
3790 __first = __parse_awk_escape(++__first, __last, &__start_range);
3791 }
3792 else
3793 {
3794 __start_range = *__first;
3795 ++__first;
3796 }
Howard Hinnant89a40572010-06-25 20:56:08 +00003797 }
3798 if (__first != __last && *__first != ']')
3799 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003800 __temp = _VSTD::next(__first);
Howard Hinnant89a40572010-06-25 20:56:08 +00003801 if (__temp != __last && *__first == '-' && *__temp != ']')
3802 {
3803 // parse a range
Howard Hinnant3034c902010-07-13 21:48:06 +00003804 basic_string<_CharT> __end_range;
Howard Hinnant89a40572010-06-25 20:56:08 +00003805 __first = __temp;
3806 ++__temp;
3807 if (__temp != __last && *__first == '[' && *__temp == '.')
Howard Hinnant3034c902010-07-13 21:48:06 +00003808 __first = __parse_collating_symbol(++__temp, __last, __end_range);
Howard Hinnant89a40572010-06-25 20:56:08 +00003809 else
3810 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00003811 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3812 {
3813 if (__grammar == ECMAScript)
3814 __first = __parse_class_escape(++__first, __last,
3815 __end_range, __ml);
3816 else
3817 __first = __parse_awk_escape(++__first, __last,
3818 &__end_range);
3819 }
3820 else
3821 {
3822 __end_range = *__first;
3823 ++__first;
3824 }
Howard Hinnant89a40572010-06-25 20:56:08 +00003825 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003826 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
Howard Hinnant89a40572010-06-25 20:56:08 +00003827 }
Howard Hinnant8ea98242013-08-23 17:37:05 +00003828 else if (!__start_range.empty())
Howard Hinnant3034c902010-07-13 21:48:06 +00003829 {
3830 if (__start_range.size() == 1)
3831 __ml->__add_char(__start_range[0]);
3832 else
3833 __ml->__add_digraph(__start_range[0], __start_range[1]);
3834 }
3835 }
Howard Hinnant8ea98242013-08-23 17:37:05 +00003836 else if (!__start_range.empty())
Howard Hinnant3034c902010-07-13 21:48:06 +00003837 {
3838 if (__start_range.size() == 1)
3839 __ml->__add_char(__start_range[0]);
3840 else
3841 __ml->__add_digraph(__start_range[0], __start_range[1]);
Howard Hinnant89a40572010-06-25 20:56:08 +00003842 }
3843 }
3844 return __first;
3845}
3846
3847template <class _CharT, class _Traits>
3848template <class _ForwardIterator>
3849_ForwardIterator
Howard Hinnant70b3e192010-07-28 17:35:27 +00003850basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
3851 _ForwardIterator __last,
3852 basic_string<_CharT>& __str,
3853 __bracket_expression<_CharT, _Traits>* __ml)
3854{
3855 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003856 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70b3e192010-07-28 17:35:27 +00003857 switch (*__first)
3858 {
3859 case 0:
3860 __str = *__first;
3861 return ++__first;
3862 case 'b':
3863 __str = _CharT(8);
3864 return ++__first;
3865 case 'd':
3866 __ml->__add_class(ctype_base::digit);
3867 return ++__first;
3868 case 'D':
3869 __ml->__add_neg_class(ctype_base::digit);
3870 return ++__first;
3871 case 's':
3872 __ml->__add_class(ctype_base::space);
3873 return ++__first;
3874 case 'S':
3875 __ml->__add_neg_class(ctype_base::space);
3876 return ++__first;
3877 case 'w':
3878 __ml->__add_class(ctype_base::alnum);
3879 __ml->__add_char('_');
3880 return ++__first;
3881 case 'W':
3882 __ml->__add_neg_class(ctype_base::alnum);
3883 __ml->__add_neg_char('_');
3884 return ++__first;
3885 }
3886 __first = __parse_character_escape(__first, __last, &__str);
3887 return __first;
3888}
3889
3890template <class _CharT, class _Traits>
3891template <class _ForwardIterator>
3892_ForwardIterator
3893basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
3894 _ForwardIterator __last,
3895 basic_string<_CharT>* __str)
3896{
3897 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003898 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70b3e192010-07-28 17:35:27 +00003899 switch (*__first)
3900 {
3901 case '\\':
3902 case '"':
3903 case '/':
3904 if (__str)
3905 *__str = *__first;
3906 else
3907 __push_char(*__first);
3908 return ++__first;
3909 case 'a':
3910 if (__str)
3911 *__str = _CharT(7);
3912 else
3913 __push_char(_CharT(7));
3914 return ++__first;
3915 case 'b':
3916 if (__str)
3917 *__str = _CharT(8);
3918 else
3919 __push_char(_CharT(8));
3920 return ++__first;
3921 case 'f':
3922 if (__str)
3923 *__str = _CharT(0xC);
3924 else
3925 __push_char(_CharT(0xC));
3926 return ++__first;
3927 case 'n':
3928 if (__str)
3929 *__str = _CharT(0xA);
3930 else
3931 __push_char(_CharT(0xA));
3932 return ++__first;
3933 case 'r':
3934 if (__str)
3935 *__str = _CharT(0xD);
3936 else
3937 __push_char(_CharT(0xD));
3938 return ++__first;
3939 case 't':
3940 if (__str)
3941 *__str = _CharT(0x9);
3942 else
3943 __push_char(_CharT(0x9));
3944 return ++__first;
3945 case 'v':
3946 if (__str)
3947 *__str = _CharT(0xB);
3948 else
3949 __push_char(_CharT(0xB));
3950 return ++__first;
3951 }
3952 if ('0' <= *__first && *__first <= '7')
3953 {
3954 unsigned __val = *__first - '0';
3955 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3956 {
3957 __val = 8 * __val + *__first - '0';
3958 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
Howard Hinnanta3096872013-07-02 17:43:31 +00003959 __val = 8 * __val + *__first++ - '0';
Howard Hinnant70b3e192010-07-28 17:35:27 +00003960 }
3961 if (__str)
3962 *__str = _CharT(__val);
3963 else
3964 __push_char(_CharT(__val));
3965 }
3966 else
Marshall Clowc8ccc292015-07-28 13:30:47 +00003967 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70b3e192010-07-28 17:35:27 +00003968 return __first;
3969}
3970
3971template <class _CharT, class _Traits>
3972template <class _ForwardIterator>
3973_ForwardIterator
Howard Hinnant89a40572010-06-25 20:56:08 +00003974basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00003975 _ForwardIterator __last,
3976 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant89a40572010-06-25 20:56:08 +00003977{
3978 // Found [=
3979 // This means =] must exist
3980 value_type _Equal_close[2] = {'=', ']'};
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00003981 _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
Howard Hinnant89a40572010-06-25 20:56:08 +00003982 _Equal_close+2);
3983 if (__temp == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00003984 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00003985 // [__first, __temp) contains all text in [= ... =]
Howard Hinnant89a40572010-06-25 20:56:08 +00003986 string_type __collate_name =
3987 __traits_.lookup_collatename(__first, __temp);
3988 if (__collate_name.empty())
Marshall Clowc8ccc292015-07-28 13:30:47 +00003989 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant89a40572010-06-25 20:56:08 +00003990 string_type __equiv_name =
3991 __traits_.transform_primary(__collate_name.begin(),
3992 __collate_name.end());
3993 if (!__equiv_name.empty())
Howard Hinnant3034c902010-07-13 21:48:06 +00003994 __ml->__add_equivalence(__equiv_name);
Howard Hinnant89a40572010-06-25 20:56:08 +00003995 else
Howard Hinnant3034c902010-07-13 21:48:06 +00003996 {
3997 switch (__collate_name.size())
3998 {
3999 case 1:
4000 __ml->__add_char(__collate_name[0]);
4001 break;
4002 case 2:
4003 __ml->__add_digraph(__collate_name[0], __collate_name[1]);
4004 break;
4005 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00004006 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant3034c902010-07-13 21:48:06 +00004007 }
4008 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004009 __first = _VSTD::next(__temp, 2);
Howard Hinnant89a40572010-06-25 20:56:08 +00004010 return __first;
4011}
4012
4013template <class _CharT, class _Traits>
4014template <class _ForwardIterator>
4015_ForwardIterator
4016basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00004017 _ForwardIterator __last,
4018 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant89a40572010-06-25 20:56:08 +00004019{
4020 // Found [:
4021 // This means :] must exist
4022 value_type _Colon_close[2] = {':', ']'};
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004023 _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
Howard Hinnant89a40572010-06-25 20:56:08 +00004024 _Colon_close+2);
4025 if (__temp == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004026 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00004027 // [__first, __temp) contains all text in [: ... :]
4028 typedef typename _Traits::char_class_type char_class_type;
4029 char_class_type __class_type =
4030 __traits_.lookup_classname(__first, __temp, __flags_ & icase);
4031 if (__class_type == 0)
Mikhail Maltsev6ef945b2018-01-24 12:45:18 +00004032 __throw_regex_error<regex_constants::error_ctype>();
Howard Hinnant3034c902010-07-13 21:48:06 +00004033 __ml->__add_class(__class_type);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004034 __first = _VSTD::next(__temp, 2);
Howard Hinnant89a40572010-06-25 20:56:08 +00004035 return __first;
4036}
4037
4038template <class _CharT, class _Traits>
4039template <class _ForwardIterator>
4040_ForwardIterator
4041basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
Howard Hinnant3034c902010-07-13 21:48:06 +00004042 _ForwardIterator __last,
4043 basic_string<_CharT>& __col_sym)
Howard Hinnant89a40572010-06-25 20:56:08 +00004044{
4045 // Found [.
4046 // This means .] must exist
4047 value_type _Dot_close[2] = {'.', ']'};
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004048 _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
Howard Hinnant89a40572010-06-25 20:56:08 +00004049 _Dot_close+2);
4050 if (__temp == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004051 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant89a40572010-06-25 20:56:08 +00004052 // [__first, __temp) contains all text in [. ... .]
Howard Hinnant3034c902010-07-13 21:48:06 +00004053 __col_sym = __traits_.lookup_collatename(__first, __temp);
4054 switch (__col_sym.size())
4055 {
4056 case 1:
4057 case 2:
4058 break;
4059 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00004060 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant3034c902010-07-13 21:48:06 +00004061 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004062 __first = _VSTD::next(__temp, 2);
Howard Hinnant89a40572010-06-25 20:56:08 +00004063 return __first;
4064}
4065
4066template <class _CharT, class _Traits>
4067template <class _ForwardIterator>
4068_ForwardIterator
4069basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4070 _ForwardIterator __last,
4071 int& __c)
4072{
Marshall Clowaa38d972014-01-18 03:40:03 +00004073 if (__first != __last )
Howard Hinnant89a40572010-06-25 20:56:08 +00004074 {
Marshall Clowaa38d972014-01-18 03:40:03 +00004075 int __val = __traits_.value(*__first, 10);
4076 if ( __val != -1 )
Howard Hinnant89a40572010-06-25 20:56:08 +00004077 {
Marshall Clowaa38d972014-01-18 03:40:03 +00004078 __c = __val;
4079 for (++__first;
4080 __first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
4081 ++__first)
4082 {
Marshall Clow863ae382017-10-19 17:39:16 +00004083 if (__c >= std::numeric_limits<int>::max() / 10)
4084 __throw_regex_error<regex_constants::error_badbrace>();
Marshall Clowaa38d972014-01-18 03:40:03 +00004085 __c *= 10;
4086 __c += __val;
4087 }
Howard Hinnant89a40572010-06-25 20:56:08 +00004088 }
4089 }
4090 return __first;
4091}
4092
Howard Hinnant67ad2132010-06-29 18:37:43 +00004093template <class _CharT, class _Traits>
Howard Hinnante1053822010-07-22 17:53:24 +00004094template <class _ForwardIterator>
4095_ForwardIterator
4096basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4097 _ForwardIterator __last)
4098{
4099 __owns_one_state<_CharT>* __sa = __end_;
4100 _ForwardIterator __temp = __parse_alternative(__first, __last);
4101 if (__temp == __first)
4102 __push_empty();
4103 __first = __temp;
4104 while (__first != __last && *__first == '|')
4105 {
4106 __owns_one_state<_CharT>* __sb = __end_;
4107 __temp = __parse_alternative(++__first, __last);
4108 if (__temp == __first)
4109 __push_empty();
4110 __push_alternation(__sa, __sb);
4111 __first = __temp;
4112 }
4113 return __first;
4114}
4115
4116template <class _CharT, class _Traits>
4117template <class _ForwardIterator>
4118_ForwardIterator
4119basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4120 _ForwardIterator __last)
4121{
4122 while (true)
4123 {
4124 _ForwardIterator __temp = __parse_term(__first, __last);
4125 if (__temp == __first)
4126 break;
4127 __first = __temp;
4128 }
4129 return __first;
4130}
4131
4132template <class _CharT, class _Traits>
4133template <class _ForwardIterator>
4134_ForwardIterator
4135basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4136 _ForwardIterator __last)
4137{
4138 _ForwardIterator __temp = __parse_assertion(__first, __last);
4139 if (__temp == __first)
4140 {
Howard Hinnant70d27852010-07-27 01:25:38 +00004141 __owns_one_state<_CharT>* __e = __end_;
4142 unsigned __mexp_begin = __marked_count_;
Howard Hinnante1053822010-07-22 17:53:24 +00004143 __temp = __parse_atom(__first, __last);
4144 if (__temp != __first)
Howard Hinnant70d27852010-07-27 01:25:38 +00004145 __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4146 __mexp_begin+1, __marked_count_+1);
Howard Hinnante1053822010-07-22 17:53:24 +00004147 }
Howard Hinnant70d27852010-07-27 01:25:38 +00004148 else
4149 __first = __temp;
Howard Hinnante1053822010-07-22 17:53:24 +00004150 return __first;
4151}
4152
4153template <class _CharT, class _Traits>
4154template <class _ForwardIterator>
4155_ForwardIterator
4156basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4157 _ForwardIterator __last)
4158{
4159 if (__first != __last)
4160 {
4161 switch (*__first)
4162 {
4163 case '^':
4164 __push_l_anchor();
4165 ++__first;
4166 break;
4167 case '$':
4168 __push_r_anchor();
4169 ++__first;
4170 break;
4171 case '\\':
4172 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004173 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnante1053822010-07-22 17:53:24 +00004174 if (__temp != __last)
4175 {
4176 if (*__temp == 'b')
4177 {
Howard Hinnant70d27852010-07-27 01:25:38 +00004178 __push_word_boundary(false);
Howard Hinnante1053822010-07-22 17:53:24 +00004179 __first = ++__temp;
4180 }
4181 else if (*__temp == 'B')
4182 {
Howard Hinnant70d27852010-07-27 01:25:38 +00004183 __push_word_boundary(true);
Howard Hinnante1053822010-07-22 17:53:24 +00004184 __first = ++__temp;
4185 }
4186 }
4187 }
4188 break;
4189 case '(':
4190 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004191 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnante1053822010-07-22 17:53:24 +00004192 if (__temp != __last && *__temp == '?')
4193 {
4194 if (++__temp != __last)
4195 {
4196 switch (*__temp)
4197 {
4198 case '=':
Howard Hinnant126da6a2010-07-27 22:20:32 +00004199 {
4200 basic_regex __exp;
4201 __exp.__flags_ = __flags_;
4202 __temp = __exp.__parse(++__temp, __last);
Howard Hinnant3efac712013-07-23 16:18:04 +00004203 unsigned __mexp = __exp.__marked_count_;
4204 __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
4205 __marked_count_ += __mexp;
Howard Hinnant126da6a2010-07-27 22:20:32 +00004206 if (__temp == __last || *__temp != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00004207 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant126da6a2010-07-27 22:20:32 +00004208 __first = ++__temp;
4209 }
Howard Hinnante1053822010-07-22 17:53:24 +00004210 break;
4211 case '!':
Howard Hinnant126da6a2010-07-27 22:20:32 +00004212 {
4213 basic_regex __exp;
4214 __exp.__flags_ = __flags_;
4215 __temp = __exp.__parse(++__temp, __last);
Howard Hinnant3efac712013-07-23 16:18:04 +00004216 unsigned __mexp = __exp.__marked_count_;
4217 __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
4218 __marked_count_ += __mexp;
Howard Hinnant126da6a2010-07-27 22:20:32 +00004219 if (__temp == __last || *__temp != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00004220 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant126da6a2010-07-27 22:20:32 +00004221 __first = ++__temp;
4222 }
Howard Hinnante1053822010-07-22 17:53:24 +00004223 break;
4224 }
4225 }
4226 }
4227 }
4228 break;
4229 }
4230 }
4231 return __first;
4232}
4233
4234template <class _CharT, class _Traits>
4235template <class _ForwardIterator>
4236_ForwardIterator
4237basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4238 _ForwardIterator __last)
4239{
Howard Hinnant70d27852010-07-27 01:25:38 +00004240 if (__first != __last)
4241 {
4242 switch (*__first)
4243 {
4244 case '.':
4245 __push_match_any_but_newline();
4246 ++__first;
4247 break;
4248 case '\\':
4249 __first = __parse_atom_escape(__first, __last);
4250 break;
4251 case '[':
4252 __first = __parse_bracket_expression(__first, __last);
4253 break;
4254 case '(':
4255 {
Howard Hinnant72f73582010-08-11 17:04:31 +00004256 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004257 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004258 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004259 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant70d27852010-07-27 01:25:38 +00004260 if (__temp != __last && *__first == '?' && *__temp == ':')
4261 {
4262 ++__open_count_;
4263 __first = __parse_ecma_exp(++__temp, __last);
4264 if (__first == __last || *__first != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00004265 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004266 --__open_count_;
4267 ++__first;
4268 }
4269 else
4270 {
4271 __push_begin_marked_subexpression();
4272 unsigned __temp_count = __marked_count_;
4273 ++__open_count_;
4274 __first = __parse_ecma_exp(__first, __last);
4275 if (__first == __last || *__first != ')')
Marshall Clowc8ccc292015-07-28 13:30:47 +00004276 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004277 __push_end_marked_subexpression(__temp_count);
4278 --__open_count_;
4279 ++__first;
4280 }
4281 }
4282 break;
Marshall Clow82058212015-07-23 18:27:51 +00004283 case '*':
4284 case '+':
4285 case '?':
4286 case '{':
Marshall Clowc8ccc292015-07-28 13:30:47 +00004287 __throw_regex_error<regex_constants::error_badrepeat>();
Marshall Clow82058212015-07-23 18:27:51 +00004288 break;
Howard Hinnant70d27852010-07-27 01:25:38 +00004289 default:
4290 __first = __parse_pattern_character(__first, __last);
4291 break;
4292 }
4293 }
4294 return __first;
4295}
4296
4297template <class _CharT, class _Traits>
4298template <class _ForwardIterator>
4299_ForwardIterator
4300basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4301 _ForwardIterator __last)
4302{
4303 if (__first != __last && *__first == '\\')
4304 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004305 _ForwardIterator __t1 = _VSTD::next(__first);
Marshall Clowdb9633c2016-01-19 00:50:37 +00004306 if (__t1 == __last)
4307 __throw_regex_error<regex_constants::error_escape>();
4308
Howard Hinnant70d27852010-07-27 01:25:38 +00004309 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4310 if (__t2 != __t1)
4311 __first = __t2;
4312 else
4313 {
4314 __t2 = __parse_character_class_escape(__t1, __last);
4315 if (__t2 != __t1)
4316 __first = __t2;
4317 else
4318 {
4319 __t2 = __parse_character_escape(__t1, __last);
4320 if (__t2 != __t1)
4321 __first = __t2;
4322 }
4323 }
4324 }
4325 return __first;
4326}
4327
4328template <class _CharT, class _Traits>
4329template <class _ForwardIterator>
4330_ForwardIterator
4331basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4332 _ForwardIterator __last)
4333{
4334 if (__first != __last)
4335 {
4336 if (*__first == '0')
4337 {
4338 __push_char(_CharT());
4339 ++__first;
4340 }
4341 else if ('1' <= *__first && *__first <= '9')
4342 {
4343 unsigned __v = *__first - '0';
Marshall Clowdc03ec72016-12-24 17:21:03 +00004344 for (++__first;
4345 __first != __last && '0' <= *__first && *__first <= '9'; ++__first)
Marshall Clow266b5ec2017-10-19 22:10:41 +00004346 {
4347 if (__v >= std::numeric_limits<unsigned>::max() / 10)
4348 __throw_regex_error<regex_constants::error_backref>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004349 __v = 10 * __v + *__first - '0';
Marshall Clow266b5ec2017-10-19 22:10:41 +00004350 }
4351 if (__v == 0 || __v > mark_count())
Marshall Clowc8ccc292015-07-28 13:30:47 +00004352 __throw_regex_error<regex_constants::error_backref>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004353 __push_back_ref(__v);
4354 }
4355 }
4356 return __first;
4357}
4358
4359template <class _CharT, class _Traits>
4360template <class _ForwardIterator>
4361_ForwardIterator
4362basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4363 _ForwardIterator __last)
4364{
4365 if (__first != __last)
4366 {
4367 __bracket_expression<_CharT, _Traits>* __ml;
4368 switch (*__first)
4369 {
4370 case 'd':
4371 __ml = __start_matching_list(false);
4372 __ml->__add_class(ctype_base::digit);
4373 ++__first;
4374 break;
4375 case 'D':
4376 __ml = __start_matching_list(true);
4377 __ml->__add_class(ctype_base::digit);
4378 ++__first;
4379 break;
4380 case 's':
4381 __ml = __start_matching_list(false);
4382 __ml->__add_class(ctype_base::space);
4383 ++__first;
4384 break;
4385 case 'S':
4386 __ml = __start_matching_list(true);
4387 __ml->__add_class(ctype_base::space);
4388 ++__first;
4389 break;
4390 case 'w':
4391 __ml = __start_matching_list(false);
4392 __ml->__add_class(ctype_base::alnum);
4393 __ml->__add_char('_');
4394 ++__first;
4395 break;
4396 case 'W':
4397 __ml = __start_matching_list(true);
4398 __ml->__add_class(ctype_base::alnum);
4399 __ml->__add_char('_');
4400 ++__first;
4401 break;
4402 }
4403 }
4404 return __first;
4405}
4406
4407template <class _CharT, class _Traits>
4408template <class _ForwardIterator>
4409_ForwardIterator
4410basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
Howard Hinnant70b3e192010-07-28 17:35:27 +00004411 _ForwardIterator __last,
4412 basic_string<_CharT>* __str)
Howard Hinnant70d27852010-07-27 01:25:38 +00004413{
4414 if (__first != __last)
4415 {
4416 _ForwardIterator __t;
4417 unsigned __sum = 0;
4418 int __hd;
4419 switch (*__first)
4420 {
4421 case 'f':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004422 if (__str)
4423 *__str = _CharT(0xC);
4424 else
4425 __push_char(_CharT(0xC));
Howard Hinnant70d27852010-07-27 01:25:38 +00004426 ++__first;
4427 break;
4428 case 'n':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004429 if (__str)
4430 *__str = _CharT(0xA);
4431 else
4432 __push_char(_CharT(0xA));
Howard Hinnant70d27852010-07-27 01:25:38 +00004433 ++__first;
4434 break;
4435 case 'r':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004436 if (__str)
4437 *__str = _CharT(0xD);
4438 else
4439 __push_char(_CharT(0xD));
Howard Hinnant70d27852010-07-27 01:25:38 +00004440 ++__first;
4441 break;
4442 case 't':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004443 if (__str)
4444 *__str = _CharT(0x9);
4445 else
4446 __push_char(_CharT(0x9));
Howard Hinnant70d27852010-07-27 01:25:38 +00004447 ++__first;
4448 break;
4449 case 'v':
Howard Hinnant70b3e192010-07-28 17:35:27 +00004450 if (__str)
4451 *__str = _CharT(0xB);
4452 else
4453 __push_char(_CharT(0xB));
Howard Hinnant70d27852010-07-27 01:25:38 +00004454 ++__first;
4455 break;
4456 case 'c':
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004457 if ((__t = _VSTD::next(__first)) != __last)
Howard Hinnant70d27852010-07-27 01:25:38 +00004458 {
Howard Hinnantd04741b2013-07-15 18:21:11 +00004459 if (('A' <= *__t && *__t <= 'Z') ||
4460 ('a' <= *__t && *__t <= 'z'))
Howard Hinnant70d27852010-07-27 01:25:38 +00004461 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00004462 if (__str)
4463 *__str = _CharT(*__t % 32);
4464 else
4465 __push_char(_CharT(*__t % 32));
Howard Hinnant70d27852010-07-27 01:25:38 +00004466 __first = ++__t;
4467 }
Howard Hinnantd04741b2013-07-15 18:21:11 +00004468 else
Marshall Clowc8ccc292015-07-28 13:30:47 +00004469 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004470 }
Howard Hinnantd04741b2013-07-15 18:21:11 +00004471 else
Marshall Clowc8ccc292015-07-28 13:30:47 +00004472 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004473 break;
4474 case 'u':
Howard Hinnant72f73582010-08-11 17:04:31 +00004475 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004476 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004477 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004478 __hd = __traits_.value(*__first, 16);
4479 if (__hd == -1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004480 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant28b24882011-12-01 20:21:04 +00004481 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant72f73582010-08-11 17:04:31 +00004482 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004483 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004484 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004485 __hd = __traits_.value(*__first, 16);
4486 if (__hd == -1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004487 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant28b24882011-12-01 20:21:04 +00004488 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant70d27852010-07-27 01:25:38 +00004489 // drop through
4490 case 'x':
Howard Hinnant72f73582010-08-11 17:04:31 +00004491 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004492 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004493 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004494 __hd = __traits_.value(*__first, 16);
4495 if (__hd == -1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004496 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant28b24882011-12-01 20:21:04 +00004497 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant72f73582010-08-11 17:04:31 +00004498 ++__first;
Howard Hinnant72f73582010-08-11 17:04:31 +00004499 if (__first == __last)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004500 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004501 __hd = __traits_.value(*__first, 16);
4502 if (__hd == -1)
Marshall Clowc8ccc292015-07-28 13:30:47 +00004503 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant28b24882011-12-01 20:21:04 +00004504 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant70b3e192010-07-28 17:35:27 +00004505 if (__str)
4506 *__str = _CharT(__sum);
4507 else
4508 __push_char(_CharT(__sum));
Howard Hinnant70d27852010-07-27 01:25:38 +00004509 ++__first;
4510 break;
Marshall Clowf6cef0d2014-05-21 16:29:50 +00004511 case '0':
4512 if (__str)
4513 *__str = _CharT(0);
4514 else
4515 __push_char(_CharT(0));
4516 ++__first;
4517 break;
Howard Hinnant70d27852010-07-27 01:25:38 +00004518 default:
4519 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4520 {
Howard Hinnant70b3e192010-07-28 17:35:27 +00004521 if (__str)
4522 *__str = *__first;
4523 else
4524 __push_char(*__first);
Howard Hinnant70d27852010-07-27 01:25:38 +00004525 ++__first;
4526 }
Howard Hinnant4f7a1f52013-06-28 18:57:30 +00004527 else
Marshall Clowc8ccc292015-07-28 13:30:47 +00004528 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant70d27852010-07-27 01:25:38 +00004529 break;
4530 }
4531 }
4532 return __first;
4533}
4534
4535template <class _CharT, class _Traits>
4536template <class _ForwardIterator>
4537_ForwardIterator
4538basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4539 _ForwardIterator __last)
4540{
4541 if (__first != __last)
4542 {
4543 switch (*__first)
4544 {
4545 case '^':
4546 case '$':
4547 case '\\':
4548 case '.':
4549 case '*':
4550 case '+':
4551 case '?':
4552 case '(':
4553 case ')':
4554 case '[':
4555 case ']':
4556 case '{':
4557 case '}':
4558 case '|':
4559 break;
4560 default:
4561 __push_char(*__first);
4562 ++__first;
4563 break;
4564 }
4565 }
4566 return __first;
Howard Hinnante1053822010-07-22 17:53:24 +00004567}
4568
4569template <class _CharT, class _Traits>
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004570template <class _ForwardIterator>
4571_ForwardIterator
4572basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4573 _ForwardIterator __last)
4574{
4575 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004576 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004577 if (__t1 != __first)
4578 __parse_basic_reg_exp(__first, __t1);
4579 else
4580 __push_empty();
4581 __first = __t1;
4582 if (__first != __last)
4583 ++__first;
4584 while (__first != __last)
4585 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004586 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004587 __owns_one_state<_CharT>* __sb = __end_;
4588 if (__t1 != __first)
4589 __parse_basic_reg_exp(__first, __t1);
4590 else
4591 __push_empty();
4592 __push_alternation(__sa, __sb);
4593 __first = __t1;
4594 if (__first != __last)
4595 ++__first;
4596 }
4597 return __first;
4598}
4599
4600template <class _CharT, class _Traits>
4601template <class _ForwardIterator>
4602_ForwardIterator
4603basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4604 _ForwardIterator __last)
4605{
4606 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004607 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004608 if (__t1 != __first)
4609 __parse_extended_reg_exp(__first, __t1);
4610 else
4611 __push_empty();
4612 __first = __t1;
4613 if (__first != __last)
4614 ++__first;
4615 while (__first != __last)
4616 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004617 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnanteaf649e2010-07-27 19:53:10 +00004618 __owns_one_state<_CharT>* __sb = __end_;
4619 if (__t1 != __first)
4620 __parse_extended_reg_exp(__first, __t1);
4621 else
4622 __push_empty();
4623 __push_alternation(__sa, __sb);
4624 __first = __t1;
4625 if (__first != __last)
4626 ++__first;
4627 }
4628 return __first;
4629}
4630
4631template <class _CharT, class _Traits>
Howard Hinnant67ad2132010-06-29 18:37:43 +00004632void
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00004633basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4634 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4635 bool __greedy)
4636{
4637 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4638 __end_->first() = nullptr;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00004639 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4640 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4641 __min, __max));
4642 __s->first() = nullptr;
4643 __e1.release();
4644 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00004645 __end_ = __e2->second();
Howard Hinnantaa0874c2010-07-12 15:51:17 +00004646 __s->first() = __e2.release();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00004647 ++__loop_count_;
4648}
4649
4650template <class _CharT, class _Traits>
4651void
Howard Hinnant67ad2132010-06-29 18:37:43 +00004652basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4653{
Howard Hinnant3034c902010-07-13 21:48:06 +00004654 if (flags() & icase)
Howard Hinnantcfe8d272010-07-12 19:11:27 +00004655 __end_->first() = new __match_char_icase<_CharT, _Traits>
4656 (__traits_, __c, __end_->first());
Howard Hinnant3034c902010-07-13 21:48:06 +00004657 else if (flags() & collate)
Howard Hinnantcfe8d272010-07-12 19:11:27 +00004658 __end_->first() = new __match_char_collate<_CharT, _Traits>
4659 (__traits_, __c, __end_->first());
4660 else
4661 __end_->first() = new __match_char<_CharT>(__c, __end_->first());
Howard Hinnant5bf96132010-07-08 17:43:58 +00004662 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
Howard Hinnant67ad2132010-06-29 18:37:43 +00004663}
4664
Howard Hinnant93ef6552010-06-30 20:30:19 +00004665template <class _CharT, class _Traits>
4666void
4667basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4668{
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00004669 if (!(__flags_ & nosubs))
4670 {
4671 __end_->first() =
4672 new __begin_marked_subexpression<_CharT>(++__marked_count_,
4673 __end_->first());
4674 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4675 }
Howard Hinnant93ef6552010-06-30 20:30:19 +00004676}
4677
4678template <class _CharT, class _Traits>
4679void
4680basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4681{
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00004682 if (!(__flags_ & nosubs))
4683 {
4684 __end_->first() =
4685 new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4686 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4687 }
Howard Hinnant93ef6552010-06-30 20:30:19 +00004688}
4689
Howard Hinnantaad0aa62010-07-09 00:15:26 +00004690template <class _CharT, class _Traits>
4691void
Howard Hinnant066ba512011-03-26 20:02:27 +00004692basic_regex<_CharT, _Traits>::__push_l_anchor()
4693{
4694 __end_->first() = new __l_anchor<_CharT>(__end_->first());
4695 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4696}
4697
4698template <class _CharT, class _Traits>
4699void
Howard Hinnantaad0aa62010-07-09 00:15:26 +00004700basic_regex<_CharT, _Traits>::__push_r_anchor()
4701{
4702 __end_->first() = new __r_anchor<_CharT>(__end_->first());
4703 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4704}
4705
Howard Hinnantaa0874c2010-07-12 15:51:17 +00004706template <class _CharT, class _Traits>
4707void
4708basic_regex<_CharT, _Traits>::__push_match_any()
4709{
4710 __end_->first() = new __match_any<_CharT>(__end_->first());
4711 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4712}
Howard Hinnantaad0aa62010-07-09 00:15:26 +00004713
Howard Hinnant2a315e32010-07-12 18:16:05 +00004714template <class _CharT, class _Traits>
4715void
Howard Hinnant70d27852010-07-27 01:25:38 +00004716basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4717{
4718 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4719 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4720}
4721
4722template <class _CharT, class _Traits>
4723void
Howard Hinnante1053822010-07-22 17:53:24 +00004724basic_regex<_CharT, _Traits>::__push_empty()
4725{
4726 __end_->first() = new __empty_state<_CharT>(__end_->first());
4727 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4728}
4729
4730template <class _CharT, class _Traits>
4731void
Howard Hinnant70d27852010-07-27 01:25:38 +00004732basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4733{
4734 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4735 __end_->first());
4736 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4737}
4738
4739template <class _CharT, class _Traits>
4740void
Howard Hinnant2a315e32010-07-12 18:16:05 +00004741basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4742{
Howard Hinnant3034c902010-07-13 21:48:06 +00004743 if (flags() & icase)
Howard Hinnantcfe8d272010-07-12 19:11:27 +00004744 __end_->first() = new __back_ref_icase<_CharT, _Traits>
4745 (__traits_, __i, __end_->first());
Howard Hinnant3034c902010-07-13 21:48:06 +00004746 else if (flags() & collate)
Howard Hinnantcfe8d272010-07-12 19:11:27 +00004747 __end_->first() = new __back_ref_collate<_CharT, _Traits>
4748 (__traits_, __i, __end_->first());
4749 else
4750 __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
Howard Hinnant2a315e32010-07-12 18:16:05 +00004751 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4752}
4753
Howard Hinnant3034c902010-07-13 21:48:06 +00004754template <class _CharT, class _Traits>
Howard Hinnant16d65422010-07-16 19:08:36 +00004755void
4756basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4757 __owns_one_state<_CharT>* __ea)
4758{
4759 __sa->first() = new __alternate<_CharT>(
4760 static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4761 static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4762 __ea->first() = nullptr;
4763 __ea->first() = new __empty_state<_CharT>(__end_->first());
4764 __end_->first() = nullptr;
4765 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4766 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4767}
4768
4769template <class _CharT, class _Traits>
Howard Hinnant3034c902010-07-13 21:48:06 +00004770__bracket_expression<_CharT, _Traits>*
4771basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4772{
4773 __bracket_expression<_CharT, _Traits>* __r =
4774 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4775 __negate, __flags_ & icase,
4776 __flags_ & collate);
4777 __end_->first() = __r;
4778 __end_ = __r;
4779 return __r;
4780}
4781
Howard Hinnant126da6a2010-07-27 22:20:32 +00004782template <class _CharT, class _Traits>
4783void
4784basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
Howard Hinnant3efac712013-07-23 16:18:04 +00004785 bool __invert,
4786 unsigned __mexp)
Howard Hinnant126da6a2010-07-27 22:20:32 +00004787{
4788 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
Howard Hinnant3efac712013-07-23 16:18:04 +00004789 __end_->first(), __mexp);
Howard Hinnant126da6a2010-07-27 22:20:32 +00004790 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4791}
4792
Howard Hinnant6c891682010-06-24 21:28:00 +00004793typedef basic_regex<char> regex;
4794typedef basic_regex<wchar_t> wregex;
4795
Howard Hinnant67ad2132010-06-29 18:37:43 +00004796// sub_match
4797
4798template <class _BidirectionalIterator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00004799class _LIBCPP_TEMPLATE_VIS sub_match
Howard Hinnant67ad2132010-06-29 18:37:43 +00004800 : public pair<_BidirectionalIterator, _BidirectionalIterator>
4801{
4802public:
4803 typedef _BidirectionalIterator iterator;
4804 typedef typename iterator_traits<iterator>::value_type value_type;
4805 typedef typename iterator_traits<iterator>::difference_type difference_type;
4806 typedef basic_string<value_type> string_type;
4807
4808 bool matched;
4809
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004810 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant5ddd33c2012-07-21 01:31:58 +00004811 _LIBCPP_CONSTEXPR sub_match() : matched() {}
Howard Hinnantb5c53a82010-12-08 21:07:55 +00004812
4813 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004814 difference_type length() const
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00004815 {return matched ? _VSTD::distance(this->first, this->second) : 0;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004816 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004817 string_type str() const
4818 {return matched ? string_type(this->first, this->second) : string_type();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004819 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004820 operator string_type() const
4821 {return str();}
4822
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004823 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004824 int compare(const sub_match& __s) const
4825 {return str().compare(__s.str());}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004826 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004827 int compare(const string_type& __s) const
4828 {return str().compare(__s);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00004829 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant67ad2132010-06-29 18:37:43 +00004830 int compare(const value_type* __s) const
4831 {return str().compare(__s);}
4832};
4833
4834typedef sub_match<const char*> csub_match;
4835typedef sub_match<const wchar_t*> wcsub_match;
4836typedef sub_match<string::const_iterator> ssub_match;
4837typedef sub_match<wstring::const_iterator> wssub_match;
4838
4839template <class _BiIter>
4840inline _LIBCPP_INLINE_VISIBILITY
4841bool
4842operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4843{
4844 return __x.compare(__y) == 0;
4845}
4846
4847template <class _BiIter>
4848inline _LIBCPP_INLINE_VISIBILITY
4849bool
4850operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4851{
4852 return !(__x == __y);
4853}
4854
4855template <class _BiIter>
4856inline _LIBCPP_INLINE_VISIBILITY
4857bool
4858operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4859{
4860 return __x.compare(__y) < 0;
4861}
4862
4863template <class _BiIter>
4864inline _LIBCPP_INLINE_VISIBILITY
4865bool
4866operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4867{
4868 return !(__y < __x);
4869}
4870
4871template <class _BiIter>
4872inline _LIBCPP_INLINE_VISIBILITY
4873bool
4874operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4875{
4876 return !(__x < __y);
4877}
4878
4879template <class _BiIter>
4880inline _LIBCPP_INLINE_VISIBILITY
4881bool
4882operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4883{
4884 return __y < __x;
4885}
4886
4887template <class _BiIter, class _ST, class _SA>
4888inline _LIBCPP_INLINE_VISIBILITY
4889bool
4890operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4891 const sub_match<_BiIter>& __y)
4892{
Marshall Clow54a46342014-12-15 23:57:56 +00004893 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00004894}
4895
4896template <class _BiIter, class _ST, class _SA>
4897inline _LIBCPP_INLINE_VISIBILITY
4898bool
4899operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4900 const sub_match<_BiIter>& __y)
4901{
4902 return !(__x == __y);
4903}
4904
4905template <class _BiIter, class _ST, class _SA>
4906inline _LIBCPP_INLINE_VISIBILITY
4907bool
4908operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4909 const sub_match<_BiIter>& __y)
4910{
Marshall Clow54a46342014-12-15 23:57:56 +00004911 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00004912}
4913
4914template <class _BiIter, class _ST, class _SA>
4915inline _LIBCPP_INLINE_VISIBILITY
4916bool
4917operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4918 const sub_match<_BiIter>& __y)
4919{
4920 return __y < __x;
4921}
4922
4923template <class _BiIter, class _ST, class _SA>
4924inline _LIBCPP_INLINE_VISIBILITY
4925bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4926 const sub_match<_BiIter>& __y)
4927{
4928 return !(__x < __y);
4929}
4930
4931template <class _BiIter, class _ST, class _SA>
4932inline _LIBCPP_INLINE_VISIBILITY
4933bool
4934operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4935 const sub_match<_BiIter>& __y)
4936{
4937 return !(__y < __x);
4938}
4939
4940template <class _BiIter, class _ST, class _SA>
4941inline _LIBCPP_INLINE_VISIBILITY
4942bool
4943operator==(const sub_match<_BiIter>& __x,
4944 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4945{
Marshall Clow54a46342014-12-15 23:57:56 +00004946 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00004947}
4948
4949template <class _BiIter, class _ST, class _SA>
4950inline _LIBCPP_INLINE_VISIBILITY
4951bool
4952operator!=(const sub_match<_BiIter>& __x,
4953 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4954{
4955 return !(__x == __y);
4956}
4957
4958template <class _BiIter, class _ST, class _SA>
4959inline _LIBCPP_INLINE_VISIBILITY
4960bool
4961operator<(const sub_match<_BiIter>& __x,
4962 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4963{
Marshall Clow54a46342014-12-15 23:57:56 +00004964 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
Howard Hinnant67ad2132010-06-29 18:37:43 +00004965}
4966
4967template <class _BiIter, class _ST, class _SA>
4968inline _LIBCPP_INLINE_VISIBILITY
4969bool operator>(const sub_match<_BiIter>& __x,
4970 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4971{
4972 return __y < __x;
4973}
4974
4975template <class _BiIter, class _ST, class _SA>
4976inline _LIBCPP_INLINE_VISIBILITY
4977bool
4978operator>=(const sub_match<_BiIter>& __x,
4979 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4980{
4981 return !(__x < __y);
4982}
4983
4984template <class _BiIter, class _ST, class _SA>
4985inline _LIBCPP_INLINE_VISIBILITY
4986bool
4987operator<=(const sub_match<_BiIter>& __x,
4988 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4989{
4990 return !(__y < __x);
4991}
4992
4993template <class _BiIter>
4994inline _LIBCPP_INLINE_VISIBILITY
4995bool
4996operator==(typename iterator_traits<_BiIter>::value_type const* __x,
4997 const sub_match<_BiIter>& __y)
4998{
4999 return __y.compare(__x) == 0;
5000}
5001
5002template <class _BiIter>
5003inline _LIBCPP_INLINE_VISIBILITY
5004bool
5005operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
5006 const sub_match<_BiIter>& __y)
5007{
5008 return !(__x == __y);
5009}
5010
5011template <class _BiIter>
5012inline _LIBCPP_INLINE_VISIBILITY
5013bool
5014operator<(typename iterator_traits<_BiIter>::value_type const* __x,
5015 const sub_match<_BiIter>& __y)
5016{
5017 return __y.compare(__x) > 0;
5018}
5019
5020template <class _BiIter>
5021inline _LIBCPP_INLINE_VISIBILITY
5022bool
5023operator>(typename iterator_traits<_BiIter>::value_type const* __x,
5024 const sub_match<_BiIter>& __y)
5025{
5026 return __y < __x;
5027}
5028
5029template <class _BiIter>
5030inline _LIBCPP_INLINE_VISIBILITY
5031bool
5032operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
5033 const sub_match<_BiIter>& __y)
5034{
5035 return !(__x < __y);
5036}
5037
5038template <class _BiIter>
5039inline _LIBCPP_INLINE_VISIBILITY
5040bool
5041operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
5042 const sub_match<_BiIter>& __y)
5043{
5044 return !(__y < __x);
5045}
5046
5047template <class _BiIter>
5048inline _LIBCPP_INLINE_VISIBILITY
5049bool
5050operator==(const sub_match<_BiIter>& __x,
5051 typename iterator_traits<_BiIter>::value_type const* __y)
5052{
5053 return __x.compare(__y) == 0;
5054}
5055
5056template <class _BiIter>
5057inline _LIBCPP_INLINE_VISIBILITY
5058bool
5059operator!=(const sub_match<_BiIter>& __x,
5060 typename iterator_traits<_BiIter>::value_type const* __y)
5061{
5062 return !(__x == __y);
5063}
5064
5065template <class _BiIter>
5066inline _LIBCPP_INLINE_VISIBILITY
5067bool
5068operator<(const sub_match<_BiIter>& __x,
5069 typename iterator_traits<_BiIter>::value_type const* __y)
5070{
5071 return __x.compare(__y) < 0;
5072}
5073
5074template <class _BiIter>
5075inline _LIBCPP_INLINE_VISIBILITY
5076bool
5077operator>(const sub_match<_BiIter>& __x,
5078 typename iterator_traits<_BiIter>::value_type const* __y)
5079{
5080 return __y < __x;
5081}
5082
5083template <class _BiIter>
5084inline _LIBCPP_INLINE_VISIBILITY
5085bool
5086operator>=(const sub_match<_BiIter>& __x,
5087 typename iterator_traits<_BiIter>::value_type const* __y)
5088{
5089 return !(__x < __y);
5090}
5091
5092template <class _BiIter>
5093inline _LIBCPP_INLINE_VISIBILITY
5094bool
5095operator<=(const sub_match<_BiIter>& __x,
5096 typename iterator_traits<_BiIter>::value_type const* __y)
5097{
5098 return !(__y < __x);
5099}
5100
5101template <class _BiIter>
5102inline _LIBCPP_INLINE_VISIBILITY
5103bool
5104operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5105 const sub_match<_BiIter>& __y)
5106{
5107 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5108 return __y.compare(string_type(1, __x)) == 0;
5109}
5110
5111template <class _BiIter>
5112inline _LIBCPP_INLINE_VISIBILITY
5113bool
5114operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5115 const sub_match<_BiIter>& __y)
5116{
5117 return !(__x == __y);
5118}
5119
5120template <class _BiIter>
5121inline _LIBCPP_INLINE_VISIBILITY
5122bool
5123operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5124 const sub_match<_BiIter>& __y)
5125{
5126 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5127 return __y.compare(string_type(1, __x)) > 0;
5128}
5129
5130template <class _BiIter>
5131inline _LIBCPP_INLINE_VISIBILITY
5132bool
5133operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5134 const sub_match<_BiIter>& __y)
5135{
5136 return __y < __x;
5137}
5138
5139template <class _BiIter>
5140inline _LIBCPP_INLINE_VISIBILITY
5141bool
5142operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5143 const sub_match<_BiIter>& __y)
5144{
5145 return !(__x < __y);
5146}
5147
5148template <class _BiIter>
5149inline _LIBCPP_INLINE_VISIBILITY
5150bool
5151operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5152 const sub_match<_BiIter>& __y)
5153{
5154 return !(__y < __x);
5155}
5156
5157template <class _BiIter>
5158inline _LIBCPP_INLINE_VISIBILITY
5159bool
5160operator==(const sub_match<_BiIter>& __x,
5161 typename iterator_traits<_BiIter>::value_type const& __y)
5162{
5163 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5164 return __x.compare(string_type(1, __y)) == 0;
5165}
5166
5167template <class _BiIter>
5168inline _LIBCPP_INLINE_VISIBILITY
5169bool
5170operator!=(const sub_match<_BiIter>& __x,
5171 typename iterator_traits<_BiIter>::value_type const& __y)
5172{
5173 return !(__x == __y);
5174}
5175
5176template <class _BiIter>
5177inline _LIBCPP_INLINE_VISIBILITY
5178bool
5179operator<(const sub_match<_BiIter>& __x,
5180 typename iterator_traits<_BiIter>::value_type const& __y)
5181{
5182 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5183 return __x.compare(string_type(1, __y)) < 0;
5184}
5185
5186template <class _BiIter>
5187inline _LIBCPP_INLINE_VISIBILITY
5188bool
5189operator>(const sub_match<_BiIter>& __x,
5190 typename iterator_traits<_BiIter>::value_type const& __y)
5191{
5192 return __y < __x;
5193}
5194
5195template <class _BiIter>
5196inline _LIBCPP_INLINE_VISIBILITY
5197bool
5198operator>=(const sub_match<_BiIter>& __x,
5199 typename iterator_traits<_BiIter>::value_type const& __y)
5200{
5201 return !(__x < __y);
5202}
5203
5204template <class _BiIter>
5205inline _LIBCPP_INLINE_VISIBILITY
5206bool
5207operator<=(const sub_match<_BiIter>& __x,
5208 typename iterator_traits<_BiIter>::value_type const& __y)
5209{
5210 return !(__y < __x);
5211}
5212
5213template <class _CharT, class _ST, class _BiIter>
5214inline _LIBCPP_INLINE_VISIBILITY
5215basic_ostream<_CharT, _ST>&
5216operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5217{
5218 return __os << __m.str();
5219}
5220
Howard Hinnant70d27852010-07-27 01:25:38 +00005221template <class _BidirectionalIterator, class _Allocator>
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00005222class _LIBCPP_TEMPLATE_VIS match_results
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005223{
5224public:
5225 typedef _Allocator allocator_type;
5226 typedef sub_match<_BidirectionalIterator> value_type;
5227private:
5228 typedef vector<value_type, allocator_type> __container_type;
5229
5230 __container_type __matches_;
5231 value_type __unmatched_;
5232 value_type __prefix_;
5233 value_type __suffix_;
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005234 bool __ready_;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005235public:
Howard Hinnantd3925342010-08-16 20:21:16 +00005236 _BidirectionalIterator __position_start_;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005237 typedef const value_type& const_reference;
Marshall Clow96e06142014-02-26 01:56:31 +00005238 typedef value_type& reference;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005239 typedef typename __container_type::const_iterator const_iterator;
5240 typedef const_iterator iterator;
5241 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5242 typedef typename allocator_traits<allocator_type>::size_type size_type;
5243 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5244 typedef basic_string<char_type> string_type;
5245
5246 // construct/copy/destroy:
5247 explicit match_results(const allocator_type& __a = allocator_type());
5248// match_results(const match_results&) = default;
5249// match_results& operator=(const match_results&) = default;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005250// match_results(match_results&& __m) = default;
5251// match_results& operator=(match_results&& __m) = default;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005252// ~match_results() = default;
5253
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005254 _LIBCPP_INLINE_VISIBILITY
5255 bool ready() const {return __ready_;}
5256
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005257 // size:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005258 _LIBCPP_INLINE_VISIBILITY
Marshall Clow081bcd22017-11-16 04:48:34 +00005259 size_type size() const _NOEXCEPT {return __matches_.size();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005260 _LIBCPP_INLINE_VISIBILITY
Marshall Clow081bcd22017-11-16 04:48:34 +00005261 size_type max_size() const _NOEXCEPT {return __matches_.max_size();}
5262 _LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_INLINE_VISIBILITY
5263 bool empty() const _NOEXCEPT {return size() == 0;}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005264
5265 // element access:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005266 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005267 difference_type length(size_type __sub = 0) const
5268 {return (*this)[__sub].length();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005269 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005270 difference_type position(size_type __sub = 0) const
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005271 {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005272 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005273 string_type str(size_type __sub = 0) const
5274 {return (*this)[__sub].str();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005275 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005276 const_reference operator[](size_type __n) const
5277 {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
5278
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005279 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005280 const_reference prefix() const {return __prefix_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005281 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005282 const_reference suffix() const {return __suffix_;}
5283
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005284 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f4191f2011-10-08 14:36:16 +00005285 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005286 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005287 const_iterator end() const {return __matches_.end();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005288 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant2f4191f2011-10-08 14:36:16 +00005289 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005290 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005291 const_iterator cend() const {return __matches_.end();}
5292
5293 // format:
5294 template <class _OutputIter>
5295 _OutputIter
Alexander Richardsonc9637642017-11-14 11:14:25 +00005296 format(_OutputIter __output_iter, const char_type* __fmt_first,
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005297 const char_type* __fmt_last,
5298 regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5299 template <class _OutputIter, class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005300 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005301 _OutputIter
Alexander Richardsonc9637642017-11-14 11:14:25 +00005302 format(_OutputIter __output_iter, const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnantcbc45252010-08-14 18:14:02 +00005303 regex_constants::match_flag_type __flags = regex_constants::format_default) const
Alexander Richardsonc9637642017-11-14 11:14:25 +00005304 {return format(__output_iter, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005305 template <class _ST, class _SA>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005306 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005307 basic_string<char_type, _ST, _SA>
5308 format(const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnantcbc45252010-08-14 18:14:02 +00005309 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5310 {
5311 basic_string<char_type, _ST, _SA> __r;
5312 format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5313 __flags);
5314 return __r;
5315 }
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005316 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005317 string_type
5318 format(const char_type* __fmt,
Howard Hinnantcbc45252010-08-14 18:14:02 +00005319 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5320 {
5321 string_type __r;
5322 format(back_inserter(__r), __fmt,
5323 __fmt + char_traits<char_type>::length(__fmt), __flags);
5324 return __r;
5325 }
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005326
5327 // allocator:
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005328 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005329 allocator_type get_allocator() const {return __matches_.get_allocator();}
5330
5331 // swap:
5332 void swap(match_results& __m);
5333
Howard Hinnantc834c512011-11-29 18:15:50 +00005334 template <class _Bp, class _Ap>
Howard Hinnant7ca9d942010-09-23 15:13:20 +00005335 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant66423212010-07-14 21:14:52 +00005336 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
Howard Hinnantc834c512011-11-29 18:15:50 +00005337 const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
Howard Hinnant66423212010-07-14 21:14:52 +00005338 {
Howard Hinnantc834c512011-11-29 18:15:50 +00005339 _Bp __mf = __m.prefix().first;
Howard Hinnant66423212010-07-14 21:14:52 +00005340 __matches_.resize(__m.size());
5341 for (size_type __i = 0; __i < __matches_.size(); ++__i)
5342 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005343 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5344 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
Howard Hinnant66423212010-07-14 21:14:52 +00005345 __matches_[__i].matched = __m[__i].matched;
5346 }
5347 __unmatched_.first = __l;
5348 __unmatched_.second = __l;
5349 __unmatched_.matched = false;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005350 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5351 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
Howard Hinnant66423212010-07-14 21:14:52 +00005352 __prefix_.matched = __m.prefix().matched;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005353 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5354 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
Howard Hinnant66423212010-07-14 21:14:52 +00005355 __suffix_.matched = __m.suffix().matched;
Howard Hinnantd3925342010-08-16 20:21:16 +00005356 if (!__no_update_pos)
5357 __position_start_ = __prefix_.first;
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005358 __ready_ = __m.ready();
Howard Hinnant66423212010-07-14 21:14:52 +00005359 }
5360
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005361private:
5362 void __init(unsigned __s,
Howard Hinnantd3925342010-08-16 20:21:16 +00005363 _BidirectionalIterator __f, _BidirectionalIterator __l,
5364 bool __no_update_pos = false);
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005365
5366 template <class, class> friend class basic_regex;
5367
Howard Hinnantc834c512011-11-29 18:15:50 +00005368 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005369 friend
5370 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00005371 regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005372 regex_constants::match_flag_type);
Howard Hinnant126da6a2010-07-27 22:20:32 +00005373
Howard Hinnantc834c512011-11-29 18:15:50 +00005374 template <class _Bp, class _Ap>
Howard Hinnantcbc45252010-08-14 18:14:02 +00005375 friend
5376 bool
Howard Hinnantc834c512011-11-29 18:15:50 +00005377 operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005378
Howard Hinnant126da6a2010-07-27 22:20:32 +00005379 template <class, class> friend class __lookahead;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005380};
5381
5382template <class _BidirectionalIterator, class _Allocator>
5383match_results<_BidirectionalIterator, _Allocator>::match_results(
5384 const allocator_type& __a)
5385 : __matches_(__a),
5386 __unmatched_(),
5387 __prefix_(),
Howard Hinnantd3925342010-08-16 20:21:16 +00005388 __suffix_(),
Eric Fiseliera75ee262015-07-22 01:29:41 +00005389 __ready_(false),
5390 __position_start_()
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005391{
5392}
5393
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005394template <class _BidirectionalIterator, class _Allocator>
5395void
5396match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
Howard Hinnantd3925342010-08-16 20:21:16 +00005397 _BidirectionalIterator __f, _BidirectionalIterator __l,
5398 bool __no_update_pos)
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005399{
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005400 __unmatched_.first = __l;
5401 __unmatched_.second = __l;
5402 __unmatched_.matched = false;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005403 __matches_.assign(__s, __unmatched_);
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005404 __prefix_.first = __f;
5405 __prefix_.second = __f;
5406 __prefix_.matched = false;
Howard Hinnant5bf96132010-07-08 17:43:58 +00005407 __suffix_ = __unmatched_;
Howard Hinnantd3925342010-08-16 20:21:16 +00005408 if (!__no_update_pos)
5409 __position_start_ = __prefix_.first;
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005410 __ready_ = true;
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005411}
5412
Howard Hinnantcbc45252010-08-14 18:14:02 +00005413template <class _BidirectionalIterator, class _Allocator>
5414template <class _OutputIter>
5415_OutputIter
Alexander Richardsonc9637642017-11-14 11:14:25 +00005416match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __output_iter,
Howard Hinnantcbc45252010-08-14 18:14:02 +00005417 const char_type* __fmt_first, const char_type* __fmt_last,
5418 regex_constants::match_flag_type __flags) const
5419{
5420 if (__flags & regex_constants::format_sed)
5421 {
5422 for (; __fmt_first != __fmt_last; ++__fmt_first)
5423 {
5424 if (*__fmt_first == '&')
Alexander Richardsonc9637642017-11-14 11:14:25 +00005425 __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5426 __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005427 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5428 {
5429 ++__fmt_first;
5430 if ('0' <= *__fmt_first && *__fmt_first <= '9')
5431 {
5432 size_t __i = *__fmt_first - '0';
Alexander Richardsonc9637642017-11-14 11:14:25 +00005433 __output_iter = _VSTD::copy((*this)[__i].first,
5434 (*this)[__i].second, __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005435 }
5436 else
5437 {
Alexander Richardsonc9637642017-11-14 11:14:25 +00005438 *__output_iter = *__fmt_first;
5439 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005440 }
5441 }
5442 else
5443 {
Alexander Richardsonc9637642017-11-14 11:14:25 +00005444 *__output_iter = *__fmt_first;
5445 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005446 }
5447 }
5448 }
5449 else
5450 {
5451 for (; __fmt_first != __fmt_last; ++__fmt_first)
5452 {
5453 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5454 {
5455 switch (__fmt_first[1])
5456 {
5457 case '$':
Alexander Richardsonc9637642017-11-14 11:14:25 +00005458 *__output_iter = *++__fmt_first;
5459 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005460 break;
5461 case '&':
5462 ++__fmt_first;
Alexander Richardsonc9637642017-11-14 11:14:25 +00005463 __output_iter = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5464 __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005465 break;
5466 case '`':
5467 ++__fmt_first;
Alexander Richardsonc9637642017-11-14 11:14:25 +00005468 __output_iter = _VSTD::copy(__prefix_.first, __prefix_.second, __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005469 break;
5470 case '\'':
5471 ++__fmt_first;
Alexander Richardsonc9637642017-11-14 11:14:25 +00005472 __output_iter = _VSTD::copy(__suffix_.first, __suffix_.second, __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005473 break;
5474 default:
5475 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5476 {
5477 ++__fmt_first;
Marshall Clow266b5ec2017-10-19 22:10:41 +00005478 size_t __idx = *__fmt_first - '0';
Howard Hinnantcbc45252010-08-14 18:14:02 +00005479 if (__fmt_first + 1 != __fmt_last &&
5480 '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5481 {
5482 ++__fmt_first;
Marshall Clow266b5ec2017-10-19 22:10:41 +00005483 if (__idx >= std::numeric_limits<size_t>::max() / 10)
5484 __throw_regex_error<regex_constants::error_escape>();
5485 __idx = 10 * __idx + *__fmt_first - '0';
Howard Hinnantcbc45252010-08-14 18:14:02 +00005486 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00005487 __output_iter = _VSTD::copy((*this)[__idx].first,
5488 (*this)[__idx].second, __output_iter);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005489 }
5490 else
5491 {
Alexander Richardsonc9637642017-11-14 11:14:25 +00005492 *__output_iter = *__fmt_first;
5493 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005494 }
5495 break;
5496 }
5497 }
5498 else
5499 {
Alexander Richardsonc9637642017-11-14 11:14:25 +00005500 *__output_iter = *__fmt_first;
5501 ++__output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005502 }
5503 }
5504 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00005505 return __output_iter;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005506}
5507
5508template <class _BidirectionalIterator, class _Allocator>
5509void
5510match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5511{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005512 using _VSTD::swap;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005513 swap(__matches_, __m.__matches_);
5514 swap(__unmatched_, __m.__unmatched_);
5515 swap(__prefix_, __m.__prefix_);
5516 swap(__suffix_, __m.__suffix_);
Howard Hinnantd3925342010-08-16 20:21:16 +00005517 swap(__position_start_, __m.__position_start_);
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005518 swap(__ready_, __m.__ready_);
Howard Hinnantcbc45252010-08-14 18:14:02 +00005519}
5520
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005521typedef match_results<const char*> cmatch;
5522typedef match_results<const wchar_t*> wcmatch;
5523typedef match_results<string::const_iterator> smatch;
5524typedef match_results<wstring::const_iterator> wsmatch;
5525
5526template <class _BidirectionalIterator, class _Allocator>
Howard Hinnantcbc45252010-08-14 18:14:02 +00005527bool
5528operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5529 const match_results<_BidirectionalIterator, _Allocator>& __y)
5530{
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005531 if (__x.__ready_ != __y.__ready_)
5532 return false;
5533 if (!__x.__ready_)
5534 return true;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005535 return __x.__matches_ == __y.__matches_ &&
5536 __x.__prefix_ == __y.__prefix_ &&
Howard Hinnantb5c53a82010-12-08 21:07:55 +00005537 __x.__suffix_ == __y.__suffix_;
Howard Hinnantcbc45252010-08-14 18:14:02 +00005538}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005539
5540template <class _BidirectionalIterator, class _Allocator>
Howard Hinnantcbc45252010-08-14 18:14:02 +00005541inline _LIBCPP_INLINE_VISIBILITY
5542bool
5543operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5544 const match_results<_BidirectionalIterator, _Allocator>& __y)
5545{
5546 return !(__x == __y);
5547}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005548
5549template <class _BidirectionalIterator, class _Allocator>
Howard Hinnantcbc45252010-08-14 18:14:02 +00005550inline _LIBCPP_INLINE_VISIBILITY
5551void
5552swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5553 match_results<_BidirectionalIterator, _Allocator>& __y)
5554{
5555 __x.swap(__y);
5556}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005557
5558// regex_search
5559
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005560template <class _CharT, class _Traits>
Howard Hinnant70d27852010-07-27 01:25:38 +00005561template <class _Allocator>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005562bool
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005563basic_regex<_CharT, _Traits>::__match_at_start_ecma(
Howard Hinnant70d27852010-07-27 01:25:38 +00005564 const _CharT* __first, const _CharT* __last,
5565 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00005566 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005567{
Howard Hinnant70d27852010-07-27 01:25:38 +00005568 vector<__state> __states;
Howard Hinnant70d27852010-07-27 01:25:38 +00005569 __node* __st = __start_.get();
5570 if (__st)
5571 {
Marshall Clow8db143c2015-01-28 22:22:35 +00005572 sub_match<const _CharT*> __unmatched;
5573 __unmatched.first = __last;
5574 __unmatched.second = __last;
5575 __unmatched.matched = false;
5576
Howard Hinnant70d27852010-07-27 01:25:38 +00005577 __states.push_back(__state());
5578 __states.back().__do_ = 0;
5579 __states.back().__first_ = __first;
5580 __states.back().__current_ = __first;
5581 __states.back().__last_ = __last;
Marshall Clow8db143c2015-01-28 22:22:35 +00005582 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
Howard Hinnant70d27852010-07-27 01:25:38 +00005583 __states.back().__loop_data_.resize(__loop_count());
5584 __states.back().__node_ = __st;
5585 __states.back().__flags_ = __flags;
Howard Hinnant066ba512011-03-26 20:02:27 +00005586 __states.back().__at_first_ = __at_first;
Marshall Clowd39d21d2017-09-12 17:56:59 +00005587 int __counter = 0;
5588 int __length = __last - __first;
Howard Hinnant70d27852010-07-27 01:25:38 +00005589 do
5590 {
Marshall Clowd39d21d2017-09-12 17:56:59 +00005591 ++__counter;
5592 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5593 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5594 __throw_regex_error<regex_constants::error_complexity>();
Howard Hinnant70d27852010-07-27 01:25:38 +00005595 __state& __s = __states.back();
5596 if (__s.__node_)
5597 __s.__node_->__exec(__s);
5598 switch (__s.__do_)
5599 {
5600 case __state::__end_state:
Tim Shen11113f52016-10-27 21:40:34 +00005601 if ((__flags & regex_constants::match_not_null) &&
Tim Shend5f175a2016-10-21 20:41:47 +00005602 __s.__current_ == __first)
5603 {
5604 __states.pop_back();
5605 break;
5606 }
Tim Shen11113f52016-10-27 21:40:34 +00005607 if ((__flags & regex_constants::__full_match) &&
5608 __s.__current_ != __last)
5609 {
5610 __states.pop_back();
5611 break;
5612 }
Howard Hinnant70d27852010-07-27 01:25:38 +00005613 __m.__matches_[0].first = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005614 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
Howard Hinnant70d27852010-07-27 01:25:38 +00005615 __m.__matches_[0].matched = true;
5616 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5617 __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5618 return true;
5619 case __state::__accept_and_consume:
5620 case __state::__repeat:
5621 case __state::__accept_but_not_consume:
5622 break;
5623 case __state::__split:
5624 {
5625 __state __snext = __s;
5626 __s.__node_->__exec_split(true, __s);
5627 __snext.__node_->__exec_split(false, __snext);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005628 __states.push_back(_VSTD::move(__snext));
Howard Hinnant70d27852010-07-27 01:25:38 +00005629 }
5630 break;
5631 case __state::__reject:
5632 __states.pop_back();
5633 break;
5634 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00005635 __throw_regex_error<regex_constants::__re_err_unknown>();
Howard Hinnant70d27852010-07-27 01:25:38 +00005636 break;
Howard Hinnant72f73582010-08-11 17:04:31 +00005637
Howard Hinnant70d27852010-07-27 01:25:38 +00005638 }
5639 } while (!__states.empty());
5640 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005641 return false;
5642}
5643
5644template <class _CharT, class _Traits>
Howard Hinnant66423212010-07-14 21:14:52 +00005645template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005646bool
5647basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5648 const _CharT* __first, const _CharT* __last,
Howard Hinnant66423212010-07-14 21:14:52 +00005649 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00005650 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005651{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005652 deque<__state> __states;
Howard Hinnant66423212010-07-14 21:14:52 +00005653 ptrdiff_t __highest_j = 0;
Howard Hinnantc834c512011-11-29 18:15:50 +00005654 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005655 __node* __st = __start_.get();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005656 if (__st)
5657 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005658 __states.push_back(__state());
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005659 __states.back().__do_ = 0;
5660 __states.back().__first_ = __first;
5661 __states.back().__current_ = __first;
5662 __states.back().__last_ = __last;
5663 __states.back().__loop_data_.resize(__loop_count());
5664 __states.back().__node_ = __st;
5665 __states.back().__flags_ = __flags;
Howard Hinnant066ba512011-03-26 20:02:27 +00005666 __states.back().__at_first_ = __at_first;
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00005667 bool __matched = false;
Marshall Clowd39d21d2017-09-12 17:56:59 +00005668 int __counter = 0;
5669 int __length = __last - __first;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005670 do
5671 {
Marshall Clowd39d21d2017-09-12 17:56:59 +00005672 ++__counter;
5673 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5674 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5675 __throw_regex_error<regex_constants::error_complexity>();
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005676 __state& __s = __states.back();
5677 if (__s.__node_)
5678 __s.__node_->__exec(__s);
5679 switch (__s.__do_)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005680 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005681 case __state::__end_state:
Tim Shen11113f52016-10-27 21:40:34 +00005682 if ((__flags & regex_constants::match_not_null) &&
Tim Shend5f175a2016-10-21 20:41:47 +00005683 __s.__current_ == __first)
5684 {
5685 __states.pop_back();
5686 break;
5687 }
Tim Shen11113f52016-10-27 21:40:34 +00005688 if ((__flags & regex_constants::__full_match) &&
5689 __s.__current_ != __last)
5690 {
5691 __states.pop_back();
5692 break;
5693 }
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005694 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00005695 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005696 __matched = true;
Howard Hinnantc834c512011-11-29 18:15:50 +00005697 if (__highest_j == _Np)
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005698 __states.clear();
5699 else
5700 __states.pop_back();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005701 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005702 case __state::__consume_input:
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005703 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005704 case __state::__accept_and_consume:
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005705 __states.push_front(_VSTD::move(__s));
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005706 __states.pop_back();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005707 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005708 case __state::__repeat:
5709 case __state::__accept_but_not_consume:
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005710 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005711 case __state::__split:
5712 {
5713 __state __snext = __s;
5714 __s.__node_->__exec_split(true, __s);
5715 __snext.__node_->__exec_split(false, __snext);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005716 __states.push_back(_VSTD::move(__snext));
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005717 }
5718 break;
5719 case __state::__reject:
5720 __states.pop_back();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005721 break;
5722 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00005723 __throw_regex_error<regex_constants::__re_err_unknown>();
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005724 break;
5725 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005726 } while (!__states.empty());
Howard Hinnant5d4aaa42010-07-14 15:45:11 +00005727 if (__matched)
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005728 {
5729 __m.__matches_[0].first = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005730 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005731 __m.__matches_[0].matched = true;
5732 return true;
5733 }
5734 }
5735 return false;
5736}
5737
5738template <class _CharT, class _Traits>
Howard Hinnant66423212010-07-14 21:14:52 +00005739template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005740bool
5741basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
Howard Hinnant66423212010-07-14 21:14:52 +00005742 const _CharT* __first, const _CharT* __last,
5743 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00005744 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005745{
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005746 vector<__state> __states;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005747 __state __best_state;
Howard Hinnant66423212010-07-14 21:14:52 +00005748 ptrdiff_t __j = 0;
5749 ptrdiff_t __highest_j = 0;
Howard Hinnantc834c512011-11-29 18:15:50 +00005750 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005751 __node* __st = __start_.get();
Howard Hinnant5bf96132010-07-08 17:43:58 +00005752 if (__st)
5753 {
Marshall Clow8db143c2015-01-28 22:22:35 +00005754 sub_match<const _CharT*> __unmatched;
5755 __unmatched.first = __last;
5756 __unmatched.second = __last;
5757 __unmatched.matched = false;
5758
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005759 __states.push_back(__state());
5760 __states.back().__do_ = 0;
5761 __states.back().__first_ = __first;
5762 __states.back().__current_ = __first;
5763 __states.back().__last_ = __last;
Marshall Clow8db143c2015-01-28 22:22:35 +00005764 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005765 __states.back().__loop_data_.resize(__loop_count());
5766 __states.back().__node_ = __st;
5767 __states.back().__flags_ = __flags;
Howard Hinnant066ba512011-03-26 20:02:27 +00005768 __states.back().__at_first_ = __at_first;
Howard Hinnant66423212010-07-14 21:14:52 +00005769 const _CharT* __current = __first;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005770 bool __matched = false;
Marshall Clowd39d21d2017-09-12 17:56:59 +00005771 int __counter = 0;
5772 int __length = __last - __first;
Howard Hinnant5bf96132010-07-08 17:43:58 +00005773 do
5774 {
Marshall Clowd39d21d2017-09-12 17:56:59 +00005775 ++__counter;
5776 if (__counter % _LIBCPP_REGEX_COMPLEXITY_FACTOR == 0 &&
5777 __counter / _LIBCPP_REGEX_COMPLEXITY_FACTOR >= __length)
5778 __throw_regex_error<regex_constants::error_complexity>();
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005779 __state& __s = __states.back();
5780 if (__s.__node_)
5781 __s.__node_->__exec(__s);
5782 switch (__s.__do_)
Howard Hinnant5bf96132010-07-08 17:43:58 +00005783 {
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005784 case __state::__end_state:
Tim Shen11113f52016-10-27 21:40:34 +00005785 if ((__flags & regex_constants::match_not_null) &&
Tim Shend5f175a2016-10-21 20:41:47 +00005786 __s.__current_ == __first)
5787 {
5788 __states.pop_back();
5789 break;
5790 }
Tim Shen11113f52016-10-27 21:40:34 +00005791 if ((__flags & regex_constants::__full_match) &&
5792 __s.__current_ != __last)
5793 {
5794 __states.pop_back();
5795 break;
5796 }
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005797 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant5bf96132010-07-08 17:43:58 +00005798 {
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005799 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005800 __best_state = __s;
Howard Hinnant5bf96132010-07-08 17:43:58 +00005801 }
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005802 __matched = true;
Howard Hinnantc834c512011-11-29 18:15:50 +00005803 if (__highest_j == _Np)
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005804 __states.clear();
5805 else
5806 __states.pop_back();
Howard Hinnant5bf96132010-07-08 17:43:58 +00005807 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005808 case __state::__accept_and_consume:
Howard Hinnant2a315e32010-07-12 18:16:05 +00005809 __j += __s.__current_ - __current;
5810 __current = __s.__current_;
Howard Hinnant5bf96132010-07-08 17:43:58 +00005811 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005812 case __state::__repeat:
5813 case __state::__accept_but_not_consume:
Howard Hinnant5bf96132010-07-08 17:43:58 +00005814 break;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005815 case __state::__split:
5816 {
5817 __state __snext = __s;
5818 __s.__node_->__exec_split(true, __s);
5819 __snext.__node_->__exec_split(false, __snext);
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005820 __states.push_back(_VSTD::move(__snext));
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005821 }
5822 break;
5823 case __state::__reject:
5824 __states.pop_back();
Howard Hinnant5bf96132010-07-08 17:43:58 +00005825 break;
5826 default:
Marshall Clowc8ccc292015-07-28 13:30:47 +00005827 __throw_regex_error<regex_constants::__re_err_unknown>();
Howard Hinnant5bf96132010-07-08 17:43:58 +00005828 break;
5829 }
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005830 } while (!__states.empty());
5831 if (__matched)
Howard Hinnant5bf96132010-07-08 17:43:58 +00005832 {
5833 __m.__matches_[0].first = __first;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005834 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnant5bf96132010-07-08 17:43:58 +00005835 __m.__matches_[0].matched = true;
Howard Hinnantaa0874c2010-07-12 15:51:17 +00005836 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
5837 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
Howard Hinnant5bf96132010-07-08 17:43:58 +00005838 return true;
5839 }
5840 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005841 return false;
5842}
5843
5844template <class _CharT, class _Traits>
Howard Hinnant66423212010-07-14 21:14:52 +00005845template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005846bool
5847basic_regex<_CharT, _Traits>::__match_at_start(
Howard Hinnant66423212010-07-14 21:14:52 +00005848 const _CharT* __first, const _CharT* __last,
5849 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant066ba512011-03-26 20:02:27 +00005850 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005851{
Howard Hinnantebbc2b62010-07-27 17:24:17 +00005852 if ((__flags_ & 0x1F0) == ECMAScript)
Howard Hinnant066ba512011-03-26 20:02:27 +00005853 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005854 if (mark_count() == 0)
Howard Hinnant066ba512011-03-26 20:02:27 +00005855 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
5856 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005857}
5858
5859template <class _CharT, class _Traits>
Howard Hinnant66423212010-07-14 21:14:52 +00005860template <class _Allocator>
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005861bool
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005862basic_regex<_CharT, _Traits>::__search(
Howard Hinnant66423212010-07-14 21:14:52 +00005863 const _CharT* __first, const _CharT* __last,
5864 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005865 regex_constants::match_flag_type __flags) const
5866{
Howard Hinnantd3925342010-08-16 20:21:16 +00005867 __m.__init(1 + mark_count(), __first, __last,
5868 __flags & regex_constants::__no_update_pos);
Howard Hinnant38d14f72013-07-09 17:29:09 +00005869 if (__match_at_start(__first, __last, __m, __flags,
5870 !(__flags & regex_constants::__no_update_pos)))
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005871 {
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005872 __m.__prefix_.second = __m[0].first;
5873 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5874 __m.__suffix_.first = __m[0].second;
5875 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5876 return true;
5877 }
Howard Hinnant22cf4862010-07-29 01:15:27 +00005878 if (__first != __last && !(__flags & regex_constants::match_continuous))
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005879 {
Howard Hinnant6b2602a2010-07-29 15:17:28 +00005880 __flags |= regex_constants::match_prev_avail;
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005881 for (++__first; __first != __last; ++__first)
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005882 {
Howard Hinnant6b2602a2010-07-29 15:17:28 +00005883 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant066ba512011-03-26 20:02:27 +00005884 if (__match_at_start(__first, __last, __m, __flags, false))
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005885 {
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005886 __m.__prefix_.second = __m[0].first;
5887 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5888 __m.__suffix_.first = __m[0].second;
5889 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5890 return true;
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005891 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005892 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005893 }
5894 }
Howard Hinnant66bcf7e2010-07-07 19:14:52 +00005895 __m.__matches_.clear();
5896 return false;
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005897}
5898
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005899template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005900inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005901bool
5902regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5903 match_results<_BidirectionalIterator, _Allocator>& __m,
5904 const basic_regex<_CharT, _Traits>& __e,
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005905 regex_constants::match_flag_type __flags = regex_constants::match_default)
5906{
Howard Hinnant1e5de642013-07-11 15:32:55 +00005907 int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
5908 basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
Howard Hinnant66423212010-07-14 21:14:52 +00005909 match_results<const _CharT*> __mc;
Howard Hinnant1e5de642013-07-11 15:32:55 +00005910 bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
Howard Hinnantd3925342010-08-16 20:21:16 +00005911 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant66423212010-07-14 21:14:52 +00005912 return __r;
5913}
5914
Howard Hinnant4018c482013-06-29 23:45:43 +00005915template <class _Iter, class _Allocator, class _CharT, class _Traits>
5916inline _LIBCPP_INLINE_VISIBILITY
5917bool
5918regex_search(__wrap_iter<_Iter> __first,
5919 __wrap_iter<_Iter> __last,
5920 match_results<__wrap_iter<_Iter>, _Allocator>& __m,
5921 const basic_regex<_CharT, _Traits>& __e,
5922 regex_constants::match_flag_type __flags = regex_constants::match_default)
5923{
5924 match_results<const _CharT*> __mc;
5925 bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
5926 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
5927 return __r;
5928}
5929
Howard Hinnant66423212010-07-14 21:14:52 +00005930template <class _Allocator, class _CharT, class _Traits>
5931inline _LIBCPP_INLINE_VISIBILITY
5932bool
5933regex_search(const _CharT* __first, const _CharT* __last,
5934 match_results<const _CharT*, _Allocator>& __m,
5935 const basic_regex<_CharT, _Traits>& __e,
5936 regex_constants::match_flag_type __flags = regex_constants::match_default)
5937{
Howard Hinnantf5cb6eb2010-06-30 17:22:19 +00005938 return __e.__search(__first, __last, __m, __flags);
5939}
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005940
5941template <class _BidirectionalIterator, class _CharT, class _Traits>
5942inline _LIBCPP_INLINE_VISIBILITY
5943bool
5944regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5945 const basic_regex<_CharT, _Traits>& __e,
5946 regex_constants::match_flag_type __flags = regex_constants::match_default)
5947{
Howard Hinnant66423212010-07-14 21:14:52 +00005948 basic_string<_CharT> __s(__first, __last);
5949 match_results<const _CharT*> __mc;
5950 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5951}
5952
5953template <class _CharT, class _Traits>
5954inline _LIBCPP_INLINE_VISIBILITY
5955bool
5956regex_search(const _CharT* __first, const _CharT* __last,
5957 const basic_regex<_CharT, _Traits>& __e,
5958 regex_constants::match_flag_type __flags = regex_constants::match_default)
5959{
5960 match_results<const _CharT*> __mc;
5961 return __e.__search(__first, __last, __mc, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005962}
5963
5964template <class _CharT, class _Allocator, class _Traits>
5965inline _LIBCPP_INLINE_VISIBILITY
5966bool
5967regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5968 const basic_regex<_CharT, _Traits>& __e,
5969 regex_constants::match_flag_type __flags = regex_constants::match_default)
5970{
Howard Hinnant66423212010-07-14 21:14:52 +00005971 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005972}
5973
5974template <class _CharT, class _Traits>
5975inline _LIBCPP_INLINE_VISIBILITY
5976bool
5977regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5978 regex_constants::match_flag_type __flags = regex_constants::match_default)
5979{
Howard Hinnant66423212010-07-14 21:14:52 +00005980 match_results<const _CharT*> __m;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00005981 return _VSTD::regex_search(__str, __m, __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005982}
5983
5984template <class _ST, class _SA, class _CharT, class _Traits>
5985inline _LIBCPP_INLINE_VISIBILITY
5986bool
5987regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5988 const basic_regex<_CharT, _Traits>& __e,
5989 regex_constants::match_flag_type __flags = regex_constants::match_default)
5990{
Howard Hinnant66423212010-07-14 21:14:52 +00005991 match_results<const _CharT*> __mc;
5992 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00005993}
5994
5995template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5996inline _LIBCPP_INLINE_VISIBILITY
5997bool
5998regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5999 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6000 const basic_regex<_CharT, _Traits>& __e,
6001 regex_constants::match_flag_type __flags = regex_constants::match_default)
6002{
Howard Hinnant66423212010-07-14 21:14:52 +00006003 match_results<const _CharT*> __mc;
6004 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnantd3925342010-08-16 20:21:16 +00006005 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant66423212010-07-14 21:14:52 +00006006 return __r;
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006007}
6008
Marshall Clow8c950072014-02-19 21:21:11 +00006009#if _LIBCPP_STD_VER > 11
6010template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
6011bool
6012regex_search(const basic_string<_Cp, _ST, _SA>&& __s,
6013 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
6014 const basic_regex<_Cp, _Tp>& __e,
6015 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6016#endif
6017
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006018// regex_match
6019
6020template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
6021bool
6022regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6023 match_results<_BidirectionalIterator, _Allocator>& __m,
6024 const basic_regex<_CharT, _Traits>& __e,
6025 regex_constants::match_flag_type __flags = regex_constants::match_default)
6026{
Tim Shen11113f52016-10-27 21:40:34 +00006027 bool __r = _VSTD::regex_search(
6028 __first, __last, __m, __e,
6029 __flags | regex_constants::match_continuous |
6030 regex_constants::__full_match);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006031 if (__r)
6032 {
6033 __r = !__m.suffix().matched;
6034 if (!__r)
6035 __m.__matches_.clear();
6036 }
6037 return __r;
6038}
6039
6040template <class _BidirectionalIterator, class _CharT, class _Traits>
6041inline _LIBCPP_INLINE_VISIBILITY
6042bool
6043regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6044 const basic_regex<_CharT, _Traits>& __e,
6045 regex_constants::match_flag_type __flags = regex_constants::match_default)
6046{
6047 match_results<_BidirectionalIterator> __m;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006048 return _VSTD::regex_match(__first, __last, __m, __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006049}
6050
6051template <class _CharT, class _Allocator, class _Traits>
6052inline _LIBCPP_INLINE_VISIBILITY
6053bool
6054regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6055 const basic_regex<_CharT, _Traits>& __e,
6056 regex_constants::match_flag_type __flags = regex_constants::match_default)
6057{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006058 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006059}
6060
6061template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6062inline _LIBCPP_INLINE_VISIBILITY
6063bool
6064regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6065 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6066 const basic_regex<_CharT, _Traits>& __e,
6067 regex_constants::match_flag_type __flags = regex_constants::match_default)
6068{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006069 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006070}
6071
Marshall Clow8c950072014-02-19 21:21:11 +00006072#if _LIBCPP_STD_VER > 11
6073template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6074inline _LIBCPP_INLINE_VISIBILITY
6075bool
6076regex_match(const basic_string<_CharT, _ST, _SA>&& __s,
6077 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6078 const basic_regex<_CharT, _Traits>& __e,
6079 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6080#endif
6081
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006082template <class _CharT, class _Traits>
6083inline _LIBCPP_INLINE_VISIBILITY
6084bool
6085regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6086 regex_constants::match_flag_type __flags = regex_constants::match_default)
6087{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006088 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006089}
6090
6091template <class _ST, class _SA, class _CharT, class _Traits>
6092inline _LIBCPP_INLINE_VISIBILITY
6093bool
6094regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6095 const basic_regex<_CharT, _Traits>& __e,
6096 regex_constants::match_flag_type __flags = regex_constants::match_default)
6097{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006098 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
Howard Hinnant65a3f3d2010-06-30 00:21:42 +00006099}
6100
Howard Hinnantd3925342010-08-16 20:21:16 +00006101// regex_iterator
6102
6103template <class _BidirectionalIterator,
6104 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6105 class _Traits = regex_traits<_CharT> >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00006106class _LIBCPP_TEMPLATE_VIS regex_iterator
Howard Hinnantd3925342010-08-16 20:21:16 +00006107{
6108public:
6109 typedef basic_regex<_CharT, _Traits> regex_type;
6110 typedef match_results<_BidirectionalIterator> value_type;
6111 typedef ptrdiff_t difference_type;
6112 typedef const value_type* pointer;
6113 typedef const value_type& reference;
6114 typedef forward_iterator_tag iterator_category;
6115
6116private:
6117 _BidirectionalIterator __begin_;
6118 _BidirectionalIterator __end_;
6119 const regex_type* __pregex_;
6120 regex_constants::match_flag_type __flags_;
6121 value_type __match_;
6122
6123public:
6124 regex_iterator();
6125 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6126 const regex_type& __re,
Marshall Clow8c950072014-02-19 21:21:11 +00006127 regex_constants::match_flag_type __m
6128 = regex_constants::match_default);
6129#if _LIBCPP_STD_VER > 11
6130 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6131 const regex_type&& __re,
6132 regex_constants::match_flag_type __m
6133 = regex_constants::match_default) = delete;
6134#endif
Howard Hinnantd3925342010-08-16 20:21:16 +00006135
6136 bool operator==(const regex_iterator& __x) const;
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006137 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd3925342010-08-16 20:21:16 +00006138 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
6139
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006140 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd3925342010-08-16 20:21:16 +00006141 reference operator*() const {return __match_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006142 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd3925342010-08-16 20:21:16 +00006143 pointer operator->() const {return &__match_;}
6144
6145 regex_iterator& operator++();
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006146 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantd3925342010-08-16 20:21:16 +00006147 regex_iterator operator++(int)
6148 {
6149 regex_iterator __t(*this);
6150 ++(*this);
6151 return __t;
6152 }
6153};
6154
6155template <class _BidirectionalIterator, class _CharT, class _Traits>
6156regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
6157 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
6158{
6159}
6160
6161template <class _BidirectionalIterator, class _CharT, class _Traits>
6162regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6163 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6164 const regex_type& __re, regex_constants::match_flag_type __m)
6165 : __begin_(__a),
6166 __end_(__b),
6167 __pregex_(&__re),
6168 __flags_(__m)
6169{
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006170 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
Howard Hinnantd3925342010-08-16 20:21:16 +00006171}
6172
6173template <class _BidirectionalIterator, class _CharT, class _Traits>
6174bool
6175regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6176 operator==(const regex_iterator& __x) const
6177{
6178 if (__match_.empty() && __x.__match_.empty())
6179 return true;
6180 if (__match_.empty() || __x.__match_.empty())
6181 return false;
6182 return __begin_ == __x.__begin_ &&
6183 __end_ == __x.__end_ &&
6184 __pregex_ == __x.__pregex_ &&
6185 __flags_ == __x.__flags_ &&
6186 __match_[0] == __x.__match_[0];
6187}
6188
6189template <class _BidirectionalIterator, class _CharT, class _Traits>
6190regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6191regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6192{
6193 __flags_ |= regex_constants::__no_update_pos;
6194 _BidirectionalIterator __start = __match_[0].second;
Marshall Clowfaa964d2017-07-05 16:37:19 +00006195 if (__match_[0].first == __match_[0].second)
Howard Hinnantd3925342010-08-16 20:21:16 +00006196 {
6197 if (__start == __end_)
6198 {
6199 __match_ = value_type();
6200 return *this;
6201 }
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006202 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
Howard Hinnantd3925342010-08-16 20:21:16 +00006203 __flags_ | regex_constants::match_not_null |
6204 regex_constants::match_continuous))
6205 return *this;
6206 else
6207 ++__start;
6208 }
6209 __flags_ |= regex_constants::match_prev_avail;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006210 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
Howard Hinnantd3925342010-08-16 20:21:16 +00006211 __match_ = value_type();
6212 return *this;
6213}
6214
6215typedef regex_iterator<const char*> cregex_iterator;
6216typedef regex_iterator<const wchar_t*> wcregex_iterator;
6217typedef regex_iterator<string::const_iterator> sregex_iterator;
6218typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
6219
6220// regex_token_iterator
6221
6222template <class _BidirectionalIterator,
6223 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6224 class _Traits = regex_traits<_CharT> >
Eric Fiselierb5eb1bf2017-01-04 23:56:00 +00006225class _LIBCPP_TEMPLATE_VIS regex_token_iterator
Howard Hinnantd3925342010-08-16 20:21:16 +00006226{
6227public:
6228 typedef basic_regex<_CharT, _Traits> regex_type;
6229 typedef sub_match<_BidirectionalIterator> value_type;
6230 typedef ptrdiff_t difference_type;
6231 typedef const value_type* pointer;
6232 typedef const value_type& reference;
6233 typedef forward_iterator_tag iterator_category;
6234
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006235private:
6236 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6237
6238 _Position __position_;
6239 const value_type* __result_;
6240 value_type __suffix_;
Eric Fiselier37c22152016-12-24 00:24:44 +00006241 ptrdiff_t __n_;
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006242 vector<int> __subs_;
6243
6244public:
Howard Hinnantd3925342010-08-16 20:21:16 +00006245 regex_token_iterator();
6246 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6247 const regex_type& __re, int __submatch = 0,
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006248 regex_constants::match_flag_type __m =
6249 regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +00006250#if _LIBCPP_STD_VER > 11
6251 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6252 const regex_type&& __re, int __submatch = 0,
6253 regex_constants::match_flag_type __m =
6254 regex_constants::match_default) = delete;
6255#endif
6256
Howard Hinnantd3925342010-08-16 20:21:16 +00006257 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6258 const regex_type& __re, const vector<int>& __submatches,
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006259 regex_constants::match_flag_type __m =
6260 regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +00006261#if _LIBCPP_STD_VER > 11
6262 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6263 const regex_type&& __re, const vector<int>& __submatches,
6264 regex_constants::match_flag_type __m =
6265 regex_constants::match_default) = delete;
6266#endif
6267
Eric Fiselier6f8516f2017-04-18 23:42:15 +00006268#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantd3925342010-08-16 20:21:16 +00006269 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006270 const regex_type& __re,
6271 initializer_list<int> __submatches,
6272 regex_constants::match_flag_type __m =
6273 regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +00006274
6275#if _LIBCPP_STD_VER > 11
6276 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6277 const regex_type&& __re,
6278 initializer_list<int> __submatches,
6279 regex_constants::match_flag_type __m =
6280 regex_constants::match_default) = delete;
6281#endif
Eric Fiselier6f8516f2017-04-18 23:42:15 +00006282#endif // _LIBCPP_CXX03_LANG
Howard Hinnantc834c512011-11-29 18:15:50 +00006283 template <size_t _Np>
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006284 regex_token_iterator(_BidirectionalIterator __a,
6285 _BidirectionalIterator __b,
6286 const regex_type& __re,
Howard Hinnantc834c512011-11-29 18:15:50 +00006287 const int (&__submatches)[_Np],
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006288 regex_constants::match_flag_type __m =
6289 regex_constants::match_default);
Marshall Clow8c950072014-02-19 21:21:11 +00006290#if _LIBCPP_STD_VER > 11
6291 template <std::size_t _Np>
6292 regex_token_iterator(_BidirectionalIterator __a,
6293 _BidirectionalIterator __b,
6294 const regex_type&& __re,
6295 const int (&__submatches)[_Np],
6296 regex_constants::match_flag_type __m =
6297 regex_constants::match_default) = delete;
6298#endif
6299
Howard Hinnantd3925342010-08-16 20:21:16 +00006300 regex_token_iterator(const regex_token_iterator&);
6301 regex_token_iterator& operator=(const regex_token_iterator&);
6302
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006303 bool operator==(const regex_token_iterator& __x) const;
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006304 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006305 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
Howard Hinnantd3925342010-08-16 20:21:16 +00006306
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006307 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006308 const value_type& operator*() const {return *__result_;}
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006309 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006310 const value_type* operator->() const {return __result_;}
Howard Hinnantd3925342010-08-16 20:21:16 +00006311
6312 regex_token_iterator& operator++();
Howard Hinnant7ca9d942010-09-23 15:13:20 +00006313 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006314 regex_token_iterator operator++(int)
6315 {
6316 regex_token_iterator __t(*this);
6317 ++(*this);
6318 return __t;
6319 }
6320
6321private:
6322 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
Marshall Clow68083022014-01-09 18:25:57 +00006323 void __establish_result () {
Eric Fiselier37c22152016-12-24 00:24:44 +00006324 if (__subs_[__n_] == -1)
Marshall Clow68083022014-01-09 18:25:57 +00006325 __result_ = &__position_->prefix();
6326 else
Eric Fiselier37c22152016-12-24 00:24:44 +00006327 __result_ = &(*__position_)[__subs_[__n_]];
Marshall Clow68083022014-01-09 18:25:57 +00006328 }
Howard Hinnantd3925342010-08-16 20:21:16 +00006329};
6330
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006331template <class _BidirectionalIterator, class _CharT, class _Traits>
6332regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6333 regex_token_iterator()
6334 : __result_(nullptr),
6335 __suffix_(),
Eric Fiselier37c22152016-12-24 00:24:44 +00006336 __n_(0)
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006337{
6338}
6339
6340template <class _BidirectionalIterator, class _CharT, class _Traits>
6341void
6342regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6343 __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6344{
6345 if (__position_ != _Position())
Marshall Clow68083022014-01-09 18:25:57 +00006346 __establish_result ();
Eric Fiselier37c22152016-12-24 00:24:44 +00006347 else if (__subs_[__n_] == -1)
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006348 {
6349 __suffix_.matched = true;
6350 __suffix_.first = __a;
6351 __suffix_.second = __b;
6352 __result_ = &__suffix_;
6353 }
6354 else
6355 __result_ = nullptr;
6356}
6357
6358template <class _BidirectionalIterator, class _CharT, class _Traits>
6359regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6360 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6361 const regex_type& __re, int __submatch,
6362 regex_constants::match_flag_type __m)
6363 : __position_(__a, __b, __re, __m),
Eric Fiselier37c22152016-12-24 00:24:44 +00006364 __n_(0),
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006365 __subs_(1, __submatch)
6366{
6367 __init(__a, __b);
6368}
6369
6370template <class _BidirectionalIterator, class _CharT, class _Traits>
6371regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6372 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6373 const regex_type& __re, const vector<int>& __submatches,
6374 regex_constants::match_flag_type __m)
6375 : __position_(__a, __b, __re, __m),
Eric Fiselier37c22152016-12-24 00:24:44 +00006376 __n_(0),
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006377 __subs_(__submatches)
6378{
6379 __init(__a, __b);
6380}
6381
Eric Fiselier6f8516f2017-04-18 23:42:15 +00006382#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00006383
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006384template <class _BidirectionalIterator, class _CharT, class _Traits>
6385regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6386 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6387 const regex_type& __re,
6388 initializer_list<int> __submatches,
6389 regex_constants::match_flag_type __m)
6390 : __position_(__a, __b, __re, __m),
Eric Fiselier37c22152016-12-24 00:24:44 +00006391 __n_(0),
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006392 __subs_(__submatches)
6393{
6394 __init(__a, __b);
6395}
6396
Eric Fiselier6f8516f2017-04-18 23:42:15 +00006397#endif // _LIBCPP_CXX03_LANG
Howard Hinnant33711792011-08-12 21:56:02 +00006398
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006399template <class _BidirectionalIterator, class _CharT, class _Traits>
Howard Hinnantc834c512011-11-29 18:15:50 +00006400template <size_t _Np>
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006401regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6402 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6403 const regex_type& __re,
Howard Hinnantc834c512011-11-29 18:15:50 +00006404 const int (&__submatches)[_Np],
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006405 regex_constants::match_flag_type __m)
6406 : __position_(__a, __b, __re, __m),
Eric Fiselier37c22152016-12-24 00:24:44 +00006407 __n_(0),
Howard Hinnantc834c512011-11-29 18:15:50 +00006408 __subs_(__submatches, __submatches + _Np)
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006409{
6410 __init(__a, __b);
6411}
6412
6413template <class _BidirectionalIterator, class _CharT, class _Traits>
6414regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6415 regex_token_iterator(const regex_token_iterator& __x)
6416 : __position_(__x.__position_),
6417 __result_(__x.__result_),
6418 __suffix_(__x.__suffix_),
Eric Fiselier37c22152016-12-24 00:24:44 +00006419 __n_(__x.__n_),
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006420 __subs_(__x.__subs_)
6421{
6422 if (__x.__result_ == &__x.__suffix_)
Marshall Clow20756ac2014-01-13 17:47:08 +00006423 __result_ = &__suffix_;
Marshall Clow68083022014-01-09 18:25:57 +00006424 else if ( __result_ != nullptr )
6425 __establish_result ();
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006426}
6427
6428template <class _BidirectionalIterator, class _CharT, class _Traits>
6429regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6430regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6431 operator=(const regex_token_iterator& __x)
6432{
6433 if (this != &__x)
6434 {
6435 __position_ = __x.__position_;
6436 if (__x.__result_ == &__x.__suffix_)
Marshall Clow68083022014-01-09 18:25:57 +00006437 __result_ = &__suffix_;
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006438 else
6439 __result_ = __x.__result_;
6440 __suffix_ = __x.__suffix_;
Eric Fiselier37c22152016-12-24 00:24:44 +00006441 __n_ = __x.__n_;
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006442 __subs_ = __x.__subs_;
Marshall Clow68083022014-01-09 18:25:57 +00006443
6444 if ( __result_ != nullptr && __result_ != &__suffix_ )
6445 __establish_result();
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006446 }
6447 return *this;
6448}
6449
6450template <class _BidirectionalIterator, class _CharT, class _Traits>
6451bool
6452regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6453 operator==(const regex_token_iterator& __x) const
6454{
6455 if (__result_ == nullptr && __x.__result_ == nullptr)
6456 return true;
6457 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6458 __suffix_ == __x.__suffix_)
6459 return true;
6460 if (__result_ == nullptr || __x.__result_ == nullptr)
6461 return false;
6462 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6463 return false;
Eric Fiselier37c22152016-12-24 00:24:44 +00006464 return __position_ == __x.__position_ && __n_ == __x.__n_ &&
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006465 __subs_ == __x.__subs_;
6466}
6467
6468template <class _BidirectionalIterator, class _CharT, class _Traits>
6469regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6470regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6471{
6472 _Position __prev = __position_;
6473 if (__result_ == &__suffix_)
6474 __result_ = nullptr;
Eric Fiselier37c22152016-12-24 00:24:44 +00006475 else if (static_cast<size_t>(__n_ + 1) < __subs_.size())
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006476 {
Eric Fiselier37c22152016-12-24 00:24:44 +00006477 ++__n_;
Marshall Clow68083022014-01-09 18:25:57 +00006478 __establish_result();
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006479 }
6480 else
6481 {
Eric Fiselier37c22152016-12-24 00:24:44 +00006482 __n_ = 0;
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006483 ++__position_;
6484 if (__position_ != _Position())
Marshall Clow68083022014-01-09 18:25:57 +00006485 __establish_result();
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006486 else
6487 {
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006488 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
Howard Hinnant63c9ce62010-08-17 20:42:03 +00006489 && __prev->suffix().length() != 0)
6490 {
6491 __suffix_.matched = true;
6492 __suffix_.first = __prev->suffix().first;
6493 __suffix_.second = __prev->suffix().second;
6494 __result_ = &__suffix_;
6495 }
6496 else
6497 __result_ = nullptr;
6498 }
6499 }
6500 return *this;
6501}
6502
Howard Hinnantd3925342010-08-16 20:21:16 +00006503typedef regex_token_iterator<const char*> cregex_token_iterator;
6504typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
6505typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
6506typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
6507
Howard Hinnante90434c2010-08-18 00:13:08 +00006508// regex_replace
6509
6510template <class _OutputIterator, class _BidirectionalIterator,
6511 class _Traits, class _CharT>
6512_OutputIterator
Alexander Richardsonc9637642017-11-14 11:14:25 +00006513regex_replace(_OutputIterator __output_iter,
Howard Hinnante90434c2010-08-18 00:13:08 +00006514 _BidirectionalIterator __first, _BidirectionalIterator __last,
6515 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6516 regex_constants::match_flag_type __flags = regex_constants::match_default)
6517{
6518 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6519 _Iter __i(__first, __last, __e, __flags);
6520 _Iter __eof;
6521 if (__i == __eof)
6522 {
6523 if (!(__flags & regex_constants::format_no_copy))
Alexander Richardsonc9637642017-11-14 11:14:25 +00006524 __output_iter = _VSTD::copy(__first, __last, __output_iter);
Howard Hinnante90434c2010-08-18 00:13:08 +00006525 }
6526 else
6527 {
6528 sub_match<_BidirectionalIterator> __lm;
6529 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6530 {
6531 if (!(__flags & regex_constants::format_no_copy))
Alexander Richardsonc9637642017-11-14 11:14:25 +00006532 __output_iter = _VSTD::copy(__i->prefix().first, __i->prefix().second, __output_iter);
6533 __output_iter = __i->format(__output_iter, __fmt, __fmt + __len, __flags);
Howard Hinnante90434c2010-08-18 00:13:08 +00006534 __lm = __i->suffix();
6535 if (__flags & regex_constants::format_first_only)
6536 break;
6537 }
6538 if (!(__flags & regex_constants::format_no_copy))
Alexander Richardsonc9637642017-11-14 11:14:25 +00006539 __output_iter = _VSTD::copy(__lm.first, __lm.second, __output_iter);
Howard Hinnante90434c2010-08-18 00:13:08 +00006540 }
Alexander Richardsonc9637642017-11-14 11:14:25 +00006541 return __output_iter;
Howard Hinnante90434c2010-08-18 00:13:08 +00006542}
6543
6544template <class _OutputIterator, class _BidirectionalIterator,
6545 class _Traits, class _CharT, class _ST, class _SA>
6546inline _LIBCPP_INLINE_VISIBILITY
6547_OutputIterator
Alexander Richardsonc9637642017-11-14 11:14:25 +00006548regex_replace(_OutputIterator __output_iter,
Howard Hinnante90434c2010-08-18 00:13:08 +00006549 _BidirectionalIterator __first, _BidirectionalIterator __last,
6550 const basic_regex<_CharT, _Traits>& __e,
6551 const basic_string<_CharT, _ST, _SA>& __fmt,
6552 regex_constants::match_flag_type __flags = regex_constants::match_default)
6553{
Alexander Richardsonc9637642017-11-14 11:14:25 +00006554 return _VSTD::regex_replace(__output_iter, __first, __last, __e, __fmt.c_str(), __flags);
Howard Hinnante90434c2010-08-18 00:13:08 +00006555}
6556
6557template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6558 class _FSA>
6559inline _LIBCPP_INLINE_VISIBILITY
6560basic_string<_CharT, _ST, _SA>
6561regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6562 const basic_regex<_CharT, _Traits>& __e,
6563 const basic_string<_CharT, _FST, _FSA>& __fmt,
6564 regex_constants::match_flag_type __flags = regex_constants::match_default)
6565{
6566 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006567 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnante90434c2010-08-18 00:13:08 +00006568 __fmt.c_str(), __flags);
6569 return __r;
6570}
6571
6572template <class _Traits, class _CharT, class _ST, class _SA>
6573inline _LIBCPP_INLINE_VISIBILITY
6574basic_string<_CharT, _ST, _SA>
6575regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6576 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6577 regex_constants::match_flag_type __flags = regex_constants::match_default)
6578{
6579 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006580 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnante90434c2010-08-18 00:13:08 +00006581 __fmt, __flags);
6582 return __r;
6583}
6584
6585template <class _Traits, class _CharT, class _ST, class _SA>
6586inline _LIBCPP_INLINE_VISIBILITY
6587basic_string<_CharT>
6588regex_replace(const _CharT* __s,
6589 const basic_regex<_CharT, _Traits>& __e,
6590 const basic_string<_CharT, _ST, _SA>& __fmt,
6591 regex_constants::match_flag_type __flags = regex_constants::match_default)
6592{
6593 basic_string<_CharT> __r;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006594 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnante90434c2010-08-18 00:13:08 +00006595 __s + char_traits<_CharT>::length(__s), __e,
6596 __fmt.c_str(), __flags);
6597 return __r;
6598}
6599
6600template <class _Traits, class _CharT>
6601inline _LIBCPP_INLINE_VISIBILITY
6602basic_string<_CharT>
6603regex_replace(const _CharT* __s,
6604 const basic_regex<_CharT, _Traits>& __e,
6605 const _CharT* __fmt,
6606 regex_constants::match_flag_type __flags = regex_constants::match_default)
6607{
6608 basic_string<_CharT> __r;
Howard Hinnantb1ad5a82011-06-30 21:18:19 +00006609 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnante90434c2010-08-18 00:13:08 +00006610 __s + char_traits<_CharT>::length(__s), __e,
6611 __fmt, __flags);
6612 return __r;
6613}
6614
Howard Hinnanta3af5a32010-06-17 00:34:59 +00006615_LIBCPP_END_NAMESPACE_STD
6616
Eric Fiselierf4433a32017-05-31 22:07:49 +00006617_LIBCPP_POP_MACROS
6618
Howard Hinnanta3af5a32010-06-17 00:34:59 +00006619#endif // _LIBCPP_REGEX