blob: 443c2e303465403686578fdf404b7c61b07f7a8f [file] [log] [blame]
Howard Hinnant3257c982010-06-17 00:34:59 +00001// -*- C++ -*-
2//===--------------------------- regex ------------------------------------===//
3//
4// The LLVM Compiler Infrastructure
5//
Howard Hinnantb64f8b02010-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 Hinnant3257c982010-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 Tongb49c67f2016-08-02 21:34:48 +0000130 typedef traits traits_type;
131 typedef typename traits::string_type string_type;
Howard Hinnant3257c982010-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 Tong7f6e8e22016-08-07 22:26:04 +0000150 basic_regex(const charT* p, size_t len, flag_type f = regex_constants::ECMAScript);
Howard Hinnant3257c982010-06-17 00:34:59 +0000151 basic_regex(const basic_regex&);
Howard Hinnant46623a02012-07-21 01:31:58 +0000152 basic_regex(basic_regex&&) noexcept;
Howard Hinnant3257c982010-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 Hinnant46623a02012-07-21 01:31:58 +0000164 basic_regex& operator=(basic_regex&&) noexcept;
Howard Hinnant3257c982010-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 Hinnant46623a02012-07-21 01:31:58 +0000172 basic_regex& assign(basic_regex&& that) noexcept;
Howard Hinnant3257c982010-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
195typedef basic_regex<char> regex;
196typedef basic_regex<wchar_t> wregex;
197
198template <class charT, class traits>
199 void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
200
201template <class BidirectionalIterator>
202class sub_match
203 : public pair<BidirectionalIterator, BidirectionalIterator>
204{
205public:
206 typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
207 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
208 typedef BidirectionalIterator iterator;
209 typedef basic_string<value_type> string_type;
210
211 bool matched;
212
Howard Hinnant31aaf552010-12-08 21:07:55 +0000213 constexpr sub_match();
214
Howard Hinnant3257c982010-06-17 00:34:59 +0000215 difference_type length() const;
216 operator string_type() const;
217 string_type str() const;
218
219 int compare(const sub_match& s) const;
220 int compare(const string_type& s) const;
221 int compare(const value_type* s) const;
222};
223
224typedef sub_match<const char*> csub_match;
225typedef sub_match<const wchar_t*> wcsub_match;
226typedef sub_match<string::const_iterator> ssub_match;
227typedef sub_match<wstring::const_iterator> wssub_match;
228
229template <class BiIter>
230 bool
231 operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
232
233template <class BiIter>
234 bool
235 operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
236
237template <class BiIter>
238 bool
239 operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
240
241template <class BiIter>
242 bool
243 operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
244
245template <class BiIter>
246 bool
247 operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
248
249template <class BiIter>
250 bool
251 operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
252
253template <class BiIter, class ST, class SA>
254 bool
255 operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
256 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 operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
275 const sub_match<BiIter>& rhs);
276
277template <class BiIter, class ST, class SA>
278 bool
279 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 sub_match<BiIter>& lhs,
285 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& 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 operator>(const sub_match<BiIter>& lhs,
299 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
300
301template <class BiIter, class ST, class SA>
302 bool
303 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>
312 bool
313 operator==(typename iterator_traits<BiIter>::value_type const* lhs,
314 const sub_match<BiIter>& 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==(const sub_match<BiIter>& lhs,
344 typename iterator_traits<BiIter>::value_type const* 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==(typename iterator_traits<BiIter>::value_type const& lhs,
374 const sub_match<BiIter>& 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==(const sub_match<BiIter>& lhs,
404 typename iterator_traits<BiIter>::value_type const& 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 charT, class ST, class BiIter>
432 basic_ostream<charT, ST>&
433 operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
434
435template <class BidirectionalIterator,
436 class Allocator = allocator<sub_match<BidirectionalIterator>>>
437class match_results
438{
439public:
440 typedef sub_match<BidirectionalIterator> value_type;
441 typedef const value_type& const_reference;
Marshall Clow103af342014-02-26 01:56:31 +0000442 typedef value_type& reference;
Howard Hinnant3257c982010-06-17 00:34:59 +0000443 typedef /implementation-defined/ const_iterator;
444 typedef const_iterator iterator;
445 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
446 typedef typename allocator_traits<Allocator>::size_type size_type;
447 typedef Allocator allocator_type;
448 typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
449 typedef basic_string<char_type> string_type;
450
451 // construct/copy/destroy:
452 explicit match_results(const Allocator& a = Allocator());
453 match_results(const match_results& m);
Howard Hinnant46623a02012-07-21 01:31:58 +0000454 match_results(match_results&& m) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000455 match_results& operator=(const match_results& m);
456 match_results& operator=(match_results&& m);
457 ~match_results();
458
Howard Hinnant31aaf552010-12-08 21:07:55 +0000459 bool ready() const;
460
Howard Hinnant3257c982010-06-17 00:34:59 +0000461 // size:
462 size_type size() const;
463 size_type max_size() const;
464 bool empty() const;
465
466 // element access:
467 difference_type length(size_type sub = 0) const;
468 difference_type position(size_type sub = 0) const;
469 string_type str(size_type sub = 0) const;
470 const_reference operator[](size_type n) const;
471
472 const_reference prefix() const;
473 const_reference suffix() const;
474
475 const_iterator begin() const;
476 const_iterator end() const;
477 const_iterator cbegin() const;
478 const_iterator cend() const;
479
480 // format:
481 template <class OutputIter>
482 OutputIter
483 format(OutputIter out, const char_type* fmt_first,
484 const char_type* fmt_last,
485 regex_constants::match_flag_type flags = regex_constants::format_default) const;
486 template <class OutputIter, class ST, class SA>
487 OutputIter
488 format(OutputIter out, const basic_string<char_type, ST, SA>& fmt,
489 regex_constants::match_flag_type flags = regex_constants::format_default) const;
490 template <class ST, class SA>
491 basic_string<char_type, ST, SA>
492 format(const basic_string<char_type, ST, SA>& fmt,
493 regex_constants::match_flag_type flags = regex_constants::format_default) const;
494 string_type
495 format(const char_type* fmt,
496 regex_constants::match_flag_type flags = regex_constants::format_default) const;
497
498 // allocator:
499 allocator_type get_allocator() const;
500
501 // swap:
502 void swap(match_results& that);
503};
504
505typedef match_results<const char*> cmatch;
506typedef match_results<const wchar_t*> wcmatch;
507typedef match_results<string::const_iterator> smatch;
508typedef match_results<wstring::const_iterator> wsmatch;
509
510template <class BidirectionalIterator, class Allocator>
511 bool
512 operator==(const match_results<BidirectionalIterator, Allocator>& m1,
513 const match_results<BidirectionalIterator, Allocator>& m2);
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 void
522 swap(match_results<BidirectionalIterator, Allocator>& m1,
523 match_results<BidirectionalIterator, Allocator>& m2);
524
525template <class BidirectionalIterator, class Allocator, class charT, class traits>
526 bool
527 regex_match(BidirectionalIterator first, BidirectionalIterator last,
528 match_results<BidirectionalIterator, Allocator>& m,
529 const basic_regex<charT, traits>& e,
530 regex_constants::match_flag_type flags = regex_constants::match_default);
531
532template <class BidirectionalIterator, class charT, class traits>
533 bool
534 regex_match(BidirectionalIterator first, BidirectionalIterator last,
535 const basic_regex<charT, traits>& e,
536 regex_constants::match_flag_type flags = regex_constants::match_default);
537
538template <class charT, class Allocator, class traits>
539 bool
540 regex_match(const charT* str, match_results<const charT*, Allocator>& m,
541 const basic_regex<charT, traits>& e,
542 regex_constants::match_flag_type flags = regex_constants::match_default);
543
544template <class ST, class SA, class Allocator, class charT, class traits>
545 bool
546 regex_match(const basic_string<charT, ST, SA>& s,
547 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
548 const basic_regex<charT, traits>& e,
549 regex_constants::match_flag_type flags = regex_constants::match_default);
550
Marshall Clowe0f86722014-02-19 21:21:11 +0000551template <class ST, class SA, class Allocator, class charT, class traits>
552 bool
553 regex_match(const basic_string<charT, ST, SA>&& s,
554 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
555 const basic_regex<charT, traits>& e,
556 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
557
Howard Hinnant3257c982010-06-17 00:34:59 +0000558template <class charT, class traits>
559 bool
560 regex_match(const charT* str, const basic_regex<charT, traits>& e,
561 regex_constants::match_flag_type flags = regex_constants::match_default);
562
563template <class ST, class SA, class charT, class traits>
564 bool
565 regex_match(const basic_string<charT, ST, SA>& s,
566 const basic_regex<charT, traits>& e,
567 regex_constants::match_flag_type flags = regex_constants::match_default);
568
569template <class BidirectionalIterator, class Allocator, class charT, class traits>
570 bool
571 regex_search(BidirectionalIterator first, BidirectionalIterator last,
572 match_results<BidirectionalIterator, Allocator>& m,
573 const basic_regex<charT, traits>& e,
574 regex_constants::match_flag_type flags = regex_constants::match_default);
575
576template <class BidirectionalIterator, class charT, class traits>
577 bool
578 regex_search(BidirectionalIterator first, BidirectionalIterator last,
579 const basic_regex<charT, traits>& e,
580 regex_constants::match_flag_type flags = regex_constants::match_default);
581
582template <class charT, class Allocator, class traits>
583 bool
584 regex_search(const charT* str, match_results<const charT*, Allocator>& m,
585 const basic_regex<charT, traits>& e,
586 regex_constants::match_flag_type flags = regex_constants::match_default);
587
588template <class charT, class traits>
589 bool
590 regex_search(const charT* str, const basic_regex<charT, traits>& e,
591 regex_constants::match_flag_type flags = regex_constants::match_default);
592
593template <class ST, class SA, class charT, class traits>
594 bool
595 regex_search(const basic_string<charT, ST, SA>& s,
596 const basic_regex<charT, traits>& e,
597 regex_constants::match_flag_type flags = regex_constants::match_default);
598
599template <class ST, class SA, class Allocator, class charT, class traits>
600 bool
601 regex_search(const basic_string<charT, ST, SA>& s,
602 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
603 const basic_regex<charT, traits>& e,
604 regex_constants::match_flag_type flags = regex_constants::match_default);
605
Marshall Clowe0f86722014-02-19 21:21:11 +0000606template <class ST, class SA, class Allocator, class charT, class traits>
607 bool
608 regex_search(const basic_string<charT, ST, SA>&& s,
609 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
610 const basic_regex<charT, traits>& e,
611 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
612
Howard Hinnant3257c982010-06-17 00:34:59 +0000613template <class OutputIterator, class BidirectionalIterator,
614 class traits, class charT, class ST, class SA>
615 OutputIterator
616 regex_replace(OutputIterator out,
617 BidirectionalIterator first, BidirectionalIterator last,
618 const basic_regex<charT, traits>& e,
619 const basic_string<charT, ST, SA>& fmt,
620 regex_constants::match_flag_type flags = regex_constants::match_default);
621
622template <class OutputIterator, class BidirectionalIterator,
623 class traits, class charT>
624 OutputIterator
625 regex_replace(OutputIterator out,
626 BidirectionalIterator first, BidirectionalIterator last,
627 const basic_regex<charT, traits>& e, const charT* fmt,
628 regex_constants::match_flag_type flags = regex_constants::match_default);
629
630template <class traits, class charT, class ST, class SA, class FST, class FSA>>
631 basic_string<charT, ST, SA>
632 regex_replace(const basic_string<charT, ST, SA>& s,
633 const basic_regex<charT, traits>& e,
634 const basic_string<charT, FST, FSA>& fmt,
635 regex_constants::match_flag_type flags = regex_constants::match_default);
636
637template <class traits, class charT, class ST, class SA>
638 basic_string<charT, ST, SA>
639 regex_replace(const basic_string<charT, ST, SA>& s,
640 const basic_regex<charT, traits>& e, const charT* fmt,
641 regex_constants::match_flag_type flags = regex_constants::match_default);
642
643template <class traits, class charT, class ST, class SA>
644 basic_string<charT>
645 regex_replace(const charT* s,
646 const basic_regex<charT, traits>& e,
647 const basic_string<charT, ST, SA>& fmt,
648 regex_constants::match_flag_type flags = regex_constants::match_default);
649
650template <class traits, class charT>
651 basic_string<charT>
652 regex_replace(const charT* s,
653 const basic_regex<charT, traits>& e,
654 const charT* fmt,
655 regex_constants::match_flag_type flags = regex_constants::match_default);
656
657template <class BidirectionalIterator,
658 class charT = typename iterator_traits< BidirectionalIterator>::value_type,
659 class traits = regex_traits<charT>>
660class regex_iterator
661{
662public:
663 typedef basic_regex<charT, traits> regex_type;
664 typedef match_results<BidirectionalIterator> value_type;
665 typedef ptrdiff_t difference_type;
666 typedef const value_type* pointer;
667 typedef const value_type& reference;
668 typedef forward_iterator_tag iterator_category;
669
670 regex_iterator();
671 regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
672 const regex_type& re,
673 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +0000674 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
675 const regex_type&& __re,
676 regex_constants::match_flag_type __m
677 = regex_constants::match_default) = delete; // C++14
Howard Hinnant3257c982010-06-17 00:34:59 +0000678 regex_iterator(const regex_iterator&);
679 regex_iterator& operator=(const regex_iterator&);
680
681 bool operator==(const regex_iterator&) const;
682 bool operator!=(const regex_iterator&) const;
683
684 const value_type& operator*() const;
685 const value_type* operator->() const;
686
687 regex_iterator& operator++();
688 regex_iterator operator++(int);
689};
690
691typedef regex_iterator<const char*> cregex_iterator;
692typedef regex_iterator<const wchar_t*> wcregex_iterator;
693typedef regex_iterator<string::const_iterator> sregex_iterator;
694typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
695
696template <class BidirectionalIterator,
697 class charT = typename iterator_traits< BidirectionalIterator>::value_type,
698 class traits = regex_traits<charT>>
699class regex_token_iterator
700{
701public:
702 typedef basic_regex<charT, traits> regex_type;
703 typedef sub_match<BidirectionalIterator> value_type;
704 typedef ptrdiff_t difference_type;
705 typedef const value_type* pointer;
706 typedef const value_type& reference;
707 typedef forward_iterator_tag iterator_category;
708
709 regex_token_iterator();
710 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
711 const regex_type& re, int submatch = 0,
712 regex_constants::match_flag_type m = regex_constants::match_default);
713 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Marshall Clowe0f86722014-02-19 21:21:11 +0000714 const regex_type&& re, int submatch = 0,
715 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
716 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Howard Hinnant3257c982010-06-17 00:34:59 +0000717 const regex_type& re, const vector<int>& submatches,
718 regex_constants::match_flag_type m = regex_constants::match_default);
719 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Marshall Clowe0f86722014-02-19 21:21:11 +0000720 const regex_type&& re, const vector<int>& submatches,
721 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
722 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Howard Hinnant3257c982010-06-17 00:34:59 +0000723 const regex_type& re, initializer_list<int> submatches,
724 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +0000725 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
726 const regex_type&& re, initializer_list<int> submatches,
727 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
Howard Hinnant3257c982010-06-17 00:34:59 +0000728 template <size_t N>
729 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
730 const regex_type& re, const int (&submatches)[N],
731 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +0000732 template <size_t N>
733 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
734 const regex_type& re, const int (&submatches)[N],
735 regex_constants::match_flag_type m = regex_constants::match_default) = delete // C++14;
Howard Hinnant3257c982010-06-17 00:34:59 +0000736 regex_token_iterator(const regex_token_iterator&);
737 regex_token_iterator& operator=(const regex_token_iterator&);
738
739 bool operator==(const regex_token_iterator&) const;
740 bool operator!=(const regex_token_iterator&) const;
741
742 const value_type& operator*() const;
743 const value_type* operator->() const;
744
745 regex_token_iterator& operator++();
746 regex_token_iterator operator++(int);
747};
748
749typedef regex_token_iterator<const char*> cregex_token_iterator;
750typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
751typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
752typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
753
754} // std
755*/
756
757#include <__config>
758#include <stdexcept>
759#include <__locale>
Howard Hinnant8c2c18d2010-06-24 21:28:00 +0000760#include <initializer_list>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +0000761#include <utility>
762#include <iterator>
763#include <string>
Howard Hinnant7e9d84b2010-06-30 00:21:42 +0000764#include <memory>
765#include <vector>
Howard Hinnantac303862010-07-12 15:51:17 +0000766#include <deque>
Howard Hinnant3257c982010-06-17 00:34:59 +0000767
Howard Hinnant08e17472011-10-17 20:05:10 +0000768#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnant3257c982010-06-17 00:34:59 +0000769#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000770#endif
Howard Hinnant3257c982010-06-17 00:34:59 +0000771
Eric Fiselier018a3d52017-05-31 22:07:49 +0000772_LIBCPP_PUSH_MACROS
773#include <__undef_macros>
774
775
Howard Hinnant3257c982010-06-17 00:34:59 +0000776_LIBCPP_BEGIN_NAMESPACE_STD
777
778namespace regex_constants
779{
780
781// syntax_option_type
782
783enum syntax_option_type
784{
785 icase = 1 << 0,
786 nosubs = 1 << 1,
787 optimize = 1 << 2,
788 collate = 1 << 3,
Howard Hinnantad2a7ab2010-07-27 17:24:17 +0000789 ECMAScript = 0,
790 basic = 1 << 4,
791 extended = 1 << 5,
792 awk = 1 << 6,
793 grep = 1 << 7,
794 egrep = 1 << 8
Howard Hinnant3257c982010-06-17 00:34:59 +0000795};
796
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000797inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000798_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000799syntax_option_type
800operator~(syntax_option_type __x)
801{
Marshall Clow04bd79b2013-03-22 02:13:55 +0000802 return syntax_option_type(~int(__x) & 0x1FF);
Howard Hinnant3257c982010-06-17 00:34:59 +0000803}
804
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000805inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000806_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000807syntax_option_type
808operator&(syntax_option_type __x, syntax_option_type __y)
809{
810 return syntax_option_type(int(__x) & int(__y));
811}
812
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000813inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000814_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-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 Hinnantaef07cb2010-09-23 15:13:20 +0000821inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000822_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-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 Hinnantaef07cb2010-09-23 15:13:20 +0000829inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000830syntax_option_type&
831operator&=(syntax_option_type& __x, syntax_option_type __y)
832{
833 __x = __x & __y;
834 return __x;
835}
836
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000837inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-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 Hinnantaef07cb2010-09-23 15:13:20 +0000845inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-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
853// match_flag_type
854
855enum match_flag_type
856{
857 match_default = 0,
858 match_not_bol = 1 << 0,
859 match_not_eol = 1 << 1,
860 match_not_bow = 1 << 2,
861 match_not_eow = 1 << 3,
862 match_any = 1 << 4,
863 match_not_null = 1 << 5,
864 match_continuous = 1 << 6,
865 match_prev_avail = 1 << 7,
866 format_default = 0,
867 format_sed = 1 << 8,
868 format_no_copy = 1 << 9,
Howard Hinnanta712c722010-08-16 20:21:16 +0000869 format_first_only = 1 << 10,
Tim Shen38c2a372016-10-27 21:40:34 +0000870 __no_update_pos = 1 << 11,
871 __full_match = 1 << 12
Howard Hinnant3257c982010-06-17 00:34:59 +0000872};
873
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000874inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000875_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000876match_flag_type
877operator~(match_flag_type __x)
878{
Marshall Clow04bd79b2013-03-22 02:13:55 +0000879 return match_flag_type(~int(__x) & 0x0FFF);
Howard Hinnant3257c982010-06-17 00:34:59 +0000880}
881
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000882inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000883_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000884match_flag_type
885operator&(match_flag_type __x, match_flag_type __y)
886{
887 return match_flag_type(int(__x) & int(__y));
888}
889
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000890inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000891_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-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 Hinnantaef07cb2010-09-23 15:13:20 +0000898inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000899_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-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 Hinnantaef07cb2010-09-23 15:13:20 +0000906inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000907match_flag_type&
908operator&=(match_flag_type& __x, match_flag_type __y)
909{
910 __x = __x & __y;
911 return __x;
912}
913
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000914inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-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 Hinnantaef07cb2010-09-23 15:13:20 +0000922inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-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
930enum error_type
931{
932 error_collate = 1,
933 error_ctype,
934 error_escape,
935 error_backref,
936 error_brack,
937 error_paren,
938 error_brace,
939 error_badbrace,
940 error_range,
941 error_space,
942 error_badrepeat,
943 error_complexity,
Howard Hinnant8c2c18d2010-06-24 21:28:00 +0000944 error_stack,
Howard Hinnantad2a7ab2010-07-27 17:24:17 +0000945 __re_err_grammar,
946 __re_err_empty,
947 __re_err_unknown
Howard Hinnant3257c982010-06-17 00:34:59 +0000948};
949
950} // regex_constants
951
952class _LIBCPP_EXCEPTION_ABI regex_error
953 : public runtime_error
954{
955 regex_constants::error_type __code_;
956public:
957 explicit regex_error(regex_constants::error_type __ecode);
958 virtual ~regex_error() throw();
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000959 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000960 regex_constants::error_type code() const {return __code_;}
961};
962
Marshall Clow2576c292015-07-28 13:30:47 +0000963template <regex_constants::error_type _Ev>
Marshall Clow14c09a22016-08-25 15:09:01 +0000964_LIBCPP_NORETURN inline _LIBCPP_ALWAYS_INLINE
Marshall Clow2576c292015-07-28 13:30:47 +0000965void __throw_regex_error()
966{
967#ifndef _LIBCPP_NO_EXCEPTIONS
Marshall Clowfc93ce72015-08-17 21:14:16 +0000968 throw regex_error(_Ev);
969#else
Marshall Clow14c09a22016-08-25 15:09:01 +0000970 _VSTD::abort();
Marshall Clow2576c292015-07-28 13:30:47 +0000971#endif
972}
973
Howard Hinnant3257c982010-06-17 00:34:59 +0000974template <class _CharT>
Eric Fiselierc3589a82017-01-04 23:56:00 +0000975struct _LIBCPP_TEMPLATE_VIS regex_traits
Howard Hinnant3257c982010-06-17 00:34:59 +0000976{
977public:
978 typedef _CharT char_type;
979 typedef basic_string<char_type> string_type;
980 typedef locale locale_type;
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000981 typedef ctype_base::mask char_class_type;
Howard Hinnant3257c982010-06-17 00:34:59 +0000982
Daniel Sanders7e87bc92016-02-17 13:16:31 +0000983#if defined(__mips__) && defined(__GLIBC__)
984 static const char_class_type __regex_word = static_cast<char_class_type>(_ISbit(15));
985#else
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000986 static const char_class_type __regex_word = 0x80;
Daniel Sanders7e87bc92016-02-17 13:16:31 +0000987#endif
988
Howard Hinnant3257c982010-06-17 00:34:59 +0000989private:
990 locale __loc_;
991 const ctype<char_type>* __ct_;
992 const collate<char_type>* __col_;
993
994public:
995 regex_traits();
996
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000997 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000998 static size_t length(const char_type* __p)
999 {return char_traits<char_type>::length(__p);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001000 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +00001001 char_type translate(char_type __c) const {return __c;}
1002 char_type translate_nocase(char_type __c) const;
1003 template <class _ForwardIterator>
1004 string_type
1005 transform(_ForwardIterator __f, _ForwardIterator __l) const;
1006 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001007 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +00001008 string_type
1009 transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
1010 {return __transform_primary(__f, __l, char_type());}
1011 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001012 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +00001013 string_type
1014 lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
1015 {return __lookup_collatename(__f, __l, char_type());}
1016 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001017 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +00001018 char_class_type
1019 lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001020 bool __icase = false) const
1021 {return __lookup_classname(__f, __l, __icase, char_type());}
1022 bool isctype(char_type __c, char_class_type __m) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001023 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001024 int value(char_type __ch, int __radix) const
Marshall Clow33ae2332013-10-21 15:43:25 +00001025 {return __regex_traits_value(__ch, __radix);}
Howard Hinnant3257c982010-06-17 00:34:59 +00001026 locale_type imbue(locale_type __l);
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001027 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +00001028 locale_type getloc()const {return __loc_;}
1029
1030private:
1031 void __init();
1032
1033 template <class _ForwardIterator>
1034 string_type
1035 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
1036 template <class _ForwardIterator>
1037 string_type
1038 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
1039
1040 template <class _ForwardIterator>
1041 string_type
1042 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
1043 template <class _ForwardIterator>
1044 string_type
1045 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001046
1047 template <class _ForwardIterator>
1048 char_class_type
1049 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1050 bool __icase, char) const;
1051 template <class _ForwardIterator>
1052 char_class_type
1053 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1054 bool __icase, wchar_t) const;
1055
Marshall Clow33ae2332013-10-21 15:43:25 +00001056 static int __regex_traits_value(unsigned char __ch, int __radix);
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001057 _LIBCPP_INLINE_VISIBILITY
Marshall Clow33ae2332013-10-21 15:43:25 +00001058 int __regex_traits_value(char __ch, int __radix) const
1059 {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +00001060 _LIBCPP_INLINE_VISIBILITY
Marshall Clow33ae2332013-10-21 15:43:25 +00001061 int __regex_traits_value(wchar_t __ch, int __radix) const;
Howard Hinnant3257c982010-06-17 00:34:59 +00001062};
1063
1064template <class _CharT>
Howard Hinnant23fb9722013-03-07 19:38:08 +00001065const typename regex_traits<_CharT>::char_class_type
1066regex_traits<_CharT>::__regex_word;
1067
1068template <class _CharT>
Howard Hinnant3257c982010-06-17 00:34:59 +00001069regex_traits<_CharT>::regex_traits()
1070{
1071 __init();
1072}
1073
1074template <class _CharT>
1075typename regex_traits<_CharT>::char_type
1076regex_traits<_CharT>::translate_nocase(char_type __c) const
1077{
1078 return __ct_->tolower(__c);
1079}
1080
1081template <class _CharT>
1082template <class _ForwardIterator>
1083typename regex_traits<_CharT>::string_type
1084regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
1085{
1086 string_type __s(__f, __l);
1087 return __col_->transform(__s.data(), __s.data() + __s.size());
1088}
1089
1090template <class _CharT>
1091void
1092regex_traits<_CharT>::__init()
1093{
1094 __ct_ = &use_facet<ctype<char_type> >(__loc_);
1095 __col_ = &use_facet<collate<char_type> >(__loc_);
1096}
1097
1098template <class _CharT>
1099typename regex_traits<_CharT>::locale_type
1100regex_traits<_CharT>::imbue(locale_type __l)
1101{
1102 locale __r = __loc_;
1103 __loc_ = __l;
1104 __init();
1105 return __r;
1106}
1107
1108// transform_primary is very FreeBSD-specific
1109
1110template <class _CharT>
1111template <class _ForwardIterator>
1112typename regex_traits<_CharT>::string_type
1113regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1114 _ForwardIterator __l, char) const
1115{
1116 const string_type __s(__f, __l);
1117 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1118 switch (__d.size())
1119 {
1120 case 1:
1121 break;
1122 case 12:
1123 __d[11] = __d[3];
1124 break;
1125 default:
1126 __d.clear();
1127 break;
1128 }
1129 return __d;
1130}
1131
1132template <class _CharT>
1133template <class _ForwardIterator>
1134typename regex_traits<_CharT>::string_type
1135regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1136 _ForwardIterator __l, wchar_t) const
1137{
1138 const string_type __s(__f, __l);
1139 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1140 switch (__d.size())
1141 {
1142 case 1:
1143 break;
1144 case 3:
1145 __d[2] = __d[0];
1146 break;
1147 default:
1148 __d.clear();
1149 break;
1150 }
1151 return __d;
1152}
1153
1154// lookup_collatename is very FreeBSD-specific
1155
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001156_LIBCPP_FUNC_VIS string __get_collation_name(const char* __s);
Howard Hinnant3257c982010-06-17 00:34:59 +00001157
1158template <class _CharT>
1159template <class _ForwardIterator>
1160typename regex_traits<_CharT>::string_type
1161regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1162 _ForwardIterator __l, char) const
1163{
1164 string_type __s(__f, __l);
1165 string_type __r;
1166 if (!__s.empty())
1167 {
1168 __r = __get_collation_name(__s.c_str());
1169 if (__r.empty() && __s.size() <= 2)
1170 {
1171 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1172 if (__r.size() == 1 || __r.size() == 12)
1173 __r = __s;
1174 else
1175 __r.clear();
1176 }
1177 }
1178 return __r;
1179}
1180
1181template <class _CharT>
1182template <class _ForwardIterator>
1183typename regex_traits<_CharT>::string_type
1184regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1185 _ForwardIterator __l, wchar_t) const
1186{
1187 string_type __s(__f, __l);
1188 string __n;
1189 __n.reserve(__s.size());
1190 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1191 __i != __e; ++__i)
1192 {
1193 if (static_cast<unsigned>(*__i) >= 127)
1194 return string_type();
1195 __n.push_back(char(*__i));
1196 }
1197 string_type __r;
1198 if (!__s.empty())
1199 {
1200 __n = __get_collation_name(__n.c_str());
1201 if (!__n.empty())
1202 __r.assign(__n.begin(), __n.end());
1203 else if (__s.size() <= 2)
1204 {
1205 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1206 if (__r.size() == 1 || __r.size() == 3)
1207 __r = __s;
1208 else
1209 __r.clear();
1210 }
1211 }
1212 return __r;
1213}
1214
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001215// lookup_classname
1216
Dan Albert17573862014-07-29 19:23:39 +00001217regex_traits<char>::char_class_type _LIBCPP_FUNC_VIS
1218__get_classname(const char* __s, bool __icase);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001219
1220template <class _CharT>
1221template <class _ForwardIterator>
1222typename regex_traits<_CharT>::char_class_type
1223regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1224 _ForwardIterator __l,
1225 bool __icase, char) const
1226{
1227 string_type __s(__f, __l);
1228 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1229 return __get_classname(__s.c_str(), __icase);
1230}
1231
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, wchar_t) const
1238{
1239 string_type __s(__f, __l);
1240 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1241 string __n;
1242 __n.reserve(__s.size());
1243 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1244 __i != __e; ++__i)
1245 {
1246 if (static_cast<unsigned>(*__i) >= 127)
1247 return char_class_type();
1248 __n.push_back(char(*__i));
1249 }
1250 return __get_classname(__n.c_str(), __icase);
1251}
1252
1253template <class _CharT>
1254bool
1255regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
1256{
1257 if (__ct_->is(__m, __c))
1258 return true;
1259 return (__c == '_' && (__m & __regex_word));
1260}
1261
1262template <class _CharT>
1263int
Marshall Clow33ae2332013-10-21 15:43:25 +00001264regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001265{
1266 if ((__ch & 0xF8u) == 0x30) // '0' <= __ch && __ch <= '7'
1267 return __ch - '0';
1268 if (__radix != 8)
1269 {
1270 if ((__ch & 0xFEu) == 0x38) // '8' <= __ch && __ch <= '9'
1271 return __ch - '0';
1272 if (__radix == 16)
1273 {
1274 __ch |= 0x20; // tolower
1275 if ('a' <= __ch && __ch <= 'f')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00001276 return __ch - ('a' - 10);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001277 }
1278 }
1279 return -1;
1280}
1281
1282template <class _CharT>
Evgeniy Stepanova3b25f82015-11-07 01:22:13 +00001283inline
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001284int
Marshall Clow33ae2332013-10-21 15:43:25 +00001285regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001286{
Marshall Clow33ae2332013-10-21 15:43:25 +00001287 return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001288}
1289
Howard Hinnantac303862010-07-12 15:51:17 +00001290template <class _CharT> class __node;
1291
Eric Fiselierc3589a82017-01-04 23:56:00 +00001292template <class _BidirectionalIterator> class _LIBCPP_TEMPLATE_VIS sub_match;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001293
Howard Hinnant17615b02010-07-27 01:25:38 +00001294template <class _BidirectionalIterator,
1295 class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
Eric Fiselierc3589a82017-01-04 23:56:00 +00001296class _LIBCPP_TEMPLATE_VIS match_results;
Howard Hinnant17615b02010-07-27 01:25:38 +00001297
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001298template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001299struct __state
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001300{
1301 enum
1302 {
1303 __end_state = -1000,
1304 __consume_input, // -999
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001305 __begin_marked_expr, // -998
1306 __end_marked_expr, // -997
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001307 __pop_state, // -996
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001308 __accept_and_consume, // -995
1309 __accept_but_not_consume, // -994
1310 __reject, // -993
Howard Hinnantac303862010-07-12 15:51:17 +00001311 __split,
1312 __repeat
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001313 };
1314
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001315 int __do_;
Howard Hinnantac303862010-07-12 15:51:17 +00001316 const _CharT* __first_;
1317 const _CharT* __current_;
1318 const _CharT* __last_;
1319 vector<sub_match<const _CharT*> > __sub_matches_;
1320 vector<pair<size_t, const _CharT*> > __loop_data_;
1321 const __node<_CharT>* __node_;
1322 regex_constants::match_flag_type __flags_;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001323 bool __at_first_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001324
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001325 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001326 __state()
1327 : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
1328 __node_(nullptr), __flags_() {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001329};
1330
Howard Hinnantac303862010-07-12 15:51:17 +00001331// __node
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001332
1333template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001334class __node
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001335{
Howard Hinnantac303862010-07-12 15:51:17 +00001336 __node(const __node&);
1337 __node& operator=(const __node&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001338public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001339 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001340
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001341 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001342 __node() {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001343 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001344 virtual ~__node() {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001345
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001346 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001347 virtual void __exec(__state&) const {};
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001348 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001349 virtual void __exec_split(bool, __state&) const {};
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001350};
1351
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001352// __end_state
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001353
1354template <class _CharT>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001355class __end_state
Howard Hinnantac303862010-07-12 15:51:17 +00001356 : public __node<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001357{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001358public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001359 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001360
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001361 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001362 __end_state() {}
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001363
Howard Hinnantac303862010-07-12 15:51:17 +00001364 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001365};
1366
1367template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001368void
1369__end_state<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001370{
Howard Hinnantac303862010-07-12 15:51:17 +00001371 __s.__do_ = __state::__end_state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001372}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001373
1374// __has_one_state
1375
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001376template <class _CharT>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001377class __has_one_state
Howard Hinnantac303862010-07-12 15:51:17 +00001378 : public __node<_CharT>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001379{
Howard Hinnantac303862010-07-12 15:51:17 +00001380 __node<_CharT>* __first_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001381
1382public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001383 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001384 explicit __has_one_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001385 : __first_(__s) {}
1386
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001387 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001388 __node<_CharT>* first() const {return __first_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001389 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001390 __node<_CharT>*& first() {return __first_;}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001391};
1392
1393// __owns_one_state
1394
1395template <class _CharT>
1396class __owns_one_state
1397 : public __has_one_state<_CharT>
1398{
1399 typedef __has_one_state<_CharT> base;
1400
1401public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001402 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001403 explicit __owns_one_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001404 : base(__s) {}
1405
1406 virtual ~__owns_one_state();
1407};
1408
1409template <class _CharT>
1410__owns_one_state<_CharT>::~__owns_one_state()
1411{
1412 delete this->first();
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001413}
1414
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001415// __empty_state
1416
1417template <class _CharT>
1418class __empty_state
1419 : public __owns_one_state<_CharT>
1420{
1421 typedef __owns_one_state<_CharT> base;
1422
1423public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001424 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001425
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001426 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001427 explicit __empty_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001428 : base(__s) {}
1429
Howard Hinnantac303862010-07-12 15:51:17 +00001430 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001431};
1432
1433template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001434void
1435__empty_state<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001436{
Howard Hinnantac303862010-07-12 15:51:17 +00001437 __s.__do_ = __state::__accept_but_not_consume;
1438 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001439}
1440
1441// __empty_non_own_state
1442
1443template <class _CharT>
1444class __empty_non_own_state
1445 : public __has_one_state<_CharT>
1446{
1447 typedef __has_one_state<_CharT> base;
1448
1449public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001450 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001451
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001452 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001453 explicit __empty_non_own_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001454 : base(__s) {}
1455
Howard Hinnantac303862010-07-12 15:51:17 +00001456 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001457};
1458
1459template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001460void
1461__empty_non_own_state<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001462{
Howard Hinnantac303862010-07-12 15:51:17 +00001463 __s.__do_ = __state::__accept_but_not_consume;
1464 __s.__node_ = this->first();
1465}
1466
1467// __repeat_one_loop
1468
1469template <class _CharT>
1470class __repeat_one_loop
1471 : public __has_one_state<_CharT>
1472{
1473 typedef __has_one_state<_CharT> base;
1474
1475public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001476 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantac303862010-07-12 15:51:17 +00001477
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001478 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001479 explicit __repeat_one_loop(__node<_CharT>* __s)
1480 : base(__s) {}
1481
1482 virtual void __exec(__state&) const;
Howard Hinnantac303862010-07-12 15:51:17 +00001483};
1484
1485template <class _CharT>
1486void
1487__repeat_one_loop<_CharT>::__exec(__state& __s) const
1488{
1489 __s.__do_ = __state::__repeat;
1490 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001491}
1492
1493// __owns_two_states
1494
1495template <class _CharT>
1496class __owns_two_states
1497 : public __owns_one_state<_CharT>
1498{
1499 typedef __owns_one_state<_CharT> base;
1500
1501 base* __second_;
1502
1503public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001504 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001505 explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001506 : base(__s1), __second_(__s2) {}
1507
1508 virtual ~__owns_two_states();
1509
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001510 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001511 base* second() const {return __second_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001512 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001513 base*& second() {return __second_;}
1514};
1515
1516template <class _CharT>
1517__owns_two_states<_CharT>::~__owns_two_states()
1518{
1519 delete __second_;
1520}
1521
1522// __loop
1523
1524template <class _CharT>
1525class __loop
1526 : public __owns_two_states<_CharT>
1527{
1528 typedef __owns_two_states<_CharT> base;
1529
1530 size_t __min_;
1531 size_t __max_;
1532 unsigned __loop_id_;
Howard Hinnantac303862010-07-12 15:51:17 +00001533 unsigned __mexp_begin_;
1534 unsigned __mexp_end_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001535 bool __greedy_;
1536
1537public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001538 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001539
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001540 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001541 explicit __loop(unsigned __loop_id,
Howard Hinnantac303862010-07-12 15:51:17 +00001542 __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
1543 unsigned __mexp_begin, unsigned __mexp_end,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001544 bool __greedy = true,
1545 size_t __min = 0,
1546 size_t __max = numeric_limits<size_t>::max())
1547 : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
Howard Hinnantac303862010-07-12 15:51:17 +00001548 __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001549 __greedy_(__greedy) {}
1550
Howard Hinnantac303862010-07-12 15:51:17 +00001551 virtual void __exec(__state& __s) const;
1552 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001553
Howard Hinnantac303862010-07-12 15:51:17 +00001554private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001555 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001556 void __init_repeat(__state& __s) const
1557 {
1558 __s.__loop_data_[__loop_id_].second = __s.__current_;
1559 for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
1560 {
1561 __s.__sub_matches_[__i].first = __s.__last_;
1562 __s.__sub_matches_[__i].second = __s.__last_;
1563 __s.__sub_matches_[__i].matched = false;
1564 }
1565 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001566};
1567
1568template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001569void
1570__loop<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001571{
Howard Hinnantac303862010-07-12 15:51:17 +00001572 if (__s.__do_ == __state::__repeat)
1573 {
1574 bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
1575 bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
1576 if (__do_repeat && __do_alt &&
1577 __s.__loop_data_[__loop_id_].second == __s.__current_)
1578 __do_repeat = false;
1579 if (__do_repeat && __do_alt)
1580 __s.__do_ = __state::__split;
1581 else if (__do_repeat)
1582 {
1583 __s.__do_ = __state::__accept_but_not_consume;
1584 __s.__node_ = this->first();
1585 __init_repeat(__s);
1586 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001587 else
Howard Hinnantac303862010-07-12 15:51:17 +00001588 {
1589 __s.__do_ = __state::__accept_but_not_consume;
1590 __s.__node_ = this->second();
1591 }
1592 }
1593 else
1594 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00001595 __s.__loop_data_[__loop_id_].first = 0;
1596 bool __do_repeat = 0 < __max_;
1597 bool __do_alt = 0 >= __min_;
1598 if (__do_repeat && __do_alt)
Howard Hinnantac303862010-07-12 15:51:17 +00001599 __s.__do_ = __state::__split;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00001600 else if (__do_repeat)
1601 {
1602 __s.__do_ = __state::__accept_but_not_consume;
1603 __s.__node_ = this->first();
1604 __init_repeat(__s);
1605 }
Howard Hinnantac303862010-07-12 15:51:17 +00001606 else
1607 {
1608 __s.__do_ = __state::__accept_but_not_consume;
1609 __s.__node_ = this->second();
1610 }
1611 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001612}
1613
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001614template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001615void
1616__loop<_CharT>::__exec_split(bool __second, __state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001617{
Howard Hinnantac303862010-07-12 15:51:17 +00001618 __s.__do_ = __state::__accept_but_not_consume;
1619 if (__greedy_ != __second)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001620 {
Howard Hinnantac303862010-07-12 15:51:17 +00001621 __s.__node_ = this->first();
1622 __init_repeat(__s);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001623 }
Howard Hinnantac303862010-07-12 15:51:17 +00001624 else
1625 __s.__node_ = this->second();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001626}
1627
Howard Hinnantaa698082010-07-16 19:08:36 +00001628// __alternate
1629
1630template <class _CharT>
1631class __alternate
1632 : public __owns_two_states<_CharT>
1633{
1634 typedef __owns_two_states<_CharT> base;
1635
1636public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001637 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantaa698082010-07-16 19:08:36 +00001638
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001639 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa698082010-07-16 19:08:36 +00001640 explicit __alternate(__owns_one_state<_CharT>* __s1,
1641 __owns_one_state<_CharT>* __s2)
1642 : base(__s1, __s2) {}
1643
1644 virtual void __exec(__state& __s) const;
1645 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnantaa698082010-07-16 19:08:36 +00001646};
1647
1648template <class _CharT>
1649void
1650__alternate<_CharT>::__exec(__state& __s) const
1651{
1652 __s.__do_ = __state::__split;
1653}
1654
1655template <class _CharT>
1656void
1657__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
1658{
1659 __s.__do_ = __state::__accept_but_not_consume;
Howard Hinnant1371b2e2010-07-22 14:12:20 +00001660 if (__second)
Howard Hinnantaa698082010-07-16 19:08:36 +00001661 __s.__node_ = this->second();
Howard Hinnant1371b2e2010-07-22 14:12:20 +00001662 else
1663 __s.__node_ = this->first();
Howard Hinnantaa698082010-07-16 19:08:36 +00001664}
1665
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001666// __begin_marked_subexpression
1667
1668template <class _CharT>
1669class __begin_marked_subexpression
1670 : public __owns_one_state<_CharT>
1671{
1672 typedef __owns_one_state<_CharT> base;
1673
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001674 unsigned __mexp_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001675public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001676 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001677
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001678 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001679 explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001680 : base(__s), __mexp_(__mexp) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001681
Howard Hinnantac303862010-07-12 15:51:17 +00001682 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001683};
1684
1685template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001686void
1687__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001688{
Howard Hinnantac303862010-07-12 15:51:17 +00001689 __s.__do_ = __state::__accept_but_not_consume;
1690 __s.__sub_matches_[__mexp_-1].first = __s.__current_;
1691 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001692}
1693
1694// __end_marked_subexpression
1695
1696template <class _CharT>
1697class __end_marked_subexpression
1698 : public __owns_one_state<_CharT>
1699{
1700 typedef __owns_one_state<_CharT> base;
1701
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001702 unsigned __mexp_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001703public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001704 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001705
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001706 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001707 explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001708 : base(__s), __mexp_(__mexp) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001709
Howard Hinnantac303862010-07-12 15:51:17 +00001710 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001711};
1712
1713template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001714void
1715__end_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001716{
Howard Hinnantac303862010-07-12 15:51:17 +00001717 __s.__do_ = __state::__accept_but_not_consume;
1718 __s.__sub_matches_[__mexp_-1].second = __s.__current_;
1719 __s.__sub_matches_[__mexp_-1].matched = true;
1720 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001721}
1722
Howard Hinnantcba352d2010-07-12 18:16:05 +00001723// __back_ref
1724
1725template <class _CharT>
1726class __back_ref
1727 : public __owns_one_state<_CharT>
1728{
1729 typedef __owns_one_state<_CharT> base;
1730
1731 unsigned __mexp_;
1732public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001733 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcba352d2010-07-12 18:16:05 +00001734
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001735 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcba352d2010-07-12 18:16:05 +00001736 explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
1737 : base(__s), __mexp_(__mexp) {}
1738
1739 virtual void __exec(__state&) const;
Howard Hinnantcba352d2010-07-12 18:16:05 +00001740};
1741
1742template <class _CharT>
1743void
1744__back_ref<_CharT>::__exec(__state& __s) const
1745{
Marshall Clow70e8f592015-08-24 15:57:09 +00001746 if (__mexp_ > __s.__sub_matches_.size())
1747 __throw_regex_error<regex_constants::error_backref>();
Howard Hinnantcba352d2010-07-12 18:16:05 +00001748 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1749 if (__sm.matched)
1750 {
1751 ptrdiff_t __len = __sm.second - __sm.first;
1752 if (__s.__last_ - __s.__current_ >= __len &&
Howard Hinnant0949eed2011-06-30 21:18:19 +00001753 _VSTD::equal(__sm.first, __sm.second, __s.__current_))
Howard Hinnantcba352d2010-07-12 18:16:05 +00001754 {
1755 __s.__do_ = __state::__accept_but_not_consume;
1756 __s.__current_ += __len;
1757 __s.__node_ = this->first();
1758 }
1759 else
1760 {
1761 __s.__do_ = __state::__reject;
1762 __s.__node_ = nullptr;
1763 }
1764 }
1765 else
1766 {
1767 __s.__do_ = __state::__reject;
1768 __s.__node_ = nullptr;
1769 }
1770}
1771
Howard Hinnante34f17d2010-07-12 19:11:27 +00001772// __back_ref_icase
1773
1774template <class _CharT, class _Traits>
1775class __back_ref_icase
1776 : public __owns_one_state<_CharT>
1777{
1778 typedef __owns_one_state<_CharT> base;
1779
1780 _Traits __traits_;
1781 unsigned __mexp_;
1782public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001783 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001784
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001785 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00001786 explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
1787 __node<_CharT>* __s)
1788 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1789
1790 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001791};
1792
1793template <class _CharT, class _Traits>
1794void
1795__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
1796{
1797 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1798 if (__sm.matched)
1799 {
1800 ptrdiff_t __len = __sm.second - __sm.first;
1801 if (__s.__last_ - __s.__current_ >= __len)
1802 {
1803 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1804 {
1805 if (__traits_.translate_nocase(__sm.first[__i]) !=
1806 __traits_.translate_nocase(__s.__current_[__i]))
1807 goto __not_equal;
1808 }
1809 __s.__do_ = __state::__accept_but_not_consume;
1810 __s.__current_ += __len;
1811 __s.__node_ = this->first();
1812 }
1813 else
1814 {
1815 __s.__do_ = __state::__reject;
1816 __s.__node_ = nullptr;
1817 }
1818 }
1819 else
1820 {
1821__not_equal:
1822 __s.__do_ = __state::__reject;
1823 __s.__node_ = nullptr;
1824 }
1825}
1826
1827// __back_ref_collate
1828
1829template <class _CharT, class _Traits>
1830class __back_ref_collate
1831 : public __owns_one_state<_CharT>
1832{
1833 typedef __owns_one_state<_CharT> base;
1834
1835 _Traits __traits_;
1836 unsigned __mexp_;
1837public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001838 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001839
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001840 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00001841 explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
1842 __node<_CharT>* __s)
1843 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1844
1845 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001846};
1847
1848template <class _CharT, class _Traits>
1849void
1850__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
1851{
1852 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1853 if (__sm.matched)
1854 {
1855 ptrdiff_t __len = __sm.second - __sm.first;
1856 if (__s.__last_ - __s.__current_ >= __len)
1857 {
1858 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1859 {
1860 if (__traits_.translate(__sm.first[__i]) !=
1861 __traits_.translate(__s.__current_[__i]))
1862 goto __not_equal;
1863 }
1864 __s.__do_ = __state::__accept_but_not_consume;
1865 __s.__current_ += __len;
1866 __s.__node_ = this->first();
1867 }
1868 else
1869 {
1870 __s.__do_ = __state::__reject;
1871 __s.__node_ = nullptr;
1872 }
1873 }
1874 else
1875 {
1876__not_equal:
1877 __s.__do_ = __state::__reject;
1878 __s.__node_ = nullptr;
1879 }
1880}
1881
Howard Hinnant17615b02010-07-27 01:25:38 +00001882// __word_boundary
1883
1884template <class _CharT, class _Traits>
1885class __word_boundary
1886 : public __owns_one_state<_CharT>
1887{
1888 typedef __owns_one_state<_CharT> base;
1889
1890 _Traits __traits_;
1891 bool __invert_;
1892public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001893 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant17615b02010-07-27 01:25:38 +00001894
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001895 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00001896 explicit __word_boundary(const _Traits& __traits, bool __invert,
1897 __node<_CharT>* __s)
1898 : base(__s), __traits_(__traits), __invert_(__invert) {}
1899
1900 virtual void __exec(__state&) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00001901};
1902
1903template <class _CharT, class _Traits>
1904void
1905__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
1906{
1907 bool __is_word_b = false;
1908 if (__s.__first_ != __s.__last_)
1909 {
1910 if (__s.__current_ == __s.__last_)
1911 {
1912 if (!(__s.__flags_ & regex_constants::match_not_eow))
1913 {
1914 _CharT __c = __s.__current_[-1];
1915 __is_word_b = __c == '_' ||
1916 __traits_.isctype(__c, ctype_base::alnum);
1917 }
1918 }
Howard Hinnantf3dcca02010-07-29 15:17:28 +00001919 else if (__s.__current_ == __s.__first_ &&
1920 !(__s.__flags_ & regex_constants::match_prev_avail))
Howard Hinnant17615b02010-07-27 01:25:38 +00001921 {
1922 if (!(__s.__flags_ & regex_constants::match_not_bow))
1923 {
1924 _CharT __c = *__s.__current_;
1925 __is_word_b = __c == '_' ||
1926 __traits_.isctype(__c, ctype_base::alnum);
1927 }
1928 }
1929 else
1930 {
1931 _CharT __c1 = __s.__current_[-1];
1932 _CharT __c2 = *__s.__current_;
1933 bool __is_c1_b = __c1 == '_' ||
1934 __traits_.isctype(__c1, ctype_base::alnum);
1935 bool __is_c2_b = __c2 == '_' ||
1936 __traits_.isctype(__c2, ctype_base::alnum);
1937 __is_word_b = __is_c1_b != __is_c2_b;
1938 }
1939 }
1940 if (__is_word_b != __invert_)
1941 {
1942 __s.__do_ = __state::__accept_but_not_consume;
1943 __s.__node_ = this->first();
1944 }
1945 else
1946 {
1947 __s.__do_ = __state::__reject;
1948 __s.__node_ = nullptr;
1949 }
1950}
1951
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001952// __l_anchor
1953
1954template <class _CharT>
1955class __l_anchor
1956 : public __owns_one_state<_CharT>
1957{
1958 typedef __owns_one_state<_CharT> base;
1959
1960public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001961 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001962
1963 _LIBCPP_INLINE_VISIBILITY
1964 __l_anchor(__node<_CharT>* __s)
1965 : base(__s) {}
1966
1967 virtual void __exec(__state&) const;
1968};
1969
1970template <class _CharT>
1971void
1972__l_anchor<_CharT>::__exec(__state& __s) const
1973{
Marshall Clow64befb52015-03-19 17:05:59 +00001974 if (__s.__at_first_ && __s.__current_ == __s.__first_ &&
1975 !(__s.__flags_ & regex_constants::match_not_bol))
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001976 {
1977 __s.__do_ = __state::__accept_but_not_consume;
1978 __s.__node_ = this->first();
1979 }
1980 else
1981 {
1982 __s.__do_ = __state::__reject;
1983 __s.__node_ = nullptr;
1984 }
1985}
1986
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001987// __r_anchor
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001988
1989template <class _CharT>
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001990class __r_anchor
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001991 : public __owns_one_state<_CharT>
1992{
1993 typedef __owns_one_state<_CharT> base;
1994
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001995public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001996 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001997
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001998 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001999 __r_anchor(__node<_CharT>* __s)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002000 : base(__s) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002001
Howard Hinnantac303862010-07-12 15:51:17 +00002002 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002003};
2004
2005template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00002006void
2007__r_anchor<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002008{
Marshall Clow64befb52015-03-19 17:05:59 +00002009 if (__s.__current_ == __s.__last_ &&
2010 !(__s.__flags_ & regex_constants::match_not_eol))
Howard Hinnantac303862010-07-12 15:51:17 +00002011 {
2012 __s.__do_ = __state::__accept_but_not_consume;
2013 __s.__node_ = this->first();
2014 }
2015 else
2016 {
2017 __s.__do_ = __state::__reject;
2018 __s.__node_ = nullptr;
2019 }
2020}
2021
2022// __match_any
2023
2024template <class _CharT>
2025class __match_any
2026 : public __owns_one_state<_CharT>
2027{
2028 typedef __owns_one_state<_CharT> base;
2029
2030public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002031 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantac303862010-07-12 15:51:17 +00002032
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002033 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00002034 __match_any(__node<_CharT>* __s)
2035 : base(__s) {}
2036
2037 virtual void __exec(__state&) const;
Howard Hinnantac303862010-07-12 15:51:17 +00002038};
2039
2040template <class _CharT>
2041void
2042__match_any<_CharT>::__exec(__state& __s) const
2043{
2044 if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
2045 {
2046 __s.__do_ = __state::__accept_and_consume;
2047 ++__s.__current_;
2048 __s.__node_ = this->first();
2049 }
2050 else
2051 {
2052 __s.__do_ = __state::__reject;
2053 __s.__node_ = nullptr;
2054 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002055}
2056
Howard Hinnant17615b02010-07-27 01:25:38 +00002057// __match_any_but_newline
2058
2059template <class _CharT>
2060class __match_any_but_newline
2061 : public __owns_one_state<_CharT>
2062{
2063 typedef __owns_one_state<_CharT> base;
2064
2065public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002066 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant17615b02010-07-27 01:25:38 +00002067
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002068 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002069 __match_any_but_newline(__node<_CharT>* __s)
2070 : base(__s) {}
2071
2072 virtual void __exec(__state&) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00002073};
2074
Howard Hinnant0f678bd2013-08-12 18:38:34 +00002075template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
2076template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
2077
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002078// __match_char
2079
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002080template <class _CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002081class __match_char
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002082 : public __owns_one_state<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002083{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002084 typedef __owns_one_state<_CharT> base;
2085
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002086 _CharT __c_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002087
2088 __match_char(const __match_char&);
2089 __match_char& operator=(const __match_char&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002090public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002091 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002092
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002093 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00002094 __match_char(_CharT __c, __node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002095 : base(__s), __c_(__c) {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002096
Howard Hinnantac303862010-07-12 15:51:17 +00002097 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002098};
2099
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002100template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00002101void
2102__match_char<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002103{
Howard Hinnantac303862010-07-12 15:51:17 +00002104 if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2105 {
2106 __s.__do_ = __state::__accept_and_consume;
2107 ++__s.__current_;
2108 __s.__node_ = this->first();
2109 }
2110 else
2111 {
2112 __s.__do_ = __state::__reject;
2113 __s.__node_ = nullptr;
2114 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002115}
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002116
Howard Hinnante34f17d2010-07-12 19:11:27 +00002117// __match_char_icase
2118
2119template <class _CharT, class _Traits>
2120class __match_char_icase
2121 : public __owns_one_state<_CharT>
2122{
2123 typedef __owns_one_state<_CharT> base;
2124
2125 _Traits __traits_;
2126 _CharT __c_;
2127
2128 __match_char_icase(const __match_char_icase&);
2129 __match_char_icase& operator=(const __match_char_icase&);
2130public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002131 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002132
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002133 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002134 __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2135 : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2136
2137 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002138};
2139
2140template <class _CharT, class _Traits>
2141void
2142__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2143{
2144 if (__s.__current_ != __s.__last_ &&
2145 __traits_.translate_nocase(*__s.__current_) == __c_)
2146 {
2147 __s.__do_ = __state::__accept_and_consume;
2148 ++__s.__current_;
2149 __s.__node_ = this->first();
2150 }
2151 else
2152 {
2153 __s.__do_ = __state::__reject;
2154 __s.__node_ = nullptr;
2155 }
2156}
2157
2158// __match_char_collate
2159
2160template <class _CharT, class _Traits>
2161class __match_char_collate
2162 : public __owns_one_state<_CharT>
2163{
2164 typedef __owns_one_state<_CharT> base;
2165
2166 _Traits __traits_;
2167 _CharT __c_;
2168
2169 __match_char_collate(const __match_char_collate&);
2170 __match_char_collate& operator=(const __match_char_collate&);
2171public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002172 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002173
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002174 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002175 __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2176 : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2177
2178 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002179};
2180
2181template <class _CharT, class _Traits>
2182void
2183__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2184{
2185 if (__s.__current_ != __s.__last_ &&
2186 __traits_.translate(*__s.__current_) == __c_)
2187 {
2188 __s.__do_ = __state::__accept_and_consume;
2189 ++__s.__current_;
2190 __s.__node_ = this->first();
2191 }
2192 else
2193 {
2194 __s.__do_ = __state::__reject;
2195 __s.__node_ = nullptr;
2196 }
2197}
2198
Howard Hinnant173968a2010-07-13 21:48:06 +00002199// __bracket_expression
2200
2201template <class _CharT, class _Traits>
2202class __bracket_expression
2203 : public __owns_one_state<_CharT>
2204{
2205 typedef __owns_one_state<_CharT> base;
2206 typedef typename _Traits::string_type string_type;
2207
2208 _Traits __traits_;
2209 vector<_CharT> __chars_;
Howard Hinnant15476f32010-07-28 17:35:27 +00002210 vector<_CharT> __neg_chars_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002211 vector<pair<string_type, string_type> > __ranges_;
2212 vector<pair<_CharT, _CharT> > __digraphs_;
2213 vector<string_type> __equivalences_;
Dan Albert17573862014-07-29 19:23:39 +00002214 typename regex_traits<_CharT>::char_class_type __mask_;
2215 typename regex_traits<_CharT>::char_class_type __neg_mask_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002216 bool __negate_;
2217 bool __icase_;
2218 bool __collate_;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002219 bool __might_have_digraph_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002220
2221 __bracket_expression(const __bracket_expression&);
2222 __bracket_expression& operator=(const __bracket_expression&);
2223public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002224 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant173968a2010-07-13 21:48:06 +00002225
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002226 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002227 __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2228 bool __negate, bool __icase, bool __collate)
Howard Hinnant15476f32010-07-28 17:35:27 +00002229 : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2230 __negate_(__negate), __icase_(__icase), __collate_(__collate),
Howard Hinnant68025ed2010-07-14 15:45:11 +00002231 __might_have_digraph_(__traits_.getloc().name() != "C") {}
Howard Hinnant173968a2010-07-13 21:48:06 +00002232
2233 virtual void __exec(__state&) const;
2234
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002235 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002236 bool __negated() const {return __negate_;}
2237
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002238 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002239 void __add_char(_CharT __c)
2240 {
2241 if (__icase_)
2242 __chars_.push_back(__traits_.translate_nocase(__c));
2243 else if (__collate_)
2244 __chars_.push_back(__traits_.translate(__c));
2245 else
2246 __chars_.push_back(__c);
2247 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002248 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002249 void __add_neg_char(_CharT __c)
2250 {
2251 if (__icase_)
2252 __neg_chars_.push_back(__traits_.translate_nocase(__c));
2253 else if (__collate_)
2254 __neg_chars_.push_back(__traits_.translate(__c));
2255 else
2256 __neg_chars_.push_back(__c);
2257 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002258 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002259 void __add_range(string_type __b, string_type __e)
2260 {
2261 if (__collate_)
2262 {
2263 if (__icase_)
2264 {
2265 for (size_t __i = 0; __i < __b.size(); ++__i)
2266 __b[__i] = __traits_.translate_nocase(__b[__i]);
2267 for (size_t __i = 0; __i < __e.size(); ++__i)
2268 __e[__i] = __traits_.translate_nocase(__e[__i]);
2269 }
2270 else
2271 {
2272 for (size_t __i = 0; __i < __b.size(); ++__i)
2273 __b[__i] = __traits_.translate(__b[__i]);
2274 for (size_t __i = 0; __i < __e.size(); ++__i)
2275 __e[__i] = __traits_.translate(__e[__i]);
2276 }
2277 __ranges_.push_back(make_pair(
2278 __traits_.transform(__b.begin(), __b.end()),
2279 __traits_.transform(__e.begin(), __e.end())));
2280 }
2281 else
2282 {
2283 if (__b.size() != 1 || __e.size() != 1)
Marshall Clow2576c292015-07-28 13:30:47 +00002284 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant173968a2010-07-13 21:48:06 +00002285 if (__icase_)
2286 {
2287 __b[0] = __traits_.translate_nocase(__b[0]);
2288 __e[0] = __traits_.translate_nocase(__e[0]);
2289 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002290 __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
Howard Hinnant173968a2010-07-13 21:48:06 +00002291 }
2292 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002293 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002294 void __add_digraph(_CharT __c1, _CharT __c2)
2295 {
2296 if (__icase_)
2297 __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
2298 __traits_.translate_nocase(__c2)));
2299 else if (__collate_)
2300 __digraphs_.push_back(make_pair(__traits_.translate(__c1),
2301 __traits_.translate(__c2)));
2302 else
2303 __digraphs_.push_back(make_pair(__c1, __c2));
2304 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002306 void __add_equivalence(const string_type& __s)
2307 {__equivalences_.push_back(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002308 _LIBCPP_INLINE_VISIBILITY
Dan Albert17573862014-07-29 19:23:39 +00002309 void __add_class(typename regex_traits<_CharT>::char_class_type __mask)
Howard Hinnant173968a2010-07-13 21:48:06 +00002310 {__mask_ |= __mask;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002311 _LIBCPP_INLINE_VISIBILITY
Dan Albert17573862014-07-29 19:23:39 +00002312 void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask)
Howard Hinnant15476f32010-07-28 17:35:27 +00002313 {__neg_mask_ |= __mask;}
Howard Hinnant173968a2010-07-13 21:48:06 +00002314};
2315
2316template <class _CharT, class _Traits>
2317void
2318__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2319{
2320 bool __found = false;
2321 unsigned __consumed = 0;
2322 if (__s.__current_ != __s.__last_)
2323 {
2324 ++__consumed;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002325 if (__might_have_digraph_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002326 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002327 const _CharT* __next = _VSTD::next(__s.__current_);
Howard Hinnant68025ed2010-07-14 15:45:11 +00002328 if (__next != __s.__last_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002329 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002330 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2331 if (__icase_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002332 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002333 __ch2.first = __traits_.translate_nocase(__ch2.first);
2334 __ch2.second = __traits_.translate_nocase(__ch2.second);
2335 }
2336 else if (__collate_)
2337 {
2338 __ch2.first = __traits_.translate(__ch2.first);
2339 __ch2.second = __traits_.translate(__ch2.second);
2340 }
2341 if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2342 {
2343 // __ch2 is a digraph in this locale
2344 ++__consumed;
2345 for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2346 {
2347 if (__ch2 == __digraphs_[__i])
2348 {
2349 __found = true;
2350 goto __exit;
2351 }
2352 }
2353 if (__collate_ && !__ranges_.empty())
2354 {
2355 string_type __s2 = __traits_.transform(&__ch2.first,
2356 &__ch2.first + 2);
2357 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2358 {
2359 if (__ranges_[__i].first <= __s2 &&
2360 __s2 <= __ranges_[__i].second)
2361 {
2362 __found = true;
2363 goto __exit;
2364 }
2365 }
2366 }
2367 if (!__equivalences_.empty())
2368 {
2369 string_type __s2 = __traits_.transform_primary(&__ch2.first,
2370 &__ch2.first + 2);
2371 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2372 {
2373 if (__s2 == __equivalences_[__i])
2374 {
2375 __found = true;
2376 goto __exit;
2377 }
2378 }
2379 }
2380 if (__traits_.isctype(__ch2.first, __mask_) &&
2381 __traits_.isctype(__ch2.second, __mask_))
Howard Hinnant173968a2010-07-13 21:48:06 +00002382 {
2383 __found = true;
2384 goto __exit;
2385 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002386 if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2387 !__traits_.isctype(__ch2.second, __neg_mask_))
2388 {
2389 __found = true;
2390 goto __exit;
2391 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002392 goto __exit;
2393 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002394 }
2395 }
2396 // test *__s.__current_ as not a digraph
2397 _CharT __ch = *__s.__current_;
2398 if (__icase_)
2399 __ch = __traits_.translate_nocase(__ch);
2400 else if (__collate_)
2401 __ch = __traits_.translate(__ch);
2402 for (size_t __i = 0; __i < __chars_.size(); ++__i)
2403 {
2404 if (__ch == __chars_[__i])
2405 {
2406 __found = true;
2407 goto __exit;
2408 }
2409 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002410 if (!__neg_chars_.empty())
2411 {
2412 for (size_t __i = 0; __i < __neg_chars_.size(); ++__i)
2413 {
2414 if (__ch == __neg_chars_[__i])
2415 goto __is_neg_char;
2416 }
2417 __found = true;
2418 goto __exit;
2419 }
2420__is_neg_char:
Howard Hinnant173968a2010-07-13 21:48:06 +00002421 if (!__ranges_.empty())
2422 {
2423 string_type __s2 = __collate_ ?
2424 __traits_.transform(&__ch, &__ch + 1) :
2425 string_type(1, __ch);
2426 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2427 {
2428 if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2429 {
2430 __found = true;
2431 goto __exit;
2432 }
2433 }
2434 }
2435 if (!__equivalences_.empty())
2436 {
2437 string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2438 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2439 {
2440 if (__s2 == __equivalences_[__i])
2441 {
2442 __found = true;
2443 goto __exit;
2444 }
2445 }
2446 }
2447 if (__traits_.isctype(__ch, __mask_))
Howard Hinnant15476f32010-07-28 17:35:27 +00002448 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002449 __found = true;
Howard Hinnant15476f32010-07-28 17:35:27 +00002450 goto __exit;
2451 }
2452 if (__neg_mask_ && !__traits_.isctype(__ch, __neg_mask_))
2453 {
2454 __found = true;
2455 goto __exit;
2456 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002457 }
2458 else
2459 __found = __negate_; // force reject
2460__exit:
2461 if (__found != __negate_)
2462 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002463 __s.__do_ = __state::__accept_and_consume;
2464 __s.__current_ += __consumed;
2465 __s.__node_ = this->first();
2466 }
2467 else
2468 {
2469 __s.__do_ = __state::__reject;
2470 __s.__node_ = nullptr;
2471 }
2472}
2473
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00002474template <class _CharT, class _Traits> class __lookahead;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002475
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002476template <class _CharT, class _Traits = regex_traits<_CharT> >
Eric Fiselierc3589a82017-01-04 23:56:00 +00002477class _LIBCPP_TEMPLATE_VIS basic_regex
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002478{
2479public:
2480 // types:
2481 typedef _CharT value_type;
Hubert Tongb49c67f2016-08-02 21:34:48 +00002482 typedef _Traits traits_type;
2483 typedef typename _Traits::string_type string_type;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002484 typedef regex_constants::syntax_option_type flag_type;
2485 typedef typename _Traits::locale_type locale_type;
2486
2487private:
2488 _Traits __traits_;
2489 flag_type __flags_;
2490 unsigned __marked_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002491 unsigned __loop_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002492 int __open_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002493 shared_ptr<__empty_state<_CharT> > __start_;
2494 __owns_one_state<_CharT>* __end_;
2495
Howard Hinnant0949eed2011-06-30 21:18:19 +00002496 typedef _VSTD::__state<_CharT> __state;
2497 typedef _VSTD::__node<_CharT> __node;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002498
2499public:
2500 // constants:
Howard Hinnant46623a02012-07-21 01:31:58 +00002501 static const regex_constants::syntax_option_type icase = regex_constants::icase;
2502 static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2503 static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
2504 static const regex_constants::syntax_option_type collate = regex_constants::collate;
2505 static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2506 static const regex_constants::syntax_option_type basic = regex_constants::basic;
2507 static const regex_constants::syntax_option_type extended = regex_constants::extended;
2508 static const regex_constants::syntax_option_type awk = regex_constants::awk;
2509 static const regex_constants::syntax_option_type grep = regex_constants::grep;
2510 static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002511
2512 // construct/copy/destroy:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002513 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002514 basic_regex()
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002515 : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002516 __end_(0)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002517 {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002518 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002519 explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002520 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002521 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002522 {__parse(__p, __p + __traits_.length(__p));}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002523 _LIBCPP_INLINE_VISIBILITY
Hubert Tong7f6e8e22016-08-07 22:26:04 +00002524 basic_regex(const value_type* __p, size_t __len, flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002525 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002526 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002527 {__parse(__p, __p + __len);}
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002528// basic_regex(const basic_regex&) = default;
2529// basic_regex(basic_regex&&) = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002530 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002531 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002532 explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2533 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002534 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002535 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002536 {__parse(__p.begin(), __p.end());}
2537 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002538 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002539 basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2540 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002541 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002542 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002543 {__parse(__first, __last);}
Eric Fiselierd89c7152017-04-18 23:42:15 +00002544#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002545 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002546 basic_regex(initializer_list<value_type> __il,
2547 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002548 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002549 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002550 {__parse(__il.begin(), __il.end());}
Eric Fiselierd89c7152017-04-18 23:42:15 +00002551#endif // _LIBCPP_CXX03_LANG
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002552
Howard Hinnant7026a172010-08-13 18:11:23 +00002553// ~basic_regex() = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002554
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002555// basic_regex& operator=(const basic_regex&) = default;
2556// basic_regex& operator=(basic_regex&&) = default;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002557 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002558 basic_regex& operator=(const value_type* __p)
2559 {return assign(__p);}
Eric Fiselierd89c7152017-04-18 23:42:15 +00002560#ifndef _LIBCPP_CXX03_LANG
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002561 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002562 basic_regex& operator=(initializer_list<value_type> __il)
2563 {return assign(__il);}
Eric Fiselierd89c7152017-04-18 23:42:15 +00002564#endif // _LIBCPP_CXX03_LANG
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002565 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002566 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002567 basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2568 {return assign(__p);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002569
2570 // assign:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002571 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002572 basic_regex& assign(const basic_regex& __that)
2573 {return *this = __that;}
Eric Fiselierd89c7152017-04-18 23:42:15 +00002574#ifndef _LIBCPP_CXX03_LANG
Howard Hinnant46623a02012-07-21 01:31:58 +00002575 _LIBCPP_INLINE_VISIBILITY
2576 basic_regex& assign(basic_regex&& __that) _NOEXCEPT
2577 {return *this = _VSTD::move(__that);}
2578#endif
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002579 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002580 basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2581 {return assign(__p, __p + __traits_.length(__p), __f);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002582 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002583 basic_regex& assign(const value_type* __p, size_t __len, flag_type __f)
2584 {return assign(__p, __p + __len, __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002585 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002586 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002587 basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
Howard Hinnant7026a172010-08-13 18:11:23 +00002588 flag_type __f = regex_constants::ECMAScript)
2589 {return assign(__s.begin(), __s.end(), __f);}
2590
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002591 template <class _InputIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002592 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002593 typename enable_if
2594 <
2595 __is_input_iterator <_InputIterator>::value &&
2596 !__is_forward_iterator<_InputIterator>::value,
2597 basic_regex&
2598 >::type
2599 assign(_InputIterator __first, _InputIterator __last,
2600 flag_type __f = regex_constants::ECMAScript)
2601 {
2602 basic_string<_CharT> __t(__first, __last);
2603 return assign(__t.begin(), __t.end(), __f);
2604 }
2605
2606private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002607 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002608 void __member_init(flag_type __f)
2609 {
2610 __flags_ = __f;
2611 __marked_count_ = 0;
2612 __loop_count_ = 0;
2613 __open_count_ = 0;
2614 __end_ = nullptr;
Howard Hinnant7026a172010-08-13 18:11:23 +00002615 }
2616public:
2617
2618 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002619 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002620 typename enable_if
2621 <
2622 __is_forward_iterator<_ForwardIterator>::value,
2623 basic_regex&
2624 >::type
2625 assign(_ForwardIterator __first, _ForwardIterator __last,
2626 flag_type __f = regex_constants::ECMAScript)
2627 {
Marshall Clow083e0112015-01-13 16:49:52 +00002628 return assign(basic_regex(__first, __last, __f));
Howard Hinnant7026a172010-08-13 18:11:23 +00002629 }
2630
Eric Fiselierd89c7152017-04-18 23:42:15 +00002631#ifndef _LIBCPP_CXX03_LANG
Howard Hinnante3e32912011-08-12 21:56:02 +00002632
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002633 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002634 basic_regex& assign(initializer_list<value_type> __il,
Howard Hinnant7026a172010-08-13 18:11:23 +00002635 flag_type __f = regex_constants::ECMAScript)
2636 {return assign(__il.begin(), __il.end(), __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002637
Eric Fiselierd89c7152017-04-18 23:42:15 +00002638#endif // _LIBCPP_CXX03_LANG
Howard Hinnante3e32912011-08-12 21:56:02 +00002639
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002640 // const operations:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002641 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002642 unsigned mark_count() const {return __marked_count_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002643 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002644 flag_type flags() const {return __flags_;}
2645
2646 // locale:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002647 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002648 locale_type imbue(locale_type __loc)
2649 {
2650 __member_init(ECMAScript);
2651 __start_.reset();
2652 return __traits_.imbue(__loc);
2653 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002654 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002655 locale_type getloc() const {return __traits_.getloc();}
2656
2657 // swap:
Howard Hinnant7026a172010-08-13 18:11:23 +00002658 void swap(basic_regex& __r);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002659
2660private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002661 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002662 unsigned __loop_count() const {return __loop_count_;}
2663
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002664 template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002665 _ForwardIterator
2666 __parse(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002667 template <class _ForwardIterator>
2668 _ForwardIterator
2669 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2670 template <class _ForwardIterator>
2671 _ForwardIterator
2672 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2673 template <class _ForwardIterator>
2674 _ForwardIterator
2675 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2676 template <class _ForwardIterator>
2677 _ForwardIterator
2678 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2679 template <class _ForwardIterator>
2680 _ForwardIterator
2681 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2682 template <class _ForwardIterator>
2683 _ForwardIterator
2684 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2685 template <class _ForwardIterator>
2686 _ForwardIterator
2687 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2688 template <class _ForwardIterator>
2689 _ForwardIterator
2690 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2691 template <class _ForwardIterator>
2692 _ForwardIterator
2693 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2694 template <class _ForwardIterator>
2695 _ForwardIterator
2696 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2697 template <class _ForwardIterator>
2698 _ForwardIterator
2699 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2700 template <class _ForwardIterator>
2701 _ForwardIterator
2702 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2703 template <class _ForwardIterator>
2704 _ForwardIterator
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002705 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002706 __owns_one_state<_CharT>* __s,
2707 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002708 template <class _ForwardIterator>
2709 _ForwardIterator
Howard Hinnantaa698082010-07-16 19:08:36 +00002710 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2711 __owns_one_state<_CharT>* __s,
2712 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002713 template <class _ForwardIterator>
2714 _ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00002715 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2716 template <class _ForwardIterator>
2717 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002718 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2719 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002720 template <class _ForwardIterator>
2721 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002722 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2723 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002724 template <class _ForwardIterator>
2725 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002726 __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2727 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002728 template <class _ForwardIterator>
2729 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002730 __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2731 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002732 template <class _ForwardIterator>
2733 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002734 __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2735 basic_string<_CharT>& __col_sym);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002736 template <class _ForwardIterator>
2737 _ForwardIterator
2738 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002739 template <class _ForwardIterator>
2740 _ForwardIterator
2741 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2742 template <class _ForwardIterator>
2743 _ForwardIterator
2744 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2745 template <class _ForwardIterator>
2746 _ForwardIterator
2747 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2748 template <class _ForwardIterator>
2749 _ForwardIterator
2750 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2751 template <class _ForwardIterator>
2752 _ForwardIterator
2753 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2754 template <class _ForwardIterator>
2755 _ForwardIterator
2756 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002757 template <class _ForwardIterator>
2758 _ForwardIterator
2759 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2760 template <class _ForwardIterator>
2761 _ForwardIterator
2762 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2763 template <class _ForwardIterator>
2764 _ForwardIterator
2765 __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2766 template <class _ForwardIterator>
2767 _ForwardIterator
2768 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2769 template <class _ForwardIterator>
2770 _ForwardIterator
2771 __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2772 template <class _ForwardIterator>
2773 _ForwardIterator
Howard Hinnant17615b02010-07-27 01:25:38 +00002774 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2775 template <class _ForwardIterator>
2776 _ForwardIterator
2777 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2778 template <class _ForwardIterator>
2779 _ForwardIterator
2780 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2781 template <class _ForwardIterator>
2782 _ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00002783 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2784 basic_string<_CharT>* __str = nullptr);
Howard Hinnant17615b02010-07-27 01:25:38 +00002785 template <class _ForwardIterator>
2786 _ForwardIterator
2787 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant856846b2010-07-27 19:53:10 +00002788 template <class _ForwardIterator>
2789 _ForwardIterator
2790 __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2791 template <class _ForwardIterator>
2792 _ForwardIterator
2793 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant15476f32010-07-28 17:35:27 +00002794 template <class _ForwardIterator>
2795 _ForwardIterator
2796 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2797 basic_string<_CharT>& __str,
2798 __bracket_expression<_CharT, _Traits>* __ml);
2799 template <class _ForwardIterator>
2800 _ForwardIterator
2801 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2802 basic_string<_CharT>* __str = nullptr);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002803
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002804 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002805 void __push_l_anchor();
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002806 void __push_r_anchor();
Howard Hinnantac303862010-07-12 15:51:17 +00002807 void __push_match_any();
Howard Hinnant17615b02010-07-27 01:25:38 +00002808 void __push_match_any_but_newline();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002809 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002810 void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2811 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2812 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2813 __mexp_begin, __mexp_end);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002814 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002815 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2816 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2817 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2818 __mexp_begin, __mexp_end, false);}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002819 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
2820 size_t __mexp_begin = 0, size_t __mexp_end = 0,
2821 bool __greedy = true);
Howard Hinnant173968a2010-07-13 21:48:06 +00002822 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002823 void __push_char(value_type __c);
Howard Hinnantcba352d2010-07-12 18:16:05 +00002824 void __push_back_ref(int __i);
Howard Hinnantaa698082010-07-16 19:08:36 +00002825 void __push_alternation(__owns_one_state<_CharT>* __sa,
2826 __owns_one_state<_CharT>* __sb);
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002827 void __push_begin_marked_subexpression();
2828 void __push_end_marked_subexpression(unsigned);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002829 void __push_empty();
Howard Hinnant17615b02010-07-27 01:25:38 +00002830 void __push_word_boundary(bool);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002831 void __push_lookahead(const basic_regex&, bool, unsigned);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002832
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002833 template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002834 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002835 __search(const _CharT* __first, const _CharT* __last,
2836 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002837 regex_constants::match_flag_type __flags) const;
2838
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002839 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002840 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002841 __match_at_start(const _CharT* __first, const _CharT* __last,
2842 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002843 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00002844 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002845 bool
Howard Hinnant17615b02010-07-27 01:25:38 +00002846 __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
2847 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002848 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002849 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002850 bool
2851 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002852 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002853 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002854 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002855 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002856 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
2857 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002858 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002859
Howard Hinnant99968442011-11-29 18:15:50 +00002860 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002861 friend
2862 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002863 regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002864 regex_constants::match_flag_type);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002865
Howard Hinnant99968442011-11-29 18:15:50 +00002866 template <class _Ap, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002867 friend
2868 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002869 regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
2870 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002871
Howard Hinnant99968442011-11-29 18:15:50 +00002872 template <class _Bp, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002873 friend
2874 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002875 regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002876 regex_constants::match_flag_type);
2877
Howard Hinnant99968442011-11-29 18:15:50 +00002878 template <class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002879 friend
2880 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002881 regex_search(const _Cp*, const _Cp*,
2882 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002883
Howard Hinnant99968442011-11-29 18:15:50 +00002884 template <class _Cp, class _Ap, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002885 friend
2886 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002887 regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002888 regex_constants::match_flag_type);
2889
Howard Hinnant99968442011-11-29 18:15:50 +00002890 template <class _ST, class _SA, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002891 friend
2892 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002893 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2894 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002895 regex_constants::match_flag_type __flags);
2896
Howard Hinnant99968442011-11-29 18:15:50 +00002897 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002898 friend
2899 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002900 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2901 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
2902 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002903 regex_constants::match_flag_type __flags);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002904
Howard Hinnanta9602d52013-06-29 23:45:43 +00002905 template <class _Iter, class _Ap, class _Cp, class _Tp>
2906 friend
2907 bool
2908 regex_search(__wrap_iter<_Iter> __first,
2909 __wrap_iter<_Iter> __last,
2910 match_results<__wrap_iter<_Iter>, _Ap>& __m,
2911 const basic_regex<_Cp, _Tp>& __e,
2912 regex_constants::match_flag_type __flags);
2913
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002914 template <class, class> friend class __lookahead;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002915};
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002916
2917template <class _CharT, class _Traits>
Howard Hinnant0a69fa12012-12-12 21:14:28 +00002918 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
2919template <class _CharT, class _Traits>
2920 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
2921template <class _CharT, class _Traits>
2922 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
2923template <class _CharT, class _Traits>
2924 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
2925template <class _CharT, class _Traits>
2926 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
2927template <class _CharT, class _Traits>
2928 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
2929template <class _CharT, class _Traits>
2930 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
2931template <class _CharT, class _Traits>
2932 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
2933template <class _CharT, class _Traits>
2934 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
2935template <class _CharT, class _Traits>
2936 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
2937
2938template <class _CharT, class _Traits>
Howard Hinnant7026a172010-08-13 18:11:23 +00002939void
2940basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002941{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002942 using _VSTD::swap;
Howard Hinnant7026a172010-08-13 18:11:23 +00002943 swap(__traits_, __r.__traits_);
2944 swap(__flags_, __r.__flags_);
2945 swap(__marked_count_, __r.__marked_count_);
2946 swap(__loop_count_, __r.__loop_count_);
2947 swap(__open_count_, __r.__open_count_);
2948 swap(__start_, __r.__start_);
2949 swap(__end_, __r.__end_);
Howard Hinnant7026a172010-08-13 18:11:23 +00002950}
2951
2952template <class _CharT, class _Traits>
2953inline _LIBCPP_INLINE_VISIBILITY
2954void
2955swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
2956{
2957 return __x.swap(__y);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002958}
2959
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002960// __lookahead
2961
2962template <class _CharT, class _Traits>
2963class __lookahead
2964 : public __owns_one_state<_CharT>
2965{
2966 typedef __owns_one_state<_CharT> base;
2967
2968 basic_regex<_CharT, _Traits> __exp_;
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002969 unsigned __mexp_;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002970 bool __invert_;
2971
2972 __lookahead(const __lookahead&);
2973 __lookahead& operator=(const __lookahead&);
2974public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002975 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002976
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002977 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002978 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
Eric Fiselier7cc71062015-07-22 01:29:41 +00002979 : base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {}
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002980
2981 virtual void __exec(__state&) const;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002982};
2983
2984template <class _CharT, class _Traits>
2985void
2986__lookahead<_CharT, _Traits>::__exec(__state& __s) const
2987{
2988 match_results<const _CharT*> __m;
2989 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
Tim Shen38c2a372016-10-27 21:40:34 +00002990 bool __matched = __exp_.__match_at_start_ecma(
2991 __s.__current_, __s.__last_,
2992 __m,
2993 (__s.__flags_ | regex_constants::match_continuous) &
2994 ~regex_constants::__full_match,
2995 __s.__at_first_ && __s.__current_ == __s.__first_);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002996 if (__matched != __invert_)
2997 {
2998 __s.__do_ = __state::__accept_but_not_consume;
2999 __s.__node_ = this->first();
Howard Hinnantcd59acc2013-07-23 16:18:04 +00003000 for (unsigned __i = 1; __i < __m.size(); ++__i) {
3001 __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
3002 }
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003003 }
3004 else
3005 {
3006 __s.__do_ = __state::__reject;
3007 __s.__node_ = nullptr;
3008 }
3009}
3010
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003011template <class _CharT, class _Traits>
3012template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003013_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003014basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
3015 _ForwardIterator __last)
3016{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003017 {
Howard Hinnantac303862010-07-12 15:51:17 +00003018 unique_ptr<__node> __h(new __end_state<_CharT>);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003019 __start_.reset(new __empty_state<_CharT>(__h.get()));
3020 __h.release();
3021 __end_ = __start_.get();
3022 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003023 switch (__flags_ & 0x1F0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003024 {
3025 case ECMAScript:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003026 __first = __parse_ecma_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003027 break;
3028 case basic:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003029 __first = __parse_basic_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003030 break;
3031 case extended:
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003032 case awk:
Howard Hinnant15476f32010-07-28 17:35:27 +00003033 __first = __parse_extended_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003034 break;
3035 case grep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003036 __first = __parse_grep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003037 break;
3038 case egrep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003039 __first = __parse_egrep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003040 break;
3041 default:
Marshall Clow2576c292015-07-28 13:30:47 +00003042 __throw_regex_error<regex_constants::__re_err_grammar>();
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003043 }
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003044 return __first;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003045}
3046
3047template <class _CharT, class _Traits>
3048template <class _ForwardIterator>
3049_ForwardIterator
3050basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
3051 _ForwardIterator __last)
3052{
3053 if (__first != __last)
3054 {
3055 if (*__first == '^')
3056 {
3057 __push_l_anchor();
3058 ++__first;
3059 }
3060 if (__first != __last)
3061 {
3062 __first = __parse_RE_expression(__first, __last);
3063 if (__first != __last)
3064 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003065 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003066 if (__temp == __last && *__first == '$')
3067 {
3068 __push_r_anchor();
3069 ++__first;
3070 }
3071 }
3072 }
3073 if (__first != __last)
Marshall Clow2576c292015-07-28 13:30:47 +00003074 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003075 }
3076 return __first;
3077}
3078
3079template <class _CharT, class _Traits>
3080template <class _ForwardIterator>
3081_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003082basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
3083 _ForwardIterator __last)
3084{
Howard Hinnantaa698082010-07-16 19:08:36 +00003085 __owns_one_state<_CharT>* __sa = __end_;
3086 _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
3087 if (__temp == __first)
Marshall Clow2576c292015-07-28 13:30:47 +00003088 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnantaa698082010-07-16 19:08:36 +00003089 __first = __temp;
3090 while (__first != __last && *__first == '|')
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003091 {
Howard Hinnantaa698082010-07-16 19:08:36 +00003092 __owns_one_state<_CharT>* __sb = __end_;
3093 __temp = __parse_ERE_branch(++__first, __last);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003094 if (__temp == __first)
Marshall Clow2576c292015-07-28 13:30:47 +00003095 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnantaa698082010-07-16 19:08:36 +00003096 __push_alternation(__sa, __sb);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003097 __first = __temp;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003098 }
3099 return __first;
3100}
3101
3102template <class _CharT, class _Traits>
3103template <class _ForwardIterator>
3104_ForwardIterator
3105basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3106 _ForwardIterator __last)
3107{
3108 _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
3109 if (__temp == __first)
Marshall Clow2576c292015-07-28 13:30:47 +00003110 __throw_regex_error<regex_constants::__re_err_empty>();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003111 do
3112 {
3113 __first = __temp;
3114 __temp = __parse_ERE_expression(__first, __last);
3115 } while (__temp != __first);
3116 return __first;
3117}
3118
3119template <class _CharT, class _Traits>
3120template <class _ForwardIterator>
3121_ForwardIterator
3122basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3123 _ForwardIterator __last)
3124{
Howard Hinnantaa698082010-07-16 19:08:36 +00003125 __owns_one_state<_CharT>* __e = __end_;
3126 unsigned __mexp_begin = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003127 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3128 if (__temp == __first && __temp != __last)
3129 {
3130 switch (*__temp)
3131 {
3132 case '^':
3133 __push_l_anchor();
3134 ++__temp;
3135 break;
3136 case '$':
3137 __push_r_anchor();
3138 ++__temp;
3139 break;
3140 case '(':
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003141 __push_begin_marked_subexpression();
3142 unsigned __temp_count = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003143 ++__open_count_;
3144 __temp = __parse_extended_reg_exp(++__temp, __last);
3145 if (__temp == __last || *__temp != ')')
Marshall Clow2576c292015-07-28 13:30:47 +00003146 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003147 __push_end_marked_subexpression(__temp_count);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003148 --__open_count_;
3149 ++__temp;
3150 break;
3151 }
3152 }
3153 if (__temp != __first)
Howard Hinnantaa698082010-07-16 19:08:36 +00003154 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3155 __marked_count_+1);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003156 __first = __temp;
3157 return __first;
3158}
3159
3160template <class _CharT, class _Traits>
3161template <class _ForwardIterator>
3162_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003163basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3164 _ForwardIterator __last)
3165{
3166 while (true)
3167 {
3168 _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3169 if (__temp == __first)
3170 break;
3171 __first = __temp;
3172 }
3173 return __first;
3174}
3175
3176template <class _CharT, class _Traits>
3177template <class _ForwardIterator>
3178_ForwardIterator
3179basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3180 _ForwardIterator __last)
3181{
3182 if (__first != __last)
3183 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003184 __owns_one_state<_CharT>* __e = __end_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003185 unsigned __mexp_begin = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003186 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3187 if (__temp != __first)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003188 __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3189 __mexp_begin+1, __marked_count_+1);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003190 }
3191 return __first;
3192}
3193
3194template <class _CharT, class _Traits>
3195template <class _ForwardIterator>
3196_ForwardIterator
3197basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3198 _ForwardIterator __last)
3199{
3200 _ForwardIterator __temp = __first;
3201 __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3202 if (__temp == __first)
3203 {
3204 __temp = __parse_Back_open_paren(__first, __last);
3205 if (__temp != __first)
3206 {
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003207 __push_begin_marked_subexpression();
3208 unsigned __temp_count = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003209 __first = __parse_RE_expression(__temp, __last);
3210 __temp = __parse_Back_close_paren(__first, __last);
3211 if (__temp == __first)
Marshall Clow2576c292015-07-28 13:30:47 +00003212 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003213 __push_end_marked_subexpression(__temp_count);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003214 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003215 }
3216 else
3217 __first = __parse_BACKREF(__first, __last);
3218 }
3219 return __first;
3220}
3221
3222template <class _CharT, class _Traits>
3223template <class _ForwardIterator>
3224_ForwardIterator
3225basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3226 _ForwardIterator __first,
3227 _ForwardIterator __last)
3228{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003229 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003230 if (__temp == __first)
3231 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003232 __temp = __parse_QUOTED_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003233 if (__temp == __first)
3234 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003235 if (__temp != __last && *__temp == '.')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003236 {
3237 __push_match_any();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003238 ++__temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003239 }
3240 else
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003241 __temp = __parse_bracket_expression(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003242 }
3243 }
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003244 __first = __temp;
3245 return __first;
3246}
3247
3248template <class _CharT, class _Traits>
3249template <class _ForwardIterator>
3250_ForwardIterator
3251basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3252 _ForwardIterator __first,
3253 _ForwardIterator __last)
3254{
3255 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3256 if (__temp == __first)
3257 {
3258 __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3259 if (__temp == __first)
3260 {
3261 if (__temp != __last && *__temp == '.')
3262 {
3263 __push_match_any();
3264 ++__temp;
3265 }
3266 else
3267 __temp = __parse_bracket_expression(__first, __last);
3268 }
3269 }
3270 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003271 return __first;
3272}
3273
3274template <class _CharT, class _Traits>
3275template <class _ForwardIterator>
3276_ForwardIterator
3277basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3278 _ForwardIterator __last)
3279{
3280 if (__first != __last)
3281 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003282 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003283 if (__temp != __last)
3284 {
3285 if (*__first == '\\' && *__temp == '(')
3286 __first = ++__temp;
3287 }
3288 }
3289 return __first;
3290}
3291
3292template <class _CharT, class _Traits>
3293template <class _ForwardIterator>
3294_ForwardIterator
3295basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3296 _ForwardIterator __last)
3297{
3298 if (__first != __last)
3299 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003300 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003301 if (__temp != __last)
3302 {
3303 if (*__first == '\\' && *__temp == ')')
3304 __first = ++__temp;
3305 }
3306 }
3307 return __first;
3308}
3309
3310template <class _CharT, class _Traits>
3311template <class _ForwardIterator>
3312_ForwardIterator
3313basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3314 _ForwardIterator __last)
3315{
3316 if (__first != __last)
3317 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003318 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003319 if (__temp != __last)
3320 {
3321 if (*__first == '\\' && *__temp == '{')
3322 __first = ++__temp;
3323 }
3324 }
3325 return __first;
3326}
3327
3328template <class _CharT, class _Traits>
3329template <class _ForwardIterator>
3330_ForwardIterator
3331basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3332 _ForwardIterator __last)
3333{
3334 if (__first != __last)
3335 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003336 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003337 if (__temp != __last)
3338 {
3339 if (*__first == '\\' && *__temp == '}')
3340 __first = ++__temp;
3341 }
3342 }
3343 return __first;
3344}
3345
3346template <class _CharT, class _Traits>
3347template <class _ForwardIterator>
3348_ForwardIterator
3349basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3350 _ForwardIterator __last)
3351{
3352 if (__first != __last)
3353 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003354 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003355 if (__temp != __last)
3356 {
Marshall Clow97f50f62014-01-18 03:40:03 +00003357 if (*__first == '\\')
3358 {
3359 int __val = __traits_.value(*__temp, 10);
3360 if (__val >= 1 && __val <= 9)
3361 {
3362 __push_back_ref(__val);
3363 __first = ++__temp;
3364 }
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003365 }
3366 }
3367 }
3368 return __first;
3369}
3370
3371template <class _CharT, class _Traits>
3372template <class _ForwardIterator>
3373_ForwardIterator
3374basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3375 _ForwardIterator __last)
3376{
3377 if (__first != __last)
3378 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003379 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003380 if (__temp == __last && *__first == '$')
3381 return __first;
3382 // Not called inside a bracket
3383 if (*__first == '.' || *__first == '\\' || *__first == '[')
3384 return __first;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003385 __push_char(*__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003386 ++__first;
3387 }
3388 return __first;
3389}
3390
3391template <class _CharT, class _Traits>
3392template <class _ForwardIterator>
3393_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003394basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3395 _ForwardIterator __last)
3396{
3397 if (__first != __last)
3398 {
3399 switch (*__first)
3400 {
3401 case '^':
3402 case '.':
3403 case '[':
3404 case '$':
3405 case '(':
3406 case '|':
3407 case '*':
3408 case '+':
3409 case '?':
3410 case '{':
3411 case '\\':
3412 break;
3413 case ')':
3414 if (__open_count_ == 0)
3415 {
3416 __push_char(*__first);
3417 ++__first;
3418 }
3419 break;
3420 default:
3421 __push_char(*__first);
3422 ++__first;
3423 break;
3424 }
3425 }
3426 return __first;
3427}
3428
3429template <class _CharT, class _Traits>
3430template <class _ForwardIterator>
3431_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003432basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3433 _ForwardIterator __last)
3434{
3435 if (__first != __last)
3436 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003437 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003438 if (__temp != __last)
3439 {
3440 if (*__first == '\\')
3441 {
3442 switch (*__temp)
3443 {
3444 case '^':
3445 case '.':
3446 case '*':
3447 case '[':
3448 case '$':
3449 case '\\':
Howard Hinnant0de86b62010-06-25 20:56:08 +00003450 __push_char(*__temp);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003451 __first = ++__temp;
3452 break;
3453 }
3454 }
3455 }
3456 }
3457 return __first;
3458}
3459
3460template <class _CharT, class _Traits>
3461template <class _ForwardIterator>
3462_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003463basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3464 _ForwardIterator __last)
3465{
3466 if (__first != __last)
3467 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003468 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003469 if (__temp != __last)
3470 {
3471 if (*__first == '\\')
3472 {
3473 switch (*__temp)
3474 {
3475 case '^':
3476 case '.':
3477 case '*':
3478 case '[':
3479 case '$':
3480 case '\\':
3481 case '(':
3482 case ')':
3483 case '|':
3484 case '+':
3485 case '?':
3486 case '{':
Howard Hinnantc1ecd972013-06-28 20:31:05 +00003487 case '}':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003488 __push_char(*__temp);
3489 __first = ++__temp;
3490 break;
Howard Hinnant15476f32010-07-28 17:35:27 +00003491 default:
3492 if ((__flags_ & 0x1F0) == awk)
3493 __first = __parse_awk_escape(++__first, __last);
3494 break;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003495 }
3496 }
3497 }
3498 }
3499 return __first;
3500}
3501
3502template <class _CharT, class _Traits>
3503template <class _ForwardIterator>
3504_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003505basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003506 _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003507 __owns_one_state<_CharT>* __s,
3508 unsigned __mexp_begin,
3509 unsigned __mexp_end)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003510{
3511 if (__first != __last)
3512 {
Howard Hinnant0de86b62010-06-25 20:56:08 +00003513 if (*__first == '*')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003514 {
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003515 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003516 ++__first;
3517 }
3518 else
3519 {
3520 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3521 if (__temp != __first)
3522 {
3523 int __min = 0;
3524 __first = __temp;
3525 __temp = __parse_DUP_COUNT(__first, __last, __min);
3526 if (__temp == __first)
Marshall Clow2576c292015-07-28 13:30:47 +00003527 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003528 __first = __temp;
3529 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00003530 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003531 if (*__first != ',')
3532 {
3533 __temp = __parse_Back_close_brace(__first, __last);
3534 if (__temp == __first)
Marshall Clow2576c292015-07-28 13:30:47 +00003535 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnantcba352d2010-07-12 18:16:05 +00003536 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3537 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003538 __first = __temp;
3539 }
3540 else
3541 {
3542 ++__first; // consume ','
3543 int __max = -1;
3544 __first = __parse_DUP_COUNT(__first, __last, __max);
3545 __temp = __parse_Back_close_brace(__first, __last);
3546 if (__temp == __first)
Marshall Clow2576c292015-07-28 13:30:47 +00003547 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003548 if (__max == -1)
Howard Hinnantaa698082010-07-16 19:08:36 +00003549 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003550 else
3551 {
3552 if (__max < __min)
Marshall Clow2576c292015-07-28 13:30:47 +00003553 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnantcba352d2010-07-12 18:16:05 +00003554 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3555 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003556 }
3557 __first = __temp;
3558 }
3559 }
3560 }
3561 }
3562 return __first;
3563}
3564
Howard Hinnant0de86b62010-06-25 20:56:08 +00003565template <class _CharT, class _Traits>
3566template <class _ForwardIterator>
3567_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003568basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantaa698082010-07-16 19:08:36 +00003569 _ForwardIterator __last,
3570 __owns_one_state<_CharT>* __s,
3571 unsigned __mexp_begin,
3572 unsigned __mexp_end)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003573{
3574 if (__first != __last)
3575 {
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003576 unsigned __grammar = __flags_ & 0x1F0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003577 switch (*__first)
3578 {
3579 case '*':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003580 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003581 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003582 {
3583 ++__first;
3584 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3585 }
3586 else
3587 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003588 break;
3589 case '+':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003590 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003591 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003592 {
3593 ++__first;
3594 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3595 }
3596 else
3597 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003598 break;
3599 case '?':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003600 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003601 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003602 {
3603 ++__first;
3604 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3605 }
3606 else
3607 __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003608 break;
3609 case '{':
3610 {
3611 int __min;
Howard Hinnantaa698082010-07-16 19:08:36 +00003612 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003613 if (__temp == __first)
Marshall Clow2576c292015-07-28 13:30:47 +00003614 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003615 __first = __temp;
3616 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00003617 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003618 switch (*__first)
3619 {
3620 case '}':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003621 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003622 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003623 {
3624 ++__first;
3625 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3626 }
3627 else
3628 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003629 break;
3630 case ',':
Howard Hinnantd4444702010-08-11 17:04:31 +00003631 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00003632 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00003633 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003634 if (*__first == '}')
3635 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003636 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003637 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003638 {
3639 ++__first;
3640 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3641 }
3642 else
3643 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003644 }
3645 else
3646 {
Howard Hinnantaa698082010-07-16 19:08:36 +00003647 int __max = -1;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003648 __temp = __parse_DUP_COUNT(__first, __last, __max);
3649 if (__temp == __first)
Marshall Clow2576c292015-07-28 13:30:47 +00003650 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003651 __first = __temp;
3652 if (__first == __last || *__first != '}')
Marshall Clow2576c292015-07-28 13:30:47 +00003653 __throw_regex_error<regex_constants::error_brace>();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003654 ++__first;
3655 if (__max < __min)
Marshall Clow2576c292015-07-28 13:30:47 +00003656 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003657 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003658 {
3659 ++__first;
3660 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3661 }
3662 else
3663 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003664 }
Howard Hinnantaa698082010-07-16 19:08:36 +00003665 break;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003666 default:
Marshall Clow2576c292015-07-28 13:30:47 +00003667 __throw_regex_error<regex_constants::error_badbrace>();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003668 }
3669 }
3670 break;
3671 }
3672 }
3673 return __first;
3674}
3675
3676template <class _CharT, class _Traits>
3677template <class _ForwardIterator>
3678_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003679basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3680 _ForwardIterator __last)
3681{
3682 if (__first != __last && *__first == '[')
3683 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003684 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00003685 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00003686 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant173968a2010-07-13 21:48:06 +00003687 bool __negate = false;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003688 if (*__first == '^')
3689 {
3690 ++__first;
Howard Hinnant173968a2010-07-13 21:48:06 +00003691 __negate = true;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003692 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003693 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3694 // __ml owned by *this
Howard Hinnant0de86b62010-06-25 20:56:08 +00003695 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00003696 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant15476f32010-07-28 17:35:27 +00003697 if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']')
Howard Hinnant0de86b62010-06-25 20:56:08 +00003698 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003699 __ml->__add_char(']');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003700 ++__first;
3701 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003702 __first = __parse_follow_list(__first, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003703 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00003704 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant0de86b62010-06-25 20:56:08 +00003705 if (*__first == '-')
3706 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003707 __ml->__add_char('-');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003708 ++__first;
3709 }
3710 if (__first == __last || *__first != ']')
Marshall Clow2576c292015-07-28 13:30:47 +00003711 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant0de86b62010-06-25 20:56:08 +00003712 ++__first;
3713 }
3714 return __first;
3715}
3716
3717template <class _CharT, class _Traits>
3718template <class _ForwardIterator>
3719_ForwardIterator
3720basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003721 _ForwardIterator __last,
3722 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003723{
3724 if (__first != __last)
3725 {
3726 while (true)
3727 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003728 _ForwardIterator __temp = __parse_expression_term(__first, __last,
3729 __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003730 if (__temp == __first)
3731 break;
3732 __first = __temp;
3733 }
3734 }
3735 return __first;
3736}
3737
3738template <class _CharT, class _Traits>
3739template <class _ForwardIterator>
3740_ForwardIterator
3741basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003742 _ForwardIterator __last,
3743 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003744{
3745 if (__first != __last && *__first != ']')
3746 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003747 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant173968a2010-07-13 21:48:06 +00003748 basic_string<_CharT> __start_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003749 if (__temp != __last && *__first == '[')
3750 {
3751 if (*__temp == '=')
Howard Hinnant173968a2010-07-13 21:48:06 +00003752 return __parse_equivalence_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003753 else if (*__temp == ':')
Howard Hinnant173968a2010-07-13 21:48:06 +00003754 return __parse_character_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003755 else if (*__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003756 __first = __parse_collating_symbol(++__temp, __last, __start_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003757 }
Howard Hinnant15476f32010-07-28 17:35:27 +00003758 unsigned __grammar = __flags_ & 0x1F0;
3759 if (__start_range.empty())
Howard Hinnant0de86b62010-06-25 20:56:08 +00003760 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003761 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3762 {
3763 if (__grammar == ECMAScript)
3764 __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3765 else
3766 __first = __parse_awk_escape(++__first, __last, &__start_range);
3767 }
3768 else
3769 {
3770 __start_range = *__first;
3771 ++__first;
3772 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003773 }
3774 if (__first != __last && *__first != ']')
3775 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003776 __temp = _VSTD::next(__first);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003777 if (__temp != __last && *__first == '-' && *__temp != ']')
3778 {
3779 // parse a range
Howard Hinnant173968a2010-07-13 21:48:06 +00003780 basic_string<_CharT> __end_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003781 __first = __temp;
3782 ++__temp;
3783 if (__temp != __last && *__first == '[' && *__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003784 __first = __parse_collating_symbol(++__temp, __last, __end_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003785 else
3786 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003787 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3788 {
3789 if (__grammar == ECMAScript)
3790 __first = __parse_class_escape(++__first, __last,
3791 __end_range, __ml);
3792 else
3793 __first = __parse_awk_escape(++__first, __last,
3794 &__end_range);
3795 }
3796 else
3797 {
3798 __end_range = *__first;
3799 ++__first;
3800 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003801 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003802 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
Howard Hinnant0de86b62010-06-25 20:56:08 +00003803 }
Howard Hinnant499cea12013-08-23 17:37:05 +00003804 else if (!__start_range.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003805 {
3806 if (__start_range.size() == 1)
3807 __ml->__add_char(__start_range[0]);
3808 else
3809 __ml->__add_digraph(__start_range[0], __start_range[1]);
3810 }
3811 }
Howard Hinnant499cea12013-08-23 17:37:05 +00003812 else if (!__start_range.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003813 {
3814 if (__start_range.size() == 1)
3815 __ml->__add_char(__start_range[0]);
3816 else
3817 __ml->__add_digraph(__start_range[0], __start_range[1]);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003818 }
3819 }
3820 return __first;
3821}
3822
3823template <class _CharT, class _Traits>
3824template <class _ForwardIterator>
3825_ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00003826basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
3827 _ForwardIterator __last,
3828 basic_string<_CharT>& __str,
3829 __bracket_expression<_CharT, _Traits>* __ml)
3830{
3831 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00003832 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant15476f32010-07-28 17:35:27 +00003833 switch (*__first)
3834 {
3835 case 0:
3836 __str = *__first;
3837 return ++__first;
3838 case 'b':
3839 __str = _CharT(8);
3840 return ++__first;
3841 case 'd':
3842 __ml->__add_class(ctype_base::digit);
3843 return ++__first;
3844 case 'D':
3845 __ml->__add_neg_class(ctype_base::digit);
3846 return ++__first;
3847 case 's':
3848 __ml->__add_class(ctype_base::space);
3849 return ++__first;
3850 case 'S':
3851 __ml->__add_neg_class(ctype_base::space);
3852 return ++__first;
3853 case 'w':
3854 __ml->__add_class(ctype_base::alnum);
3855 __ml->__add_char('_');
3856 return ++__first;
3857 case 'W':
3858 __ml->__add_neg_class(ctype_base::alnum);
3859 __ml->__add_neg_char('_');
3860 return ++__first;
3861 }
3862 __first = __parse_character_escape(__first, __last, &__str);
3863 return __first;
3864}
3865
3866template <class _CharT, class _Traits>
3867template <class _ForwardIterator>
3868_ForwardIterator
3869basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
3870 _ForwardIterator __last,
3871 basic_string<_CharT>* __str)
3872{
3873 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00003874 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant15476f32010-07-28 17:35:27 +00003875 switch (*__first)
3876 {
3877 case '\\':
3878 case '"':
3879 case '/':
3880 if (__str)
3881 *__str = *__first;
3882 else
3883 __push_char(*__first);
3884 return ++__first;
3885 case 'a':
3886 if (__str)
3887 *__str = _CharT(7);
3888 else
3889 __push_char(_CharT(7));
3890 return ++__first;
3891 case 'b':
3892 if (__str)
3893 *__str = _CharT(8);
3894 else
3895 __push_char(_CharT(8));
3896 return ++__first;
3897 case 'f':
3898 if (__str)
3899 *__str = _CharT(0xC);
3900 else
3901 __push_char(_CharT(0xC));
3902 return ++__first;
3903 case 'n':
3904 if (__str)
3905 *__str = _CharT(0xA);
3906 else
3907 __push_char(_CharT(0xA));
3908 return ++__first;
3909 case 'r':
3910 if (__str)
3911 *__str = _CharT(0xD);
3912 else
3913 __push_char(_CharT(0xD));
3914 return ++__first;
3915 case 't':
3916 if (__str)
3917 *__str = _CharT(0x9);
3918 else
3919 __push_char(_CharT(0x9));
3920 return ++__first;
3921 case 'v':
3922 if (__str)
3923 *__str = _CharT(0xB);
3924 else
3925 __push_char(_CharT(0xB));
3926 return ++__first;
3927 }
3928 if ('0' <= *__first && *__first <= '7')
3929 {
3930 unsigned __val = *__first - '0';
3931 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3932 {
3933 __val = 8 * __val + *__first - '0';
3934 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
Howard Hinnantdbc8cf02013-07-02 17:43:31 +00003935 __val = 8 * __val + *__first++ - '0';
Howard Hinnant15476f32010-07-28 17:35:27 +00003936 }
3937 if (__str)
3938 *__str = _CharT(__val);
3939 else
3940 __push_char(_CharT(__val));
3941 }
3942 else
Marshall Clow2576c292015-07-28 13:30:47 +00003943 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant15476f32010-07-28 17:35:27 +00003944 return __first;
3945}
3946
3947template <class _CharT, class _Traits>
3948template <class _ForwardIterator>
3949_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003950basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003951 _ForwardIterator __last,
3952 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003953{
3954 // Found [=
3955 // This means =] must exist
3956 value_type _Equal_close[2] = {'=', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003957 _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00003958 _Equal_close+2);
3959 if (__temp == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00003960 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant0de86b62010-06-25 20:56:08 +00003961 // [__first, __temp) contains all text in [= ... =]
Howard Hinnant0de86b62010-06-25 20:56:08 +00003962 string_type __collate_name =
3963 __traits_.lookup_collatename(__first, __temp);
3964 if (__collate_name.empty())
Marshall Clow2576c292015-07-28 13:30:47 +00003965 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant0de86b62010-06-25 20:56:08 +00003966 string_type __equiv_name =
3967 __traits_.transform_primary(__collate_name.begin(),
3968 __collate_name.end());
3969 if (!__equiv_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003970 __ml->__add_equivalence(__equiv_name);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003971 else
Howard Hinnant173968a2010-07-13 21:48:06 +00003972 {
3973 switch (__collate_name.size())
3974 {
3975 case 1:
3976 __ml->__add_char(__collate_name[0]);
3977 break;
3978 case 2:
3979 __ml->__add_digraph(__collate_name[0], __collate_name[1]);
3980 break;
3981 default:
Marshall Clow2576c292015-07-28 13:30:47 +00003982 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant173968a2010-07-13 21:48:06 +00003983 }
3984 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003985 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003986 return __first;
3987}
3988
3989template <class _CharT, class _Traits>
3990template <class _ForwardIterator>
3991_ForwardIterator
3992basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003993 _ForwardIterator __last,
3994 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003995{
3996 // Found [:
3997 // This means :] must exist
3998 value_type _Colon_close[2] = {':', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003999 _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00004000 _Colon_close+2);
4001 if (__temp == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00004002 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant0de86b62010-06-25 20:56:08 +00004003 // [__first, __temp) contains all text in [: ... :]
4004 typedef typename _Traits::char_class_type char_class_type;
4005 char_class_type __class_type =
4006 __traits_.lookup_classname(__first, __temp, __flags_ & icase);
4007 if (__class_type == 0)
Marshall Clow2576c292015-07-28 13:30:47 +00004008 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant173968a2010-07-13 21:48:06 +00004009 __ml->__add_class(__class_type);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004010 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004011 return __first;
4012}
4013
4014template <class _CharT, class _Traits>
4015template <class _ForwardIterator>
4016_ForwardIterator
4017basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00004018 _ForwardIterator __last,
4019 basic_string<_CharT>& __col_sym)
Howard Hinnant0de86b62010-06-25 20:56:08 +00004020{
4021 // Found [.
4022 // This means .] must exist
4023 value_type _Dot_close[2] = {'.', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00004024 _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00004025 _Dot_close+2);
4026 if (__temp == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00004027 __throw_regex_error<regex_constants::error_brack>();
Howard Hinnant0de86b62010-06-25 20:56:08 +00004028 // [__first, __temp) contains all text in [. ... .]
Howard Hinnant173968a2010-07-13 21:48:06 +00004029 __col_sym = __traits_.lookup_collatename(__first, __temp);
4030 switch (__col_sym.size())
4031 {
4032 case 1:
4033 case 2:
4034 break;
4035 default:
Marshall Clow2576c292015-07-28 13:30:47 +00004036 __throw_regex_error<regex_constants::error_collate>();
Howard Hinnant173968a2010-07-13 21:48:06 +00004037 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004038 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004039 return __first;
4040}
4041
4042template <class _CharT, class _Traits>
4043template <class _ForwardIterator>
4044_ForwardIterator
4045basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4046 _ForwardIterator __last,
4047 int& __c)
4048{
Marshall Clow97f50f62014-01-18 03:40:03 +00004049 if (__first != __last )
Howard Hinnant0de86b62010-06-25 20:56:08 +00004050 {
Marshall Clow97f50f62014-01-18 03:40:03 +00004051 int __val = __traits_.value(*__first, 10);
4052 if ( __val != -1 )
Howard Hinnant0de86b62010-06-25 20:56:08 +00004053 {
Marshall Clow97f50f62014-01-18 03:40:03 +00004054 __c = __val;
4055 for (++__first;
4056 __first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
4057 ++__first)
4058 {
4059 __c *= 10;
4060 __c += __val;
4061 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00004062 }
4063 }
4064 return __first;
4065}
4066
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004067template <class _CharT, class _Traits>
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004068template <class _ForwardIterator>
4069_ForwardIterator
4070basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4071 _ForwardIterator __last)
4072{
4073 __owns_one_state<_CharT>* __sa = __end_;
4074 _ForwardIterator __temp = __parse_alternative(__first, __last);
4075 if (__temp == __first)
4076 __push_empty();
4077 __first = __temp;
4078 while (__first != __last && *__first == '|')
4079 {
4080 __owns_one_state<_CharT>* __sb = __end_;
4081 __temp = __parse_alternative(++__first, __last);
4082 if (__temp == __first)
4083 __push_empty();
4084 __push_alternation(__sa, __sb);
4085 __first = __temp;
4086 }
4087 return __first;
4088}
4089
4090template <class _CharT, class _Traits>
4091template <class _ForwardIterator>
4092_ForwardIterator
4093basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4094 _ForwardIterator __last)
4095{
4096 while (true)
4097 {
4098 _ForwardIterator __temp = __parse_term(__first, __last);
4099 if (__temp == __first)
4100 break;
4101 __first = __temp;
4102 }
4103 return __first;
4104}
4105
4106template <class _CharT, class _Traits>
4107template <class _ForwardIterator>
4108_ForwardIterator
4109basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4110 _ForwardIterator __last)
4111{
4112 _ForwardIterator __temp = __parse_assertion(__first, __last);
4113 if (__temp == __first)
4114 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004115 __owns_one_state<_CharT>* __e = __end_;
4116 unsigned __mexp_begin = __marked_count_;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004117 __temp = __parse_atom(__first, __last);
4118 if (__temp != __first)
Howard Hinnant17615b02010-07-27 01:25:38 +00004119 __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4120 __mexp_begin+1, __marked_count_+1);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004121 }
Howard Hinnant17615b02010-07-27 01:25:38 +00004122 else
4123 __first = __temp;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004124 return __first;
4125}
4126
4127template <class _CharT, class _Traits>
4128template <class _ForwardIterator>
4129_ForwardIterator
4130basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4131 _ForwardIterator __last)
4132{
4133 if (__first != __last)
4134 {
4135 switch (*__first)
4136 {
4137 case '^':
4138 __push_l_anchor();
4139 ++__first;
4140 break;
4141 case '$':
4142 __push_r_anchor();
4143 ++__first;
4144 break;
4145 case '\\':
4146 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004147 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004148 if (__temp != __last)
4149 {
4150 if (*__temp == 'b')
4151 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004152 __push_word_boundary(false);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004153 __first = ++__temp;
4154 }
4155 else if (*__temp == 'B')
4156 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004157 __push_word_boundary(true);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004158 __first = ++__temp;
4159 }
4160 }
4161 }
4162 break;
4163 case '(':
4164 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004165 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004166 if (__temp != __last && *__temp == '?')
4167 {
4168 if (++__temp != __last)
4169 {
4170 switch (*__temp)
4171 {
4172 case '=':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004173 {
4174 basic_regex __exp;
4175 __exp.__flags_ = __flags_;
4176 __temp = __exp.__parse(++__temp, __last);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004177 unsigned __mexp = __exp.__marked_count_;
4178 __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
4179 __marked_count_ += __mexp;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004180 if (__temp == __last || *__temp != ')')
Marshall Clow2576c292015-07-28 13:30:47 +00004181 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004182 __first = ++__temp;
4183 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004184 break;
4185 case '!':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004186 {
4187 basic_regex __exp;
4188 __exp.__flags_ = __flags_;
4189 __temp = __exp.__parse(++__temp, __last);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004190 unsigned __mexp = __exp.__marked_count_;
4191 __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
4192 __marked_count_ += __mexp;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004193 if (__temp == __last || *__temp != ')')
Marshall Clow2576c292015-07-28 13:30:47 +00004194 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004195 __first = ++__temp;
4196 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004197 break;
4198 }
4199 }
4200 }
4201 }
4202 break;
4203 }
4204 }
4205 return __first;
4206}
4207
4208template <class _CharT, class _Traits>
4209template <class _ForwardIterator>
4210_ForwardIterator
4211basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4212 _ForwardIterator __last)
4213{
Howard Hinnant17615b02010-07-27 01:25:38 +00004214 if (__first != __last)
4215 {
4216 switch (*__first)
4217 {
4218 case '.':
4219 __push_match_any_but_newline();
4220 ++__first;
4221 break;
4222 case '\\':
4223 __first = __parse_atom_escape(__first, __last);
4224 break;
4225 case '[':
4226 __first = __parse_bracket_expression(__first, __last);
4227 break;
4228 case '(':
4229 {
Howard Hinnantd4444702010-08-11 17:04:31 +00004230 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00004231 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00004232 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant0949eed2011-06-30 21:18:19 +00004233 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004234 if (__temp != __last && *__first == '?' && *__temp == ':')
4235 {
4236 ++__open_count_;
4237 __first = __parse_ecma_exp(++__temp, __last);
4238 if (__first == __last || *__first != ')')
Marshall Clow2576c292015-07-28 13:30:47 +00004239 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant17615b02010-07-27 01:25:38 +00004240 --__open_count_;
4241 ++__first;
4242 }
4243 else
4244 {
4245 __push_begin_marked_subexpression();
4246 unsigned __temp_count = __marked_count_;
4247 ++__open_count_;
4248 __first = __parse_ecma_exp(__first, __last);
4249 if (__first == __last || *__first != ')')
Marshall Clow2576c292015-07-28 13:30:47 +00004250 __throw_regex_error<regex_constants::error_paren>();
Howard Hinnant17615b02010-07-27 01:25:38 +00004251 __push_end_marked_subexpression(__temp_count);
4252 --__open_count_;
4253 ++__first;
4254 }
4255 }
4256 break;
Marshall Clow568bd022015-07-23 18:27:51 +00004257 case '*':
4258 case '+':
4259 case '?':
4260 case '{':
Marshall Clow2576c292015-07-28 13:30:47 +00004261 __throw_regex_error<regex_constants::error_badrepeat>();
Marshall Clow568bd022015-07-23 18:27:51 +00004262 break;
Howard Hinnant17615b02010-07-27 01:25:38 +00004263 default:
4264 __first = __parse_pattern_character(__first, __last);
4265 break;
4266 }
4267 }
4268 return __first;
4269}
4270
4271template <class _CharT, class _Traits>
4272template <class _ForwardIterator>
4273_ForwardIterator
4274basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4275 _ForwardIterator __last)
4276{
4277 if (__first != __last && *__first == '\\')
4278 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004279 _ForwardIterator __t1 = _VSTD::next(__first);
Marshall Clow685cdca2016-01-19 00:50:37 +00004280 if (__t1 == __last)
4281 __throw_regex_error<regex_constants::error_escape>();
4282
Howard Hinnant17615b02010-07-27 01:25:38 +00004283 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4284 if (__t2 != __t1)
4285 __first = __t2;
4286 else
4287 {
4288 __t2 = __parse_character_class_escape(__t1, __last);
4289 if (__t2 != __t1)
4290 __first = __t2;
4291 else
4292 {
4293 __t2 = __parse_character_escape(__t1, __last);
4294 if (__t2 != __t1)
4295 __first = __t2;
4296 }
4297 }
4298 }
4299 return __first;
4300}
4301
4302template <class _CharT, class _Traits>
4303template <class _ForwardIterator>
4304_ForwardIterator
4305basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4306 _ForwardIterator __last)
4307{
4308 if (__first != __last)
4309 {
4310 if (*__first == '0')
4311 {
4312 __push_char(_CharT());
4313 ++__first;
4314 }
4315 else if ('1' <= *__first && *__first <= '9')
4316 {
4317 unsigned __v = *__first - '0';
Marshall Clow99447c82016-12-24 17:21:03 +00004318 for (++__first;
4319 __first != __last && '0' <= *__first && *__first <= '9'; ++__first)
Howard Hinnant17615b02010-07-27 01:25:38 +00004320 __v = 10 * __v + *__first - '0';
4321 if (__v > mark_count())
Marshall Clow2576c292015-07-28 13:30:47 +00004322 __throw_regex_error<regex_constants::error_backref>();
Howard Hinnant17615b02010-07-27 01:25:38 +00004323 __push_back_ref(__v);
4324 }
4325 }
4326 return __first;
4327}
4328
4329template <class _CharT, class _Traits>
4330template <class _ForwardIterator>
4331_ForwardIterator
4332basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4333 _ForwardIterator __last)
4334{
4335 if (__first != __last)
4336 {
4337 __bracket_expression<_CharT, _Traits>* __ml;
4338 switch (*__first)
4339 {
4340 case 'd':
4341 __ml = __start_matching_list(false);
4342 __ml->__add_class(ctype_base::digit);
4343 ++__first;
4344 break;
4345 case 'D':
4346 __ml = __start_matching_list(true);
4347 __ml->__add_class(ctype_base::digit);
4348 ++__first;
4349 break;
4350 case 's':
4351 __ml = __start_matching_list(false);
4352 __ml->__add_class(ctype_base::space);
4353 ++__first;
4354 break;
4355 case 'S':
4356 __ml = __start_matching_list(true);
4357 __ml->__add_class(ctype_base::space);
4358 ++__first;
4359 break;
4360 case 'w':
4361 __ml = __start_matching_list(false);
4362 __ml->__add_class(ctype_base::alnum);
4363 __ml->__add_char('_');
4364 ++__first;
4365 break;
4366 case 'W':
4367 __ml = __start_matching_list(true);
4368 __ml->__add_class(ctype_base::alnum);
4369 __ml->__add_char('_');
4370 ++__first;
4371 break;
4372 }
4373 }
4374 return __first;
4375}
4376
4377template <class _CharT, class _Traits>
4378template <class _ForwardIterator>
4379_ForwardIterator
4380basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
Howard Hinnant15476f32010-07-28 17:35:27 +00004381 _ForwardIterator __last,
4382 basic_string<_CharT>* __str)
Howard Hinnant17615b02010-07-27 01:25:38 +00004383{
4384 if (__first != __last)
4385 {
4386 _ForwardIterator __t;
4387 unsigned __sum = 0;
4388 int __hd;
4389 switch (*__first)
4390 {
4391 case 'f':
Howard Hinnant15476f32010-07-28 17:35:27 +00004392 if (__str)
4393 *__str = _CharT(0xC);
4394 else
4395 __push_char(_CharT(0xC));
Howard Hinnant17615b02010-07-27 01:25:38 +00004396 ++__first;
4397 break;
4398 case 'n':
Howard Hinnant15476f32010-07-28 17:35:27 +00004399 if (__str)
4400 *__str = _CharT(0xA);
4401 else
4402 __push_char(_CharT(0xA));
Howard Hinnant17615b02010-07-27 01:25:38 +00004403 ++__first;
4404 break;
4405 case 'r':
Howard Hinnant15476f32010-07-28 17:35:27 +00004406 if (__str)
4407 *__str = _CharT(0xD);
4408 else
4409 __push_char(_CharT(0xD));
Howard Hinnant17615b02010-07-27 01:25:38 +00004410 ++__first;
4411 break;
4412 case 't':
Howard Hinnant15476f32010-07-28 17:35:27 +00004413 if (__str)
4414 *__str = _CharT(0x9);
4415 else
4416 __push_char(_CharT(0x9));
Howard Hinnant17615b02010-07-27 01:25:38 +00004417 ++__first;
4418 break;
4419 case 'v':
Howard Hinnant15476f32010-07-28 17:35:27 +00004420 if (__str)
4421 *__str = _CharT(0xB);
4422 else
4423 __push_char(_CharT(0xB));
Howard Hinnant17615b02010-07-27 01:25:38 +00004424 ++__first;
4425 break;
4426 case 'c':
Howard Hinnant0949eed2011-06-30 21:18:19 +00004427 if ((__t = _VSTD::next(__first)) != __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004428 {
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004429 if (('A' <= *__t && *__t <= 'Z') ||
4430 ('a' <= *__t && *__t <= 'z'))
Howard Hinnant17615b02010-07-27 01:25:38 +00004431 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004432 if (__str)
4433 *__str = _CharT(*__t % 32);
4434 else
4435 __push_char(_CharT(*__t % 32));
Howard Hinnant17615b02010-07-27 01:25:38 +00004436 __first = ++__t;
4437 }
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004438 else
Marshall Clow2576c292015-07-28 13:30:47 +00004439 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant17615b02010-07-27 01:25:38 +00004440 }
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004441 else
Marshall Clow2576c292015-07-28 13:30:47 +00004442 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant17615b02010-07-27 01:25:38 +00004443 break;
4444 case 'u':
Howard Hinnantd4444702010-08-11 17:04:31 +00004445 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00004446 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00004447 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant17615b02010-07-27 01:25:38 +00004448 __hd = __traits_.value(*__first, 16);
4449 if (__hd == -1)
Marshall Clow2576c292015-07-28 13:30:47 +00004450 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnantec3773c2011-12-01 20:21:04 +00004451 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnantd4444702010-08-11 17:04:31 +00004452 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00004453 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00004454 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant17615b02010-07-27 01:25:38 +00004455 __hd = __traits_.value(*__first, 16);
4456 if (__hd == -1)
Marshall Clow2576c292015-07-28 13:30:47 +00004457 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnantec3773c2011-12-01 20:21:04 +00004458 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant17615b02010-07-27 01:25:38 +00004459 // drop through
4460 case 'x':
Howard Hinnantd4444702010-08-11 17:04:31 +00004461 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00004462 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00004463 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant17615b02010-07-27 01:25:38 +00004464 __hd = __traits_.value(*__first, 16);
4465 if (__hd == -1)
Marshall Clow2576c292015-07-28 13:30:47 +00004466 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnantec3773c2011-12-01 20:21:04 +00004467 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnantd4444702010-08-11 17:04:31 +00004468 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00004469 if (__first == __last)
Marshall Clow2576c292015-07-28 13:30:47 +00004470 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant17615b02010-07-27 01:25:38 +00004471 __hd = __traits_.value(*__first, 16);
4472 if (__hd == -1)
Marshall Clow2576c292015-07-28 13:30:47 +00004473 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnantec3773c2011-12-01 20:21:04 +00004474 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant15476f32010-07-28 17:35:27 +00004475 if (__str)
4476 *__str = _CharT(__sum);
4477 else
4478 __push_char(_CharT(__sum));
Howard Hinnant17615b02010-07-27 01:25:38 +00004479 ++__first;
4480 break;
Marshall Clow6b7e6922014-05-21 16:29:50 +00004481 case '0':
4482 if (__str)
4483 *__str = _CharT(0);
4484 else
4485 __push_char(_CharT(0));
4486 ++__first;
4487 break;
Howard Hinnant17615b02010-07-27 01:25:38 +00004488 default:
4489 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4490 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004491 if (__str)
4492 *__str = *__first;
4493 else
4494 __push_char(*__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004495 ++__first;
4496 }
Howard Hinnant918f2a82013-06-28 18:57:30 +00004497 else
Marshall Clow2576c292015-07-28 13:30:47 +00004498 __throw_regex_error<regex_constants::error_escape>();
Howard Hinnant17615b02010-07-27 01:25:38 +00004499 break;
4500 }
4501 }
4502 return __first;
4503}
4504
4505template <class _CharT, class _Traits>
4506template <class _ForwardIterator>
4507_ForwardIterator
4508basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4509 _ForwardIterator __last)
4510{
4511 if (__first != __last)
4512 {
4513 switch (*__first)
4514 {
4515 case '^':
4516 case '$':
4517 case '\\':
4518 case '.':
4519 case '*':
4520 case '+':
4521 case '?':
4522 case '(':
4523 case ')':
4524 case '[':
4525 case ']':
4526 case '{':
4527 case '}':
4528 case '|':
4529 break;
4530 default:
4531 __push_char(*__first);
4532 ++__first;
4533 break;
4534 }
4535 }
4536 return __first;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004537}
4538
4539template <class _CharT, class _Traits>
Howard Hinnant856846b2010-07-27 19:53:10 +00004540template <class _ForwardIterator>
4541_ForwardIterator
4542basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4543 _ForwardIterator __last)
4544{
4545 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004546 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004547 if (__t1 != __first)
4548 __parse_basic_reg_exp(__first, __t1);
4549 else
4550 __push_empty();
4551 __first = __t1;
4552 if (__first != __last)
4553 ++__first;
4554 while (__first != __last)
4555 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004556 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004557 __owns_one_state<_CharT>* __sb = __end_;
4558 if (__t1 != __first)
4559 __parse_basic_reg_exp(__first, __t1);
4560 else
4561 __push_empty();
4562 __push_alternation(__sa, __sb);
4563 __first = __t1;
4564 if (__first != __last)
4565 ++__first;
4566 }
4567 return __first;
4568}
4569
4570template <class _CharT, class _Traits>
4571template <class _ForwardIterator>
4572_ForwardIterator
4573basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4574 _ForwardIterator __last)
4575{
4576 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004577 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004578 if (__t1 != __first)
4579 __parse_extended_reg_exp(__first, __t1);
4580 else
4581 __push_empty();
4582 __first = __t1;
4583 if (__first != __last)
4584 ++__first;
4585 while (__first != __last)
4586 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004587 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004588 __owns_one_state<_CharT>* __sb = __end_;
4589 if (__t1 != __first)
4590 __parse_extended_reg_exp(__first, __t1);
4591 else
4592 __push_empty();
4593 __push_alternation(__sa, __sb);
4594 __first = __t1;
4595 if (__first != __last)
4596 ++__first;
4597 }
4598 return __first;
4599}
4600
4601template <class _CharT, class _Traits>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004602void
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004603basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4604 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4605 bool __greedy)
4606{
4607 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4608 __end_->first() = nullptr;
Howard Hinnantac303862010-07-12 15:51:17 +00004609 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4610 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4611 __min, __max));
4612 __s->first() = nullptr;
4613 __e1.release();
4614 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004615 __end_ = __e2->second();
Howard Hinnantac303862010-07-12 15:51:17 +00004616 __s->first() = __e2.release();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004617 ++__loop_count_;
4618}
4619
4620template <class _CharT, class _Traits>
4621void
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004622basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4623{
Howard Hinnant173968a2010-07-13 21:48:06 +00004624 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004625 __end_->first() = new __match_char_icase<_CharT, _Traits>
4626 (__traits_, __c, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004627 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004628 __end_->first() = new __match_char_collate<_CharT, _Traits>
4629 (__traits_, __c, __end_->first());
4630 else
4631 __end_->first() = new __match_char<_CharT>(__c, __end_->first());
Howard Hinnante77aa5e2010-07-08 17:43:58 +00004632 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004633}
4634
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004635template <class _CharT, class _Traits>
4636void
4637basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4638{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004639 if (!(__flags_ & nosubs))
4640 {
4641 __end_->first() =
4642 new __begin_marked_subexpression<_CharT>(++__marked_count_,
4643 __end_->first());
4644 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4645 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004646}
4647
4648template <class _CharT, class _Traits>
4649void
4650basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4651{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004652 if (!(__flags_ & nosubs))
4653 {
4654 __end_->first() =
4655 new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4656 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4657 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004658}
4659
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004660template <class _CharT, class _Traits>
4661void
Howard Hinnant41fb6e12011-03-26 20:02:27 +00004662basic_regex<_CharT, _Traits>::__push_l_anchor()
4663{
4664 __end_->first() = new __l_anchor<_CharT>(__end_->first());
4665 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4666}
4667
4668template <class _CharT, class _Traits>
4669void
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004670basic_regex<_CharT, _Traits>::__push_r_anchor()
4671{
4672 __end_->first() = new __r_anchor<_CharT>(__end_->first());
4673 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4674}
4675
Howard Hinnantac303862010-07-12 15:51:17 +00004676template <class _CharT, class _Traits>
4677void
4678basic_regex<_CharT, _Traits>::__push_match_any()
4679{
4680 __end_->first() = new __match_any<_CharT>(__end_->first());
4681 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4682}
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004683
Howard Hinnantcba352d2010-07-12 18:16:05 +00004684template <class _CharT, class _Traits>
4685void
Howard Hinnant17615b02010-07-27 01:25:38 +00004686basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4687{
4688 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4689 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4690}
4691
4692template <class _CharT, class _Traits>
4693void
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004694basic_regex<_CharT, _Traits>::__push_empty()
4695{
4696 __end_->first() = new __empty_state<_CharT>(__end_->first());
4697 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4698}
4699
4700template <class _CharT, class _Traits>
4701void
Howard Hinnant17615b02010-07-27 01:25:38 +00004702basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4703{
4704 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4705 __end_->first());
4706 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4707}
4708
4709template <class _CharT, class _Traits>
4710void
Howard Hinnantcba352d2010-07-12 18:16:05 +00004711basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4712{
Howard Hinnant173968a2010-07-13 21:48:06 +00004713 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004714 __end_->first() = new __back_ref_icase<_CharT, _Traits>
4715 (__traits_, __i, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004716 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004717 __end_->first() = new __back_ref_collate<_CharT, _Traits>
4718 (__traits_, __i, __end_->first());
4719 else
4720 __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
Howard Hinnantcba352d2010-07-12 18:16:05 +00004721 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4722}
4723
Howard Hinnant173968a2010-07-13 21:48:06 +00004724template <class _CharT, class _Traits>
Howard Hinnantaa698082010-07-16 19:08:36 +00004725void
4726basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4727 __owns_one_state<_CharT>* __ea)
4728{
4729 __sa->first() = new __alternate<_CharT>(
4730 static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4731 static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4732 __ea->first() = nullptr;
4733 __ea->first() = new __empty_state<_CharT>(__end_->first());
4734 __end_->first() = nullptr;
4735 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4736 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4737}
4738
4739template <class _CharT, class _Traits>
Howard Hinnant173968a2010-07-13 21:48:06 +00004740__bracket_expression<_CharT, _Traits>*
4741basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4742{
4743 __bracket_expression<_CharT, _Traits>* __r =
4744 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4745 __negate, __flags_ & icase,
4746 __flags_ & collate);
4747 __end_->first() = __r;
4748 __end_ = __r;
4749 return __r;
4750}
4751
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004752template <class _CharT, class _Traits>
4753void
4754basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004755 bool __invert,
4756 unsigned __mexp)
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004757{
4758 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004759 __end_->first(), __mexp);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004760 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4761}
4762
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00004763typedef basic_regex<char> regex;
4764typedef basic_regex<wchar_t> wregex;
4765
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004766// sub_match
4767
4768template <class _BidirectionalIterator>
Eric Fiselierc3589a82017-01-04 23:56:00 +00004769class _LIBCPP_TEMPLATE_VIS sub_match
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004770 : public pair<_BidirectionalIterator, _BidirectionalIterator>
4771{
4772public:
4773 typedef _BidirectionalIterator iterator;
4774 typedef typename iterator_traits<iterator>::value_type value_type;
4775 typedef typename iterator_traits<iterator>::difference_type difference_type;
4776 typedef basic_string<value_type> string_type;
4777
4778 bool matched;
4779
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004780 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +00004781 _LIBCPP_CONSTEXPR sub_match() : matched() {}
Howard Hinnant31aaf552010-12-08 21:07:55 +00004782
4783 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004784 difference_type length() const
Howard Hinnant0949eed2011-06-30 21:18:19 +00004785 {return matched ? _VSTD::distance(this->first, this->second) : 0;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004786 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004787 string_type str() const
4788 {return matched ? string_type(this->first, this->second) : string_type();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004789 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004790 operator string_type() const
4791 {return str();}
4792
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004793 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004794 int compare(const sub_match& __s) const
4795 {return str().compare(__s.str());}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004796 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004797 int compare(const string_type& __s) const
4798 {return str().compare(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004799 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004800 int compare(const value_type* __s) const
4801 {return str().compare(__s);}
4802};
4803
4804typedef sub_match<const char*> csub_match;
4805typedef sub_match<const wchar_t*> wcsub_match;
4806typedef sub_match<string::const_iterator> ssub_match;
4807typedef sub_match<wstring::const_iterator> wssub_match;
4808
4809template <class _BiIter>
4810inline _LIBCPP_INLINE_VISIBILITY
4811bool
4812operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4813{
4814 return __x.compare(__y) == 0;
4815}
4816
4817template <class _BiIter>
4818inline _LIBCPP_INLINE_VISIBILITY
4819bool
4820operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4821{
4822 return !(__x == __y);
4823}
4824
4825template <class _BiIter>
4826inline _LIBCPP_INLINE_VISIBILITY
4827bool
4828operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4829{
4830 return __x.compare(__y) < 0;
4831}
4832
4833template <class _BiIter>
4834inline _LIBCPP_INLINE_VISIBILITY
4835bool
4836operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4837{
4838 return !(__y < __x);
4839}
4840
4841template <class _BiIter>
4842inline _LIBCPP_INLINE_VISIBILITY
4843bool
4844operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4845{
4846 return !(__x < __y);
4847}
4848
4849template <class _BiIter>
4850inline _LIBCPP_INLINE_VISIBILITY
4851bool
4852operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4853{
4854 return __y < __x;
4855}
4856
4857template <class _BiIter, class _ST, class _SA>
4858inline _LIBCPP_INLINE_VISIBILITY
4859bool
4860operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4861 const sub_match<_BiIter>& __y)
4862{
Marshall Clowe3e70542014-12-15 23:57:56 +00004863 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004864}
4865
4866template <class _BiIter, class _ST, class _SA>
4867inline _LIBCPP_INLINE_VISIBILITY
4868bool
4869operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4870 const sub_match<_BiIter>& __y)
4871{
4872 return !(__x == __y);
4873}
4874
4875template <class _BiIter, class _ST, class _SA>
4876inline _LIBCPP_INLINE_VISIBILITY
4877bool
4878operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4879 const sub_match<_BiIter>& __y)
4880{
Marshall Clowe3e70542014-12-15 23:57:56 +00004881 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004882}
4883
4884template <class _BiIter, class _ST, class _SA>
4885inline _LIBCPP_INLINE_VISIBILITY
4886bool
4887operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4888 const sub_match<_BiIter>& __y)
4889{
4890 return __y < __x;
4891}
4892
4893template <class _BiIter, class _ST, class _SA>
4894inline _LIBCPP_INLINE_VISIBILITY
4895bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4896 const sub_match<_BiIter>& __y)
4897{
4898 return !(__x < __y);
4899}
4900
4901template <class _BiIter, class _ST, class _SA>
4902inline _LIBCPP_INLINE_VISIBILITY
4903bool
4904operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4905 const sub_match<_BiIter>& __y)
4906{
4907 return !(__y < __x);
4908}
4909
4910template <class _BiIter, class _ST, class _SA>
4911inline _LIBCPP_INLINE_VISIBILITY
4912bool
4913operator==(const sub_match<_BiIter>& __x,
4914 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4915{
Marshall Clowe3e70542014-12-15 23:57:56 +00004916 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004917}
4918
4919template <class _BiIter, class _ST, class _SA>
4920inline _LIBCPP_INLINE_VISIBILITY
4921bool
4922operator!=(const sub_match<_BiIter>& __x,
4923 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4924{
4925 return !(__x == __y);
4926}
4927
4928template <class _BiIter, class _ST, class _SA>
4929inline _LIBCPP_INLINE_VISIBILITY
4930bool
4931operator<(const sub_match<_BiIter>& __x,
4932 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4933{
Marshall Clowe3e70542014-12-15 23:57:56 +00004934 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004935}
4936
4937template <class _BiIter, class _ST, class _SA>
4938inline _LIBCPP_INLINE_VISIBILITY
4939bool operator>(const sub_match<_BiIter>& __x,
4940 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4941{
4942 return __y < __x;
4943}
4944
4945template <class _BiIter, class _ST, class _SA>
4946inline _LIBCPP_INLINE_VISIBILITY
4947bool
4948operator>=(const sub_match<_BiIter>& __x,
4949 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4950{
4951 return !(__x < __y);
4952}
4953
4954template <class _BiIter, class _ST, class _SA>
4955inline _LIBCPP_INLINE_VISIBILITY
4956bool
4957operator<=(const sub_match<_BiIter>& __x,
4958 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4959{
4960 return !(__y < __x);
4961}
4962
4963template <class _BiIter>
4964inline _LIBCPP_INLINE_VISIBILITY
4965bool
4966operator==(typename iterator_traits<_BiIter>::value_type const* __x,
4967 const sub_match<_BiIter>& __y)
4968{
4969 return __y.compare(__x) == 0;
4970}
4971
4972template <class _BiIter>
4973inline _LIBCPP_INLINE_VISIBILITY
4974bool
4975operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
4976 const sub_match<_BiIter>& __y)
4977{
4978 return !(__x == __y);
4979}
4980
4981template <class _BiIter>
4982inline _LIBCPP_INLINE_VISIBILITY
4983bool
4984operator<(typename iterator_traits<_BiIter>::value_type const* __x,
4985 const sub_match<_BiIter>& __y)
4986{
4987 return __y.compare(__x) > 0;
4988}
4989
4990template <class _BiIter>
4991inline _LIBCPP_INLINE_VISIBILITY
4992bool
4993operator>(typename iterator_traits<_BiIter>::value_type const* __x,
4994 const sub_match<_BiIter>& __y)
4995{
4996 return __y < __x;
4997}
4998
4999template <class _BiIter>
5000inline _LIBCPP_INLINE_VISIBILITY
5001bool
5002operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
5003 const sub_match<_BiIter>& __y)
5004{
5005 return !(__x < __y);
5006}
5007
5008template <class _BiIter>
5009inline _LIBCPP_INLINE_VISIBILITY
5010bool
5011operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
5012 const sub_match<_BiIter>& __y)
5013{
5014 return !(__y < __x);
5015}
5016
5017template <class _BiIter>
5018inline _LIBCPP_INLINE_VISIBILITY
5019bool
5020operator==(const sub_match<_BiIter>& __x,
5021 typename iterator_traits<_BiIter>::value_type const* __y)
5022{
5023 return __x.compare(__y) == 0;
5024}
5025
5026template <class _BiIter>
5027inline _LIBCPP_INLINE_VISIBILITY
5028bool
5029operator!=(const sub_match<_BiIter>& __x,
5030 typename iterator_traits<_BiIter>::value_type const* __y)
5031{
5032 return !(__x == __y);
5033}
5034
5035template <class _BiIter>
5036inline _LIBCPP_INLINE_VISIBILITY
5037bool
5038operator<(const sub_match<_BiIter>& __x,
5039 typename iterator_traits<_BiIter>::value_type const* __y)
5040{
5041 return __x.compare(__y) < 0;
5042}
5043
5044template <class _BiIter>
5045inline _LIBCPP_INLINE_VISIBILITY
5046bool
5047operator>(const sub_match<_BiIter>& __x,
5048 typename iterator_traits<_BiIter>::value_type const* __y)
5049{
5050 return __y < __x;
5051}
5052
5053template <class _BiIter>
5054inline _LIBCPP_INLINE_VISIBILITY
5055bool
5056operator>=(const sub_match<_BiIter>& __x,
5057 typename iterator_traits<_BiIter>::value_type const* __y)
5058{
5059 return !(__x < __y);
5060}
5061
5062template <class _BiIter>
5063inline _LIBCPP_INLINE_VISIBILITY
5064bool
5065operator<=(const sub_match<_BiIter>& __x,
5066 typename iterator_traits<_BiIter>::value_type const* __y)
5067{
5068 return !(__y < __x);
5069}
5070
5071template <class _BiIter>
5072inline _LIBCPP_INLINE_VISIBILITY
5073bool
5074operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5075 const sub_match<_BiIter>& __y)
5076{
5077 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5078 return __y.compare(string_type(1, __x)) == 0;
5079}
5080
5081template <class _BiIter>
5082inline _LIBCPP_INLINE_VISIBILITY
5083bool
5084operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5085 const sub_match<_BiIter>& __y)
5086{
5087 return !(__x == __y);
5088}
5089
5090template <class _BiIter>
5091inline _LIBCPP_INLINE_VISIBILITY
5092bool
5093operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5094 const sub_match<_BiIter>& __y)
5095{
5096 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5097 return __y.compare(string_type(1, __x)) > 0;
5098}
5099
5100template <class _BiIter>
5101inline _LIBCPP_INLINE_VISIBILITY
5102bool
5103operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5104 const sub_match<_BiIter>& __y)
5105{
5106 return __y < __x;
5107}
5108
5109template <class _BiIter>
5110inline _LIBCPP_INLINE_VISIBILITY
5111bool
5112operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5113 const sub_match<_BiIter>& __y)
5114{
5115 return !(__x < __y);
5116}
5117
5118template <class _BiIter>
5119inline _LIBCPP_INLINE_VISIBILITY
5120bool
5121operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5122 const sub_match<_BiIter>& __y)
5123{
5124 return !(__y < __x);
5125}
5126
5127template <class _BiIter>
5128inline _LIBCPP_INLINE_VISIBILITY
5129bool
5130operator==(const sub_match<_BiIter>& __x,
5131 typename iterator_traits<_BiIter>::value_type const& __y)
5132{
5133 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5134 return __x.compare(string_type(1, __y)) == 0;
5135}
5136
5137template <class _BiIter>
5138inline _LIBCPP_INLINE_VISIBILITY
5139bool
5140operator!=(const sub_match<_BiIter>& __x,
5141 typename iterator_traits<_BiIter>::value_type const& __y)
5142{
5143 return !(__x == __y);
5144}
5145
5146template <class _BiIter>
5147inline _LIBCPP_INLINE_VISIBILITY
5148bool
5149operator<(const sub_match<_BiIter>& __x,
5150 typename iterator_traits<_BiIter>::value_type const& __y)
5151{
5152 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5153 return __x.compare(string_type(1, __y)) < 0;
5154}
5155
5156template <class _BiIter>
5157inline _LIBCPP_INLINE_VISIBILITY
5158bool
5159operator>(const sub_match<_BiIter>& __x,
5160 typename iterator_traits<_BiIter>::value_type const& __y)
5161{
5162 return __y < __x;
5163}
5164
5165template <class _BiIter>
5166inline _LIBCPP_INLINE_VISIBILITY
5167bool
5168operator>=(const sub_match<_BiIter>& __x,
5169 typename iterator_traits<_BiIter>::value_type const& __y)
5170{
5171 return !(__x < __y);
5172}
5173
5174template <class _BiIter>
5175inline _LIBCPP_INLINE_VISIBILITY
5176bool
5177operator<=(const sub_match<_BiIter>& __x,
5178 typename iterator_traits<_BiIter>::value_type const& __y)
5179{
5180 return !(__y < __x);
5181}
5182
5183template <class _CharT, class _ST, class _BiIter>
5184inline _LIBCPP_INLINE_VISIBILITY
5185basic_ostream<_CharT, _ST>&
5186operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5187{
5188 return __os << __m.str();
5189}
5190
Howard Hinnant17615b02010-07-27 01:25:38 +00005191template <class _BidirectionalIterator, class _Allocator>
Eric Fiselierc3589a82017-01-04 23:56:00 +00005192class _LIBCPP_TEMPLATE_VIS match_results
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005193{
5194public:
5195 typedef _Allocator allocator_type;
5196 typedef sub_match<_BidirectionalIterator> value_type;
5197private:
5198 typedef vector<value_type, allocator_type> __container_type;
5199
5200 __container_type __matches_;
5201 value_type __unmatched_;
5202 value_type __prefix_;
5203 value_type __suffix_;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005204 bool __ready_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005205public:
Howard Hinnanta712c722010-08-16 20:21:16 +00005206 _BidirectionalIterator __position_start_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005207 typedef const value_type& const_reference;
Marshall Clow103af342014-02-26 01:56:31 +00005208 typedef value_type& reference;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005209 typedef typename __container_type::const_iterator const_iterator;
5210 typedef const_iterator iterator;
5211 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5212 typedef typename allocator_traits<allocator_type>::size_type size_type;
5213 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5214 typedef basic_string<char_type> string_type;
5215
5216 // construct/copy/destroy:
5217 explicit match_results(const allocator_type& __a = allocator_type());
5218// match_results(const match_results&) = default;
5219// match_results& operator=(const match_results&) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005220// match_results(match_results&& __m) = default;
5221// match_results& operator=(match_results&& __m) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005222// ~match_results() = default;
5223
Howard Hinnant31aaf552010-12-08 21:07:55 +00005224 _LIBCPP_INLINE_VISIBILITY
5225 bool ready() const {return __ready_;}
5226
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005227 // size:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005228 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005229 size_type size() const {return __matches_.size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005230 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005231 size_type max_size() const {return __matches_.max_size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005232 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005233 bool empty() const {return size() == 0;}
5234
5235 // element access:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005236 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005237 difference_type length(size_type __sub = 0) const
5238 {return (*this)[__sub].length();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005239 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005240 difference_type position(size_type __sub = 0) const
Howard Hinnant0949eed2011-06-30 21:18:19 +00005241 {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005242 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005243 string_type str(size_type __sub = 0) const
5244 {return (*this)[__sub].str();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005245 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005246 const_reference operator[](size_type __n) const
5247 {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
5248
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005249 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005250 const_reference prefix() const {return __prefix_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005251 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005252 const_reference suffix() const {return __suffix_;}
5253
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005254 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005255 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005256 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005257 const_iterator end() const {return __matches_.end();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005258 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005259 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005260 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005261 const_iterator cend() const {return __matches_.end();}
5262
5263 // format:
5264 template <class _OutputIter>
5265 _OutputIter
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005266 format(_OutputIter __output, const char_type* __fmt_first,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005267 const char_type* __fmt_last,
5268 regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5269 template <class _OutputIter, class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005270 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005271 _OutputIter
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005272 format(_OutputIter __output, const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005273 regex_constants::match_flag_type __flags = regex_constants::format_default) const
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005274 {return format(__output, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005275 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005276 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005277 basic_string<char_type, _ST, _SA>
5278 format(const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005279 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5280 {
5281 basic_string<char_type, _ST, _SA> __r;
5282 format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5283 __flags);
5284 return __r;
5285 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005286 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005287 string_type
5288 format(const char_type* __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005289 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5290 {
5291 string_type __r;
5292 format(back_inserter(__r), __fmt,
5293 __fmt + char_traits<char_type>::length(__fmt), __flags);
5294 return __r;
5295 }
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005296
5297 // allocator:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005298 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005299 allocator_type get_allocator() const {return __matches_.get_allocator();}
5300
5301 // swap:
5302 void swap(match_results& __m);
5303
Howard Hinnant99968442011-11-29 18:15:50 +00005304 template <class _Bp, class _Ap>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005306 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
Howard Hinnant99968442011-11-29 18:15:50 +00005307 const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005308 {
Howard Hinnant99968442011-11-29 18:15:50 +00005309 _Bp __mf = __m.prefix().first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005310 __matches_.resize(__m.size());
5311 for (size_type __i = 0; __i < __matches_.size(); ++__i)
5312 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005313 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5314 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005315 __matches_[__i].matched = __m[__i].matched;
5316 }
5317 __unmatched_.first = __l;
5318 __unmatched_.second = __l;
5319 __unmatched_.matched = false;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005320 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5321 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005322 __prefix_.matched = __m.prefix().matched;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005323 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5324 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005325 __suffix_.matched = __m.suffix().matched;
Howard Hinnanta712c722010-08-16 20:21:16 +00005326 if (!__no_update_pos)
5327 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005328 __ready_ = __m.ready();
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005329 }
5330
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005331private:
5332 void __init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005333 _BidirectionalIterator __f, _BidirectionalIterator __l,
5334 bool __no_update_pos = false);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005335
5336 template <class, class> friend class basic_regex;
5337
Howard Hinnant99968442011-11-29 18:15:50 +00005338 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005339 friend
5340 bool
Howard Hinnant99968442011-11-29 18:15:50 +00005341 regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005342 regex_constants::match_flag_type);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005343
Howard Hinnant99968442011-11-29 18:15:50 +00005344 template <class _Bp, class _Ap>
Howard Hinnant27405f92010-08-14 18:14:02 +00005345 friend
5346 bool
Howard Hinnant99968442011-11-29 18:15:50 +00005347 operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
Howard Hinnant27405f92010-08-14 18:14:02 +00005348
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005349 template <class, class> friend class __lookahead;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005350};
5351
5352template <class _BidirectionalIterator, class _Allocator>
5353match_results<_BidirectionalIterator, _Allocator>::match_results(
5354 const allocator_type& __a)
5355 : __matches_(__a),
5356 __unmatched_(),
5357 __prefix_(),
Howard Hinnanta712c722010-08-16 20:21:16 +00005358 __suffix_(),
Eric Fiselier7cc71062015-07-22 01:29:41 +00005359 __ready_(false),
5360 __position_start_()
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005361{
5362}
5363
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005364template <class _BidirectionalIterator, class _Allocator>
5365void
5366match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005367 _BidirectionalIterator __f, _BidirectionalIterator __l,
5368 bool __no_update_pos)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005369{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005370 __unmatched_.first = __l;
5371 __unmatched_.second = __l;
5372 __unmatched_.matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005373 __matches_.assign(__s, __unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005374 __prefix_.first = __f;
5375 __prefix_.second = __f;
5376 __prefix_.matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005377 __suffix_ = __unmatched_;
Howard Hinnanta712c722010-08-16 20:21:16 +00005378 if (!__no_update_pos)
5379 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005380 __ready_ = true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005381}
5382
Howard Hinnant27405f92010-08-14 18:14:02 +00005383template <class _BidirectionalIterator, class _Allocator>
5384template <class _OutputIter>
5385_OutputIter
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005386match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __output,
Howard Hinnant27405f92010-08-14 18:14:02 +00005387 const char_type* __fmt_first, const char_type* __fmt_last,
5388 regex_constants::match_flag_type __flags) const
5389{
5390 if (__flags & regex_constants::format_sed)
5391 {
5392 for (; __fmt_first != __fmt_last; ++__fmt_first)
5393 {
5394 if (*__fmt_first == '&')
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005395 __output = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5396 __output);
Howard Hinnant27405f92010-08-14 18:14:02 +00005397 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5398 {
5399 ++__fmt_first;
5400 if ('0' <= *__fmt_first && *__fmt_first <= '9')
5401 {
5402 size_t __i = *__fmt_first - '0';
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005403 __output = _VSTD::copy((*this)[__i].first,
5404 (*this)[__i].second, __output);
Howard Hinnant27405f92010-08-14 18:14:02 +00005405 }
5406 else
5407 {
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005408 *__output = *__fmt_first;
5409 ++__output;
Howard Hinnant27405f92010-08-14 18:14:02 +00005410 }
5411 }
5412 else
5413 {
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005414 *__output = *__fmt_first;
5415 ++__output;
Howard Hinnant27405f92010-08-14 18:14:02 +00005416 }
5417 }
5418 }
5419 else
5420 {
5421 for (; __fmt_first != __fmt_last; ++__fmt_first)
5422 {
5423 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5424 {
5425 switch (__fmt_first[1])
5426 {
5427 case '$':
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005428 *__output = *++__fmt_first;
5429 ++__output;
Howard Hinnant27405f92010-08-14 18:14:02 +00005430 break;
5431 case '&':
5432 ++__fmt_first;
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005433 __output = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5434 __output);
Howard Hinnant27405f92010-08-14 18:14:02 +00005435 break;
5436 case '`':
5437 ++__fmt_first;
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005438 __output = _VSTD::copy(__prefix_.first, __prefix_.second, __output);
Howard Hinnant27405f92010-08-14 18:14:02 +00005439 break;
5440 case '\'':
5441 ++__fmt_first;
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005442 __output = _VSTD::copy(__suffix_.first, __suffix_.second, __output);
Howard Hinnant27405f92010-08-14 18:14:02 +00005443 break;
5444 default:
5445 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5446 {
5447 ++__fmt_first;
5448 size_t __i = *__fmt_first - '0';
5449 if (__fmt_first + 1 != __fmt_last &&
5450 '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5451 {
5452 ++__fmt_first;
5453 __i = 10 * __i + *__fmt_first - '0';
5454 }
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005455 __output = _VSTD::copy((*this)[__i].first,
5456 (*this)[__i].second, __output);
Howard Hinnant27405f92010-08-14 18:14:02 +00005457 }
5458 else
5459 {
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005460 *__output = *__fmt_first;
5461 ++__output;
Howard Hinnant27405f92010-08-14 18:14:02 +00005462 }
5463 break;
5464 }
5465 }
5466 else
5467 {
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005468 *__output = *__fmt_first;
5469 ++__output;
Howard Hinnant27405f92010-08-14 18:14:02 +00005470 }
5471 }
5472 }
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00005473 return __output;
Howard Hinnant27405f92010-08-14 18:14:02 +00005474}
5475
5476template <class _BidirectionalIterator, class _Allocator>
5477void
5478match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5479{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005480 using _VSTD::swap;
Howard Hinnant27405f92010-08-14 18:14:02 +00005481 swap(__matches_, __m.__matches_);
5482 swap(__unmatched_, __m.__unmatched_);
5483 swap(__prefix_, __m.__prefix_);
5484 swap(__suffix_, __m.__suffix_);
Howard Hinnanta712c722010-08-16 20:21:16 +00005485 swap(__position_start_, __m.__position_start_);
Howard Hinnant31aaf552010-12-08 21:07:55 +00005486 swap(__ready_, __m.__ready_);
Howard Hinnant27405f92010-08-14 18:14:02 +00005487}
5488
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005489typedef match_results<const char*> cmatch;
5490typedef match_results<const wchar_t*> wcmatch;
5491typedef match_results<string::const_iterator> smatch;
5492typedef match_results<wstring::const_iterator> wsmatch;
5493
5494template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005495bool
5496operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5497 const match_results<_BidirectionalIterator, _Allocator>& __y)
5498{
Howard Hinnant31aaf552010-12-08 21:07:55 +00005499 if (__x.__ready_ != __y.__ready_)
5500 return false;
5501 if (!__x.__ready_)
5502 return true;
Howard Hinnant27405f92010-08-14 18:14:02 +00005503 return __x.__matches_ == __y.__matches_ &&
5504 __x.__prefix_ == __y.__prefix_ &&
Howard Hinnant31aaf552010-12-08 21:07:55 +00005505 __x.__suffix_ == __y.__suffix_;
Howard Hinnant27405f92010-08-14 18:14:02 +00005506}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005507
5508template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005509inline _LIBCPP_INLINE_VISIBILITY
5510bool
5511operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5512 const match_results<_BidirectionalIterator, _Allocator>& __y)
5513{
5514 return !(__x == __y);
5515}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005516
5517template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005518inline _LIBCPP_INLINE_VISIBILITY
5519void
5520swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5521 match_results<_BidirectionalIterator, _Allocator>& __y)
5522{
5523 __x.swap(__y);
5524}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005525
5526// regex_search
5527
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005528template <class _CharT, class _Traits>
Howard Hinnant17615b02010-07-27 01:25:38 +00005529template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005530bool
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005531basic_regex<_CharT, _Traits>::__match_at_start_ecma(
Howard Hinnant17615b02010-07-27 01:25:38 +00005532 const _CharT* __first, const _CharT* __last,
5533 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005534 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005535{
Howard Hinnant17615b02010-07-27 01:25:38 +00005536 vector<__state> __states;
Howard Hinnant17615b02010-07-27 01:25:38 +00005537 __node* __st = __start_.get();
5538 if (__st)
5539 {
Marshall Clow5e56c302015-01-28 22:22:35 +00005540 sub_match<const _CharT*> __unmatched;
5541 __unmatched.first = __last;
5542 __unmatched.second = __last;
5543 __unmatched.matched = false;
5544
Howard Hinnant17615b02010-07-27 01:25:38 +00005545 __states.push_back(__state());
5546 __states.back().__do_ = 0;
5547 __states.back().__first_ = __first;
5548 __states.back().__current_ = __first;
5549 __states.back().__last_ = __last;
Marshall Clow5e56c302015-01-28 22:22:35 +00005550 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
Howard Hinnant17615b02010-07-27 01:25:38 +00005551 __states.back().__loop_data_.resize(__loop_count());
5552 __states.back().__node_ = __st;
5553 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005554 __states.back().__at_first_ = __at_first;
Howard Hinnant17615b02010-07-27 01:25:38 +00005555 do
5556 {
5557 __state& __s = __states.back();
5558 if (__s.__node_)
5559 __s.__node_->__exec(__s);
5560 switch (__s.__do_)
5561 {
5562 case __state::__end_state:
Tim Shen38c2a372016-10-27 21:40:34 +00005563 if ((__flags & regex_constants::match_not_null) &&
Tim Shen741cb8b2016-10-21 20:41:47 +00005564 __s.__current_ == __first)
5565 {
5566 __states.pop_back();
5567 break;
5568 }
Tim Shen38c2a372016-10-27 21:40:34 +00005569 if ((__flags & regex_constants::__full_match) &&
5570 __s.__current_ != __last)
5571 {
5572 __states.pop_back();
5573 break;
5574 }
Howard Hinnant17615b02010-07-27 01:25:38 +00005575 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005576 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
Howard Hinnant17615b02010-07-27 01:25:38 +00005577 __m.__matches_[0].matched = true;
5578 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5579 __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5580 return true;
5581 case __state::__accept_and_consume:
5582 case __state::__repeat:
5583 case __state::__accept_but_not_consume:
5584 break;
5585 case __state::__split:
5586 {
5587 __state __snext = __s;
5588 __s.__node_->__exec_split(true, __s);
5589 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005590 __states.push_back(_VSTD::move(__snext));
Howard Hinnant17615b02010-07-27 01:25:38 +00005591 }
5592 break;
5593 case __state::__reject:
5594 __states.pop_back();
5595 break;
5596 default:
Marshall Clow2576c292015-07-28 13:30:47 +00005597 __throw_regex_error<regex_constants::__re_err_unknown>();
Howard Hinnant17615b02010-07-27 01:25:38 +00005598 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00005599
Howard Hinnant17615b02010-07-27 01:25:38 +00005600 }
5601 } while (!__states.empty());
5602 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005603 return false;
5604}
5605
5606template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005607template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005608bool
5609basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5610 const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005611 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005612 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005613{
Howard Hinnantac303862010-07-12 15:51:17 +00005614 deque<__state> __states;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005615 ptrdiff_t __highest_j = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00005616 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005617 __node* __st = __start_.get();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005618 if (__st)
5619 {
Howard Hinnantac303862010-07-12 15:51:17 +00005620 __states.push_back(__state());
Howard Hinnantac303862010-07-12 15:51:17 +00005621 __states.back().__do_ = 0;
5622 __states.back().__first_ = __first;
5623 __states.back().__current_ = __first;
5624 __states.back().__last_ = __last;
5625 __states.back().__loop_data_.resize(__loop_count());
5626 __states.back().__node_ = __st;
5627 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005628 __states.back().__at_first_ = __at_first;
Howard Hinnant68025ed2010-07-14 15:45:11 +00005629 bool __matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005630 do
5631 {
Howard Hinnantac303862010-07-12 15:51:17 +00005632 __state& __s = __states.back();
5633 if (__s.__node_)
5634 __s.__node_->__exec(__s);
5635 switch (__s.__do_)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005636 {
Howard Hinnantac303862010-07-12 15:51:17 +00005637 case __state::__end_state:
Tim Shen38c2a372016-10-27 21:40:34 +00005638 if ((__flags & regex_constants::match_not_null) &&
Tim Shen741cb8b2016-10-21 20:41:47 +00005639 __s.__current_ == __first)
5640 {
5641 __states.pop_back();
5642 break;
5643 }
Tim Shen38c2a372016-10-27 21:40:34 +00005644 if ((__flags & regex_constants::__full_match) &&
5645 __s.__current_ != __last)
5646 {
5647 __states.pop_back();
5648 break;
5649 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005650 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant68025ed2010-07-14 15:45:11 +00005651 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005652 __matched = true;
Howard Hinnant99968442011-11-29 18:15:50 +00005653 if (__highest_j == _Np)
Howard Hinnantac303862010-07-12 15:51:17 +00005654 __states.clear();
5655 else
5656 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005657 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005658 case __state::__consume_input:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005659 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005660 case __state::__accept_and_consume:
Howard Hinnant0949eed2011-06-30 21:18:19 +00005661 __states.push_front(_VSTD::move(__s));
Howard Hinnantac303862010-07-12 15:51:17 +00005662 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005663 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005664 case __state::__repeat:
5665 case __state::__accept_but_not_consume:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005666 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005667 case __state::__split:
5668 {
5669 __state __snext = __s;
5670 __s.__node_->__exec_split(true, __s);
5671 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005672 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005673 }
5674 break;
5675 case __state::__reject:
5676 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005677 break;
5678 default:
Marshall Clow2576c292015-07-28 13:30:47 +00005679 __throw_regex_error<regex_constants::__re_err_unknown>();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005680 break;
5681 }
Howard Hinnantac303862010-07-12 15:51:17 +00005682 } while (!__states.empty());
Howard Hinnant68025ed2010-07-14 15:45:11 +00005683 if (__matched)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005684 {
5685 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005686 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005687 __m.__matches_[0].matched = true;
5688 return true;
5689 }
5690 }
5691 return false;
5692}
5693
5694template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005695template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005696bool
5697basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005698 const _CharT* __first, const _CharT* __last,
5699 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005700 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005701{
Howard Hinnantac303862010-07-12 15:51:17 +00005702 vector<__state> __states;
Howard Hinnantac303862010-07-12 15:51:17 +00005703 __state __best_state;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005704 ptrdiff_t __j = 0;
5705 ptrdiff_t __highest_j = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00005706 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005707 __node* __st = __start_.get();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005708 if (__st)
5709 {
Marshall Clow5e56c302015-01-28 22:22:35 +00005710 sub_match<const _CharT*> __unmatched;
5711 __unmatched.first = __last;
5712 __unmatched.second = __last;
5713 __unmatched.matched = false;
5714
Howard Hinnantac303862010-07-12 15:51:17 +00005715 __states.push_back(__state());
5716 __states.back().__do_ = 0;
5717 __states.back().__first_ = __first;
5718 __states.back().__current_ = __first;
5719 __states.back().__last_ = __last;
Marshall Clow5e56c302015-01-28 22:22:35 +00005720 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
Howard Hinnantac303862010-07-12 15:51:17 +00005721 __states.back().__loop_data_.resize(__loop_count());
5722 __states.back().__node_ = __st;
5723 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005724 __states.back().__at_first_ = __at_first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005725 const _CharT* __current = __first;
Howard Hinnantac303862010-07-12 15:51:17 +00005726 bool __matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005727 do
5728 {
Howard Hinnantac303862010-07-12 15:51:17 +00005729 __state& __s = __states.back();
5730 if (__s.__node_)
5731 __s.__node_->__exec(__s);
5732 switch (__s.__do_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005733 {
Howard Hinnantac303862010-07-12 15:51:17 +00005734 case __state::__end_state:
Tim Shen38c2a372016-10-27 21:40:34 +00005735 if ((__flags & regex_constants::match_not_null) &&
Tim Shen741cb8b2016-10-21 20:41:47 +00005736 __s.__current_ == __first)
5737 {
5738 __states.pop_back();
5739 break;
5740 }
Tim Shen38c2a372016-10-27 21:40:34 +00005741 if ((__flags & regex_constants::__full_match) &&
5742 __s.__current_ != __last)
5743 {
5744 __states.pop_back();
5745 break;
5746 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005747 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005748 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005749 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantac303862010-07-12 15:51:17 +00005750 __best_state = __s;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005751 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005752 __matched = true;
Howard Hinnant99968442011-11-29 18:15:50 +00005753 if (__highest_j == _Np)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005754 __states.clear();
5755 else
5756 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005757 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005758 case __state::__accept_and_consume:
Howard Hinnantcba352d2010-07-12 18:16:05 +00005759 __j += __s.__current_ - __current;
5760 __current = __s.__current_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005761 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005762 case __state::__repeat:
5763 case __state::__accept_but_not_consume:
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005764 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005765 case __state::__split:
5766 {
5767 __state __snext = __s;
5768 __s.__node_->__exec_split(true, __s);
5769 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005770 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005771 }
5772 break;
5773 case __state::__reject:
5774 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005775 break;
5776 default:
Marshall Clow2576c292015-07-28 13:30:47 +00005777 __throw_regex_error<regex_constants::__re_err_unknown>();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005778 break;
5779 }
Howard Hinnantac303862010-07-12 15:51:17 +00005780 } while (!__states.empty());
5781 if (__matched)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005782 {
5783 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005784 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005785 __m.__matches_[0].matched = true;
Howard Hinnantac303862010-07-12 15:51:17 +00005786 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
5787 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005788 return true;
5789 }
5790 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005791 return false;
5792}
5793
5794template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005795template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005796bool
5797basic_regex<_CharT, _Traits>::__match_at_start(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005798 const _CharT* __first, const _CharT* __last,
5799 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005800 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005801{
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005802 if ((__flags_ & 0x1F0) == ECMAScript)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005803 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005804 if (mark_count() == 0)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005805 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
5806 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005807}
5808
5809template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005810template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005811bool
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005812basic_regex<_CharT, _Traits>::__search(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005813 const _CharT* __first, const _CharT* __last,
5814 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005815 regex_constants::match_flag_type __flags) const
5816{
Howard Hinnanta712c722010-08-16 20:21:16 +00005817 __m.__init(1 + mark_count(), __first, __last,
5818 __flags & regex_constants::__no_update_pos);
Howard Hinnant7670f7d2013-07-09 17:29:09 +00005819 if (__match_at_start(__first, __last, __m, __flags,
5820 !(__flags & regex_constants::__no_update_pos)))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005821 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005822 __m.__prefix_.second = __m[0].first;
5823 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5824 __m.__suffix_.first = __m[0].second;
5825 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5826 return true;
5827 }
Howard Hinnant8daa7332010-07-29 01:15:27 +00005828 if (__first != __last && !(__flags & regex_constants::match_continuous))
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005829 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005830 __flags |= regex_constants::match_prev_avail;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005831 for (++__first; __first != __last; ++__first)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005832 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005833 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005834 if (__match_at_start(__first, __last, __m, __flags, false))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005835 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005836 __m.__prefix_.second = __m[0].first;
5837 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5838 __m.__suffix_.first = __m[0].second;
5839 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5840 return true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005841 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005842 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005843 }
5844 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005845 __m.__matches_.clear();
5846 return false;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005847}
5848
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005849template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005850inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005851bool
5852regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5853 match_results<_BidirectionalIterator, _Allocator>& __m,
5854 const basic_regex<_CharT, _Traits>& __e,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005855 regex_constants::match_flag_type __flags = regex_constants::match_default)
5856{
Howard Hinnante8402082013-07-11 15:32:55 +00005857 int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
5858 basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005859 match_results<const _CharT*> __mc;
Howard Hinnante8402082013-07-11 15:32:55 +00005860 bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005861 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005862 return __r;
5863}
5864
Howard Hinnanta9602d52013-06-29 23:45:43 +00005865template <class _Iter, class _Allocator, class _CharT, class _Traits>
5866inline _LIBCPP_INLINE_VISIBILITY
5867bool
5868regex_search(__wrap_iter<_Iter> __first,
5869 __wrap_iter<_Iter> __last,
5870 match_results<__wrap_iter<_Iter>, _Allocator>& __m,
5871 const basic_regex<_CharT, _Traits>& __e,
5872 regex_constants::match_flag_type __flags = regex_constants::match_default)
5873{
5874 match_results<const _CharT*> __mc;
5875 bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
5876 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
5877 return __r;
5878}
5879
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005880template <class _Allocator, class _CharT, class _Traits>
5881inline _LIBCPP_INLINE_VISIBILITY
5882bool
5883regex_search(const _CharT* __first, const _CharT* __last,
5884 match_results<const _CharT*, _Allocator>& __m,
5885 const basic_regex<_CharT, _Traits>& __e,
5886 regex_constants::match_flag_type __flags = regex_constants::match_default)
5887{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005888 return __e.__search(__first, __last, __m, __flags);
5889}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005890
5891template <class _BidirectionalIterator, class _CharT, class _Traits>
5892inline _LIBCPP_INLINE_VISIBILITY
5893bool
5894regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5895 const basic_regex<_CharT, _Traits>& __e,
5896 regex_constants::match_flag_type __flags = regex_constants::match_default)
5897{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005898 basic_string<_CharT> __s(__first, __last);
5899 match_results<const _CharT*> __mc;
5900 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5901}
5902
5903template <class _CharT, class _Traits>
5904inline _LIBCPP_INLINE_VISIBILITY
5905bool
5906regex_search(const _CharT* __first, const _CharT* __last,
5907 const basic_regex<_CharT, _Traits>& __e,
5908 regex_constants::match_flag_type __flags = regex_constants::match_default)
5909{
5910 match_results<const _CharT*> __mc;
5911 return __e.__search(__first, __last, __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005912}
5913
5914template <class _CharT, class _Allocator, class _Traits>
5915inline _LIBCPP_INLINE_VISIBILITY
5916bool
5917regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5918 const basic_regex<_CharT, _Traits>& __e,
5919 regex_constants::match_flag_type __flags = regex_constants::match_default)
5920{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005921 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005922}
5923
5924template <class _CharT, class _Traits>
5925inline _LIBCPP_INLINE_VISIBILITY
5926bool
5927regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5928 regex_constants::match_flag_type __flags = regex_constants::match_default)
5929{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005930 match_results<const _CharT*> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005931 return _VSTD::regex_search(__str, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005932}
5933
5934template <class _ST, class _SA, class _CharT, class _Traits>
5935inline _LIBCPP_INLINE_VISIBILITY
5936bool
5937regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5938 const basic_regex<_CharT, _Traits>& __e,
5939 regex_constants::match_flag_type __flags = regex_constants::match_default)
5940{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005941 match_results<const _CharT*> __mc;
5942 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005943}
5944
5945template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5946inline _LIBCPP_INLINE_VISIBILITY
5947bool
5948regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5949 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5950 const basic_regex<_CharT, _Traits>& __e,
5951 regex_constants::match_flag_type __flags = regex_constants::match_default)
5952{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005953 match_results<const _CharT*> __mc;
5954 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005955 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005956 return __r;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005957}
5958
Marshall Clowe0f86722014-02-19 21:21:11 +00005959#if _LIBCPP_STD_VER > 11
5960template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
5961bool
5962regex_search(const basic_string<_Cp, _ST, _SA>&& __s,
5963 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
5964 const basic_regex<_Cp, _Tp>& __e,
5965 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
5966#endif
5967
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005968// regex_match
5969
5970template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
5971bool
5972regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
5973 match_results<_BidirectionalIterator, _Allocator>& __m,
5974 const basic_regex<_CharT, _Traits>& __e,
5975 regex_constants::match_flag_type __flags = regex_constants::match_default)
5976{
Tim Shen38c2a372016-10-27 21:40:34 +00005977 bool __r = _VSTD::regex_search(
5978 __first, __last, __m, __e,
5979 __flags | regex_constants::match_continuous |
5980 regex_constants::__full_match);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005981 if (__r)
5982 {
5983 __r = !__m.suffix().matched;
5984 if (!__r)
5985 __m.__matches_.clear();
5986 }
5987 return __r;
5988}
5989
5990template <class _BidirectionalIterator, class _CharT, class _Traits>
5991inline _LIBCPP_INLINE_VISIBILITY
5992bool
5993regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
5994 const basic_regex<_CharT, _Traits>& __e,
5995 regex_constants::match_flag_type __flags = regex_constants::match_default)
5996{
5997 match_results<_BidirectionalIterator> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005998 return _VSTD::regex_match(__first, __last, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005999}
6000
6001template <class _CharT, class _Allocator, class _Traits>
6002inline _LIBCPP_INLINE_VISIBILITY
6003bool
6004regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6005 const basic_regex<_CharT, _Traits>& __e,
6006 regex_constants::match_flag_type __flags = regex_constants::match_default)
6007{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006008 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006009}
6010
6011template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6012inline _LIBCPP_INLINE_VISIBILITY
6013bool
6014regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6015 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6016 const basic_regex<_CharT, _Traits>& __e,
6017 regex_constants::match_flag_type __flags = regex_constants::match_default)
6018{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006019 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006020}
6021
Marshall Clowe0f86722014-02-19 21:21:11 +00006022#if _LIBCPP_STD_VER > 11
6023template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6024inline _LIBCPP_INLINE_VISIBILITY
6025bool
6026regex_match(const basic_string<_CharT, _ST, _SA>&& __s,
6027 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6028 const basic_regex<_CharT, _Traits>& __e,
6029 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6030#endif
6031
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006032template <class _CharT, class _Traits>
6033inline _LIBCPP_INLINE_VISIBILITY
6034bool
6035regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6036 regex_constants::match_flag_type __flags = regex_constants::match_default)
6037{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006038 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006039}
6040
6041template <class _ST, class _SA, class _CharT, class _Traits>
6042inline _LIBCPP_INLINE_VISIBILITY
6043bool
6044regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6045 const basic_regex<_CharT, _Traits>& __e,
6046 regex_constants::match_flag_type __flags = regex_constants::match_default)
6047{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006048 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006049}
6050
Howard Hinnanta712c722010-08-16 20:21:16 +00006051// regex_iterator
6052
6053template <class _BidirectionalIterator,
6054 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6055 class _Traits = regex_traits<_CharT> >
Eric Fiselierc3589a82017-01-04 23:56:00 +00006056class _LIBCPP_TEMPLATE_VIS regex_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00006057{
6058public:
6059 typedef basic_regex<_CharT, _Traits> regex_type;
6060 typedef match_results<_BidirectionalIterator> value_type;
6061 typedef ptrdiff_t difference_type;
6062 typedef const value_type* pointer;
6063 typedef const value_type& reference;
6064 typedef forward_iterator_tag iterator_category;
6065
6066private:
6067 _BidirectionalIterator __begin_;
6068 _BidirectionalIterator __end_;
6069 const regex_type* __pregex_;
6070 regex_constants::match_flag_type __flags_;
6071 value_type __match_;
6072
6073public:
6074 regex_iterator();
6075 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6076 const regex_type& __re,
Marshall Clowe0f86722014-02-19 21:21:11 +00006077 regex_constants::match_flag_type __m
6078 = regex_constants::match_default);
6079#if _LIBCPP_STD_VER > 11
6080 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6081 const regex_type&& __re,
6082 regex_constants::match_flag_type __m
6083 = regex_constants::match_default) = delete;
6084#endif
Howard Hinnanta712c722010-08-16 20:21:16 +00006085
6086 bool operator==(const regex_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006087 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006088 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
6089
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006090 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006091 reference operator*() const {return __match_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006092 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006093 pointer operator->() const {return &__match_;}
6094
6095 regex_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006096 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006097 regex_iterator operator++(int)
6098 {
6099 regex_iterator __t(*this);
6100 ++(*this);
6101 return __t;
6102 }
6103};
6104
6105template <class _BidirectionalIterator, class _CharT, class _Traits>
6106regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
6107 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
6108{
6109}
6110
6111template <class _BidirectionalIterator, class _CharT, class _Traits>
6112regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6113 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6114 const regex_type& __re, regex_constants::match_flag_type __m)
6115 : __begin_(__a),
6116 __end_(__b),
6117 __pregex_(&__re),
6118 __flags_(__m)
6119{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006120 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
Howard Hinnanta712c722010-08-16 20:21:16 +00006121}
6122
6123template <class _BidirectionalIterator, class _CharT, class _Traits>
6124bool
6125regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6126 operator==(const regex_iterator& __x) const
6127{
6128 if (__match_.empty() && __x.__match_.empty())
6129 return true;
6130 if (__match_.empty() || __x.__match_.empty())
6131 return false;
6132 return __begin_ == __x.__begin_ &&
6133 __end_ == __x.__end_ &&
6134 __pregex_ == __x.__pregex_ &&
6135 __flags_ == __x.__flags_ &&
6136 __match_[0] == __x.__match_[0];
6137}
6138
6139template <class _BidirectionalIterator, class _CharT, class _Traits>
6140regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6141regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6142{
6143 __flags_ |= regex_constants::__no_update_pos;
6144 _BidirectionalIterator __start = __match_[0].second;
Howard Hinnanta9602d52013-06-29 23:45:43 +00006145 if (__match_.empty())
Howard Hinnanta712c722010-08-16 20:21:16 +00006146 {
6147 if (__start == __end_)
6148 {
6149 __match_ = value_type();
6150 return *this;
6151 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00006152 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
Howard Hinnanta712c722010-08-16 20:21:16 +00006153 __flags_ | regex_constants::match_not_null |
6154 regex_constants::match_continuous))
6155 return *this;
6156 else
6157 ++__start;
6158 }
6159 __flags_ |= regex_constants::match_prev_avail;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006160 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
Howard Hinnanta712c722010-08-16 20:21:16 +00006161 __match_ = value_type();
6162 return *this;
6163}
6164
6165typedef regex_iterator<const char*> cregex_iterator;
6166typedef regex_iterator<const wchar_t*> wcregex_iterator;
6167typedef regex_iterator<string::const_iterator> sregex_iterator;
6168typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
6169
6170// regex_token_iterator
6171
6172template <class _BidirectionalIterator,
6173 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6174 class _Traits = regex_traits<_CharT> >
Eric Fiselierc3589a82017-01-04 23:56:00 +00006175class _LIBCPP_TEMPLATE_VIS regex_token_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00006176{
6177public:
6178 typedef basic_regex<_CharT, _Traits> regex_type;
6179 typedef sub_match<_BidirectionalIterator> value_type;
6180 typedef ptrdiff_t difference_type;
6181 typedef const value_type* pointer;
6182 typedef const value_type& reference;
6183 typedef forward_iterator_tag iterator_category;
6184
Howard Hinnant262b7792010-08-17 20:42:03 +00006185private:
6186 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6187
6188 _Position __position_;
6189 const value_type* __result_;
6190 value_type __suffix_;
Eric Fiselier50f65792016-12-24 00:24:44 +00006191 ptrdiff_t __n_;
Howard Hinnant262b7792010-08-17 20:42:03 +00006192 vector<int> __subs_;
6193
6194public:
Howard Hinnanta712c722010-08-16 20:21:16 +00006195 regex_token_iterator();
6196 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6197 const regex_type& __re, int __submatch = 0,
Howard Hinnant262b7792010-08-17 20:42:03 +00006198 regex_constants::match_flag_type __m =
6199 regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +00006200#if _LIBCPP_STD_VER > 11
6201 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6202 const regex_type&& __re, int __submatch = 0,
6203 regex_constants::match_flag_type __m =
6204 regex_constants::match_default) = delete;
6205#endif
6206
Howard Hinnanta712c722010-08-16 20:21:16 +00006207 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6208 const regex_type& __re, const vector<int>& __submatches,
Howard Hinnant262b7792010-08-17 20:42:03 +00006209 regex_constants::match_flag_type __m =
6210 regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +00006211#if _LIBCPP_STD_VER > 11
6212 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6213 const regex_type&& __re, const vector<int>& __submatches,
6214 regex_constants::match_flag_type __m =
6215 regex_constants::match_default) = delete;
6216#endif
6217
Eric Fiselierd89c7152017-04-18 23:42:15 +00006218#ifndef _LIBCPP_CXX03_LANG
Howard Hinnanta712c722010-08-16 20:21:16 +00006219 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
Howard Hinnant262b7792010-08-17 20:42:03 +00006220 const regex_type& __re,
6221 initializer_list<int> __submatches,
6222 regex_constants::match_flag_type __m =
6223 regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +00006224
6225#if _LIBCPP_STD_VER > 11
6226 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6227 const regex_type&& __re,
6228 initializer_list<int> __submatches,
6229 regex_constants::match_flag_type __m =
6230 regex_constants::match_default) = delete;
6231#endif
Eric Fiselierd89c7152017-04-18 23:42:15 +00006232#endif // _LIBCPP_CXX03_LANG
Howard Hinnant99968442011-11-29 18:15:50 +00006233 template <size_t _Np>
Howard Hinnant262b7792010-08-17 20:42:03 +00006234 regex_token_iterator(_BidirectionalIterator __a,
6235 _BidirectionalIterator __b,
6236 const regex_type& __re,
Howard Hinnant99968442011-11-29 18:15:50 +00006237 const int (&__submatches)[_Np],
Howard Hinnant262b7792010-08-17 20:42:03 +00006238 regex_constants::match_flag_type __m =
6239 regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +00006240#if _LIBCPP_STD_VER > 11
6241 template <std::size_t _Np>
6242 regex_token_iterator(_BidirectionalIterator __a,
6243 _BidirectionalIterator __b,
6244 const regex_type&& __re,
6245 const int (&__submatches)[_Np],
6246 regex_constants::match_flag_type __m =
6247 regex_constants::match_default) = delete;
6248#endif
6249
Howard Hinnanta712c722010-08-16 20:21:16 +00006250 regex_token_iterator(const regex_token_iterator&);
6251 regex_token_iterator& operator=(const regex_token_iterator&);
6252
Howard Hinnant262b7792010-08-17 20:42:03 +00006253 bool operator==(const regex_token_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006254 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006255 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
Howard Hinnanta712c722010-08-16 20:21:16 +00006256
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006257 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006258 const value_type& operator*() const {return *__result_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006259 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006260 const value_type* operator->() const {return __result_;}
Howard Hinnanta712c722010-08-16 20:21:16 +00006261
6262 regex_token_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006263 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006264 regex_token_iterator operator++(int)
6265 {
6266 regex_token_iterator __t(*this);
6267 ++(*this);
6268 return __t;
6269 }
6270
6271private:
6272 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006273 void __establish_result () {
Eric Fiselier50f65792016-12-24 00:24:44 +00006274 if (__subs_[__n_] == -1)
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006275 __result_ = &__position_->prefix();
6276 else
Eric Fiselier50f65792016-12-24 00:24:44 +00006277 __result_ = &(*__position_)[__subs_[__n_]];
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006278 }
Howard Hinnanta712c722010-08-16 20:21:16 +00006279};
6280
Howard Hinnant262b7792010-08-17 20:42:03 +00006281template <class _BidirectionalIterator, class _CharT, class _Traits>
6282regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6283 regex_token_iterator()
6284 : __result_(nullptr),
6285 __suffix_(),
Eric Fiselier50f65792016-12-24 00:24:44 +00006286 __n_(0)
Howard Hinnant262b7792010-08-17 20:42:03 +00006287{
6288}
6289
6290template <class _BidirectionalIterator, class _CharT, class _Traits>
6291void
6292regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6293 __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6294{
6295 if (__position_ != _Position())
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006296 __establish_result ();
Eric Fiselier50f65792016-12-24 00:24:44 +00006297 else if (__subs_[__n_] == -1)
Howard Hinnant262b7792010-08-17 20:42:03 +00006298 {
6299 __suffix_.matched = true;
6300 __suffix_.first = __a;
6301 __suffix_.second = __b;
6302 __result_ = &__suffix_;
6303 }
6304 else
6305 __result_ = nullptr;
6306}
6307
6308template <class _BidirectionalIterator, class _CharT, class _Traits>
6309regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6310 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6311 const regex_type& __re, int __submatch,
6312 regex_constants::match_flag_type __m)
6313 : __position_(__a, __b, __re, __m),
Eric Fiselier50f65792016-12-24 00:24:44 +00006314 __n_(0),
Howard Hinnant262b7792010-08-17 20:42:03 +00006315 __subs_(1, __submatch)
6316{
6317 __init(__a, __b);
6318}
6319
6320template <class _BidirectionalIterator, class _CharT, class _Traits>
6321regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6322 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6323 const regex_type& __re, const vector<int>& __submatches,
6324 regex_constants::match_flag_type __m)
6325 : __position_(__a, __b, __re, __m),
Eric Fiselier50f65792016-12-24 00:24:44 +00006326 __n_(0),
Howard Hinnant262b7792010-08-17 20:42:03 +00006327 __subs_(__submatches)
6328{
6329 __init(__a, __b);
6330}
6331
Eric Fiselierd89c7152017-04-18 23:42:15 +00006332#ifndef _LIBCPP_CXX03_LANG
Howard Hinnante3e32912011-08-12 21:56:02 +00006333
Howard Hinnant262b7792010-08-17 20:42:03 +00006334template <class _BidirectionalIterator, class _CharT, class _Traits>
6335regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6336 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6337 const regex_type& __re,
6338 initializer_list<int> __submatches,
6339 regex_constants::match_flag_type __m)
6340 : __position_(__a, __b, __re, __m),
Eric Fiselier50f65792016-12-24 00:24:44 +00006341 __n_(0),
Howard Hinnant262b7792010-08-17 20:42:03 +00006342 __subs_(__submatches)
6343{
6344 __init(__a, __b);
6345}
6346
Eric Fiselierd89c7152017-04-18 23:42:15 +00006347#endif // _LIBCPP_CXX03_LANG
Howard Hinnante3e32912011-08-12 21:56:02 +00006348
Howard Hinnant262b7792010-08-17 20:42:03 +00006349template <class _BidirectionalIterator, class _CharT, class _Traits>
Howard Hinnant99968442011-11-29 18:15:50 +00006350template <size_t _Np>
Howard Hinnant262b7792010-08-17 20:42:03 +00006351regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6352 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6353 const regex_type& __re,
Howard Hinnant99968442011-11-29 18:15:50 +00006354 const int (&__submatches)[_Np],
Howard Hinnant262b7792010-08-17 20:42:03 +00006355 regex_constants::match_flag_type __m)
6356 : __position_(__a, __b, __re, __m),
Eric Fiselier50f65792016-12-24 00:24:44 +00006357 __n_(0),
Howard Hinnant99968442011-11-29 18:15:50 +00006358 __subs_(__submatches, __submatches + _Np)
Howard Hinnant262b7792010-08-17 20:42:03 +00006359{
6360 __init(__a, __b);
6361}
6362
6363template <class _BidirectionalIterator, class _CharT, class _Traits>
6364regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6365 regex_token_iterator(const regex_token_iterator& __x)
6366 : __position_(__x.__position_),
6367 __result_(__x.__result_),
6368 __suffix_(__x.__suffix_),
Eric Fiselier50f65792016-12-24 00:24:44 +00006369 __n_(__x.__n_),
Howard Hinnant262b7792010-08-17 20:42:03 +00006370 __subs_(__x.__subs_)
6371{
6372 if (__x.__result_ == &__x.__suffix_)
Marshall Clow72fe0ae2014-01-13 17:47:08 +00006373 __result_ = &__suffix_;
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006374 else if ( __result_ != nullptr )
6375 __establish_result ();
Howard Hinnant262b7792010-08-17 20:42:03 +00006376}
6377
6378template <class _BidirectionalIterator, class _CharT, class _Traits>
6379regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6380regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6381 operator=(const regex_token_iterator& __x)
6382{
6383 if (this != &__x)
6384 {
6385 __position_ = __x.__position_;
6386 if (__x.__result_ == &__x.__suffix_)
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006387 __result_ = &__suffix_;
Howard Hinnant262b7792010-08-17 20:42:03 +00006388 else
6389 __result_ = __x.__result_;
6390 __suffix_ = __x.__suffix_;
Eric Fiselier50f65792016-12-24 00:24:44 +00006391 __n_ = __x.__n_;
Howard Hinnant262b7792010-08-17 20:42:03 +00006392 __subs_ = __x.__subs_;
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006393
6394 if ( __result_ != nullptr && __result_ != &__suffix_ )
6395 __establish_result();
Howard Hinnant262b7792010-08-17 20:42:03 +00006396 }
6397 return *this;
6398}
6399
6400template <class _BidirectionalIterator, class _CharT, class _Traits>
6401bool
6402regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6403 operator==(const regex_token_iterator& __x) const
6404{
6405 if (__result_ == nullptr && __x.__result_ == nullptr)
6406 return true;
6407 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6408 __suffix_ == __x.__suffix_)
6409 return true;
6410 if (__result_ == nullptr || __x.__result_ == nullptr)
6411 return false;
6412 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6413 return false;
Eric Fiselier50f65792016-12-24 00:24:44 +00006414 return __position_ == __x.__position_ && __n_ == __x.__n_ &&
Howard Hinnant262b7792010-08-17 20:42:03 +00006415 __subs_ == __x.__subs_;
6416}
6417
6418template <class _BidirectionalIterator, class _CharT, class _Traits>
6419regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6420regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6421{
6422 _Position __prev = __position_;
6423 if (__result_ == &__suffix_)
6424 __result_ = nullptr;
Eric Fiselier50f65792016-12-24 00:24:44 +00006425 else if (static_cast<size_t>(__n_ + 1) < __subs_.size())
Howard Hinnant262b7792010-08-17 20:42:03 +00006426 {
Eric Fiselier50f65792016-12-24 00:24:44 +00006427 ++__n_;
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006428 __establish_result();
Howard Hinnant262b7792010-08-17 20:42:03 +00006429 }
6430 else
6431 {
Eric Fiselier50f65792016-12-24 00:24:44 +00006432 __n_ = 0;
Howard Hinnant262b7792010-08-17 20:42:03 +00006433 ++__position_;
6434 if (__position_ != _Position())
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006435 __establish_result();
Howard Hinnant262b7792010-08-17 20:42:03 +00006436 else
6437 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00006438 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
Howard Hinnant262b7792010-08-17 20:42:03 +00006439 && __prev->suffix().length() != 0)
6440 {
6441 __suffix_.matched = true;
6442 __suffix_.first = __prev->suffix().first;
6443 __suffix_.second = __prev->suffix().second;
6444 __result_ = &__suffix_;
6445 }
6446 else
6447 __result_ = nullptr;
6448 }
6449 }
6450 return *this;
6451}
6452
Howard Hinnanta712c722010-08-16 20:21:16 +00006453typedef regex_token_iterator<const char*> cregex_token_iterator;
6454typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
6455typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
6456typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
6457
Howard Hinnanta8d77592010-08-18 00:13:08 +00006458// regex_replace
6459
6460template <class _OutputIterator, class _BidirectionalIterator,
6461 class _Traits, class _CharT>
6462_OutputIterator
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00006463regex_replace(_OutputIterator __output,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006464 _BidirectionalIterator __first, _BidirectionalIterator __last,
6465 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6466 regex_constants::match_flag_type __flags = regex_constants::match_default)
6467{
6468 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6469 _Iter __i(__first, __last, __e, __flags);
6470 _Iter __eof;
6471 if (__i == __eof)
6472 {
6473 if (!(__flags & regex_constants::format_no_copy))
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00006474 __output = _VSTD::copy(__first, __last, __output);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006475 }
6476 else
6477 {
6478 sub_match<_BidirectionalIterator> __lm;
6479 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6480 {
6481 if (!(__flags & regex_constants::format_no_copy))
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00006482 __output = _VSTD::copy(__i->prefix().first, __i->prefix().second, __output);
6483 __output = __i->format(__output, __fmt, __fmt + __len, __flags);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006484 __lm = __i->suffix();
6485 if (__flags & regex_constants::format_first_only)
6486 break;
6487 }
6488 if (!(__flags & regex_constants::format_no_copy))
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00006489 __output = _VSTD::copy(__lm.first, __lm.second, __output);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006490 }
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00006491 return __output;
Howard Hinnanta8d77592010-08-18 00:13:08 +00006492}
6493
6494template <class _OutputIterator, class _BidirectionalIterator,
6495 class _Traits, class _CharT, class _ST, class _SA>
6496inline _LIBCPP_INLINE_VISIBILITY
6497_OutputIterator
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00006498regex_replace(_OutputIterator __output,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006499 _BidirectionalIterator __first, _BidirectionalIterator __last,
6500 const basic_regex<_CharT, _Traits>& __e,
6501 const basic_string<_CharT, _ST, _SA>& __fmt,
6502 regex_constants::match_flag_type __flags = regex_constants::match_default)
6503{
Eric Fiselierc60e8fc2017-01-07 11:27:06 +00006504 return _VSTD::regex_replace(__output, __first, __last, __e, __fmt.c_str(), __flags);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006505}
6506
6507template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6508 class _FSA>
6509inline _LIBCPP_INLINE_VISIBILITY
6510basic_string<_CharT, _ST, _SA>
6511regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6512 const basic_regex<_CharT, _Traits>& __e,
6513 const basic_string<_CharT, _FST, _FSA>& __fmt,
6514 regex_constants::match_flag_type __flags = regex_constants::match_default)
6515{
6516 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006517 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006518 __fmt.c_str(), __flags);
6519 return __r;
6520}
6521
6522template <class _Traits, class _CharT, class _ST, class _SA>
6523inline _LIBCPP_INLINE_VISIBILITY
6524basic_string<_CharT, _ST, _SA>
6525regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6526 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6527 regex_constants::match_flag_type __flags = regex_constants::match_default)
6528{
6529 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006530 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006531 __fmt, __flags);
6532 return __r;
6533}
6534
6535template <class _Traits, class _CharT, class _ST, class _SA>
6536inline _LIBCPP_INLINE_VISIBILITY
6537basic_string<_CharT>
6538regex_replace(const _CharT* __s,
6539 const basic_regex<_CharT, _Traits>& __e,
6540 const basic_string<_CharT, _ST, _SA>& __fmt,
6541 regex_constants::match_flag_type __flags = regex_constants::match_default)
6542{
6543 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006544 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006545 __s + char_traits<_CharT>::length(__s), __e,
6546 __fmt.c_str(), __flags);
6547 return __r;
6548}
6549
6550template <class _Traits, class _CharT>
6551inline _LIBCPP_INLINE_VISIBILITY
6552basic_string<_CharT>
6553regex_replace(const _CharT* __s,
6554 const basic_regex<_CharT, _Traits>& __e,
6555 const _CharT* __fmt,
6556 regex_constants::match_flag_type __flags = regex_constants::match_default)
6557{
6558 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006559 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006560 __s + char_traits<_CharT>::length(__s), __e,
6561 __fmt, __flags);
6562 return __r;
6563}
6564
Howard Hinnant3257c982010-06-17 00:34:59 +00006565_LIBCPP_END_NAMESPACE_STD
6566
Eric Fiselier018a3d52017-05-31 22:07:49 +00006567_LIBCPP_POP_MACROS
6568
Howard Hinnant3257c982010-06-17 00:34:59 +00006569#endif // _LIBCPP_REGEX