blob: fb0f7d8c2624aa0398d2a46cdb05d43cf1b0354c [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;
130 typedef regex_constants::syntax_option_type flag_type;
131 typedef typename traits::locale_type locale_type;
132
133 // constants:
134 static constexpr regex_constants::syntax_option_type icase = regex_constants::icase;
135 static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
136 static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize;
137 static constexpr regex_constants::syntax_option_type collate = regex_constants::collate;
138 static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
139 static constexpr regex_constants::syntax_option_type basic = regex_constants::basic;
140 static constexpr regex_constants::syntax_option_type extended = regex_constants::extended;
141 static constexpr regex_constants::syntax_option_type awk = regex_constants::awk;
142 static constexpr regex_constants::syntax_option_type grep = regex_constants::grep;
143 static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep;
144
145 // construct/copy/destroy:
146 basic_regex();
147 explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
148 basic_regex(const charT* p, size_t len, flag_type f);
149 basic_regex(const basic_regex&);
Howard Hinnant46623a02012-07-21 01:31:58 +0000150 basic_regex(basic_regex&&) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000151 template <class ST, class SA>
152 explicit basic_regex(const basic_string<charT, ST, SA>& p,
153 flag_type f = regex_constants::ECMAScript);
154 template <class ForwardIterator>
155 basic_regex(ForwardIterator first, ForwardIterator last,
156 flag_type f = regex_constants::ECMAScript);
157 basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
158
159 ~basic_regex();
160
161 basic_regex& operator=(const basic_regex&);
Howard Hinnant46623a02012-07-21 01:31:58 +0000162 basic_regex& operator=(basic_regex&&) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000163 basic_regex& operator=(const charT* ptr);
164 basic_regex& operator=(initializer_list<charT> il);
165 template <class ST, class SA>
166 basic_regex& operator=(const basic_string<charT, ST, SA>& p);
167
168 // assign:
169 basic_regex& assign(const basic_regex& that);
Howard Hinnant46623a02012-07-21 01:31:58 +0000170 basic_regex& assign(basic_regex&& that) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000171 basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);
172 basic_regex& assign(const charT* p, size_t len, flag_type f);
173 template <class string_traits, class A>
174 basic_regex& assign(const basic_string<charT, string_traits, A>& s,
175 flag_type f = regex_constants::ECMAScript);
176 template <class InputIterator>
177 basic_regex& assign(InputIterator first, InputIterator last,
178 flag_type f = regex_constants::ECMAScript);
179 basic_regex& assign(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
180
181 // const operations:
182 unsigned mark_count() const;
183 flag_type flags() const;
184
185 // locale:
186 locale_type imbue(locale_type loc);
187 locale_type getloc() const;
188
189 // swap:
190 void swap(basic_regex&);
191};
192
193typedef basic_regex<char> regex;
194typedef basic_regex<wchar_t> wregex;
195
196template <class charT, class traits>
197 void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
198
199template <class BidirectionalIterator>
200class sub_match
201 : public pair<BidirectionalIterator, BidirectionalIterator>
202{
203public:
204 typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
205 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
206 typedef BidirectionalIterator iterator;
207 typedef basic_string<value_type> string_type;
208
209 bool matched;
210
Howard Hinnant31aaf552010-12-08 21:07:55 +0000211 constexpr sub_match();
212
Howard Hinnant3257c982010-06-17 00:34:59 +0000213 difference_type length() const;
214 operator string_type() const;
215 string_type str() const;
216
217 int compare(const sub_match& s) const;
218 int compare(const string_type& s) const;
219 int compare(const value_type* s) const;
220};
221
222typedef sub_match<const char*> csub_match;
223typedef sub_match<const wchar_t*> wcsub_match;
224typedef sub_match<string::const_iterator> ssub_match;
225typedef sub_match<wstring::const_iterator> wssub_match;
226
227template <class BiIter>
228 bool
229 operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
230
231template <class BiIter>
232 bool
233 operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
234
235template <class BiIter>
236 bool
237 operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
238
239template <class BiIter>
240 bool
241 operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
242
243template <class BiIter>
244 bool
245 operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
246
247template <class BiIter>
248 bool
249 operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
250
251template <class BiIter, class ST, class SA>
252 bool
253 operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
254 const sub_match<BiIter>& rhs);
255
256template <class BiIter, class ST, class SA>
257 bool
258 operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
259 const sub_match<BiIter>& rhs);
260
261template <class BiIter, class ST, class SA>
262 bool
263 operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
264 const sub_match<BiIter>& rhs);
265
266template <class BiIter, class ST, class SA>
267 bool
268 operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
269 const sub_match<BiIter>& rhs);
270
271template <class BiIter, class ST, class SA>
272 bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
273 const sub_match<BiIter>& rhs);
274
275template <class BiIter, class ST, class SA>
276 bool
277 operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
278 const sub_match<BiIter>& rhs);
279
280template <class BiIter, class ST, class SA>
281 bool
282 operator==(const sub_match<BiIter>& lhs,
283 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
284
285template <class BiIter, class ST, class SA>
286 bool
287 operator!=(const sub_match<BiIter>& lhs,
288 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
289
290template <class BiIter, class ST, class SA>
291 bool
292 operator<(const sub_match<BiIter>& lhs,
293 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
294
295template <class BiIter, class ST, class SA>
296 bool operator>(const sub_match<BiIter>& lhs,
297 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
298
299template <class BiIter, class ST, class SA>
300 bool
301 operator>=(const sub_match<BiIter>& lhs,
302 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
303
304template <class BiIter, class ST, class SA>
305 bool
306 operator<=(const sub_match<BiIter>& lhs,
307 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
308
309template <class BiIter>
310 bool
311 operator==(typename iterator_traits<BiIter>::value_type const* lhs,
312 const sub_match<BiIter>& rhs);
313
314template <class BiIter>
315 bool
316 operator!=(typename iterator_traits<BiIter>::value_type const* lhs,
317 const sub_match<BiIter>& rhs);
318
319template <class BiIter>
320 bool
321 operator<(typename iterator_traits<BiIter>::value_type const* lhs,
322 const sub_match<BiIter>& rhs);
323
324template <class BiIter>
325 bool
326 operator>(typename iterator_traits<BiIter>::value_type const* lhs,
327 const sub_match<BiIter>& rhs);
328
329template <class BiIter>
330 bool
331 operator>=(typename iterator_traits<BiIter>::value_type const* lhs,
332 const sub_match<BiIter>& rhs);
333
334template <class BiIter>
335 bool
336 operator<=(typename iterator_traits<BiIter>::value_type const* lhs,
337 const sub_match<BiIter>& rhs);
338
339template <class BiIter>
340 bool
341 operator==(const sub_match<BiIter>& lhs,
342 typename iterator_traits<BiIter>::value_type const* rhs);
343
344template <class BiIter>
345 bool
346 operator!=(const sub_match<BiIter>& lhs,
347 typename iterator_traits<BiIter>::value_type const* rhs);
348
349template <class BiIter>
350 bool
351 operator<(const sub_match<BiIter>& lhs,
352 typename iterator_traits<BiIter>::value_type const* rhs);
353
354template <class BiIter>
355 bool
356 operator>(const sub_match<BiIter>& lhs,
357 typename iterator_traits<BiIter>::value_type const* rhs);
358
359template <class BiIter>
360 bool
361 operator>=(const sub_match<BiIter>& lhs,
362 typename iterator_traits<BiIter>::value_type const* rhs);
363
364template <class BiIter>
365 bool
366 operator<=(const sub_match<BiIter>& lhs,
367 typename iterator_traits<BiIter>::value_type const* rhs);
368
369template <class BiIter>
370 bool
371 operator==(typename iterator_traits<BiIter>::value_type const& lhs,
372 const sub_match<BiIter>& rhs);
373
374template <class BiIter>
375 bool
376 operator!=(typename iterator_traits<BiIter>::value_type const& lhs,
377 const sub_match<BiIter>& rhs);
378
379template <class BiIter>
380 bool
381 operator<(typename iterator_traits<BiIter>::value_type const& lhs,
382 const sub_match<BiIter>& rhs);
383
384template <class BiIter>
385 bool
386 operator>(typename iterator_traits<BiIter>::value_type const& lhs,
387 const sub_match<BiIter>& rhs);
388
389template <class BiIter>
390 bool
391 operator>=(typename iterator_traits<BiIter>::value_type const& lhs,
392 const sub_match<BiIter>& rhs);
393
394template <class BiIter>
395 bool
396 operator<=(typename iterator_traits<BiIter>::value_type const& lhs,
397 const sub_match<BiIter>& rhs);
398
399template <class BiIter>
400 bool
401 operator==(const sub_match<BiIter>& lhs,
402 typename iterator_traits<BiIter>::value_type const& rhs);
403
404template <class BiIter>
405 bool
406 operator!=(const sub_match<BiIter>& lhs,
407 typename iterator_traits<BiIter>::value_type const& rhs);
408
409template <class BiIter>
410 bool
411 operator<(const sub_match<BiIter>& lhs,
412 typename iterator_traits<BiIter>::value_type const& rhs);
413
414template <class BiIter>
415 bool
416 operator>(const sub_match<BiIter>& lhs,
417 typename iterator_traits<BiIter>::value_type const& rhs);
418
419template <class BiIter>
420 bool
421 operator>=(const sub_match<BiIter>& lhs,
422 typename iterator_traits<BiIter>::value_type const& rhs);
423
424template <class BiIter>
425 bool
426 operator<=(const sub_match<BiIter>& lhs,
427 typename iterator_traits<BiIter>::value_type const& rhs);
428
429template <class charT, class ST, class BiIter>
430 basic_ostream<charT, ST>&
431 operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
432
433template <class BidirectionalIterator,
434 class Allocator = allocator<sub_match<BidirectionalIterator>>>
435class match_results
436{
437public:
438 typedef sub_match<BidirectionalIterator> value_type;
439 typedef const value_type& const_reference;
Marshall Clow103af342014-02-26 01:56:31 +0000440 typedef value_type& reference;
Howard Hinnant3257c982010-06-17 00:34:59 +0000441 typedef /implementation-defined/ const_iterator;
442 typedef const_iterator iterator;
443 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
444 typedef typename allocator_traits<Allocator>::size_type size_type;
445 typedef Allocator allocator_type;
446 typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
447 typedef basic_string<char_type> string_type;
448
449 // construct/copy/destroy:
450 explicit match_results(const Allocator& a = Allocator());
451 match_results(const match_results& m);
Howard Hinnant46623a02012-07-21 01:31:58 +0000452 match_results(match_results&& m) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000453 match_results& operator=(const match_results& m);
454 match_results& operator=(match_results&& m);
455 ~match_results();
456
Howard Hinnant31aaf552010-12-08 21:07:55 +0000457 bool ready() const;
458
Howard Hinnant3257c982010-06-17 00:34:59 +0000459 // size:
460 size_type size() const;
461 size_type max_size() const;
462 bool empty() const;
463
464 // element access:
465 difference_type length(size_type sub = 0) const;
466 difference_type position(size_type sub = 0) const;
467 string_type str(size_type sub = 0) const;
468 const_reference operator[](size_type n) const;
469
470 const_reference prefix() const;
471 const_reference suffix() const;
472
473 const_iterator begin() const;
474 const_iterator end() const;
475 const_iterator cbegin() const;
476 const_iterator cend() const;
477
478 // format:
479 template <class OutputIter>
480 OutputIter
481 format(OutputIter out, const char_type* fmt_first,
482 const char_type* fmt_last,
483 regex_constants::match_flag_type flags = regex_constants::format_default) const;
484 template <class OutputIter, class ST, class SA>
485 OutputIter
486 format(OutputIter out, const basic_string<char_type, ST, SA>& fmt,
487 regex_constants::match_flag_type flags = regex_constants::format_default) const;
488 template <class ST, class SA>
489 basic_string<char_type, ST, SA>
490 format(const basic_string<char_type, ST, SA>& fmt,
491 regex_constants::match_flag_type flags = regex_constants::format_default) const;
492 string_type
493 format(const char_type* fmt,
494 regex_constants::match_flag_type flags = regex_constants::format_default) const;
495
496 // allocator:
497 allocator_type get_allocator() const;
498
499 // swap:
500 void swap(match_results& that);
501};
502
503typedef match_results<const char*> cmatch;
504typedef match_results<const wchar_t*> wcmatch;
505typedef match_results<string::const_iterator> smatch;
506typedef match_results<wstring::const_iterator> wsmatch;
507
508template <class BidirectionalIterator, class Allocator>
509 bool
510 operator==(const match_results<BidirectionalIterator, Allocator>& m1,
511 const match_results<BidirectionalIterator, Allocator>& m2);
512
513template <class BidirectionalIterator, class Allocator>
514 bool
515 operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
516 const match_results<BidirectionalIterator, Allocator>& m2);
517
518template <class BidirectionalIterator, class Allocator>
519 void
520 swap(match_results<BidirectionalIterator, Allocator>& m1,
521 match_results<BidirectionalIterator, Allocator>& m2);
522
523template <class BidirectionalIterator, class Allocator, class charT, class traits>
524 bool
525 regex_match(BidirectionalIterator first, BidirectionalIterator last,
526 match_results<BidirectionalIterator, Allocator>& m,
527 const basic_regex<charT, traits>& e,
528 regex_constants::match_flag_type flags = regex_constants::match_default);
529
530template <class BidirectionalIterator, class charT, class traits>
531 bool
532 regex_match(BidirectionalIterator first, BidirectionalIterator last,
533 const basic_regex<charT, traits>& e,
534 regex_constants::match_flag_type flags = regex_constants::match_default);
535
536template <class charT, class Allocator, class traits>
537 bool
538 regex_match(const charT* str, match_results<const charT*, Allocator>& m,
539 const basic_regex<charT, traits>& e,
540 regex_constants::match_flag_type flags = regex_constants::match_default);
541
542template <class ST, class SA, class Allocator, class charT, class traits>
543 bool
544 regex_match(const basic_string<charT, ST, SA>& s,
545 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
546 const basic_regex<charT, traits>& e,
547 regex_constants::match_flag_type flags = regex_constants::match_default);
548
Marshall Clowe0f86722014-02-19 21:21:11 +0000549template <class ST, class SA, class Allocator, class charT, class traits>
550 bool
551 regex_match(const basic_string<charT, ST, SA>&& s,
552 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
553 const basic_regex<charT, traits>& e,
554 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
555
Howard Hinnant3257c982010-06-17 00:34:59 +0000556template <class charT, class traits>
557 bool
558 regex_match(const charT* str, const basic_regex<charT, traits>& e,
559 regex_constants::match_flag_type flags = regex_constants::match_default);
560
561template <class ST, class SA, class charT, class traits>
562 bool
563 regex_match(const basic_string<charT, ST, SA>& s,
564 const basic_regex<charT, traits>& e,
565 regex_constants::match_flag_type flags = regex_constants::match_default);
566
567template <class BidirectionalIterator, class Allocator, class charT, class traits>
568 bool
569 regex_search(BidirectionalIterator first, BidirectionalIterator last,
570 match_results<BidirectionalIterator, Allocator>& m,
571 const basic_regex<charT, traits>& e,
572 regex_constants::match_flag_type flags = regex_constants::match_default);
573
574template <class BidirectionalIterator, class charT, class traits>
575 bool
576 regex_search(BidirectionalIterator first, BidirectionalIterator last,
577 const basic_regex<charT, traits>& e,
578 regex_constants::match_flag_type flags = regex_constants::match_default);
579
580template <class charT, class Allocator, class traits>
581 bool
582 regex_search(const charT* str, match_results<const charT*, Allocator>& m,
583 const basic_regex<charT, traits>& e,
584 regex_constants::match_flag_type flags = regex_constants::match_default);
585
586template <class charT, class traits>
587 bool
588 regex_search(const charT* str, const basic_regex<charT, traits>& e,
589 regex_constants::match_flag_type flags = regex_constants::match_default);
590
591template <class ST, class SA, class charT, class traits>
592 bool
593 regex_search(const basic_string<charT, ST, SA>& s,
594 const basic_regex<charT, traits>& e,
595 regex_constants::match_flag_type flags = regex_constants::match_default);
596
597template <class ST, class SA, class Allocator, class charT, class traits>
598 bool
599 regex_search(const basic_string<charT, ST, SA>& s,
600 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
601 const basic_regex<charT, traits>& e,
602 regex_constants::match_flag_type flags = regex_constants::match_default);
603
Marshall Clowe0f86722014-02-19 21:21:11 +0000604template <class ST, class SA, class Allocator, class charT, class traits>
605 bool
606 regex_search(const basic_string<charT, ST, SA>&& s,
607 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
608 const basic_regex<charT, traits>& e,
609 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
610
Howard Hinnant3257c982010-06-17 00:34:59 +0000611template <class OutputIterator, class BidirectionalIterator,
612 class traits, class charT, class ST, class SA>
613 OutputIterator
614 regex_replace(OutputIterator out,
615 BidirectionalIterator first, BidirectionalIterator last,
616 const basic_regex<charT, traits>& e,
617 const basic_string<charT, ST, SA>& fmt,
618 regex_constants::match_flag_type flags = regex_constants::match_default);
619
620template <class OutputIterator, class BidirectionalIterator,
621 class traits, class charT>
622 OutputIterator
623 regex_replace(OutputIterator out,
624 BidirectionalIterator first, BidirectionalIterator last,
625 const basic_regex<charT, traits>& e, const charT* fmt,
626 regex_constants::match_flag_type flags = regex_constants::match_default);
627
628template <class traits, class charT, class ST, class SA, class FST, class FSA>>
629 basic_string<charT, ST, SA>
630 regex_replace(const basic_string<charT, ST, SA>& s,
631 const basic_regex<charT, traits>& e,
632 const basic_string<charT, FST, FSA>& fmt,
633 regex_constants::match_flag_type flags = regex_constants::match_default);
634
635template <class traits, class charT, class ST, class SA>
636 basic_string<charT, ST, SA>
637 regex_replace(const basic_string<charT, ST, SA>& s,
638 const basic_regex<charT, traits>& e, const charT* fmt,
639 regex_constants::match_flag_type flags = regex_constants::match_default);
640
641template <class traits, class charT, class ST, class SA>
642 basic_string<charT>
643 regex_replace(const charT* s,
644 const basic_regex<charT, traits>& e,
645 const basic_string<charT, ST, SA>& fmt,
646 regex_constants::match_flag_type flags = regex_constants::match_default);
647
648template <class traits, class charT>
649 basic_string<charT>
650 regex_replace(const charT* s,
651 const basic_regex<charT, traits>& e,
652 const charT* fmt,
653 regex_constants::match_flag_type flags = regex_constants::match_default);
654
655template <class BidirectionalIterator,
656 class charT = typename iterator_traits< BidirectionalIterator>::value_type,
657 class traits = regex_traits<charT>>
658class regex_iterator
659{
660public:
661 typedef basic_regex<charT, traits> regex_type;
662 typedef match_results<BidirectionalIterator> value_type;
663 typedef ptrdiff_t difference_type;
664 typedef const value_type* pointer;
665 typedef const value_type& reference;
666 typedef forward_iterator_tag iterator_category;
667
668 regex_iterator();
669 regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
670 const regex_type& re,
671 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +0000672 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
673 const regex_type&& __re,
674 regex_constants::match_flag_type __m
675 = regex_constants::match_default) = delete; // C++14
Howard Hinnant3257c982010-06-17 00:34:59 +0000676 regex_iterator(const regex_iterator&);
677 regex_iterator& operator=(const regex_iterator&);
678
679 bool operator==(const regex_iterator&) const;
680 bool operator!=(const regex_iterator&) const;
681
682 const value_type& operator*() const;
683 const value_type* operator->() const;
684
685 regex_iterator& operator++();
686 regex_iterator operator++(int);
687};
688
689typedef regex_iterator<const char*> cregex_iterator;
690typedef regex_iterator<const wchar_t*> wcregex_iterator;
691typedef regex_iterator<string::const_iterator> sregex_iterator;
692typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
693
694template <class BidirectionalIterator,
695 class charT = typename iterator_traits< BidirectionalIterator>::value_type,
696 class traits = regex_traits<charT>>
697class regex_token_iterator
698{
699public:
700 typedef basic_regex<charT, traits> regex_type;
701 typedef sub_match<BidirectionalIterator> value_type;
702 typedef ptrdiff_t difference_type;
703 typedef const value_type* pointer;
704 typedef const value_type& reference;
705 typedef forward_iterator_tag iterator_category;
706
707 regex_token_iterator();
708 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
709 const regex_type& re, int submatch = 0,
710 regex_constants::match_flag_type m = regex_constants::match_default);
711 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Marshall Clowe0f86722014-02-19 21:21:11 +0000712 const regex_type&& re, int submatch = 0,
713 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
714 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Howard Hinnant3257c982010-06-17 00:34:59 +0000715 const regex_type& re, const vector<int>& submatches,
716 regex_constants::match_flag_type m = regex_constants::match_default);
717 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Marshall Clowe0f86722014-02-19 21:21:11 +0000718 const regex_type&& re, const vector<int>& submatches,
719 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
720 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Howard Hinnant3257c982010-06-17 00:34:59 +0000721 const regex_type& re, initializer_list<int> submatches,
722 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +0000723 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
724 const regex_type&& re, initializer_list<int> submatches,
725 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
Howard Hinnant3257c982010-06-17 00:34:59 +0000726 template <size_t N>
727 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
728 const regex_type& re, const int (&submatches)[N],
729 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +0000730 template <size_t N>
731 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
732 const regex_type& re, const int (&submatches)[N],
733 regex_constants::match_flag_type m = regex_constants::match_default) = delete // C++14;
Howard Hinnant3257c982010-06-17 00:34:59 +0000734 regex_token_iterator(const regex_token_iterator&);
735 regex_token_iterator& operator=(const regex_token_iterator&);
736
737 bool operator==(const regex_token_iterator&) const;
738 bool operator!=(const regex_token_iterator&) const;
739
740 const value_type& operator*() const;
741 const value_type* operator->() const;
742
743 regex_token_iterator& operator++();
744 regex_token_iterator operator++(int);
745};
746
747typedef regex_token_iterator<const char*> cregex_token_iterator;
748typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
749typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
750typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
751
752} // std
753*/
754
755#include <__config>
756#include <stdexcept>
757#include <__locale>
Howard Hinnant8c2c18d2010-06-24 21:28:00 +0000758#include <initializer_list>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +0000759#include <utility>
760#include <iterator>
761#include <string>
Howard Hinnant7e9d84b2010-06-30 00:21:42 +0000762#include <memory>
763#include <vector>
Howard Hinnantac303862010-07-12 15:51:17 +0000764#include <deque>
Howard Hinnant3257c982010-06-17 00:34:59 +0000765
Howard Hinnant66c6f972011-11-29 16:45:27 +0000766#include <__undef_min_max>
767
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
772_LIBCPP_BEGIN_NAMESPACE_STD
773
774namespace regex_constants
775{
776
777// syntax_option_type
778
779enum syntax_option_type
780{
781 icase = 1 << 0,
782 nosubs = 1 << 1,
783 optimize = 1 << 2,
784 collate = 1 << 3,
Howard Hinnantad2a7ab2010-07-27 17:24:17 +0000785 ECMAScript = 0,
786 basic = 1 << 4,
787 extended = 1 << 5,
788 awk = 1 << 6,
789 grep = 1 << 7,
790 egrep = 1 << 8
Howard Hinnant3257c982010-06-17 00:34:59 +0000791};
792
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000793inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000794_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000795syntax_option_type
796operator~(syntax_option_type __x)
797{
Marshall Clow04bd79b2013-03-22 02:13:55 +0000798 return syntax_option_type(~int(__x) & 0x1FF);
Howard Hinnant3257c982010-06-17 00:34:59 +0000799}
800
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000801inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000802_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000803syntax_option_type
804operator&(syntax_option_type __x, syntax_option_type __y)
805{
806 return syntax_option_type(int(__x) & int(__y));
807}
808
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000809inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000810_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000811syntax_option_type
812operator|(syntax_option_type __x, syntax_option_type __y)
813{
814 return syntax_option_type(int(__x) | int(__y));
815}
816
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000817inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000818_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000819syntax_option_type
820operator^(syntax_option_type __x, syntax_option_type __y)
821{
822 return syntax_option_type(int(__x) ^ int(__y));
823}
824
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000825inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000826syntax_option_type&
827operator&=(syntax_option_type& __x, syntax_option_type __y)
828{
829 __x = __x & __y;
830 return __x;
831}
832
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000833inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000834syntax_option_type&
835operator|=(syntax_option_type& __x, syntax_option_type __y)
836{
837 __x = __x | __y;
838 return __x;
839}
840
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000841inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000842syntax_option_type&
843operator^=(syntax_option_type& __x, syntax_option_type __y)
844{
845 __x = __x ^ __y;
846 return __x;
847}
848
849// match_flag_type
850
851enum match_flag_type
852{
853 match_default = 0,
854 match_not_bol = 1 << 0,
855 match_not_eol = 1 << 1,
856 match_not_bow = 1 << 2,
857 match_not_eow = 1 << 3,
858 match_any = 1 << 4,
859 match_not_null = 1 << 5,
860 match_continuous = 1 << 6,
861 match_prev_avail = 1 << 7,
862 format_default = 0,
863 format_sed = 1 << 8,
864 format_no_copy = 1 << 9,
Howard Hinnanta712c722010-08-16 20:21:16 +0000865 format_first_only = 1 << 10,
866 __no_update_pos = 1 << 11
Howard Hinnant3257c982010-06-17 00:34:59 +0000867};
868
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000869inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000870_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000871match_flag_type
872operator~(match_flag_type __x)
873{
Marshall Clow04bd79b2013-03-22 02:13:55 +0000874 return match_flag_type(~int(__x) & 0x0FFF);
Howard Hinnant3257c982010-06-17 00:34:59 +0000875}
876
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000877inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000878_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000879match_flag_type
880operator&(match_flag_type __x, match_flag_type __y)
881{
882 return match_flag_type(int(__x) & int(__y));
883}
884
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000885inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000886_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000887match_flag_type
888operator|(match_flag_type __x, match_flag_type __y)
889{
890 return match_flag_type(int(__x) | int(__y));
891}
892
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000893inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000894_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000895match_flag_type
896operator^(match_flag_type __x, match_flag_type __y)
897{
898 return match_flag_type(int(__x) ^ int(__y));
899}
900
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000901inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000902match_flag_type&
903operator&=(match_flag_type& __x, match_flag_type __y)
904{
905 __x = __x & __y;
906 return __x;
907}
908
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000909inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000910match_flag_type&
911operator|=(match_flag_type& __x, match_flag_type __y)
912{
913 __x = __x | __y;
914 return __x;
915}
916
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000917inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000918match_flag_type&
919operator^=(match_flag_type& __x, match_flag_type __y)
920{
921 __x = __x ^ __y;
922 return __x;
923}
924
925enum error_type
926{
927 error_collate = 1,
928 error_ctype,
929 error_escape,
930 error_backref,
931 error_brack,
932 error_paren,
933 error_brace,
934 error_badbrace,
935 error_range,
936 error_space,
937 error_badrepeat,
938 error_complexity,
Howard Hinnant8c2c18d2010-06-24 21:28:00 +0000939 error_stack,
Howard Hinnantad2a7ab2010-07-27 17:24:17 +0000940 __re_err_grammar,
941 __re_err_empty,
942 __re_err_unknown
Howard Hinnant3257c982010-06-17 00:34:59 +0000943};
944
945} // regex_constants
946
947class _LIBCPP_EXCEPTION_ABI regex_error
948 : public runtime_error
949{
950 regex_constants::error_type __code_;
951public:
952 explicit regex_error(regex_constants::error_type __ecode);
953 virtual ~regex_error() throw();
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000954 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000955 regex_constants::error_type code() const {return __code_;}
956};
957
958template <class _CharT>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000959struct _LIBCPP_TYPE_VIS_ONLY regex_traits
Howard Hinnant3257c982010-06-17 00:34:59 +0000960{
961public:
962 typedef _CharT char_type;
963 typedef basic_string<char_type> string_type;
964 typedef locale locale_type;
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000965 typedef ctype_base::mask char_class_type;
Howard Hinnant3257c982010-06-17 00:34:59 +0000966
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000967 static const char_class_type __regex_word = 0x80;
Howard Hinnant3257c982010-06-17 00:34:59 +0000968private:
969 locale __loc_;
970 const ctype<char_type>* __ct_;
971 const collate<char_type>* __col_;
972
973public:
974 regex_traits();
975
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000976 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000977 static size_t length(const char_type* __p)
978 {return char_traits<char_type>::length(__p);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000979 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000980 char_type translate(char_type __c) const {return __c;}
981 char_type translate_nocase(char_type __c) const;
982 template <class _ForwardIterator>
983 string_type
984 transform(_ForwardIterator __f, _ForwardIterator __l) const;
985 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000986 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000987 string_type
988 transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
989 {return __transform_primary(__f, __l, char_type());}
990 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000991 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000992 string_type
993 lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
994 {return __lookup_collatename(__f, __l, char_type());}
995 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000996 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000997 char_class_type
998 lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000999 bool __icase = false) const
1000 {return __lookup_classname(__f, __l, __icase, char_type());}
1001 bool isctype(char_type __c, char_class_type __m) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001002 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001003 int value(char_type __ch, int __radix) const
Marshall Clow33ae2332013-10-21 15:43:25 +00001004 {return __regex_traits_value(__ch, __radix);}
Howard Hinnant3257c982010-06-17 00:34:59 +00001005 locale_type imbue(locale_type __l);
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001006 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +00001007 locale_type getloc()const {return __loc_;}
1008
1009private:
1010 void __init();
1011
1012 template <class _ForwardIterator>
1013 string_type
1014 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
1015 template <class _ForwardIterator>
1016 string_type
1017 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
1018
1019 template <class _ForwardIterator>
1020 string_type
1021 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
1022 template <class _ForwardIterator>
1023 string_type
1024 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001025
1026 template <class _ForwardIterator>
1027 char_class_type
1028 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1029 bool __icase, char) const;
1030 template <class _ForwardIterator>
1031 char_class_type
1032 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1033 bool __icase, wchar_t) const;
1034
Marshall Clow33ae2332013-10-21 15:43:25 +00001035 static int __regex_traits_value(unsigned char __ch, int __radix);
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001036 _LIBCPP_INLINE_VISIBILITY
Marshall Clow33ae2332013-10-21 15:43:25 +00001037 int __regex_traits_value(char __ch, int __radix) const
1038 {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
1039 int __regex_traits_value(wchar_t __ch, int __radix) const;
Howard Hinnant3257c982010-06-17 00:34:59 +00001040};
1041
1042template <class _CharT>
Howard Hinnant23fb9722013-03-07 19:38:08 +00001043const typename regex_traits<_CharT>::char_class_type
1044regex_traits<_CharT>::__regex_word;
1045
1046template <class _CharT>
Howard Hinnant3257c982010-06-17 00:34:59 +00001047regex_traits<_CharT>::regex_traits()
1048{
1049 __init();
1050}
1051
1052template <class _CharT>
1053typename regex_traits<_CharT>::char_type
1054regex_traits<_CharT>::translate_nocase(char_type __c) const
1055{
1056 return __ct_->tolower(__c);
1057}
1058
1059template <class _CharT>
1060template <class _ForwardIterator>
1061typename regex_traits<_CharT>::string_type
1062regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
1063{
1064 string_type __s(__f, __l);
1065 return __col_->transform(__s.data(), __s.data() + __s.size());
1066}
1067
1068template <class _CharT>
1069void
1070regex_traits<_CharT>::__init()
1071{
1072 __ct_ = &use_facet<ctype<char_type> >(__loc_);
1073 __col_ = &use_facet<collate<char_type> >(__loc_);
1074}
1075
1076template <class _CharT>
1077typename regex_traits<_CharT>::locale_type
1078regex_traits<_CharT>::imbue(locale_type __l)
1079{
1080 locale __r = __loc_;
1081 __loc_ = __l;
1082 __init();
1083 return __r;
1084}
1085
1086// transform_primary is very FreeBSD-specific
1087
1088template <class _CharT>
1089template <class _ForwardIterator>
1090typename regex_traits<_CharT>::string_type
1091regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1092 _ForwardIterator __l, char) const
1093{
1094 const string_type __s(__f, __l);
1095 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1096 switch (__d.size())
1097 {
1098 case 1:
1099 break;
1100 case 12:
1101 __d[11] = __d[3];
1102 break;
1103 default:
1104 __d.clear();
1105 break;
1106 }
1107 return __d;
1108}
1109
1110template <class _CharT>
1111template <class _ForwardIterator>
1112typename regex_traits<_CharT>::string_type
1113regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1114 _ForwardIterator __l, wchar_t) 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 3:
1123 __d[2] = __d[0];
1124 break;
1125 default:
1126 __d.clear();
1127 break;
1128 }
1129 return __d;
1130}
1131
1132// lookup_collatename is very FreeBSD-specific
1133
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001134_LIBCPP_FUNC_VIS string __get_collation_name(const char* __s);
Howard Hinnant3257c982010-06-17 00:34:59 +00001135
1136template <class _CharT>
1137template <class _ForwardIterator>
1138typename regex_traits<_CharT>::string_type
1139regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1140 _ForwardIterator __l, char) const
1141{
1142 string_type __s(__f, __l);
1143 string_type __r;
1144 if (!__s.empty())
1145 {
1146 __r = __get_collation_name(__s.c_str());
1147 if (__r.empty() && __s.size() <= 2)
1148 {
1149 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1150 if (__r.size() == 1 || __r.size() == 12)
1151 __r = __s;
1152 else
1153 __r.clear();
1154 }
1155 }
1156 return __r;
1157}
1158
1159template <class _CharT>
1160template <class _ForwardIterator>
1161typename regex_traits<_CharT>::string_type
1162regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1163 _ForwardIterator __l, wchar_t) const
1164{
1165 string_type __s(__f, __l);
1166 string __n;
1167 __n.reserve(__s.size());
1168 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1169 __i != __e; ++__i)
1170 {
1171 if (static_cast<unsigned>(*__i) >= 127)
1172 return string_type();
1173 __n.push_back(char(*__i));
1174 }
1175 string_type __r;
1176 if (!__s.empty())
1177 {
1178 __n = __get_collation_name(__n.c_str());
1179 if (!__n.empty())
1180 __r.assign(__n.begin(), __n.end());
1181 else if (__s.size() <= 2)
1182 {
1183 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1184 if (__r.size() == 1 || __r.size() == 3)
1185 __r = __s;
1186 else
1187 __r.clear();
1188 }
1189 }
1190 return __r;
1191}
1192
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001193// lookup_classname
1194
Dan Albert17573862014-07-29 19:23:39 +00001195regex_traits<char>::char_class_type _LIBCPP_FUNC_VIS
1196__get_classname(const char* __s, bool __icase);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001197
1198template <class _CharT>
1199template <class _ForwardIterator>
1200typename regex_traits<_CharT>::char_class_type
1201regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1202 _ForwardIterator __l,
1203 bool __icase, char) const
1204{
1205 string_type __s(__f, __l);
1206 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1207 return __get_classname(__s.c_str(), __icase);
1208}
1209
1210template <class _CharT>
1211template <class _ForwardIterator>
1212typename regex_traits<_CharT>::char_class_type
1213regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1214 _ForwardIterator __l,
1215 bool __icase, wchar_t) const
1216{
1217 string_type __s(__f, __l);
1218 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1219 string __n;
1220 __n.reserve(__s.size());
1221 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1222 __i != __e; ++__i)
1223 {
1224 if (static_cast<unsigned>(*__i) >= 127)
1225 return char_class_type();
1226 __n.push_back(char(*__i));
1227 }
1228 return __get_classname(__n.c_str(), __icase);
1229}
1230
1231template <class _CharT>
1232bool
1233regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
1234{
1235 if (__ct_->is(__m, __c))
1236 return true;
1237 return (__c == '_' && (__m & __regex_word));
1238}
1239
1240template <class _CharT>
1241int
Marshall Clow33ae2332013-10-21 15:43:25 +00001242regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001243{
1244 if ((__ch & 0xF8u) == 0x30) // '0' <= __ch && __ch <= '7'
1245 return __ch - '0';
1246 if (__radix != 8)
1247 {
1248 if ((__ch & 0xFEu) == 0x38) // '8' <= __ch && __ch <= '9'
1249 return __ch - '0';
1250 if (__radix == 16)
1251 {
1252 __ch |= 0x20; // tolower
1253 if ('a' <= __ch && __ch <= 'f')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00001254 return __ch - ('a' - 10);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001255 }
1256 }
1257 return -1;
1258}
1259
1260template <class _CharT>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001261inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001262int
Marshall Clow33ae2332013-10-21 15:43:25 +00001263regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001264{
Marshall Clow33ae2332013-10-21 15:43:25 +00001265 return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001266}
1267
Howard Hinnantac303862010-07-12 15:51:17 +00001268template <class _CharT> class __node;
1269
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001270template <class _BidirectionalIterator> class _LIBCPP_TYPE_VIS_ONLY sub_match;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001271
Howard Hinnant17615b02010-07-27 01:25:38 +00001272template <class _BidirectionalIterator,
1273 class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001274class _LIBCPP_TYPE_VIS_ONLY match_results;
Howard Hinnant17615b02010-07-27 01:25:38 +00001275
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001276template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001277struct __state
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001278{
1279 enum
1280 {
1281 __end_state = -1000,
1282 __consume_input, // -999
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001283 __begin_marked_expr, // -998
1284 __end_marked_expr, // -997
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001285 __pop_state, // -996
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001286 __accept_and_consume, // -995
1287 __accept_but_not_consume, // -994
1288 __reject, // -993
Howard Hinnantac303862010-07-12 15:51:17 +00001289 __split,
1290 __repeat
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001291 };
1292
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001293 int __do_;
Howard Hinnantac303862010-07-12 15:51:17 +00001294 const _CharT* __first_;
1295 const _CharT* __current_;
1296 const _CharT* __last_;
1297 vector<sub_match<const _CharT*> > __sub_matches_;
1298 vector<pair<size_t, const _CharT*> > __loop_data_;
1299 const __node<_CharT>* __node_;
1300 regex_constants::match_flag_type __flags_;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001301 bool __at_first_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001302
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001303 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001304 __state()
1305 : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
1306 __node_(nullptr), __flags_() {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001307};
1308
Howard Hinnantac303862010-07-12 15:51:17 +00001309// __node
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001310
1311template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001312class __node
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001313{
Howard Hinnantac303862010-07-12 15:51:17 +00001314 __node(const __node&);
1315 __node& operator=(const __node&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001316public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001317 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001318
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001319 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001320 __node() {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001321 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001322 virtual ~__node() {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001323
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001324 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001325 virtual void __exec(__state&) const {};
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001326 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001327 virtual void __exec_split(bool, __state&) const {};
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001328};
1329
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001330// __end_state
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001331
1332template <class _CharT>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001333class __end_state
Howard Hinnantac303862010-07-12 15:51:17 +00001334 : public __node<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001335{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001336public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001337 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001338
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001339 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001340 __end_state() {}
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001341
Howard Hinnantac303862010-07-12 15:51:17 +00001342 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001343};
1344
1345template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001346void
1347__end_state<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001348{
Howard Hinnantac303862010-07-12 15:51:17 +00001349 __s.__do_ = __state::__end_state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001350}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001351
1352// __has_one_state
1353
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001354template <class _CharT>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001355class __has_one_state
Howard Hinnantac303862010-07-12 15:51:17 +00001356 : public __node<_CharT>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001357{
Howard Hinnantac303862010-07-12 15:51:17 +00001358 __node<_CharT>* __first_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001359
1360public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001361 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001362 explicit __has_one_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001363 : __first_(__s) {}
1364
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001365 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001366 __node<_CharT>* first() const {return __first_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001367 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001368 __node<_CharT>*& first() {return __first_;}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001369};
1370
1371// __owns_one_state
1372
1373template <class _CharT>
1374class __owns_one_state
1375 : public __has_one_state<_CharT>
1376{
1377 typedef __has_one_state<_CharT> base;
1378
1379public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001380 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001381 explicit __owns_one_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001382 : base(__s) {}
1383
1384 virtual ~__owns_one_state();
1385};
1386
1387template <class _CharT>
1388__owns_one_state<_CharT>::~__owns_one_state()
1389{
1390 delete this->first();
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001391}
1392
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001393// __empty_state
1394
1395template <class _CharT>
1396class __empty_state
1397 : public __owns_one_state<_CharT>
1398{
1399 typedef __owns_one_state<_CharT> base;
1400
1401public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001402 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001403
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001404 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001405 explicit __empty_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001406 : base(__s) {}
1407
Howard Hinnantac303862010-07-12 15:51:17 +00001408 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001409};
1410
1411template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001412void
1413__empty_state<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001414{
Howard Hinnantac303862010-07-12 15:51:17 +00001415 __s.__do_ = __state::__accept_but_not_consume;
1416 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001417}
1418
1419// __empty_non_own_state
1420
1421template <class _CharT>
1422class __empty_non_own_state
1423 : public __has_one_state<_CharT>
1424{
1425 typedef __has_one_state<_CharT> base;
1426
1427public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001428 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001429
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001430 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001431 explicit __empty_non_own_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001432 : base(__s) {}
1433
Howard Hinnantac303862010-07-12 15:51:17 +00001434 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001435};
1436
1437template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001438void
1439__empty_non_own_state<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001440{
Howard Hinnantac303862010-07-12 15:51:17 +00001441 __s.__do_ = __state::__accept_but_not_consume;
1442 __s.__node_ = this->first();
1443}
1444
1445// __repeat_one_loop
1446
1447template <class _CharT>
1448class __repeat_one_loop
1449 : public __has_one_state<_CharT>
1450{
1451 typedef __has_one_state<_CharT> base;
1452
1453public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001454 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantac303862010-07-12 15:51:17 +00001455
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001456 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001457 explicit __repeat_one_loop(__node<_CharT>* __s)
1458 : base(__s) {}
1459
1460 virtual void __exec(__state&) const;
Howard Hinnantac303862010-07-12 15:51:17 +00001461};
1462
1463template <class _CharT>
1464void
1465__repeat_one_loop<_CharT>::__exec(__state& __s) const
1466{
1467 __s.__do_ = __state::__repeat;
1468 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001469}
1470
1471// __owns_two_states
1472
1473template <class _CharT>
1474class __owns_two_states
1475 : public __owns_one_state<_CharT>
1476{
1477 typedef __owns_one_state<_CharT> base;
1478
1479 base* __second_;
1480
1481public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001482 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001483 explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001484 : base(__s1), __second_(__s2) {}
1485
1486 virtual ~__owns_two_states();
1487
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001488 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001489 base* second() const {return __second_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001490 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001491 base*& second() {return __second_;}
1492};
1493
1494template <class _CharT>
1495__owns_two_states<_CharT>::~__owns_two_states()
1496{
1497 delete __second_;
1498}
1499
1500// __loop
1501
1502template <class _CharT>
1503class __loop
1504 : public __owns_two_states<_CharT>
1505{
1506 typedef __owns_two_states<_CharT> base;
1507
1508 size_t __min_;
1509 size_t __max_;
1510 unsigned __loop_id_;
Howard Hinnantac303862010-07-12 15:51:17 +00001511 unsigned __mexp_begin_;
1512 unsigned __mexp_end_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001513 bool __greedy_;
1514
1515public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001516 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001517
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001518 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001519 explicit __loop(unsigned __loop_id,
Howard Hinnantac303862010-07-12 15:51:17 +00001520 __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
1521 unsigned __mexp_begin, unsigned __mexp_end,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001522 bool __greedy = true,
1523 size_t __min = 0,
1524 size_t __max = numeric_limits<size_t>::max())
1525 : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
Howard Hinnantac303862010-07-12 15:51:17 +00001526 __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001527 __greedy_(__greedy) {}
1528
Howard Hinnantac303862010-07-12 15:51:17 +00001529 virtual void __exec(__state& __s) const;
1530 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001531
Howard Hinnantac303862010-07-12 15:51:17 +00001532private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001533 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001534 void __init_repeat(__state& __s) const
1535 {
1536 __s.__loop_data_[__loop_id_].second = __s.__current_;
1537 for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
1538 {
1539 __s.__sub_matches_[__i].first = __s.__last_;
1540 __s.__sub_matches_[__i].second = __s.__last_;
1541 __s.__sub_matches_[__i].matched = false;
1542 }
1543 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001544};
1545
1546template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001547void
1548__loop<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001549{
Howard Hinnantac303862010-07-12 15:51:17 +00001550 if (__s.__do_ == __state::__repeat)
1551 {
1552 bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
1553 bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
1554 if (__do_repeat && __do_alt &&
1555 __s.__loop_data_[__loop_id_].second == __s.__current_)
1556 __do_repeat = false;
1557 if (__do_repeat && __do_alt)
1558 __s.__do_ = __state::__split;
1559 else if (__do_repeat)
1560 {
1561 __s.__do_ = __state::__accept_but_not_consume;
1562 __s.__node_ = this->first();
1563 __init_repeat(__s);
1564 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001565 else
Howard Hinnantac303862010-07-12 15:51:17 +00001566 {
1567 __s.__do_ = __state::__accept_but_not_consume;
1568 __s.__node_ = this->second();
1569 }
1570 }
1571 else
1572 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00001573 __s.__loop_data_[__loop_id_].first = 0;
1574 bool __do_repeat = 0 < __max_;
1575 bool __do_alt = 0 >= __min_;
1576 if (__do_repeat && __do_alt)
Howard Hinnantac303862010-07-12 15:51:17 +00001577 __s.__do_ = __state::__split;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00001578 else if (__do_repeat)
1579 {
1580 __s.__do_ = __state::__accept_but_not_consume;
1581 __s.__node_ = this->first();
1582 __init_repeat(__s);
1583 }
Howard Hinnantac303862010-07-12 15:51:17 +00001584 else
1585 {
1586 __s.__do_ = __state::__accept_but_not_consume;
1587 __s.__node_ = this->second();
1588 }
1589 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001590}
1591
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001592template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001593void
1594__loop<_CharT>::__exec_split(bool __second, __state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001595{
Howard Hinnantac303862010-07-12 15:51:17 +00001596 __s.__do_ = __state::__accept_but_not_consume;
1597 if (__greedy_ != __second)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001598 {
Howard Hinnantac303862010-07-12 15:51:17 +00001599 __s.__node_ = this->first();
1600 __init_repeat(__s);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001601 }
Howard Hinnantac303862010-07-12 15:51:17 +00001602 else
1603 __s.__node_ = this->second();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001604}
1605
Howard Hinnantaa698082010-07-16 19:08:36 +00001606// __alternate
1607
1608template <class _CharT>
1609class __alternate
1610 : public __owns_two_states<_CharT>
1611{
1612 typedef __owns_two_states<_CharT> base;
1613
1614public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001615 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantaa698082010-07-16 19:08:36 +00001616
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001617 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa698082010-07-16 19:08:36 +00001618 explicit __alternate(__owns_one_state<_CharT>* __s1,
1619 __owns_one_state<_CharT>* __s2)
1620 : base(__s1, __s2) {}
1621
1622 virtual void __exec(__state& __s) const;
1623 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnantaa698082010-07-16 19:08:36 +00001624};
1625
1626template <class _CharT>
1627void
1628__alternate<_CharT>::__exec(__state& __s) const
1629{
1630 __s.__do_ = __state::__split;
1631}
1632
1633template <class _CharT>
1634void
1635__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
1636{
1637 __s.__do_ = __state::__accept_but_not_consume;
Howard Hinnant1371b2e2010-07-22 14:12:20 +00001638 if (__second)
Howard Hinnantaa698082010-07-16 19:08:36 +00001639 __s.__node_ = this->second();
Howard Hinnant1371b2e2010-07-22 14:12:20 +00001640 else
1641 __s.__node_ = this->first();
Howard Hinnantaa698082010-07-16 19:08:36 +00001642}
1643
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001644// __begin_marked_subexpression
1645
1646template <class _CharT>
1647class __begin_marked_subexpression
1648 : public __owns_one_state<_CharT>
1649{
1650 typedef __owns_one_state<_CharT> base;
1651
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001652 unsigned __mexp_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001653public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001654 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001655
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001656 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001657 explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001658 : base(__s), __mexp_(__mexp) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001659
Howard Hinnantac303862010-07-12 15:51:17 +00001660 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001661};
1662
1663template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001664void
1665__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001666{
Howard Hinnantac303862010-07-12 15:51:17 +00001667 __s.__do_ = __state::__accept_but_not_consume;
1668 __s.__sub_matches_[__mexp_-1].first = __s.__current_;
1669 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001670}
1671
1672// __end_marked_subexpression
1673
1674template <class _CharT>
1675class __end_marked_subexpression
1676 : public __owns_one_state<_CharT>
1677{
1678 typedef __owns_one_state<_CharT> base;
1679
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001680 unsigned __mexp_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001681public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001682 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001683
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001684 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001685 explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001686 : base(__s), __mexp_(__mexp) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001687
Howard Hinnantac303862010-07-12 15:51:17 +00001688 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001689};
1690
1691template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001692void
1693__end_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001694{
Howard Hinnantac303862010-07-12 15:51:17 +00001695 __s.__do_ = __state::__accept_but_not_consume;
1696 __s.__sub_matches_[__mexp_-1].second = __s.__current_;
1697 __s.__sub_matches_[__mexp_-1].matched = true;
1698 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001699}
1700
Howard Hinnantcba352d2010-07-12 18:16:05 +00001701// __back_ref
1702
1703template <class _CharT>
1704class __back_ref
1705 : public __owns_one_state<_CharT>
1706{
1707 typedef __owns_one_state<_CharT> base;
1708
1709 unsigned __mexp_;
1710public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001711 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcba352d2010-07-12 18:16:05 +00001712
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001713 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcba352d2010-07-12 18:16:05 +00001714 explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
1715 : base(__s), __mexp_(__mexp) {}
1716
1717 virtual void __exec(__state&) const;
Howard Hinnantcba352d2010-07-12 18:16:05 +00001718};
1719
1720template <class _CharT>
1721void
1722__back_ref<_CharT>::__exec(__state& __s) const
1723{
1724 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1725 if (__sm.matched)
1726 {
1727 ptrdiff_t __len = __sm.second - __sm.first;
1728 if (__s.__last_ - __s.__current_ >= __len &&
Howard Hinnant0949eed2011-06-30 21:18:19 +00001729 _VSTD::equal(__sm.first, __sm.second, __s.__current_))
Howard Hinnantcba352d2010-07-12 18:16:05 +00001730 {
1731 __s.__do_ = __state::__accept_but_not_consume;
1732 __s.__current_ += __len;
1733 __s.__node_ = this->first();
1734 }
1735 else
1736 {
1737 __s.__do_ = __state::__reject;
1738 __s.__node_ = nullptr;
1739 }
1740 }
1741 else
1742 {
1743 __s.__do_ = __state::__reject;
1744 __s.__node_ = nullptr;
1745 }
1746}
1747
Howard Hinnante34f17d2010-07-12 19:11:27 +00001748// __back_ref_icase
1749
1750template <class _CharT, class _Traits>
1751class __back_ref_icase
1752 : public __owns_one_state<_CharT>
1753{
1754 typedef __owns_one_state<_CharT> base;
1755
1756 _Traits __traits_;
1757 unsigned __mexp_;
1758public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001759 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001760
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001761 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00001762 explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
1763 __node<_CharT>* __s)
1764 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1765
1766 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001767};
1768
1769template <class _CharT, class _Traits>
1770void
1771__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
1772{
1773 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1774 if (__sm.matched)
1775 {
1776 ptrdiff_t __len = __sm.second - __sm.first;
1777 if (__s.__last_ - __s.__current_ >= __len)
1778 {
1779 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1780 {
1781 if (__traits_.translate_nocase(__sm.first[__i]) !=
1782 __traits_.translate_nocase(__s.__current_[__i]))
1783 goto __not_equal;
1784 }
1785 __s.__do_ = __state::__accept_but_not_consume;
1786 __s.__current_ += __len;
1787 __s.__node_ = this->first();
1788 }
1789 else
1790 {
1791 __s.__do_ = __state::__reject;
1792 __s.__node_ = nullptr;
1793 }
1794 }
1795 else
1796 {
1797__not_equal:
1798 __s.__do_ = __state::__reject;
1799 __s.__node_ = nullptr;
1800 }
1801}
1802
1803// __back_ref_collate
1804
1805template <class _CharT, class _Traits>
1806class __back_ref_collate
1807 : public __owns_one_state<_CharT>
1808{
1809 typedef __owns_one_state<_CharT> base;
1810
1811 _Traits __traits_;
1812 unsigned __mexp_;
1813public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001814 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001815
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001816 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00001817 explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
1818 __node<_CharT>* __s)
1819 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1820
1821 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001822};
1823
1824template <class _CharT, class _Traits>
1825void
1826__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
1827{
1828 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1829 if (__sm.matched)
1830 {
1831 ptrdiff_t __len = __sm.second - __sm.first;
1832 if (__s.__last_ - __s.__current_ >= __len)
1833 {
1834 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1835 {
1836 if (__traits_.translate(__sm.first[__i]) !=
1837 __traits_.translate(__s.__current_[__i]))
1838 goto __not_equal;
1839 }
1840 __s.__do_ = __state::__accept_but_not_consume;
1841 __s.__current_ += __len;
1842 __s.__node_ = this->first();
1843 }
1844 else
1845 {
1846 __s.__do_ = __state::__reject;
1847 __s.__node_ = nullptr;
1848 }
1849 }
1850 else
1851 {
1852__not_equal:
1853 __s.__do_ = __state::__reject;
1854 __s.__node_ = nullptr;
1855 }
1856}
1857
Howard Hinnant17615b02010-07-27 01:25:38 +00001858// __word_boundary
1859
1860template <class _CharT, class _Traits>
1861class __word_boundary
1862 : public __owns_one_state<_CharT>
1863{
1864 typedef __owns_one_state<_CharT> base;
1865
1866 _Traits __traits_;
1867 bool __invert_;
1868public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001869 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant17615b02010-07-27 01:25:38 +00001870
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001871 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00001872 explicit __word_boundary(const _Traits& __traits, bool __invert,
1873 __node<_CharT>* __s)
1874 : base(__s), __traits_(__traits), __invert_(__invert) {}
1875
1876 virtual void __exec(__state&) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00001877};
1878
1879template <class _CharT, class _Traits>
1880void
1881__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
1882{
1883 bool __is_word_b = false;
1884 if (__s.__first_ != __s.__last_)
1885 {
1886 if (__s.__current_ == __s.__last_)
1887 {
1888 if (!(__s.__flags_ & regex_constants::match_not_eow))
1889 {
1890 _CharT __c = __s.__current_[-1];
1891 __is_word_b = __c == '_' ||
1892 __traits_.isctype(__c, ctype_base::alnum);
1893 }
1894 }
Howard Hinnantf3dcca02010-07-29 15:17:28 +00001895 else if (__s.__current_ == __s.__first_ &&
1896 !(__s.__flags_ & regex_constants::match_prev_avail))
Howard Hinnant17615b02010-07-27 01:25:38 +00001897 {
1898 if (!(__s.__flags_ & regex_constants::match_not_bow))
1899 {
1900 _CharT __c = *__s.__current_;
1901 __is_word_b = __c == '_' ||
1902 __traits_.isctype(__c, ctype_base::alnum);
1903 }
1904 }
1905 else
1906 {
1907 _CharT __c1 = __s.__current_[-1];
1908 _CharT __c2 = *__s.__current_;
1909 bool __is_c1_b = __c1 == '_' ||
1910 __traits_.isctype(__c1, ctype_base::alnum);
1911 bool __is_c2_b = __c2 == '_' ||
1912 __traits_.isctype(__c2, ctype_base::alnum);
1913 __is_word_b = __is_c1_b != __is_c2_b;
1914 }
1915 }
1916 if (__is_word_b != __invert_)
1917 {
1918 __s.__do_ = __state::__accept_but_not_consume;
1919 __s.__node_ = this->first();
1920 }
1921 else
1922 {
1923 __s.__do_ = __state::__reject;
1924 __s.__node_ = nullptr;
1925 }
1926}
1927
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001928// __l_anchor
1929
1930template <class _CharT>
1931class __l_anchor
1932 : public __owns_one_state<_CharT>
1933{
1934 typedef __owns_one_state<_CharT> base;
1935
1936public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001937 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001938
1939 _LIBCPP_INLINE_VISIBILITY
1940 __l_anchor(__node<_CharT>* __s)
1941 : base(__s) {}
1942
1943 virtual void __exec(__state&) const;
1944};
1945
1946template <class _CharT>
1947void
1948__l_anchor<_CharT>::__exec(__state& __s) const
1949{
1950 if (__s.__at_first_ && __s.__current_ == __s.__first_)
1951 {
1952 __s.__do_ = __state::__accept_but_not_consume;
1953 __s.__node_ = this->first();
1954 }
1955 else
1956 {
1957 __s.__do_ = __state::__reject;
1958 __s.__node_ = nullptr;
1959 }
1960}
1961
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001962// __r_anchor
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001963
1964template <class _CharT>
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001965class __r_anchor
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001966 : public __owns_one_state<_CharT>
1967{
1968 typedef __owns_one_state<_CharT> base;
1969
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001970public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001971 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001972
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001973 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001974 __r_anchor(__node<_CharT>* __s)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001975 : base(__s) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001976
Howard Hinnantac303862010-07-12 15:51:17 +00001977 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001978};
1979
1980template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001981void
1982__r_anchor<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001983{
Howard Hinnantac303862010-07-12 15:51:17 +00001984 if (__s.__current_ == __s.__last_)
1985 {
1986 __s.__do_ = __state::__accept_but_not_consume;
1987 __s.__node_ = this->first();
1988 }
1989 else
1990 {
1991 __s.__do_ = __state::__reject;
1992 __s.__node_ = nullptr;
1993 }
1994}
1995
1996// __match_any
1997
1998template <class _CharT>
1999class __match_any
2000 : public __owns_one_state<_CharT>
2001{
2002 typedef __owns_one_state<_CharT> base;
2003
2004public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002005 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantac303862010-07-12 15:51:17 +00002006
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002007 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00002008 __match_any(__node<_CharT>* __s)
2009 : base(__s) {}
2010
2011 virtual void __exec(__state&) const;
Howard Hinnantac303862010-07-12 15:51:17 +00002012};
2013
2014template <class _CharT>
2015void
2016__match_any<_CharT>::__exec(__state& __s) const
2017{
2018 if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
2019 {
2020 __s.__do_ = __state::__accept_and_consume;
2021 ++__s.__current_;
2022 __s.__node_ = this->first();
2023 }
2024 else
2025 {
2026 __s.__do_ = __state::__reject;
2027 __s.__node_ = nullptr;
2028 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002029}
2030
Howard Hinnant17615b02010-07-27 01:25:38 +00002031// __match_any_but_newline
2032
2033template <class _CharT>
2034class __match_any_but_newline
2035 : public __owns_one_state<_CharT>
2036{
2037 typedef __owns_one_state<_CharT> base;
2038
2039public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002040 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant17615b02010-07-27 01:25:38 +00002041
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002042 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002043 __match_any_but_newline(__node<_CharT>* __s)
2044 : base(__s) {}
2045
2046 virtual void __exec(__state&) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00002047};
2048
Howard Hinnant0f678bd2013-08-12 18:38:34 +00002049template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
2050template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
2051
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002052// __match_char
2053
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002054template <class _CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002055class __match_char
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002056 : public __owns_one_state<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002057{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002058 typedef __owns_one_state<_CharT> base;
2059
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002060 _CharT __c_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002061
2062 __match_char(const __match_char&);
2063 __match_char& operator=(const __match_char&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002064public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002065 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002066
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002067 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00002068 __match_char(_CharT __c, __node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002069 : base(__s), __c_(__c) {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002070
Howard Hinnantac303862010-07-12 15:51:17 +00002071 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002072};
2073
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002074template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00002075void
2076__match_char<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002077{
Howard Hinnantac303862010-07-12 15:51:17 +00002078 if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2079 {
2080 __s.__do_ = __state::__accept_and_consume;
2081 ++__s.__current_;
2082 __s.__node_ = this->first();
2083 }
2084 else
2085 {
2086 __s.__do_ = __state::__reject;
2087 __s.__node_ = nullptr;
2088 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002089}
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002090
Howard Hinnante34f17d2010-07-12 19:11:27 +00002091// __match_char_icase
2092
2093template <class _CharT, class _Traits>
2094class __match_char_icase
2095 : public __owns_one_state<_CharT>
2096{
2097 typedef __owns_one_state<_CharT> base;
2098
2099 _Traits __traits_;
2100 _CharT __c_;
2101
2102 __match_char_icase(const __match_char_icase&);
2103 __match_char_icase& operator=(const __match_char_icase&);
2104public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002105 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002106
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002107 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002108 __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2109 : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2110
2111 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002112};
2113
2114template <class _CharT, class _Traits>
2115void
2116__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2117{
2118 if (__s.__current_ != __s.__last_ &&
2119 __traits_.translate_nocase(*__s.__current_) == __c_)
2120 {
2121 __s.__do_ = __state::__accept_and_consume;
2122 ++__s.__current_;
2123 __s.__node_ = this->first();
2124 }
2125 else
2126 {
2127 __s.__do_ = __state::__reject;
2128 __s.__node_ = nullptr;
2129 }
2130}
2131
2132// __match_char_collate
2133
2134template <class _CharT, class _Traits>
2135class __match_char_collate
2136 : public __owns_one_state<_CharT>
2137{
2138 typedef __owns_one_state<_CharT> base;
2139
2140 _Traits __traits_;
2141 _CharT __c_;
2142
2143 __match_char_collate(const __match_char_collate&);
2144 __match_char_collate& operator=(const __match_char_collate&);
2145public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002146 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002147
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002148 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002149 __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2150 : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2151
2152 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002153};
2154
2155template <class _CharT, class _Traits>
2156void
2157__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2158{
2159 if (__s.__current_ != __s.__last_ &&
2160 __traits_.translate(*__s.__current_) == __c_)
2161 {
2162 __s.__do_ = __state::__accept_and_consume;
2163 ++__s.__current_;
2164 __s.__node_ = this->first();
2165 }
2166 else
2167 {
2168 __s.__do_ = __state::__reject;
2169 __s.__node_ = nullptr;
2170 }
2171}
2172
Howard Hinnant173968a2010-07-13 21:48:06 +00002173// __bracket_expression
2174
2175template <class _CharT, class _Traits>
2176class __bracket_expression
2177 : public __owns_one_state<_CharT>
2178{
2179 typedef __owns_one_state<_CharT> base;
2180 typedef typename _Traits::string_type string_type;
2181
2182 _Traits __traits_;
2183 vector<_CharT> __chars_;
Howard Hinnant15476f32010-07-28 17:35:27 +00002184 vector<_CharT> __neg_chars_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002185 vector<pair<string_type, string_type> > __ranges_;
2186 vector<pair<_CharT, _CharT> > __digraphs_;
2187 vector<string_type> __equivalences_;
Dan Albert17573862014-07-29 19:23:39 +00002188 typename regex_traits<_CharT>::char_class_type __mask_;
2189 typename regex_traits<_CharT>::char_class_type __neg_mask_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002190 bool __negate_;
2191 bool __icase_;
2192 bool __collate_;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002193 bool __might_have_digraph_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002194
2195 __bracket_expression(const __bracket_expression&);
2196 __bracket_expression& operator=(const __bracket_expression&);
2197public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002198 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant173968a2010-07-13 21:48:06 +00002199
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002200 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002201 __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2202 bool __negate, bool __icase, bool __collate)
Howard Hinnant15476f32010-07-28 17:35:27 +00002203 : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2204 __negate_(__negate), __icase_(__icase), __collate_(__collate),
Howard Hinnant68025ed2010-07-14 15:45:11 +00002205 __might_have_digraph_(__traits_.getloc().name() != "C") {}
Howard Hinnant173968a2010-07-13 21:48:06 +00002206
2207 virtual void __exec(__state&) const;
2208
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002209 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002210 bool __negated() const {return __negate_;}
2211
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002212 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002213 void __add_char(_CharT __c)
2214 {
2215 if (__icase_)
2216 __chars_.push_back(__traits_.translate_nocase(__c));
2217 else if (__collate_)
2218 __chars_.push_back(__traits_.translate(__c));
2219 else
2220 __chars_.push_back(__c);
2221 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002222 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002223 void __add_neg_char(_CharT __c)
2224 {
2225 if (__icase_)
2226 __neg_chars_.push_back(__traits_.translate_nocase(__c));
2227 else if (__collate_)
2228 __neg_chars_.push_back(__traits_.translate(__c));
2229 else
2230 __neg_chars_.push_back(__c);
2231 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002232 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002233 void __add_range(string_type __b, string_type __e)
2234 {
2235 if (__collate_)
2236 {
2237 if (__icase_)
2238 {
2239 for (size_t __i = 0; __i < __b.size(); ++__i)
2240 __b[__i] = __traits_.translate_nocase(__b[__i]);
2241 for (size_t __i = 0; __i < __e.size(); ++__i)
2242 __e[__i] = __traits_.translate_nocase(__e[__i]);
2243 }
2244 else
2245 {
2246 for (size_t __i = 0; __i < __b.size(); ++__i)
2247 __b[__i] = __traits_.translate(__b[__i]);
2248 for (size_t __i = 0; __i < __e.size(); ++__i)
2249 __e[__i] = __traits_.translate(__e[__i]);
2250 }
2251 __ranges_.push_back(make_pair(
2252 __traits_.transform(__b.begin(), __b.end()),
2253 __traits_.transform(__e.begin(), __e.end())));
2254 }
2255 else
2256 {
Howard Hinnantd4444702010-08-11 17:04:31 +00002257#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00002258 if (__b.size() != 1 || __e.size() != 1)
2259 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00002260#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00002261 if (__icase_)
2262 {
2263 __b[0] = __traits_.translate_nocase(__b[0]);
2264 __e[0] = __traits_.translate_nocase(__e[0]);
2265 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002266 __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
Howard Hinnant173968a2010-07-13 21:48:06 +00002267 }
2268 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002269 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002270 void __add_digraph(_CharT __c1, _CharT __c2)
2271 {
2272 if (__icase_)
2273 __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
2274 __traits_.translate_nocase(__c2)));
2275 else if (__collate_)
2276 __digraphs_.push_back(make_pair(__traits_.translate(__c1),
2277 __traits_.translate(__c2)));
2278 else
2279 __digraphs_.push_back(make_pair(__c1, __c2));
2280 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002281 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002282 void __add_equivalence(const string_type& __s)
2283 {__equivalences_.push_back(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002284 _LIBCPP_INLINE_VISIBILITY
Dan Albert17573862014-07-29 19:23:39 +00002285 void __add_class(typename regex_traits<_CharT>::char_class_type __mask)
Howard Hinnant173968a2010-07-13 21:48:06 +00002286 {__mask_ |= __mask;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002287 _LIBCPP_INLINE_VISIBILITY
Dan Albert17573862014-07-29 19:23:39 +00002288 void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask)
Howard Hinnant15476f32010-07-28 17:35:27 +00002289 {__neg_mask_ |= __mask;}
Howard Hinnant173968a2010-07-13 21:48:06 +00002290};
2291
2292template <class _CharT, class _Traits>
2293void
2294__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2295{
2296 bool __found = false;
2297 unsigned __consumed = 0;
2298 if (__s.__current_ != __s.__last_)
2299 {
2300 ++__consumed;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002301 if (__might_have_digraph_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002302 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002303 const _CharT* __next = _VSTD::next(__s.__current_);
Howard Hinnant68025ed2010-07-14 15:45:11 +00002304 if (__next != __s.__last_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002305 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002306 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2307 if (__icase_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002308 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002309 __ch2.first = __traits_.translate_nocase(__ch2.first);
2310 __ch2.second = __traits_.translate_nocase(__ch2.second);
2311 }
2312 else if (__collate_)
2313 {
2314 __ch2.first = __traits_.translate(__ch2.first);
2315 __ch2.second = __traits_.translate(__ch2.second);
2316 }
2317 if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2318 {
2319 // __ch2 is a digraph in this locale
2320 ++__consumed;
2321 for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2322 {
2323 if (__ch2 == __digraphs_[__i])
2324 {
2325 __found = true;
2326 goto __exit;
2327 }
2328 }
2329 if (__collate_ && !__ranges_.empty())
2330 {
2331 string_type __s2 = __traits_.transform(&__ch2.first,
2332 &__ch2.first + 2);
2333 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2334 {
2335 if (__ranges_[__i].first <= __s2 &&
2336 __s2 <= __ranges_[__i].second)
2337 {
2338 __found = true;
2339 goto __exit;
2340 }
2341 }
2342 }
2343 if (!__equivalences_.empty())
2344 {
2345 string_type __s2 = __traits_.transform_primary(&__ch2.first,
2346 &__ch2.first + 2);
2347 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2348 {
2349 if (__s2 == __equivalences_[__i])
2350 {
2351 __found = true;
2352 goto __exit;
2353 }
2354 }
2355 }
2356 if (__traits_.isctype(__ch2.first, __mask_) &&
2357 __traits_.isctype(__ch2.second, __mask_))
Howard Hinnant173968a2010-07-13 21:48:06 +00002358 {
2359 __found = true;
2360 goto __exit;
2361 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002362 if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2363 !__traits_.isctype(__ch2.second, __neg_mask_))
2364 {
2365 __found = true;
2366 goto __exit;
2367 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002368 goto __exit;
2369 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002370 }
2371 }
2372 // test *__s.__current_ as not a digraph
2373 _CharT __ch = *__s.__current_;
2374 if (__icase_)
2375 __ch = __traits_.translate_nocase(__ch);
2376 else if (__collate_)
2377 __ch = __traits_.translate(__ch);
2378 for (size_t __i = 0; __i < __chars_.size(); ++__i)
2379 {
2380 if (__ch == __chars_[__i])
2381 {
2382 __found = true;
2383 goto __exit;
2384 }
2385 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002386 if (!__neg_chars_.empty())
2387 {
2388 for (size_t __i = 0; __i < __neg_chars_.size(); ++__i)
2389 {
2390 if (__ch == __neg_chars_[__i])
2391 goto __is_neg_char;
2392 }
2393 __found = true;
2394 goto __exit;
2395 }
2396__is_neg_char:
Howard Hinnant173968a2010-07-13 21:48:06 +00002397 if (!__ranges_.empty())
2398 {
2399 string_type __s2 = __collate_ ?
2400 __traits_.transform(&__ch, &__ch + 1) :
2401 string_type(1, __ch);
2402 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2403 {
2404 if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2405 {
2406 __found = true;
2407 goto __exit;
2408 }
2409 }
2410 }
2411 if (!__equivalences_.empty())
2412 {
2413 string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2414 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2415 {
2416 if (__s2 == __equivalences_[__i])
2417 {
2418 __found = true;
2419 goto __exit;
2420 }
2421 }
2422 }
2423 if (__traits_.isctype(__ch, __mask_))
Howard Hinnant15476f32010-07-28 17:35:27 +00002424 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002425 __found = true;
Howard Hinnant15476f32010-07-28 17:35:27 +00002426 goto __exit;
2427 }
2428 if (__neg_mask_ && !__traits_.isctype(__ch, __neg_mask_))
2429 {
2430 __found = true;
2431 goto __exit;
2432 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002433 }
2434 else
2435 __found = __negate_; // force reject
2436__exit:
2437 if (__found != __negate_)
2438 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002439 __s.__do_ = __state::__accept_and_consume;
2440 __s.__current_ += __consumed;
2441 __s.__node_ = this->first();
2442 }
2443 else
2444 {
2445 __s.__do_ = __state::__reject;
2446 __s.__node_ = nullptr;
2447 }
2448}
2449
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00002450template <class _CharT, class _Traits> class __lookahead;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002451
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002452template <class _CharT, class _Traits = regex_traits<_CharT> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +00002453class _LIBCPP_TYPE_VIS_ONLY basic_regex
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002454{
2455public:
2456 // types:
2457 typedef _CharT value_type;
2458 typedef regex_constants::syntax_option_type flag_type;
2459 typedef typename _Traits::locale_type locale_type;
2460
2461private:
2462 _Traits __traits_;
2463 flag_type __flags_;
2464 unsigned __marked_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002465 unsigned __loop_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002466 int __open_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002467 shared_ptr<__empty_state<_CharT> > __start_;
2468 __owns_one_state<_CharT>* __end_;
2469
Howard Hinnant0949eed2011-06-30 21:18:19 +00002470 typedef _VSTD::__state<_CharT> __state;
2471 typedef _VSTD::__node<_CharT> __node;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002472
2473public:
2474 // constants:
Howard Hinnant46623a02012-07-21 01:31:58 +00002475 static const regex_constants::syntax_option_type icase = regex_constants::icase;
2476 static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2477 static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
2478 static const regex_constants::syntax_option_type collate = regex_constants::collate;
2479 static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2480 static const regex_constants::syntax_option_type basic = regex_constants::basic;
2481 static const regex_constants::syntax_option_type extended = regex_constants::extended;
2482 static const regex_constants::syntax_option_type awk = regex_constants::awk;
2483 static const regex_constants::syntax_option_type grep = regex_constants::grep;
2484 static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002485
2486 // construct/copy/destroy:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002487 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002488 basic_regex()
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002489 : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002490 __end_(0)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002491 {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002492 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002493 explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002494 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002495 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002496 {__parse(__p, __p + __traits_.length(__p));}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002497 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002498 basic_regex(const value_type* __p, size_t __len, flag_type __f)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002499 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002500 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002501 {__parse(__p, __p + __len);}
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002502// basic_regex(const basic_regex&) = default;
2503// basic_regex(basic_regex&&) = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002504 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002505 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002506 explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2507 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002508 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002509 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002510 {__parse(__p.begin(), __p.end());}
2511 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002512 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002513 basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2514 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002515 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002516 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002517 {__parse(__first, __last);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002518#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002519 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002520 basic_regex(initializer_list<value_type> __il,
2521 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002522 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002523 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002524 {__parse(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00002525#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002526
Howard Hinnant7026a172010-08-13 18:11:23 +00002527// ~basic_regex() = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002528
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002529// basic_regex& operator=(const basic_regex&) = default;
2530// basic_regex& operator=(basic_regex&&) = default;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002531 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002532 basic_regex& operator=(const value_type* __p)
2533 {return assign(__p);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002534#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002535 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002536 basic_regex& operator=(initializer_list<value_type> __il)
2537 {return assign(__il);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002538#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002539 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002540 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002541 basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2542 {return assign(__p);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002543
2544 // assign:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002545 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002546 basic_regex& assign(const basic_regex& __that)
2547 {return *this = __that;}
Howard Hinnant46623a02012-07-21 01:31:58 +00002548#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2549 _LIBCPP_INLINE_VISIBILITY
2550 basic_regex& assign(basic_regex&& __that) _NOEXCEPT
2551 {return *this = _VSTD::move(__that);}
2552#endif
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002553 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002554 basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2555 {return assign(__p, __p + __traits_.length(__p), __f);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002556 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002557 basic_regex& assign(const value_type* __p, size_t __len, flag_type __f)
2558 {return assign(__p, __p + __len, __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002559 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002560 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002561 basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
Howard Hinnant7026a172010-08-13 18:11:23 +00002562 flag_type __f = regex_constants::ECMAScript)
2563 {return assign(__s.begin(), __s.end(), __f);}
2564
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002565 template <class _InputIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002566 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002567 typename enable_if
2568 <
2569 __is_input_iterator <_InputIterator>::value &&
2570 !__is_forward_iterator<_InputIterator>::value,
2571 basic_regex&
2572 >::type
2573 assign(_InputIterator __first, _InputIterator __last,
2574 flag_type __f = regex_constants::ECMAScript)
2575 {
2576 basic_string<_CharT> __t(__first, __last);
2577 return assign(__t.begin(), __t.end(), __f);
2578 }
2579
2580private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002581 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002582 void __member_init(flag_type __f)
2583 {
2584 __flags_ = __f;
2585 __marked_count_ = 0;
2586 __loop_count_ = 0;
2587 __open_count_ = 0;
2588 __end_ = nullptr;
Howard Hinnant7026a172010-08-13 18:11:23 +00002589 }
2590public:
2591
2592 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002593 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002594 typename enable_if
2595 <
2596 __is_forward_iterator<_ForwardIterator>::value,
2597 basic_regex&
2598 >::type
2599 assign(_ForwardIterator __first, _ForwardIterator __last,
2600 flag_type __f = regex_constants::ECMAScript)
2601 {
Marshall Clow083e0112015-01-13 16:49:52 +00002602 return assign(basic_regex(__first, __last, __f));
Howard Hinnant7026a172010-08-13 18:11:23 +00002603 }
2604
Howard Hinnante3e32912011-08-12 21:56:02 +00002605#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2606
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002607 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002608 basic_regex& assign(initializer_list<value_type> __il,
Howard Hinnant7026a172010-08-13 18:11:23 +00002609 flag_type __f = regex_constants::ECMAScript)
2610 {return assign(__il.begin(), __il.end(), __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002611
Howard Hinnante3e32912011-08-12 21:56:02 +00002612#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2613
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002614 // const operations:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002615 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002616 unsigned mark_count() const {return __marked_count_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002617 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002618 flag_type flags() const {return __flags_;}
2619
2620 // locale:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002621 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002622 locale_type imbue(locale_type __loc)
2623 {
2624 __member_init(ECMAScript);
2625 __start_.reset();
2626 return __traits_.imbue(__loc);
2627 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002628 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002629 locale_type getloc() const {return __traits_.getloc();}
2630
2631 // swap:
Howard Hinnant7026a172010-08-13 18:11:23 +00002632 void swap(basic_regex& __r);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002633
2634private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002635 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002636 unsigned __loop_count() const {return __loop_count_;}
2637
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002638 template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002639 _ForwardIterator
2640 __parse(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002641 template <class _ForwardIterator>
2642 _ForwardIterator
2643 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2644 template <class _ForwardIterator>
2645 _ForwardIterator
2646 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2647 template <class _ForwardIterator>
2648 _ForwardIterator
2649 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2650 template <class _ForwardIterator>
2651 _ForwardIterator
2652 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2653 template <class _ForwardIterator>
2654 _ForwardIterator
2655 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2656 template <class _ForwardIterator>
2657 _ForwardIterator
2658 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2659 template <class _ForwardIterator>
2660 _ForwardIterator
2661 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2662 template <class _ForwardIterator>
2663 _ForwardIterator
2664 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2665 template <class _ForwardIterator>
2666 _ForwardIterator
2667 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2668 template <class _ForwardIterator>
2669 _ForwardIterator
2670 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2671 template <class _ForwardIterator>
2672 _ForwardIterator
2673 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2674 template <class _ForwardIterator>
2675 _ForwardIterator
2676 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2677 template <class _ForwardIterator>
2678 _ForwardIterator
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002679 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002680 __owns_one_state<_CharT>* __s,
2681 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002682 template <class _ForwardIterator>
2683 _ForwardIterator
Howard Hinnantaa698082010-07-16 19:08:36 +00002684 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2685 __owns_one_state<_CharT>* __s,
2686 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002687 template <class _ForwardIterator>
2688 _ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00002689 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2690 template <class _ForwardIterator>
2691 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002692 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2693 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002694 template <class _ForwardIterator>
2695 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002696 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2697 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002698 template <class _ForwardIterator>
2699 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002700 __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2701 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002702 template <class _ForwardIterator>
2703 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002704 __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2705 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002706 template <class _ForwardIterator>
2707 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002708 __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2709 basic_string<_CharT>& __col_sym);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002710 template <class _ForwardIterator>
2711 _ForwardIterator
2712 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002713 template <class _ForwardIterator>
2714 _ForwardIterator
2715 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2716 template <class _ForwardIterator>
2717 _ForwardIterator
2718 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2719 template <class _ForwardIterator>
2720 _ForwardIterator
2721 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2722 template <class _ForwardIterator>
2723 _ForwardIterator
2724 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2725 template <class _ForwardIterator>
2726 _ForwardIterator
2727 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2728 template <class _ForwardIterator>
2729 _ForwardIterator
2730 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002731 template <class _ForwardIterator>
2732 _ForwardIterator
2733 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2734 template <class _ForwardIterator>
2735 _ForwardIterator
2736 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2737 template <class _ForwardIterator>
2738 _ForwardIterator
2739 __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2740 template <class _ForwardIterator>
2741 _ForwardIterator
2742 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2743 template <class _ForwardIterator>
2744 _ForwardIterator
2745 __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2746 template <class _ForwardIterator>
2747 _ForwardIterator
Howard Hinnant17615b02010-07-27 01:25:38 +00002748 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2749 template <class _ForwardIterator>
2750 _ForwardIterator
2751 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2752 template <class _ForwardIterator>
2753 _ForwardIterator
2754 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2755 template <class _ForwardIterator>
2756 _ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00002757 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2758 basic_string<_CharT>* __str = nullptr);
Howard Hinnant17615b02010-07-27 01:25:38 +00002759 template <class _ForwardIterator>
2760 _ForwardIterator
2761 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant856846b2010-07-27 19:53:10 +00002762 template <class _ForwardIterator>
2763 _ForwardIterator
2764 __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2765 template <class _ForwardIterator>
2766 _ForwardIterator
2767 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant15476f32010-07-28 17:35:27 +00002768 template <class _ForwardIterator>
2769 _ForwardIterator
2770 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2771 basic_string<_CharT>& __str,
2772 __bracket_expression<_CharT, _Traits>* __ml);
2773 template <class _ForwardIterator>
2774 _ForwardIterator
2775 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2776 basic_string<_CharT>* __str = nullptr);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002777
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002778 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002779 void __push_l_anchor();
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002780 void __push_r_anchor();
Howard Hinnantac303862010-07-12 15:51:17 +00002781 void __push_match_any();
Howard Hinnant17615b02010-07-27 01:25:38 +00002782 void __push_match_any_but_newline();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002783 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002784 void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2785 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2786 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2787 __mexp_begin, __mexp_end);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002788 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002789 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2790 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2791 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2792 __mexp_begin, __mexp_end, false);}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002793 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
2794 size_t __mexp_begin = 0, size_t __mexp_end = 0,
2795 bool __greedy = true);
Howard Hinnant173968a2010-07-13 21:48:06 +00002796 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002797 void __push_char(value_type __c);
Howard Hinnantcba352d2010-07-12 18:16:05 +00002798 void __push_back_ref(int __i);
Howard Hinnantaa698082010-07-16 19:08:36 +00002799 void __push_alternation(__owns_one_state<_CharT>* __sa,
2800 __owns_one_state<_CharT>* __sb);
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002801 void __push_begin_marked_subexpression();
2802 void __push_end_marked_subexpression(unsigned);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002803 void __push_empty();
Howard Hinnant17615b02010-07-27 01:25:38 +00002804 void __push_word_boundary(bool);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002805 void __push_lookahead(const basic_regex&, bool, unsigned);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002806
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002807 template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002808 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002809 __search(const _CharT* __first, const _CharT* __last,
2810 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002811 regex_constants::match_flag_type __flags) const;
2812
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002813 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002814 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002815 __match_at_start(const _CharT* __first, const _CharT* __last,
2816 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002817 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00002818 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002819 bool
Howard Hinnant17615b02010-07-27 01:25:38 +00002820 __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
2821 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002822 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002823 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002824 bool
2825 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002826 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002827 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002828 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002829 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002830 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
2831 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002832 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002833
Howard Hinnant99968442011-11-29 18:15:50 +00002834 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002835 friend
2836 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002837 regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002838 regex_constants::match_flag_type);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002839
Howard Hinnant99968442011-11-29 18:15:50 +00002840 template <class _Ap, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002841 friend
2842 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002843 regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
2844 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002845
Howard Hinnant99968442011-11-29 18:15:50 +00002846 template <class _Bp, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002847 friend
2848 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002849 regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002850 regex_constants::match_flag_type);
2851
Howard Hinnant99968442011-11-29 18:15:50 +00002852 template <class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002853 friend
2854 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002855 regex_search(const _Cp*, const _Cp*,
2856 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002857
Howard Hinnant99968442011-11-29 18:15:50 +00002858 template <class _Cp, class _Ap, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002859 friend
2860 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002861 regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002862 regex_constants::match_flag_type);
2863
Howard Hinnant99968442011-11-29 18:15:50 +00002864 template <class _ST, class _SA, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002865 friend
2866 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002867 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2868 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002869 regex_constants::match_flag_type __flags);
2870
Howard Hinnant99968442011-11-29 18:15:50 +00002871 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002872 friend
2873 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002874 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2875 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
2876 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002877 regex_constants::match_flag_type __flags);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002878
Howard Hinnanta9602d52013-06-29 23:45:43 +00002879 template <class _Iter, class _Ap, class _Cp, class _Tp>
2880 friend
2881 bool
2882 regex_search(__wrap_iter<_Iter> __first,
2883 __wrap_iter<_Iter> __last,
2884 match_results<__wrap_iter<_Iter>, _Ap>& __m,
2885 const basic_regex<_Cp, _Tp>& __e,
2886 regex_constants::match_flag_type __flags);
2887
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002888 template <class, class> friend class __lookahead;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002889};
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002890
2891template <class _CharT, class _Traits>
Howard Hinnant0a69fa12012-12-12 21:14:28 +00002892 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
2893template <class _CharT, class _Traits>
2894 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
2895template <class _CharT, class _Traits>
2896 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
2897template <class _CharT, class _Traits>
2898 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
2899template <class _CharT, class _Traits>
2900 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
2901template <class _CharT, class _Traits>
2902 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
2903template <class _CharT, class _Traits>
2904 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
2905template <class _CharT, class _Traits>
2906 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
2907template <class _CharT, class _Traits>
2908 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
2909template <class _CharT, class _Traits>
2910 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
2911
2912template <class _CharT, class _Traits>
Howard Hinnant7026a172010-08-13 18:11:23 +00002913void
2914basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002915{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002916 using _VSTD::swap;
Howard Hinnant7026a172010-08-13 18:11:23 +00002917 swap(__traits_, __r.__traits_);
2918 swap(__flags_, __r.__flags_);
2919 swap(__marked_count_, __r.__marked_count_);
2920 swap(__loop_count_, __r.__loop_count_);
2921 swap(__open_count_, __r.__open_count_);
2922 swap(__start_, __r.__start_);
2923 swap(__end_, __r.__end_);
Howard Hinnant7026a172010-08-13 18:11:23 +00002924}
2925
2926template <class _CharT, class _Traits>
2927inline _LIBCPP_INLINE_VISIBILITY
2928void
2929swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
2930{
2931 return __x.swap(__y);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002932}
2933
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002934// __lookahead
2935
2936template <class _CharT, class _Traits>
2937class __lookahead
2938 : public __owns_one_state<_CharT>
2939{
2940 typedef __owns_one_state<_CharT> base;
2941
2942 basic_regex<_CharT, _Traits> __exp_;
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002943 unsigned __mexp_;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002944 bool __invert_;
2945
2946 __lookahead(const __lookahead&);
2947 __lookahead& operator=(const __lookahead&);
2948public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002949 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002950
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002951 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002952 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
2953 : base(__s), __exp_(__exp), __invert_(__invert), __mexp_(__mexp) {}
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002954
2955 virtual void __exec(__state&) const;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002956};
2957
2958template <class _CharT, class _Traits>
2959void
2960__lookahead<_CharT, _Traits>::__exec(__state& __s) const
2961{
2962 match_results<const _CharT*> __m;
2963 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
2964 bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002965 __m,
2966 __s.__flags_ | regex_constants::match_continuous,
Howard Hinnante57b7c42013-06-28 19:11:23 +00002967 __s.__at_first_ && __s.__current_ == __s.__first_);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002968 if (__matched != __invert_)
2969 {
2970 __s.__do_ = __state::__accept_but_not_consume;
2971 __s.__node_ = this->first();
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002972 for (unsigned __i = 1; __i < __m.size(); ++__i) {
2973 __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
2974 }
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002975 }
2976 else
2977 {
2978 __s.__do_ = __state::__reject;
2979 __s.__node_ = nullptr;
2980 }
2981}
2982
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002983template <class _CharT, class _Traits>
2984template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002985_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002986basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
2987 _ForwardIterator __last)
2988{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002989 {
Howard Hinnantac303862010-07-12 15:51:17 +00002990 unique_ptr<__node> __h(new __end_state<_CharT>);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002991 __start_.reset(new __empty_state<_CharT>(__h.get()));
2992 __h.release();
2993 __end_ = __start_.get();
2994 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002995 switch (__flags_ & 0x1F0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002996 {
2997 case ECMAScript:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002998 __first = __parse_ecma_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002999 break;
3000 case basic:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003001 __first = __parse_basic_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003002 break;
3003 case extended:
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003004 case awk:
Howard Hinnant15476f32010-07-28 17:35:27 +00003005 __first = __parse_extended_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003006 break;
3007 case grep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003008 __first = __parse_grep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003009 break;
3010 case egrep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003011 __first = __parse_egrep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003012 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003013#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003014 default:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003015 throw regex_error(regex_constants::__re_err_grammar);
Howard Hinnant324bb032010-08-22 00:02:43 +00003016#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003017 }
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003018 return __first;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003019}
3020
3021template <class _CharT, class _Traits>
3022template <class _ForwardIterator>
3023_ForwardIterator
3024basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
3025 _ForwardIterator __last)
3026{
3027 if (__first != __last)
3028 {
3029 if (*__first == '^')
3030 {
3031 __push_l_anchor();
3032 ++__first;
3033 }
3034 if (__first != __last)
3035 {
3036 __first = __parse_RE_expression(__first, __last);
3037 if (__first != __last)
3038 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003039 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003040 if (__temp == __last && *__first == '$')
3041 {
3042 __push_r_anchor();
3043 ++__first;
3044 }
3045 }
3046 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003047#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003048 if (__first != __last)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003049 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003050#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003051 }
3052 return __first;
3053}
3054
3055template <class _CharT, class _Traits>
3056template <class _ForwardIterator>
3057_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003058basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
3059 _ForwardIterator __last)
3060{
Howard Hinnantaa698082010-07-16 19:08:36 +00003061 __owns_one_state<_CharT>* __sa = __end_;
3062 _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003063#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003064 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003065 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003066#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003067 __first = __temp;
3068 while (__first != __last && *__first == '|')
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003069 {
Howard Hinnantaa698082010-07-16 19:08:36 +00003070 __owns_one_state<_CharT>* __sb = __end_;
3071 __temp = __parse_ERE_branch(++__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003072#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003073 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003074 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003075#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003076 __push_alternation(__sa, __sb);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003077 __first = __temp;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003078 }
3079 return __first;
3080}
3081
3082template <class _CharT, class _Traits>
3083template <class _ForwardIterator>
3084_ForwardIterator
3085basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3086 _ForwardIterator __last)
3087{
3088 _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003089#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003090 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003091 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003092#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003093 do
3094 {
3095 __first = __temp;
3096 __temp = __parse_ERE_expression(__first, __last);
3097 } while (__temp != __first);
3098 return __first;
3099}
3100
3101template <class _CharT, class _Traits>
3102template <class _ForwardIterator>
3103_ForwardIterator
3104basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3105 _ForwardIterator __last)
3106{
Howard Hinnantaa698082010-07-16 19:08:36 +00003107 __owns_one_state<_CharT>* __e = __end_;
3108 unsigned __mexp_begin = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003109 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3110 if (__temp == __first && __temp != __last)
3111 {
3112 switch (*__temp)
3113 {
3114 case '^':
3115 __push_l_anchor();
3116 ++__temp;
3117 break;
3118 case '$':
3119 __push_r_anchor();
3120 ++__temp;
3121 break;
3122 case '(':
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003123 __push_begin_marked_subexpression();
3124 unsigned __temp_count = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003125 ++__open_count_;
3126 __temp = __parse_extended_reg_exp(++__temp, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003127#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003128 if (__temp == __last || *__temp != ')')
3129 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00003130#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003131 __push_end_marked_subexpression(__temp_count);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003132 --__open_count_;
3133 ++__temp;
3134 break;
3135 }
3136 }
3137 if (__temp != __first)
Howard Hinnantaa698082010-07-16 19:08:36 +00003138 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3139 __marked_count_+1);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003140 __first = __temp;
3141 return __first;
3142}
3143
3144template <class _CharT, class _Traits>
3145template <class _ForwardIterator>
3146_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003147basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3148 _ForwardIterator __last)
3149{
3150 while (true)
3151 {
3152 _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3153 if (__temp == __first)
3154 break;
3155 __first = __temp;
3156 }
3157 return __first;
3158}
3159
3160template <class _CharT, class _Traits>
3161template <class _ForwardIterator>
3162_ForwardIterator
3163basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3164 _ForwardIterator __last)
3165{
3166 if (__first != __last)
3167 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003168 __owns_one_state<_CharT>* __e = __end_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003169 unsigned __mexp_begin = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003170 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3171 if (__temp != __first)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003172 __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3173 __mexp_begin+1, __marked_count_+1);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003174 }
3175 return __first;
3176}
3177
3178template <class _CharT, class _Traits>
3179template <class _ForwardIterator>
3180_ForwardIterator
3181basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3182 _ForwardIterator __last)
3183{
3184 _ForwardIterator __temp = __first;
3185 __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3186 if (__temp == __first)
3187 {
3188 __temp = __parse_Back_open_paren(__first, __last);
3189 if (__temp != __first)
3190 {
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003191 __push_begin_marked_subexpression();
3192 unsigned __temp_count = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003193 __first = __parse_RE_expression(__temp, __last);
3194 __temp = __parse_Back_close_paren(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003195#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003196 if (__temp == __first)
3197 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00003198#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003199 __push_end_marked_subexpression(__temp_count);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003200 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003201 }
3202 else
3203 __first = __parse_BACKREF(__first, __last);
3204 }
3205 return __first;
3206}
3207
3208template <class _CharT, class _Traits>
3209template <class _ForwardIterator>
3210_ForwardIterator
3211basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3212 _ForwardIterator __first,
3213 _ForwardIterator __last)
3214{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003215 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003216 if (__temp == __first)
3217 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003218 __temp = __parse_QUOTED_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003219 if (__temp == __first)
3220 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003221 if (__temp != __last && *__temp == '.')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003222 {
3223 __push_match_any();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003224 ++__temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003225 }
3226 else
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003227 __temp = __parse_bracket_expression(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003228 }
3229 }
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003230 __first = __temp;
3231 return __first;
3232}
3233
3234template <class _CharT, class _Traits>
3235template <class _ForwardIterator>
3236_ForwardIterator
3237basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3238 _ForwardIterator __first,
3239 _ForwardIterator __last)
3240{
3241 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3242 if (__temp == __first)
3243 {
3244 __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3245 if (__temp == __first)
3246 {
3247 if (__temp != __last && *__temp == '.')
3248 {
3249 __push_match_any();
3250 ++__temp;
3251 }
3252 else
3253 __temp = __parse_bracket_expression(__first, __last);
3254 }
3255 }
3256 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003257 return __first;
3258}
3259
3260template <class _CharT, class _Traits>
3261template <class _ForwardIterator>
3262_ForwardIterator
3263basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3264 _ForwardIterator __last)
3265{
3266 if (__first != __last)
3267 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003268 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003269 if (__temp != __last)
3270 {
3271 if (*__first == '\\' && *__temp == '(')
3272 __first = ++__temp;
3273 }
3274 }
3275 return __first;
3276}
3277
3278template <class _CharT, class _Traits>
3279template <class _ForwardIterator>
3280_ForwardIterator
3281basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3282 _ForwardIterator __last)
3283{
3284 if (__first != __last)
3285 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003286 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003287 if (__temp != __last)
3288 {
3289 if (*__first == '\\' && *__temp == ')')
3290 __first = ++__temp;
3291 }
3292 }
3293 return __first;
3294}
3295
3296template <class _CharT, class _Traits>
3297template <class _ForwardIterator>
3298_ForwardIterator
3299basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3300 _ForwardIterator __last)
3301{
3302 if (__first != __last)
3303 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003304 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003305 if (__temp != __last)
3306 {
3307 if (*__first == '\\' && *__temp == '{')
3308 __first = ++__temp;
3309 }
3310 }
3311 return __first;
3312}
3313
3314template <class _CharT, class _Traits>
3315template <class _ForwardIterator>
3316_ForwardIterator
3317basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3318 _ForwardIterator __last)
3319{
3320 if (__first != __last)
3321 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003322 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003323 if (__temp != __last)
3324 {
3325 if (*__first == '\\' && *__temp == '}')
3326 __first = ++__temp;
3327 }
3328 }
3329 return __first;
3330}
3331
3332template <class _CharT, class _Traits>
3333template <class _ForwardIterator>
3334_ForwardIterator
3335basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3336 _ForwardIterator __last)
3337{
3338 if (__first != __last)
3339 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003340 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003341 if (__temp != __last)
3342 {
Marshall Clow97f50f62014-01-18 03:40:03 +00003343 if (*__first == '\\')
3344 {
3345 int __val = __traits_.value(*__temp, 10);
3346 if (__val >= 1 && __val <= 9)
3347 {
3348 __push_back_ref(__val);
3349 __first = ++__temp;
3350 }
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003351 }
3352 }
3353 }
3354 return __first;
3355}
3356
3357template <class _CharT, class _Traits>
3358template <class _ForwardIterator>
3359_ForwardIterator
3360basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3361 _ForwardIterator __last)
3362{
3363 if (__first != __last)
3364 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003365 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003366 if (__temp == __last && *__first == '$')
3367 return __first;
3368 // Not called inside a bracket
3369 if (*__first == '.' || *__first == '\\' || *__first == '[')
3370 return __first;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003371 __push_char(*__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003372 ++__first;
3373 }
3374 return __first;
3375}
3376
3377template <class _CharT, class _Traits>
3378template <class _ForwardIterator>
3379_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003380basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3381 _ForwardIterator __last)
3382{
3383 if (__first != __last)
3384 {
3385 switch (*__first)
3386 {
3387 case '^':
3388 case '.':
3389 case '[':
3390 case '$':
3391 case '(':
3392 case '|':
3393 case '*':
3394 case '+':
3395 case '?':
3396 case '{':
3397 case '\\':
3398 break;
3399 case ')':
3400 if (__open_count_ == 0)
3401 {
3402 __push_char(*__first);
3403 ++__first;
3404 }
3405 break;
3406 default:
3407 __push_char(*__first);
3408 ++__first;
3409 break;
3410 }
3411 }
3412 return __first;
3413}
3414
3415template <class _CharT, class _Traits>
3416template <class _ForwardIterator>
3417_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003418basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3419 _ForwardIterator __last)
3420{
3421 if (__first != __last)
3422 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003423 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003424 if (__temp != __last)
3425 {
3426 if (*__first == '\\')
3427 {
3428 switch (*__temp)
3429 {
3430 case '^':
3431 case '.':
3432 case '*':
3433 case '[':
3434 case '$':
3435 case '\\':
Howard Hinnant0de86b62010-06-25 20:56:08 +00003436 __push_char(*__temp);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003437 __first = ++__temp;
3438 break;
3439 }
3440 }
3441 }
3442 }
3443 return __first;
3444}
3445
3446template <class _CharT, class _Traits>
3447template <class _ForwardIterator>
3448_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003449basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3450 _ForwardIterator __last)
3451{
3452 if (__first != __last)
3453 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003454 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003455 if (__temp != __last)
3456 {
3457 if (*__first == '\\')
3458 {
3459 switch (*__temp)
3460 {
3461 case '^':
3462 case '.':
3463 case '*':
3464 case '[':
3465 case '$':
3466 case '\\':
3467 case '(':
3468 case ')':
3469 case '|':
3470 case '+':
3471 case '?':
3472 case '{':
Howard Hinnantc1ecd972013-06-28 20:31:05 +00003473 case '}':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003474 __push_char(*__temp);
3475 __first = ++__temp;
3476 break;
Howard Hinnant15476f32010-07-28 17:35:27 +00003477 default:
3478 if ((__flags_ & 0x1F0) == awk)
3479 __first = __parse_awk_escape(++__first, __last);
3480 break;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003481 }
3482 }
3483 }
3484 }
3485 return __first;
3486}
3487
3488template <class _CharT, class _Traits>
3489template <class _ForwardIterator>
3490_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003491basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003492 _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003493 __owns_one_state<_CharT>* __s,
3494 unsigned __mexp_begin,
3495 unsigned __mexp_end)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003496{
3497 if (__first != __last)
3498 {
Howard Hinnant0de86b62010-06-25 20:56:08 +00003499 if (*__first == '*')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003500 {
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003501 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003502 ++__first;
3503 }
3504 else
3505 {
3506 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3507 if (__temp != __first)
3508 {
3509 int __min = 0;
3510 __first = __temp;
3511 __temp = __parse_DUP_COUNT(__first, __last, __min);
Howard Hinnantd4444702010-08-11 17:04:31 +00003512#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003513 if (__temp == __first)
3514 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003515#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003516 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003517#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003518 if (__first == __last)
3519 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003520#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003521 if (*__first != ',')
3522 {
3523 __temp = __parse_Back_close_brace(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003524#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003525 if (__temp == __first)
3526 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003527#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcba352d2010-07-12 18:16:05 +00003528 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3529 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003530 __first = __temp;
3531 }
3532 else
3533 {
3534 ++__first; // consume ','
3535 int __max = -1;
3536 __first = __parse_DUP_COUNT(__first, __last, __max);
3537 __temp = __parse_Back_close_brace(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003538#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003539 if (__temp == __first)
3540 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003541#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003542 if (__max == -1)
Howard Hinnantaa698082010-07-16 19:08:36 +00003543 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003544 else
3545 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003546#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003547 if (__max < __min)
3548 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003549#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcba352d2010-07-12 18:16:05 +00003550 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3551 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003552 }
3553 __first = __temp;
3554 }
3555 }
3556 }
3557 }
3558 return __first;
3559}
3560
Howard Hinnant0de86b62010-06-25 20:56:08 +00003561template <class _CharT, class _Traits>
3562template <class _ForwardIterator>
3563_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003564basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantaa698082010-07-16 19:08:36 +00003565 _ForwardIterator __last,
3566 __owns_one_state<_CharT>* __s,
3567 unsigned __mexp_begin,
3568 unsigned __mexp_end)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003569{
3570 if (__first != __last)
3571 {
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003572 unsigned __grammar = __flags_ & 0x1F0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003573 switch (*__first)
3574 {
3575 case '*':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003576 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003577 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003578 {
3579 ++__first;
3580 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3581 }
3582 else
3583 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003584 break;
3585 case '+':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003586 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003587 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003588 {
3589 ++__first;
3590 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3591 }
3592 else
3593 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003594 break;
3595 case '?':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003596 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003597 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003598 {
3599 ++__first;
3600 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3601 }
3602 else
3603 __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003604 break;
3605 case '{':
3606 {
3607 int __min;
Howard Hinnantaa698082010-07-16 19:08:36 +00003608 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
Howard Hinnantd4444702010-08-11 17:04:31 +00003609#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003610 if (__temp == __first)
3611 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003612#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003613 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003614#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003615 if (__first == __last)
3616 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003617#endif // _LIBCPP_NO_EXCEPTIONS
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;
3632#ifndef _LIBCPP_NO_EXCEPTIONS
3633 if (__first == __last)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003634 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003635#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003636 if (*__first == '}')
3637 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003638 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003639 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003640 {
3641 ++__first;
3642 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3643 }
3644 else
3645 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003646 }
3647 else
3648 {
Howard Hinnantaa698082010-07-16 19:08:36 +00003649 int __max = -1;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003650 __temp = __parse_DUP_COUNT(__first, __last, __max);
Howard Hinnantd4444702010-08-11 17:04:31 +00003651#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003652 if (__temp == __first)
3653 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003654#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003655 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003656#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003657 if (__first == __last || *__first != '}')
3658 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003659#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003660 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00003661#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003662 if (__max < __min)
3663 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003664#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003665 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003666 {
3667 ++__first;
3668 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3669 }
3670 else
3671 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003672 }
Howard Hinnantaa698082010-07-16 19:08:36 +00003673 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003674#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003675 default:
3676 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003677#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003678 }
3679 }
3680 break;
3681 }
3682 }
3683 return __first;
3684}
3685
3686template <class _CharT, class _Traits>
3687template <class _ForwardIterator>
3688_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003689basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3690 _ForwardIterator __last)
3691{
3692 if (__first != __last && *__first == '[')
3693 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003694 ++__first;
3695#ifndef _LIBCPP_NO_EXCEPTIONS
3696 if (__first == __last)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003697 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003698#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003699 bool __negate = false;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003700 if (*__first == '^')
3701 {
3702 ++__first;
Howard Hinnant173968a2010-07-13 21:48:06 +00003703 __negate = true;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003704 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003705 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3706 // __ml owned by *this
Howard Hinnantd4444702010-08-11 17:04:31 +00003707#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003708 if (__first == __last)
3709 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003710#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003711 if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']')
Howard Hinnant0de86b62010-06-25 20:56:08 +00003712 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003713 __ml->__add_char(']');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003714 ++__first;
3715 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003716 __first = __parse_follow_list(__first, __last, __ml);
Howard Hinnantd4444702010-08-11 17:04:31 +00003717#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003718 if (__first == __last)
3719 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003720#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003721 if (*__first == '-')
3722 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003723 __ml->__add_char('-');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003724 ++__first;
3725 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003726#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003727 if (__first == __last || *__first != ']')
3728 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003729#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003730 ++__first;
3731 }
3732 return __first;
3733}
3734
3735template <class _CharT, class _Traits>
3736template <class _ForwardIterator>
3737_ForwardIterator
3738basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003739 _ForwardIterator __last,
3740 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003741{
3742 if (__first != __last)
3743 {
3744 while (true)
3745 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003746 _ForwardIterator __temp = __parse_expression_term(__first, __last,
3747 __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003748 if (__temp == __first)
3749 break;
3750 __first = __temp;
3751 }
3752 }
3753 return __first;
3754}
3755
3756template <class _CharT, class _Traits>
3757template <class _ForwardIterator>
3758_ForwardIterator
3759basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003760 _ForwardIterator __last,
3761 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003762{
3763 if (__first != __last && *__first != ']')
3764 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003765 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant173968a2010-07-13 21:48:06 +00003766 basic_string<_CharT> __start_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003767 if (__temp != __last && *__first == '[')
3768 {
3769 if (*__temp == '=')
Howard Hinnant173968a2010-07-13 21:48:06 +00003770 return __parse_equivalence_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003771 else if (*__temp == ':')
Howard Hinnant173968a2010-07-13 21:48:06 +00003772 return __parse_character_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003773 else if (*__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003774 __first = __parse_collating_symbol(++__temp, __last, __start_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003775 }
Howard Hinnant15476f32010-07-28 17:35:27 +00003776 unsigned __grammar = __flags_ & 0x1F0;
3777 if (__start_range.empty())
Howard Hinnant0de86b62010-06-25 20:56:08 +00003778 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003779 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3780 {
3781 if (__grammar == ECMAScript)
3782 __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3783 else
3784 __first = __parse_awk_escape(++__first, __last, &__start_range);
3785 }
3786 else
3787 {
3788 __start_range = *__first;
3789 ++__first;
3790 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003791 }
3792 if (__first != __last && *__first != ']')
3793 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003794 __temp = _VSTD::next(__first);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003795 if (__temp != __last && *__first == '-' && *__temp != ']')
3796 {
3797 // parse a range
Howard Hinnant173968a2010-07-13 21:48:06 +00003798 basic_string<_CharT> __end_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003799 __first = __temp;
3800 ++__temp;
3801 if (__temp != __last && *__first == '[' && *__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003802 __first = __parse_collating_symbol(++__temp, __last, __end_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003803 else
3804 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003805 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3806 {
3807 if (__grammar == ECMAScript)
3808 __first = __parse_class_escape(++__first, __last,
3809 __end_range, __ml);
3810 else
3811 __first = __parse_awk_escape(++__first, __last,
3812 &__end_range);
3813 }
3814 else
3815 {
3816 __end_range = *__first;
3817 ++__first;
3818 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003819 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003820 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
Howard Hinnant0de86b62010-06-25 20:56:08 +00003821 }
Howard Hinnant499cea12013-08-23 17:37:05 +00003822 else if (!__start_range.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003823 {
3824 if (__start_range.size() == 1)
3825 __ml->__add_char(__start_range[0]);
3826 else
3827 __ml->__add_digraph(__start_range[0], __start_range[1]);
3828 }
3829 }
Howard Hinnant499cea12013-08-23 17:37:05 +00003830 else if (!__start_range.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003831 {
3832 if (__start_range.size() == 1)
3833 __ml->__add_char(__start_range[0]);
3834 else
3835 __ml->__add_digraph(__start_range[0], __start_range[1]);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003836 }
3837 }
3838 return __first;
3839}
3840
3841template <class _CharT, class _Traits>
3842template <class _ForwardIterator>
3843_ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00003844basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
3845 _ForwardIterator __last,
3846 basic_string<_CharT>& __str,
3847 __bracket_expression<_CharT, _Traits>* __ml)
3848{
Howard Hinnantd4444702010-08-11 17:04:31 +00003849#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003850 if (__first == __last)
3851 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003852#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003853 switch (*__first)
3854 {
3855 case 0:
3856 __str = *__first;
3857 return ++__first;
3858 case 'b':
3859 __str = _CharT(8);
3860 return ++__first;
3861 case 'd':
3862 __ml->__add_class(ctype_base::digit);
3863 return ++__first;
3864 case 'D':
3865 __ml->__add_neg_class(ctype_base::digit);
3866 return ++__first;
3867 case 's':
3868 __ml->__add_class(ctype_base::space);
3869 return ++__first;
3870 case 'S':
3871 __ml->__add_neg_class(ctype_base::space);
3872 return ++__first;
3873 case 'w':
3874 __ml->__add_class(ctype_base::alnum);
3875 __ml->__add_char('_');
3876 return ++__first;
3877 case 'W':
3878 __ml->__add_neg_class(ctype_base::alnum);
3879 __ml->__add_neg_char('_');
3880 return ++__first;
3881 }
3882 __first = __parse_character_escape(__first, __last, &__str);
3883 return __first;
3884}
3885
3886template <class _CharT, class _Traits>
3887template <class _ForwardIterator>
3888_ForwardIterator
3889basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
3890 _ForwardIterator __last,
3891 basic_string<_CharT>* __str)
3892{
Howard Hinnantd4444702010-08-11 17:04:31 +00003893#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003894 if (__first == __last)
3895 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003896#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003897 switch (*__first)
3898 {
3899 case '\\':
3900 case '"':
3901 case '/':
3902 if (__str)
3903 *__str = *__first;
3904 else
3905 __push_char(*__first);
3906 return ++__first;
3907 case 'a':
3908 if (__str)
3909 *__str = _CharT(7);
3910 else
3911 __push_char(_CharT(7));
3912 return ++__first;
3913 case 'b':
3914 if (__str)
3915 *__str = _CharT(8);
3916 else
3917 __push_char(_CharT(8));
3918 return ++__first;
3919 case 'f':
3920 if (__str)
3921 *__str = _CharT(0xC);
3922 else
3923 __push_char(_CharT(0xC));
3924 return ++__first;
3925 case 'n':
3926 if (__str)
3927 *__str = _CharT(0xA);
3928 else
3929 __push_char(_CharT(0xA));
3930 return ++__first;
3931 case 'r':
3932 if (__str)
3933 *__str = _CharT(0xD);
3934 else
3935 __push_char(_CharT(0xD));
3936 return ++__first;
3937 case 't':
3938 if (__str)
3939 *__str = _CharT(0x9);
3940 else
3941 __push_char(_CharT(0x9));
3942 return ++__first;
3943 case 'v':
3944 if (__str)
3945 *__str = _CharT(0xB);
3946 else
3947 __push_char(_CharT(0xB));
3948 return ++__first;
3949 }
3950 if ('0' <= *__first && *__first <= '7')
3951 {
3952 unsigned __val = *__first - '0';
3953 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3954 {
3955 __val = 8 * __val + *__first - '0';
3956 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
Howard Hinnantdbc8cf02013-07-02 17:43:31 +00003957 __val = 8 * __val + *__first++ - '0';
Howard Hinnant15476f32010-07-28 17:35:27 +00003958 }
3959 if (__str)
3960 *__str = _CharT(__val);
3961 else
3962 __push_char(_CharT(__val));
3963 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003964#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003965 else
3966 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003967#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003968 return __first;
3969}
3970
3971template <class _CharT, class _Traits>
3972template <class _ForwardIterator>
3973_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003974basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003975 _ForwardIterator __last,
3976 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003977{
3978 // Found [=
3979 // This means =] must exist
3980 value_type _Equal_close[2] = {'=', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003981 _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00003982 _Equal_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00003983#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003984 if (__temp == __last)
3985 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003986#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003987 // [__first, __temp) contains all text in [= ... =]
3988 typedef typename _Traits::string_type string_type;
3989 string_type __collate_name =
3990 __traits_.lookup_collatename(__first, __temp);
Howard Hinnantd4444702010-08-11 17:04:31 +00003991#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003992 if (__collate_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003993 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00003994#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003995 string_type __equiv_name =
3996 __traits_.transform_primary(__collate_name.begin(),
3997 __collate_name.end());
3998 if (!__equiv_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003999 __ml->__add_equivalence(__equiv_name);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004000 else
Howard Hinnant173968a2010-07-13 21:48:06 +00004001 {
4002 switch (__collate_name.size())
4003 {
4004 case 1:
4005 __ml->__add_char(__collate_name[0]);
4006 break;
4007 case 2:
4008 __ml->__add_digraph(__collate_name[0], __collate_name[1]);
4009 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00004010#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004011 default:
4012 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00004013#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004014 }
4015 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004016 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004017 return __first;
4018}
4019
4020template <class _CharT, class _Traits>
4021template <class _ForwardIterator>
4022_ForwardIterator
4023basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00004024 _ForwardIterator __last,
4025 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00004026{
4027 // Found [:
4028 // This means :] must exist
4029 value_type _Colon_close[2] = {':', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00004030 _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00004031 _Colon_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00004032#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004033 if (__temp == __last)
4034 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00004035#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004036 // [__first, __temp) contains all text in [: ... :]
4037 typedef typename _Traits::char_class_type char_class_type;
4038 char_class_type __class_type =
4039 __traits_.lookup_classname(__first, __temp, __flags_ & icase);
Howard Hinnantd4444702010-08-11 17:04:31 +00004040#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004041 if (__class_type == 0)
4042 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00004043#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004044 __ml->__add_class(__class_type);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004045 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004046 return __first;
4047}
4048
4049template <class _CharT, class _Traits>
4050template <class _ForwardIterator>
4051_ForwardIterator
4052basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00004053 _ForwardIterator __last,
4054 basic_string<_CharT>& __col_sym)
Howard Hinnant0de86b62010-06-25 20:56:08 +00004055{
4056 // Found [.
4057 // This means .] must exist
4058 value_type _Dot_close[2] = {'.', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00004059 _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00004060 _Dot_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00004061#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004062 if (__temp == __last)
4063 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00004064#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004065 // [__first, __temp) contains all text in [. ... .]
4066 typedef typename _Traits::string_type string_type;
Howard Hinnant173968a2010-07-13 21:48:06 +00004067 __col_sym = __traits_.lookup_collatename(__first, __temp);
4068 switch (__col_sym.size())
4069 {
4070 case 1:
4071 case 2:
4072 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00004073#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004074 default:
4075 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00004076#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004077 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004078 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004079 return __first;
4080}
4081
4082template <class _CharT, class _Traits>
4083template <class _ForwardIterator>
4084_ForwardIterator
4085basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4086 _ForwardIterator __last,
4087 int& __c)
4088{
Marshall Clow97f50f62014-01-18 03:40:03 +00004089 if (__first != __last )
Howard Hinnant0de86b62010-06-25 20:56:08 +00004090 {
Marshall Clow97f50f62014-01-18 03:40:03 +00004091 int __val = __traits_.value(*__first, 10);
4092 if ( __val != -1 )
Howard Hinnant0de86b62010-06-25 20:56:08 +00004093 {
Marshall Clow97f50f62014-01-18 03:40:03 +00004094 __c = __val;
4095 for (++__first;
4096 __first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
4097 ++__first)
4098 {
4099 __c *= 10;
4100 __c += __val;
4101 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00004102 }
4103 }
4104 return __first;
4105}
4106
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004107template <class _CharT, class _Traits>
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004108template <class _ForwardIterator>
4109_ForwardIterator
4110basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4111 _ForwardIterator __last)
4112{
4113 __owns_one_state<_CharT>* __sa = __end_;
4114 _ForwardIterator __temp = __parse_alternative(__first, __last);
4115 if (__temp == __first)
4116 __push_empty();
4117 __first = __temp;
4118 while (__first != __last && *__first == '|')
4119 {
4120 __owns_one_state<_CharT>* __sb = __end_;
4121 __temp = __parse_alternative(++__first, __last);
4122 if (__temp == __first)
4123 __push_empty();
4124 __push_alternation(__sa, __sb);
4125 __first = __temp;
4126 }
4127 return __first;
4128}
4129
4130template <class _CharT, class _Traits>
4131template <class _ForwardIterator>
4132_ForwardIterator
4133basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4134 _ForwardIterator __last)
4135{
4136 while (true)
4137 {
4138 _ForwardIterator __temp = __parse_term(__first, __last);
4139 if (__temp == __first)
4140 break;
4141 __first = __temp;
4142 }
4143 return __first;
4144}
4145
4146template <class _CharT, class _Traits>
4147template <class _ForwardIterator>
4148_ForwardIterator
4149basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4150 _ForwardIterator __last)
4151{
4152 _ForwardIterator __temp = __parse_assertion(__first, __last);
4153 if (__temp == __first)
4154 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004155 __owns_one_state<_CharT>* __e = __end_;
4156 unsigned __mexp_begin = __marked_count_;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004157 __temp = __parse_atom(__first, __last);
4158 if (__temp != __first)
Howard Hinnant17615b02010-07-27 01:25:38 +00004159 __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4160 __mexp_begin+1, __marked_count_+1);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004161 }
Howard Hinnant17615b02010-07-27 01:25:38 +00004162 else
4163 __first = __temp;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004164 return __first;
4165}
4166
4167template <class _CharT, class _Traits>
4168template <class _ForwardIterator>
4169_ForwardIterator
4170basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4171 _ForwardIterator __last)
4172{
4173 if (__first != __last)
4174 {
4175 switch (*__first)
4176 {
4177 case '^':
4178 __push_l_anchor();
4179 ++__first;
4180 break;
4181 case '$':
4182 __push_r_anchor();
4183 ++__first;
4184 break;
4185 case '\\':
4186 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004187 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004188 if (__temp != __last)
4189 {
4190 if (*__temp == 'b')
4191 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004192 __push_word_boundary(false);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004193 __first = ++__temp;
4194 }
4195 else if (*__temp == 'B')
4196 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004197 __push_word_boundary(true);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004198 __first = ++__temp;
4199 }
4200 }
4201 }
4202 break;
4203 case '(':
4204 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004205 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004206 if (__temp != __last && *__temp == '?')
4207 {
4208 if (++__temp != __last)
4209 {
4210 switch (*__temp)
4211 {
4212 case '=':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004213 {
4214 basic_regex __exp;
4215 __exp.__flags_ = __flags_;
4216 __temp = __exp.__parse(++__temp, __last);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004217 unsigned __mexp = __exp.__marked_count_;
4218 __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
4219 __marked_count_ += __mexp;
Howard Hinnantd4444702010-08-11 17:04:31 +00004220#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004221 if (__temp == __last || *__temp != ')')
4222 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004223#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004224 __first = ++__temp;
4225 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004226 break;
4227 case '!':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004228 {
4229 basic_regex __exp;
4230 __exp.__flags_ = __flags_;
4231 __temp = __exp.__parse(++__temp, __last);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004232 unsigned __mexp = __exp.__marked_count_;
4233 __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
4234 __marked_count_ += __mexp;
Howard Hinnantd4444702010-08-11 17:04:31 +00004235#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004236 if (__temp == __last || *__temp != ')')
4237 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004238#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004239 __first = ++__temp;
4240 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004241 break;
4242 }
4243 }
4244 }
4245 }
4246 break;
4247 }
4248 }
4249 return __first;
4250}
4251
4252template <class _CharT, class _Traits>
4253template <class _ForwardIterator>
4254_ForwardIterator
4255basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4256 _ForwardIterator __last)
4257{
Howard Hinnant17615b02010-07-27 01:25:38 +00004258 if (__first != __last)
4259 {
4260 switch (*__first)
4261 {
4262 case '.':
4263 __push_match_any_but_newline();
4264 ++__first;
4265 break;
4266 case '\\':
4267 __first = __parse_atom_escape(__first, __last);
4268 break;
4269 case '[':
4270 __first = __parse_bracket_expression(__first, __last);
4271 break;
4272 case '(':
4273 {
Howard Hinnantd4444702010-08-11 17:04:31 +00004274 ++__first;
4275#ifndef _LIBCPP_NO_EXCEPTIONS
4276 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004277 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004278#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0949eed2011-06-30 21:18:19 +00004279 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004280 if (__temp != __last && *__first == '?' && *__temp == ':')
4281 {
4282 ++__open_count_;
4283 __first = __parse_ecma_exp(++__temp, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00004284#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004285 if (__first == __last || *__first != ')')
4286 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004287#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004288 --__open_count_;
4289 ++__first;
4290 }
4291 else
4292 {
4293 __push_begin_marked_subexpression();
4294 unsigned __temp_count = __marked_count_;
4295 ++__open_count_;
4296 __first = __parse_ecma_exp(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00004297#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004298 if (__first == __last || *__first != ')')
4299 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004300#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004301 __push_end_marked_subexpression(__temp_count);
4302 --__open_count_;
4303 ++__first;
4304 }
4305 }
4306 break;
4307 default:
4308 __first = __parse_pattern_character(__first, __last);
4309 break;
4310 }
4311 }
4312 return __first;
4313}
4314
4315template <class _CharT, class _Traits>
4316template <class _ForwardIterator>
4317_ForwardIterator
4318basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4319 _ForwardIterator __last)
4320{
4321 if (__first != __last && *__first == '\\')
4322 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004323 _ForwardIterator __t1 = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004324 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4325 if (__t2 != __t1)
4326 __first = __t2;
4327 else
4328 {
4329 __t2 = __parse_character_class_escape(__t1, __last);
4330 if (__t2 != __t1)
4331 __first = __t2;
4332 else
4333 {
4334 __t2 = __parse_character_escape(__t1, __last);
4335 if (__t2 != __t1)
4336 __first = __t2;
4337 }
4338 }
4339 }
4340 return __first;
4341}
4342
4343template <class _CharT, class _Traits>
4344template <class _ForwardIterator>
4345_ForwardIterator
4346basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4347 _ForwardIterator __last)
4348{
4349 if (__first != __last)
4350 {
4351 if (*__first == '0')
4352 {
4353 __push_char(_CharT());
4354 ++__first;
4355 }
4356 else if ('1' <= *__first && *__first <= '9')
4357 {
4358 unsigned __v = *__first - '0';
4359 for (++__first; '0' <= *__first && *__first <= '9'; ++__first)
4360 __v = 10 * __v + *__first - '0';
Howard Hinnantd4444702010-08-11 17:04:31 +00004361#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004362 if (__v > mark_count())
4363 throw regex_error(regex_constants::error_backref);
Howard Hinnant324bb032010-08-22 00:02:43 +00004364#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004365 __push_back_ref(__v);
4366 }
4367 }
4368 return __first;
4369}
4370
4371template <class _CharT, class _Traits>
4372template <class _ForwardIterator>
4373_ForwardIterator
4374basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4375 _ForwardIterator __last)
4376{
4377 if (__first != __last)
4378 {
4379 __bracket_expression<_CharT, _Traits>* __ml;
4380 switch (*__first)
4381 {
4382 case 'd':
4383 __ml = __start_matching_list(false);
4384 __ml->__add_class(ctype_base::digit);
4385 ++__first;
4386 break;
4387 case 'D':
4388 __ml = __start_matching_list(true);
4389 __ml->__add_class(ctype_base::digit);
4390 ++__first;
4391 break;
4392 case 's':
4393 __ml = __start_matching_list(false);
4394 __ml->__add_class(ctype_base::space);
4395 ++__first;
4396 break;
4397 case 'S':
4398 __ml = __start_matching_list(true);
4399 __ml->__add_class(ctype_base::space);
4400 ++__first;
4401 break;
4402 case 'w':
4403 __ml = __start_matching_list(false);
4404 __ml->__add_class(ctype_base::alnum);
4405 __ml->__add_char('_');
4406 ++__first;
4407 break;
4408 case 'W':
4409 __ml = __start_matching_list(true);
4410 __ml->__add_class(ctype_base::alnum);
4411 __ml->__add_char('_');
4412 ++__first;
4413 break;
4414 }
4415 }
4416 return __first;
4417}
4418
4419template <class _CharT, class _Traits>
4420template <class _ForwardIterator>
4421_ForwardIterator
4422basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
Howard Hinnant15476f32010-07-28 17:35:27 +00004423 _ForwardIterator __last,
4424 basic_string<_CharT>* __str)
Howard Hinnant17615b02010-07-27 01:25:38 +00004425{
4426 if (__first != __last)
4427 {
4428 _ForwardIterator __t;
4429 unsigned __sum = 0;
4430 int __hd;
4431 switch (*__first)
4432 {
4433 case 'f':
Howard Hinnant15476f32010-07-28 17:35:27 +00004434 if (__str)
4435 *__str = _CharT(0xC);
4436 else
4437 __push_char(_CharT(0xC));
Howard Hinnant17615b02010-07-27 01:25:38 +00004438 ++__first;
4439 break;
4440 case 'n':
Howard Hinnant15476f32010-07-28 17:35:27 +00004441 if (__str)
4442 *__str = _CharT(0xA);
4443 else
4444 __push_char(_CharT(0xA));
Howard Hinnant17615b02010-07-27 01:25:38 +00004445 ++__first;
4446 break;
4447 case 'r':
Howard Hinnant15476f32010-07-28 17:35:27 +00004448 if (__str)
4449 *__str = _CharT(0xD);
4450 else
4451 __push_char(_CharT(0xD));
Howard Hinnant17615b02010-07-27 01:25:38 +00004452 ++__first;
4453 break;
4454 case 't':
Howard Hinnant15476f32010-07-28 17:35:27 +00004455 if (__str)
4456 *__str = _CharT(0x9);
4457 else
4458 __push_char(_CharT(0x9));
Howard Hinnant17615b02010-07-27 01:25:38 +00004459 ++__first;
4460 break;
4461 case 'v':
Howard Hinnant15476f32010-07-28 17:35:27 +00004462 if (__str)
4463 *__str = _CharT(0xB);
4464 else
4465 __push_char(_CharT(0xB));
Howard Hinnant17615b02010-07-27 01:25:38 +00004466 ++__first;
4467 break;
4468 case 'c':
Howard Hinnant0949eed2011-06-30 21:18:19 +00004469 if ((__t = _VSTD::next(__first)) != __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004470 {
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004471 if (('A' <= *__t && *__t <= 'Z') ||
4472 ('a' <= *__t && *__t <= 'z'))
Howard Hinnant17615b02010-07-27 01:25:38 +00004473 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004474 if (__str)
4475 *__str = _CharT(*__t % 32);
4476 else
4477 __push_char(_CharT(*__t % 32));
Howard Hinnant17615b02010-07-27 01:25:38 +00004478 __first = ++__t;
4479 }
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004480#ifndef _LIBCPP_NO_EXCEPTIONS
4481 else
4482 throw regex_error(regex_constants::error_escape);
4483#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004484 }
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004485#ifndef _LIBCPP_NO_EXCEPTIONS
4486 else
4487 throw regex_error(regex_constants::error_escape);
4488#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004489 break;
4490 case 'u':
Howard Hinnantd4444702010-08-11 17:04:31 +00004491 ++__first;
4492#ifndef _LIBCPP_NO_EXCEPTIONS
4493 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004494 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004495#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004496 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004497#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004498 if (__hd == -1)
4499 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004500#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004501 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnantd4444702010-08-11 17:04:31 +00004502 ++__first;
4503#ifndef _LIBCPP_NO_EXCEPTIONS
4504 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004505 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004506#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004507 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004508#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004509 if (__hd == -1)
4510 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004511#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004512 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant17615b02010-07-27 01:25:38 +00004513 // drop through
4514 case 'x':
Howard Hinnantd4444702010-08-11 17:04:31 +00004515 ++__first;
4516#ifndef _LIBCPP_NO_EXCEPTIONS
4517 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004518 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004519#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004520 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004521#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004522 if (__hd == -1)
4523 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004524#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004525 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnantd4444702010-08-11 17:04:31 +00004526 ++__first;
4527#ifndef _LIBCPP_NO_EXCEPTIONS
4528 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004529 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004530#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004531 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004532#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004533 if (__hd == -1)
4534 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004535#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004536 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant15476f32010-07-28 17:35:27 +00004537 if (__str)
4538 *__str = _CharT(__sum);
4539 else
4540 __push_char(_CharT(__sum));
Howard Hinnant17615b02010-07-27 01:25:38 +00004541 ++__first;
4542 break;
Marshall Clow6b7e6922014-05-21 16:29:50 +00004543 case '0':
4544 if (__str)
4545 *__str = _CharT(0);
4546 else
4547 __push_char(_CharT(0));
4548 ++__first;
4549 break;
Howard Hinnant17615b02010-07-27 01:25:38 +00004550 default:
4551 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4552 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004553 if (__str)
4554 *__str = *__first;
4555 else
4556 __push_char(*__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004557 ++__first;
4558 }
Howard Hinnantd4444702010-08-11 17:04:31 +00004559#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant918f2a82013-06-28 18:57:30 +00004560 else
Howard Hinnant15476f32010-07-28 17:35:27 +00004561 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004562#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004563 break;
4564 }
4565 }
4566 return __first;
4567}
4568
4569template <class _CharT, class _Traits>
4570template <class _ForwardIterator>
4571_ForwardIterator
4572basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4573 _ForwardIterator __last)
4574{
4575 if (__first != __last)
4576 {
4577 switch (*__first)
4578 {
4579 case '^':
4580 case '$':
4581 case '\\':
4582 case '.':
4583 case '*':
4584 case '+':
4585 case '?':
4586 case '(':
4587 case ')':
4588 case '[':
4589 case ']':
4590 case '{':
4591 case '}':
4592 case '|':
4593 break;
4594 default:
4595 __push_char(*__first);
4596 ++__first;
4597 break;
4598 }
4599 }
4600 return __first;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004601}
4602
4603template <class _CharT, class _Traits>
Howard Hinnant856846b2010-07-27 19:53:10 +00004604template <class _ForwardIterator>
4605_ForwardIterator
4606basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4607 _ForwardIterator __last)
4608{
4609 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004610 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004611 if (__t1 != __first)
4612 __parse_basic_reg_exp(__first, __t1);
4613 else
4614 __push_empty();
4615 __first = __t1;
4616 if (__first != __last)
4617 ++__first;
4618 while (__first != __last)
4619 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004620 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004621 __owns_one_state<_CharT>* __sb = __end_;
4622 if (__t1 != __first)
4623 __parse_basic_reg_exp(__first, __t1);
4624 else
4625 __push_empty();
4626 __push_alternation(__sa, __sb);
4627 __first = __t1;
4628 if (__first != __last)
4629 ++__first;
4630 }
4631 return __first;
4632}
4633
4634template <class _CharT, class _Traits>
4635template <class _ForwardIterator>
4636_ForwardIterator
4637basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4638 _ForwardIterator __last)
4639{
4640 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004641 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004642 if (__t1 != __first)
4643 __parse_extended_reg_exp(__first, __t1);
4644 else
4645 __push_empty();
4646 __first = __t1;
4647 if (__first != __last)
4648 ++__first;
4649 while (__first != __last)
4650 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004651 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004652 __owns_one_state<_CharT>* __sb = __end_;
4653 if (__t1 != __first)
4654 __parse_extended_reg_exp(__first, __t1);
4655 else
4656 __push_empty();
4657 __push_alternation(__sa, __sb);
4658 __first = __t1;
4659 if (__first != __last)
4660 ++__first;
4661 }
4662 return __first;
4663}
4664
4665template <class _CharT, class _Traits>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004666void
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004667basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4668 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4669 bool __greedy)
4670{
4671 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4672 __end_->first() = nullptr;
Howard Hinnantac303862010-07-12 15:51:17 +00004673 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4674 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4675 __min, __max));
4676 __s->first() = nullptr;
4677 __e1.release();
4678 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004679 __end_ = __e2->second();
Howard Hinnantac303862010-07-12 15:51:17 +00004680 __s->first() = __e2.release();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004681 ++__loop_count_;
4682}
4683
4684template <class _CharT, class _Traits>
4685void
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004686basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4687{
Howard Hinnant173968a2010-07-13 21:48:06 +00004688 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004689 __end_->first() = new __match_char_icase<_CharT, _Traits>
4690 (__traits_, __c, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004691 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004692 __end_->first() = new __match_char_collate<_CharT, _Traits>
4693 (__traits_, __c, __end_->first());
4694 else
4695 __end_->first() = new __match_char<_CharT>(__c, __end_->first());
Howard Hinnante77aa5e2010-07-08 17:43:58 +00004696 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004697}
4698
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004699template <class _CharT, class _Traits>
4700void
4701basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4702{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004703 if (!(__flags_ & nosubs))
4704 {
4705 __end_->first() =
4706 new __begin_marked_subexpression<_CharT>(++__marked_count_,
4707 __end_->first());
4708 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4709 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004710}
4711
4712template <class _CharT, class _Traits>
4713void
4714basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4715{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004716 if (!(__flags_ & nosubs))
4717 {
4718 __end_->first() =
4719 new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4720 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4721 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004722}
4723
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004724template <class _CharT, class _Traits>
4725void
Howard Hinnant41fb6e12011-03-26 20:02:27 +00004726basic_regex<_CharT, _Traits>::__push_l_anchor()
4727{
4728 __end_->first() = new __l_anchor<_CharT>(__end_->first());
4729 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4730}
4731
4732template <class _CharT, class _Traits>
4733void
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004734basic_regex<_CharT, _Traits>::__push_r_anchor()
4735{
4736 __end_->first() = new __r_anchor<_CharT>(__end_->first());
4737 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4738}
4739
Howard Hinnantac303862010-07-12 15:51:17 +00004740template <class _CharT, class _Traits>
4741void
4742basic_regex<_CharT, _Traits>::__push_match_any()
4743{
4744 __end_->first() = new __match_any<_CharT>(__end_->first());
4745 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4746}
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004747
Howard Hinnantcba352d2010-07-12 18:16:05 +00004748template <class _CharT, class _Traits>
4749void
Howard Hinnant17615b02010-07-27 01:25:38 +00004750basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4751{
4752 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4753 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4754}
4755
4756template <class _CharT, class _Traits>
4757void
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004758basic_regex<_CharT, _Traits>::__push_empty()
4759{
4760 __end_->first() = new __empty_state<_CharT>(__end_->first());
4761 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4762}
4763
4764template <class _CharT, class _Traits>
4765void
Howard Hinnant17615b02010-07-27 01:25:38 +00004766basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4767{
4768 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4769 __end_->first());
4770 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4771}
4772
4773template <class _CharT, class _Traits>
4774void
Howard Hinnantcba352d2010-07-12 18:16:05 +00004775basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4776{
Howard Hinnant173968a2010-07-13 21:48:06 +00004777 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004778 __end_->first() = new __back_ref_icase<_CharT, _Traits>
4779 (__traits_, __i, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004780 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004781 __end_->first() = new __back_ref_collate<_CharT, _Traits>
4782 (__traits_, __i, __end_->first());
4783 else
4784 __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
Howard Hinnantcba352d2010-07-12 18:16:05 +00004785 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4786}
4787
Howard Hinnant173968a2010-07-13 21:48:06 +00004788template <class _CharT, class _Traits>
Howard Hinnantaa698082010-07-16 19:08:36 +00004789void
4790basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4791 __owns_one_state<_CharT>* __ea)
4792{
4793 __sa->first() = new __alternate<_CharT>(
4794 static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4795 static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4796 __ea->first() = nullptr;
4797 __ea->first() = new __empty_state<_CharT>(__end_->first());
4798 __end_->first() = nullptr;
4799 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4800 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4801}
4802
4803template <class _CharT, class _Traits>
Howard Hinnant173968a2010-07-13 21:48:06 +00004804__bracket_expression<_CharT, _Traits>*
4805basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4806{
4807 __bracket_expression<_CharT, _Traits>* __r =
4808 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4809 __negate, __flags_ & icase,
4810 __flags_ & collate);
4811 __end_->first() = __r;
4812 __end_ = __r;
4813 return __r;
4814}
4815
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004816template <class _CharT, class _Traits>
4817void
4818basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004819 bool __invert,
4820 unsigned __mexp)
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004821{
4822 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004823 __end_->first(), __mexp);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004824 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4825}
4826
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00004827typedef basic_regex<char> regex;
4828typedef basic_regex<wchar_t> wregex;
4829
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004830// sub_match
4831
4832template <class _BidirectionalIterator>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004833class _LIBCPP_TYPE_VIS_ONLY sub_match
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004834 : public pair<_BidirectionalIterator, _BidirectionalIterator>
4835{
4836public:
4837 typedef _BidirectionalIterator iterator;
4838 typedef typename iterator_traits<iterator>::value_type value_type;
4839 typedef typename iterator_traits<iterator>::difference_type difference_type;
4840 typedef basic_string<value_type> string_type;
4841
4842 bool matched;
4843
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004844 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +00004845 _LIBCPP_CONSTEXPR sub_match() : matched() {}
Howard Hinnant31aaf552010-12-08 21:07:55 +00004846
4847 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004848 difference_type length() const
Howard Hinnant0949eed2011-06-30 21:18:19 +00004849 {return matched ? _VSTD::distance(this->first, this->second) : 0;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004850 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004851 string_type str() const
4852 {return matched ? string_type(this->first, this->second) : string_type();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004853 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004854 operator string_type() const
4855 {return str();}
4856
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004857 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004858 int compare(const sub_match& __s) const
4859 {return str().compare(__s.str());}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004860 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004861 int compare(const string_type& __s) const
4862 {return str().compare(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004863 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004864 int compare(const value_type* __s) const
4865 {return str().compare(__s);}
4866};
4867
4868typedef sub_match<const char*> csub_match;
4869typedef sub_match<const wchar_t*> wcsub_match;
4870typedef sub_match<string::const_iterator> ssub_match;
4871typedef sub_match<wstring::const_iterator> wssub_match;
4872
4873template <class _BiIter>
4874inline _LIBCPP_INLINE_VISIBILITY
4875bool
4876operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4877{
4878 return __x.compare(__y) == 0;
4879}
4880
4881template <class _BiIter>
4882inline _LIBCPP_INLINE_VISIBILITY
4883bool
4884operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4885{
4886 return !(__x == __y);
4887}
4888
4889template <class _BiIter>
4890inline _LIBCPP_INLINE_VISIBILITY
4891bool
4892operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4893{
4894 return __x.compare(__y) < 0;
4895}
4896
4897template <class _BiIter>
4898inline _LIBCPP_INLINE_VISIBILITY
4899bool
4900operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4901{
4902 return !(__y < __x);
4903}
4904
4905template <class _BiIter>
4906inline _LIBCPP_INLINE_VISIBILITY
4907bool
4908operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4909{
4910 return !(__x < __y);
4911}
4912
4913template <class _BiIter>
4914inline _LIBCPP_INLINE_VISIBILITY
4915bool
4916operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4917{
4918 return __y < __x;
4919}
4920
4921template <class _BiIter, class _ST, class _SA>
4922inline _LIBCPP_INLINE_VISIBILITY
4923bool
4924operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4925 const sub_match<_BiIter>& __y)
4926{
Marshall Clowe3e70542014-12-15 23:57:56 +00004927 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004928}
4929
4930template <class _BiIter, class _ST, class _SA>
4931inline _LIBCPP_INLINE_VISIBILITY
4932bool
4933operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4934 const sub_match<_BiIter>& __y)
4935{
4936 return !(__x == __y);
4937}
4938
4939template <class _BiIter, class _ST, class _SA>
4940inline _LIBCPP_INLINE_VISIBILITY
4941bool
4942operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4943 const sub_match<_BiIter>& __y)
4944{
Marshall Clowe3e70542014-12-15 23:57:56 +00004945 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004946}
4947
4948template <class _BiIter, class _ST, class _SA>
4949inline _LIBCPP_INLINE_VISIBILITY
4950bool
4951operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4952 const sub_match<_BiIter>& __y)
4953{
4954 return __y < __x;
4955}
4956
4957template <class _BiIter, class _ST, class _SA>
4958inline _LIBCPP_INLINE_VISIBILITY
4959bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4960 const sub_match<_BiIter>& __y)
4961{
4962 return !(__x < __y);
4963}
4964
4965template <class _BiIter, class _ST, class _SA>
4966inline _LIBCPP_INLINE_VISIBILITY
4967bool
4968operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4969 const sub_match<_BiIter>& __y)
4970{
4971 return !(__y < __x);
4972}
4973
4974template <class _BiIter, class _ST, class _SA>
4975inline _LIBCPP_INLINE_VISIBILITY
4976bool
4977operator==(const sub_match<_BiIter>& __x,
4978 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4979{
Marshall Clowe3e70542014-12-15 23:57:56 +00004980 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004981}
4982
4983template <class _BiIter, class _ST, class _SA>
4984inline _LIBCPP_INLINE_VISIBILITY
4985bool
4986operator!=(const sub_match<_BiIter>& __x,
4987 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4988{
4989 return !(__x == __y);
4990}
4991
4992template <class _BiIter, class _ST, class _SA>
4993inline _LIBCPP_INLINE_VISIBILITY
4994bool
4995operator<(const sub_match<_BiIter>& __x,
4996 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4997{
Marshall Clowe3e70542014-12-15 23:57:56 +00004998 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004999}
5000
5001template <class _BiIter, class _ST, class _SA>
5002inline _LIBCPP_INLINE_VISIBILITY
5003bool operator>(const sub_match<_BiIter>& __x,
5004 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5005{
5006 return __y < __x;
5007}
5008
5009template <class _BiIter, class _ST, class _SA>
5010inline _LIBCPP_INLINE_VISIBILITY
5011bool
5012operator>=(const sub_match<_BiIter>& __x,
5013 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5014{
5015 return !(__x < __y);
5016}
5017
5018template <class _BiIter, class _ST, class _SA>
5019inline _LIBCPP_INLINE_VISIBILITY
5020bool
5021operator<=(const sub_match<_BiIter>& __x,
5022 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5023{
5024 return !(__y < __x);
5025}
5026
5027template <class _BiIter>
5028inline _LIBCPP_INLINE_VISIBILITY
5029bool
5030operator==(typename iterator_traits<_BiIter>::value_type const* __x,
5031 const sub_match<_BiIter>& __y)
5032{
5033 return __y.compare(__x) == 0;
5034}
5035
5036template <class _BiIter>
5037inline _LIBCPP_INLINE_VISIBILITY
5038bool
5039operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
5040 const sub_match<_BiIter>& __y)
5041{
5042 return !(__x == __y);
5043}
5044
5045template <class _BiIter>
5046inline _LIBCPP_INLINE_VISIBILITY
5047bool
5048operator<(typename iterator_traits<_BiIter>::value_type const* __x,
5049 const sub_match<_BiIter>& __y)
5050{
5051 return __y.compare(__x) > 0;
5052}
5053
5054template <class _BiIter>
5055inline _LIBCPP_INLINE_VISIBILITY
5056bool
5057operator>(typename iterator_traits<_BiIter>::value_type const* __x,
5058 const sub_match<_BiIter>& __y)
5059{
5060 return __y < __x;
5061}
5062
5063template <class _BiIter>
5064inline _LIBCPP_INLINE_VISIBILITY
5065bool
5066operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
5067 const sub_match<_BiIter>& __y)
5068{
5069 return !(__x < __y);
5070}
5071
5072template <class _BiIter>
5073inline _LIBCPP_INLINE_VISIBILITY
5074bool
5075operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
5076 const sub_match<_BiIter>& __y)
5077{
5078 return !(__y < __x);
5079}
5080
5081template <class _BiIter>
5082inline _LIBCPP_INLINE_VISIBILITY
5083bool
5084operator==(const sub_match<_BiIter>& __x,
5085 typename iterator_traits<_BiIter>::value_type const* __y)
5086{
5087 return __x.compare(__y) == 0;
5088}
5089
5090template <class _BiIter>
5091inline _LIBCPP_INLINE_VISIBILITY
5092bool
5093operator!=(const sub_match<_BiIter>& __x,
5094 typename iterator_traits<_BiIter>::value_type const* __y)
5095{
5096 return !(__x == __y);
5097}
5098
5099template <class _BiIter>
5100inline _LIBCPP_INLINE_VISIBILITY
5101bool
5102operator<(const sub_match<_BiIter>& __x,
5103 typename iterator_traits<_BiIter>::value_type const* __y)
5104{
5105 return __x.compare(__y) < 0;
5106}
5107
5108template <class _BiIter>
5109inline _LIBCPP_INLINE_VISIBILITY
5110bool
5111operator>(const sub_match<_BiIter>& __x,
5112 typename iterator_traits<_BiIter>::value_type const* __y)
5113{
5114 return __y < __x;
5115}
5116
5117template <class _BiIter>
5118inline _LIBCPP_INLINE_VISIBILITY
5119bool
5120operator>=(const sub_match<_BiIter>& __x,
5121 typename iterator_traits<_BiIter>::value_type const* __y)
5122{
5123 return !(__x < __y);
5124}
5125
5126template <class _BiIter>
5127inline _LIBCPP_INLINE_VISIBILITY
5128bool
5129operator<=(const sub_match<_BiIter>& __x,
5130 typename iterator_traits<_BiIter>::value_type const* __y)
5131{
5132 return !(__y < __x);
5133}
5134
5135template <class _BiIter>
5136inline _LIBCPP_INLINE_VISIBILITY
5137bool
5138operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5139 const sub_match<_BiIter>& __y)
5140{
5141 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5142 return __y.compare(string_type(1, __x)) == 0;
5143}
5144
5145template <class _BiIter>
5146inline _LIBCPP_INLINE_VISIBILITY
5147bool
5148operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5149 const sub_match<_BiIter>& __y)
5150{
5151 return !(__x == __y);
5152}
5153
5154template <class _BiIter>
5155inline _LIBCPP_INLINE_VISIBILITY
5156bool
5157operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5158 const sub_match<_BiIter>& __y)
5159{
5160 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5161 return __y.compare(string_type(1, __x)) > 0;
5162}
5163
5164template <class _BiIter>
5165inline _LIBCPP_INLINE_VISIBILITY
5166bool
5167operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5168 const sub_match<_BiIter>& __y)
5169{
5170 return __y < __x;
5171}
5172
5173template <class _BiIter>
5174inline _LIBCPP_INLINE_VISIBILITY
5175bool
5176operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5177 const sub_match<_BiIter>& __y)
5178{
5179 return !(__x < __y);
5180}
5181
5182template <class _BiIter>
5183inline _LIBCPP_INLINE_VISIBILITY
5184bool
5185operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5186 const sub_match<_BiIter>& __y)
5187{
5188 return !(__y < __x);
5189}
5190
5191template <class _BiIter>
5192inline _LIBCPP_INLINE_VISIBILITY
5193bool
5194operator==(const sub_match<_BiIter>& __x,
5195 typename iterator_traits<_BiIter>::value_type const& __y)
5196{
5197 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5198 return __x.compare(string_type(1, __y)) == 0;
5199}
5200
5201template <class _BiIter>
5202inline _LIBCPP_INLINE_VISIBILITY
5203bool
5204operator!=(const sub_match<_BiIter>& __x,
5205 typename iterator_traits<_BiIter>::value_type const& __y)
5206{
5207 return !(__x == __y);
5208}
5209
5210template <class _BiIter>
5211inline _LIBCPP_INLINE_VISIBILITY
5212bool
5213operator<(const sub_match<_BiIter>& __x,
5214 typename iterator_traits<_BiIter>::value_type const& __y)
5215{
5216 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5217 return __x.compare(string_type(1, __y)) < 0;
5218}
5219
5220template <class _BiIter>
5221inline _LIBCPP_INLINE_VISIBILITY
5222bool
5223operator>(const sub_match<_BiIter>& __x,
5224 typename iterator_traits<_BiIter>::value_type const& __y)
5225{
5226 return __y < __x;
5227}
5228
5229template <class _BiIter>
5230inline _LIBCPP_INLINE_VISIBILITY
5231bool
5232operator>=(const sub_match<_BiIter>& __x,
5233 typename iterator_traits<_BiIter>::value_type const& __y)
5234{
5235 return !(__x < __y);
5236}
5237
5238template <class _BiIter>
5239inline _LIBCPP_INLINE_VISIBILITY
5240bool
5241operator<=(const sub_match<_BiIter>& __x,
5242 typename iterator_traits<_BiIter>::value_type const& __y)
5243{
5244 return !(__y < __x);
5245}
5246
5247template <class _CharT, class _ST, class _BiIter>
5248inline _LIBCPP_INLINE_VISIBILITY
5249basic_ostream<_CharT, _ST>&
5250operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5251{
5252 return __os << __m.str();
5253}
5254
Howard Hinnant17615b02010-07-27 01:25:38 +00005255template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00005256class _LIBCPP_TYPE_VIS_ONLY match_results
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005257{
5258public:
5259 typedef _Allocator allocator_type;
5260 typedef sub_match<_BidirectionalIterator> value_type;
5261private:
5262 typedef vector<value_type, allocator_type> __container_type;
5263
5264 __container_type __matches_;
5265 value_type __unmatched_;
5266 value_type __prefix_;
5267 value_type __suffix_;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005268 bool __ready_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005269public:
Howard Hinnanta712c722010-08-16 20:21:16 +00005270 _BidirectionalIterator __position_start_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005271 typedef const value_type& const_reference;
Marshall Clow103af342014-02-26 01:56:31 +00005272 typedef value_type& reference;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005273 typedef typename __container_type::const_iterator const_iterator;
5274 typedef const_iterator iterator;
5275 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5276 typedef typename allocator_traits<allocator_type>::size_type size_type;
5277 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5278 typedef basic_string<char_type> string_type;
5279
5280 // construct/copy/destroy:
5281 explicit match_results(const allocator_type& __a = allocator_type());
5282// match_results(const match_results&) = default;
5283// match_results& operator=(const match_results&) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005284// match_results(match_results&& __m) = default;
5285// match_results& operator=(match_results&& __m) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005286// ~match_results() = default;
5287
Howard Hinnant31aaf552010-12-08 21:07:55 +00005288 _LIBCPP_INLINE_VISIBILITY
5289 bool ready() const {return __ready_;}
5290
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005291 // size:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005292 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005293 size_type size() const {return __matches_.size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005294 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005295 size_type max_size() const {return __matches_.max_size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005296 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005297 bool empty() const {return size() == 0;}
5298
5299 // element access:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005300 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005301 difference_type length(size_type __sub = 0) const
5302 {return (*this)[__sub].length();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005303 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005304 difference_type position(size_type __sub = 0) const
Howard Hinnant0949eed2011-06-30 21:18:19 +00005305 {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005306 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005307 string_type str(size_type __sub = 0) const
5308 {return (*this)[__sub].str();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005309 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005310 const_reference operator[](size_type __n) const
5311 {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
5312
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005313 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005314 const_reference prefix() const {return __prefix_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005315 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005316 const_reference suffix() const {return __suffix_;}
5317
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005318 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005319 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005320 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005321 const_iterator end() const {return __matches_.end();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005322 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005323 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005324 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005325 const_iterator cend() const {return __matches_.end();}
5326
5327 // format:
5328 template <class _OutputIter>
5329 _OutputIter
5330 format(_OutputIter __out, const char_type* __fmt_first,
5331 const char_type* __fmt_last,
5332 regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5333 template <class _OutputIter, class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005334 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005335 _OutputIter
5336 format(_OutputIter __out, const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005337 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5338 {return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005339 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005340 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005341 basic_string<char_type, _ST, _SA>
5342 format(const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005343 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5344 {
5345 basic_string<char_type, _ST, _SA> __r;
5346 format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5347 __flags);
5348 return __r;
5349 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005350 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005351 string_type
5352 format(const char_type* __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005353 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5354 {
5355 string_type __r;
5356 format(back_inserter(__r), __fmt,
5357 __fmt + char_traits<char_type>::length(__fmt), __flags);
5358 return __r;
5359 }
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005360
5361 // allocator:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005362 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005363 allocator_type get_allocator() const {return __matches_.get_allocator();}
5364
5365 // swap:
5366 void swap(match_results& __m);
5367
Howard Hinnant99968442011-11-29 18:15:50 +00005368 template <class _Bp, class _Ap>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005369 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005370 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
Howard Hinnant99968442011-11-29 18:15:50 +00005371 const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005372 {
Howard Hinnant99968442011-11-29 18:15:50 +00005373 _Bp __mf = __m.prefix().first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005374 __matches_.resize(__m.size());
5375 for (size_type __i = 0; __i < __matches_.size(); ++__i)
5376 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005377 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5378 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005379 __matches_[__i].matched = __m[__i].matched;
5380 }
5381 __unmatched_.first = __l;
5382 __unmatched_.second = __l;
5383 __unmatched_.matched = false;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005384 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5385 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005386 __prefix_.matched = __m.prefix().matched;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005387 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5388 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005389 __suffix_.matched = __m.suffix().matched;
Howard Hinnanta712c722010-08-16 20:21:16 +00005390 if (!__no_update_pos)
5391 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005392 __ready_ = __m.ready();
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005393 }
5394
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005395private:
5396 void __init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005397 _BidirectionalIterator __f, _BidirectionalIterator __l,
5398 bool __no_update_pos = false);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005399
5400 template <class, class> friend class basic_regex;
5401
Howard Hinnant99968442011-11-29 18:15:50 +00005402 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005403 friend
5404 bool
Howard Hinnant99968442011-11-29 18:15:50 +00005405 regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005406 regex_constants::match_flag_type);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005407
Howard Hinnant99968442011-11-29 18:15:50 +00005408 template <class _Bp, class _Ap>
Howard Hinnant27405f92010-08-14 18:14:02 +00005409 friend
5410 bool
Howard Hinnant99968442011-11-29 18:15:50 +00005411 operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
Howard Hinnant27405f92010-08-14 18:14:02 +00005412
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005413 template <class, class> friend class __lookahead;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005414};
5415
5416template <class _BidirectionalIterator, class _Allocator>
5417match_results<_BidirectionalIterator, _Allocator>::match_results(
5418 const allocator_type& __a)
5419 : __matches_(__a),
5420 __unmatched_(),
5421 __prefix_(),
Howard Hinnanta712c722010-08-16 20:21:16 +00005422 __suffix_(),
Howard Hinnant31aaf552010-12-08 21:07:55 +00005423 __position_start_(),
5424 __ready_(false)
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005425{
5426}
5427
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005428template <class _BidirectionalIterator, class _Allocator>
5429void
5430match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005431 _BidirectionalIterator __f, _BidirectionalIterator __l,
5432 bool __no_update_pos)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005433{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005434 __unmatched_.first = __l;
5435 __unmatched_.second = __l;
5436 __unmatched_.matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005437 __matches_.assign(__s, __unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005438 __prefix_.first = __f;
5439 __prefix_.second = __f;
5440 __prefix_.matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005441 __suffix_ = __unmatched_;
Howard Hinnanta712c722010-08-16 20:21:16 +00005442 if (!__no_update_pos)
5443 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005444 __ready_ = true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005445}
5446
Howard Hinnant27405f92010-08-14 18:14:02 +00005447template <class _BidirectionalIterator, class _Allocator>
5448template <class _OutputIter>
5449_OutputIter
5450match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __out,
5451 const char_type* __fmt_first, const char_type* __fmt_last,
5452 regex_constants::match_flag_type __flags) const
5453{
5454 if (__flags & regex_constants::format_sed)
5455 {
5456 for (; __fmt_first != __fmt_last; ++__fmt_first)
5457 {
5458 if (*__fmt_first == '&')
Howard Hinnant0949eed2011-06-30 21:18:19 +00005459 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
Howard Hinnant27405f92010-08-14 18:14:02 +00005460 __out);
5461 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5462 {
5463 ++__fmt_first;
5464 if ('0' <= *__fmt_first && *__fmt_first <= '9')
5465 {
5466 size_t __i = *__fmt_first - '0';
Howard Hinnant0949eed2011-06-30 21:18:19 +00005467 __out = _VSTD::copy(__matches_[__i].first,
Howard Hinnant27405f92010-08-14 18:14:02 +00005468 __matches_[__i].second, __out);
5469 }
5470 else
5471 {
5472 *__out = *__fmt_first;
5473 ++__out;
5474 }
5475 }
5476 else
5477 {
5478 *__out = *__fmt_first;
5479 ++__out;
5480 }
5481 }
5482 }
5483 else
5484 {
5485 for (; __fmt_first != __fmt_last; ++__fmt_first)
5486 {
5487 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5488 {
5489 switch (__fmt_first[1])
5490 {
5491 case '$':
5492 *__out = *++__fmt_first;
5493 ++__out;
5494 break;
5495 case '&':
5496 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005497 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
Howard Hinnant27405f92010-08-14 18:14:02 +00005498 __out);
5499 break;
5500 case '`':
5501 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005502 __out = _VSTD::copy(__prefix_.first, __prefix_.second, __out);
Howard Hinnant27405f92010-08-14 18:14:02 +00005503 break;
5504 case '\'':
5505 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005506 __out = _VSTD::copy(__suffix_.first, __suffix_.second, __out);
Howard Hinnant27405f92010-08-14 18:14:02 +00005507 break;
5508 default:
5509 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5510 {
5511 ++__fmt_first;
5512 size_t __i = *__fmt_first - '0';
5513 if (__fmt_first + 1 != __fmt_last &&
5514 '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5515 {
5516 ++__fmt_first;
5517 __i = 10 * __i + *__fmt_first - '0';
5518 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005519 __out = _VSTD::copy(__matches_[__i].first,
Howard Hinnant27405f92010-08-14 18:14:02 +00005520 __matches_[__i].second, __out);
5521 }
5522 else
5523 {
5524 *__out = *__fmt_first;
5525 ++__out;
5526 }
5527 break;
5528 }
5529 }
5530 else
5531 {
5532 *__out = *__fmt_first;
5533 ++__out;
5534 }
5535 }
5536 }
5537 return __out;
5538}
5539
5540template <class _BidirectionalIterator, class _Allocator>
5541void
5542match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5543{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005544 using _VSTD::swap;
Howard Hinnant27405f92010-08-14 18:14:02 +00005545 swap(__matches_, __m.__matches_);
5546 swap(__unmatched_, __m.__unmatched_);
5547 swap(__prefix_, __m.__prefix_);
5548 swap(__suffix_, __m.__suffix_);
Howard Hinnanta712c722010-08-16 20:21:16 +00005549 swap(__position_start_, __m.__position_start_);
Howard Hinnant31aaf552010-12-08 21:07:55 +00005550 swap(__ready_, __m.__ready_);
Howard Hinnant27405f92010-08-14 18:14:02 +00005551}
5552
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005553typedef match_results<const char*> cmatch;
5554typedef match_results<const wchar_t*> wcmatch;
5555typedef match_results<string::const_iterator> smatch;
5556typedef match_results<wstring::const_iterator> wsmatch;
5557
5558template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005559bool
5560operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5561 const match_results<_BidirectionalIterator, _Allocator>& __y)
5562{
Howard Hinnant31aaf552010-12-08 21:07:55 +00005563 if (__x.__ready_ != __y.__ready_)
5564 return false;
5565 if (!__x.__ready_)
5566 return true;
Howard Hinnant27405f92010-08-14 18:14:02 +00005567 return __x.__matches_ == __y.__matches_ &&
5568 __x.__prefix_ == __y.__prefix_ &&
Howard Hinnant31aaf552010-12-08 21:07:55 +00005569 __x.__suffix_ == __y.__suffix_;
Howard Hinnant27405f92010-08-14 18:14:02 +00005570}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005571
5572template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005573inline _LIBCPP_INLINE_VISIBILITY
5574bool
5575operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5576 const match_results<_BidirectionalIterator, _Allocator>& __y)
5577{
5578 return !(__x == __y);
5579}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005580
5581template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005582inline _LIBCPP_INLINE_VISIBILITY
5583void
5584swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5585 match_results<_BidirectionalIterator, _Allocator>& __y)
5586{
5587 __x.swap(__y);
5588}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005589
5590// regex_search
5591
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005592template <class _CharT, class _Traits>
Howard Hinnant17615b02010-07-27 01:25:38 +00005593template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005594bool
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005595basic_regex<_CharT, _Traits>::__match_at_start_ecma(
Howard Hinnant17615b02010-07-27 01:25:38 +00005596 const _CharT* __first, const _CharT* __last,
5597 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005598 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005599{
Howard Hinnant17615b02010-07-27 01:25:38 +00005600 vector<__state> __states;
Howard Hinnant17615b02010-07-27 01:25:38 +00005601 __node* __st = __start_.get();
5602 if (__st)
5603 {
Marshall Clow5e56c302015-01-28 22:22:35 +00005604 sub_match<const _CharT*> __unmatched;
5605 __unmatched.first = __last;
5606 __unmatched.second = __last;
5607 __unmatched.matched = false;
5608
Howard Hinnant17615b02010-07-27 01:25:38 +00005609 __states.push_back(__state());
5610 __states.back().__do_ = 0;
5611 __states.back().__first_ = __first;
5612 __states.back().__current_ = __first;
5613 __states.back().__last_ = __last;
Marshall Clow5e56c302015-01-28 22:22:35 +00005614 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
Howard Hinnant17615b02010-07-27 01:25:38 +00005615 __states.back().__loop_data_.resize(__loop_count());
5616 __states.back().__node_ = __st;
5617 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005618 __states.back().__at_first_ = __at_first;
Howard Hinnant17615b02010-07-27 01:25:38 +00005619 do
5620 {
5621 __state& __s = __states.back();
5622 if (__s.__node_)
5623 __s.__node_->__exec(__s);
5624 switch (__s.__do_)
5625 {
5626 case __state::__end_state:
5627 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005628 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
Howard Hinnant17615b02010-07-27 01:25:38 +00005629 __m.__matches_[0].matched = true;
5630 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5631 __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5632 return true;
5633 case __state::__accept_and_consume:
5634 case __state::__repeat:
5635 case __state::__accept_but_not_consume:
5636 break;
5637 case __state::__split:
5638 {
5639 __state __snext = __s;
5640 __s.__node_->__exec_split(true, __s);
5641 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005642 __states.push_back(_VSTD::move(__snext));
Howard Hinnant17615b02010-07-27 01:25:38 +00005643 }
5644 break;
5645 case __state::__reject:
5646 __states.pop_back();
5647 break;
5648 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005649#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005650 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005651#endif
Howard Hinnant17615b02010-07-27 01:25:38 +00005652 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00005653
Howard Hinnant17615b02010-07-27 01:25:38 +00005654 }
5655 } while (!__states.empty());
5656 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005657 return false;
5658}
5659
5660template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005661template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005662bool
5663basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5664 const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005665 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005666 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005667{
Howard Hinnantac303862010-07-12 15:51:17 +00005668 deque<__state> __states;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005669 ptrdiff_t __highest_j = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00005670 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005671 __node* __st = __start_.get();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005672 if (__st)
5673 {
Howard Hinnantac303862010-07-12 15:51:17 +00005674 __states.push_back(__state());
Howard Hinnantac303862010-07-12 15:51:17 +00005675 __states.back().__do_ = 0;
5676 __states.back().__first_ = __first;
5677 __states.back().__current_ = __first;
5678 __states.back().__last_ = __last;
5679 __states.back().__loop_data_.resize(__loop_count());
5680 __states.back().__node_ = __st;
5681 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005682 __states.back().__at_first_ = __at_first;
Howard Hinnant68025ed2010-07-14 15:45:11 +00005683 bool __matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005684 do
5685 {
Howard Hinnantac303862010-07-12 15:51:17 +00005686 __state& __s = __states.back();
5687 if (__s.__node_)
5688 __s.__node_->__exec(__s);
5689 switch (__s.__do_)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005690 {
Howard Hinnantac303862010-07-12 15:51:17 +00005691 case __state::__end_state:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005692 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant68025ed2010-07-14 15:45:11 +00005693 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005694 __matched = true;
Howard Hinnant99968442011-11-29 18:15:50 +00005695 if (__highest_j == _Np)
Howard Hinnantac303862010-07-12 15:51:17 +00005696 __states.clear();
5697 else
5698 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005699 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005700 case __state::__consume_input:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005701 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005702 case __state::__accept_and_consume:
Howard Hinnant0949eed2011-06-30 21:18:19 +00005703 __states.push_front(_VSTD::move(__s));
Howard Hinnantac303862010-07-12 15:51:17 +00005704 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005705 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005706 case __state::__repeat:
5707 case __state::__accept_but_not_consume:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005708 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005709 case __state::__split:
5710 {
5711 __state __snext = __s;
5712 __s.__node_->__exec_split(true, __s);
5713 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005714 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005715 }
5716 break;
5717 case __state::__reject:
5718 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005719 break;
5720 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005721#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005722 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005723#endif
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005724 break;
5725 }
Howard Hinnantac303862010-07-12 15:51:17 +00005726 } while (!__states.empty());
Howard Hinnant68025ed2010-07-14 15:45:11 +00005727 if (__matched)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005728 {
5729 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005730 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005731 __m.__matches_[0].matched = true;
5732 return true;
5733 }
5734 }
5735 return false;
5736}
5737
5738template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005739template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005740bool
5741basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005742 const _CharT* __first, const _CharT* __last,
5743 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005744 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005745{
Howard Hinnantac303862010-07-12 15:51:17 +00005746 vector<__state> __states;
Howard Hinnantac303862010-07-12 15:51:17 +00005747 __state __best_state;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005748 ptrdiff_t __j = 0;
5749 ptrdiff_t __highest_j = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00005750 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005751 __node* __st = __start_.get();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005752 if (__st)
5753 {
Marshall Clow5e56c302015-01-28 22:22:35 +00005754 sub_match<const _CharT*> __unmatched;
5755 __unmatched.first = __last;
5756 __unmatched.second = __last;
5757 __unmatched.matched = false;
5758
Howard Hinnantac303862010-07-12 15:51:17 +00005759 __states.push_back(__state());
5760 __states.back().__do_ = 0;
5761 __states.back().__first_ = __first;
5762 __states.back().__current_ = __first;
5763 __states.back().__last_ = __last;
Marshall Clow5e56c302015-01-28 22:22:35 +00005764 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
Howard Hinnantac303862010-07-12 15:51:17 +00005765 __states.back().__loop_data_.resize(__loop_count());
5766 __states.back().__node_ = __st;
5767 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005768 __states.back().__at_first_ = __at_first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005769 const _CharT* __current = __first;
Howard Hinnantac303862010-07-12 15:51:17 +00005770 bool __matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005771 do
5772 {
Howard Hinnantac303862010-07-12 15:51:17 +00005773 __state& __s = __states.back();
5774 if (__s.__node_)
5775 __s.__node_->__exec(__s);
5776 switch (__s.__do_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005777 {
Howard Hinnantac303862010-07-12 15:51:17 +00005778 case __state::__end_state:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005779 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005780 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005781 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantac303862010-07-12 15:51:17 +00005782 __best_state = __s;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005783 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005784 __matched = true;
Howard Hinnant99968442011-11-29 18:15:50 +00005785 if (__highest_j == _Np)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005786 __states.clear();
5787 else
5788 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005789 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005790 case __state::__accept_and_consume:
Howard Hinnantcba352d2010-07-12 18:16:05 +00005791 __j += __s.__current_ - __current;
5792 __current = __s.__current_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005793 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005794 case __state::__repeat:
5795 case __state::__accept_but_not_consume:
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005796 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005797 case __state::__split:
5798 {
5799 __state __snext = __s;
5800 __s.__node_->__exec_split(true, __s);
5801 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005802 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005803 }
5804 break;
5805 case __state::__reject:
5806 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005807 break;
5808 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005809#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005810 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005811#endif
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005812 break;
5813 }
Howard Hinnantac303862010-07-12 15:51:17 +00005814 } while (!__states.empty());
5815 if (__matched)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005816 {
5817 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005818 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005819 __m.__matches_[0].matched = true;
Howard Hinnantac303862010-07-12 15:51:17 +00005820 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
5821 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005822 return true;
5823 }
5824 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005825 return false;
5826}
5827
5828template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005829template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005830bool
5831basic_regex<_CharT, _Traits>::__match_at_start(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005832 const _CharT* __first, const _CharT* __last,
5833 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005834 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005835{
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005836 if ((__flags_ & 0x1F0) == ECMAScript)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005837 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005838 if (mark_count() == 0)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005839 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
5840 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005841}
5842
5843template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005844template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005845bool
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005846basic_regex<_CharT, _Traits>::__search(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005847 const _CharT* __first, const _CharT* __last,
5848 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005849 regex_constants::match_flag_type __flags) const
5850{
Howard Hinnanta712c722010-08-16 20:21:16 +00005851 __m.__init(1 + mark_count(), __first, __last,
5852 __flags & regex_constants::__no_update_pos);
Howard Hinnant7670f7d2013-07-09 17:29:09 +00005853 if (__match_at_start(__first, __last, __m, __flags,
5854 !(__flags & regex_constants::__no_update_pos)))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005855 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005856 __m.__prefix_.second = __m[0].first;
5857 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5858 __m.__suffix_.first = __m[0].second;
5859 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5860 return true;
5861 }
Howard Hinnant8daa7332010-07-29 01:15:27 +00005862 if (__first != __last && !(__flags & regex_constants::match_continuous))
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005863 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005864 __flags |= regex_constants::match_prev_avail;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005865 for (++__first; __first != __last; ++__first)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005866 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005867 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005868 if (__match_at_start(__first, __last, __m, __flags, false))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005869 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005870 __m.__prefix_.second = __m[0].first;
5871 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5872 __m.__suffix_.first = __m[0].second;
5873 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5874 return true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005875 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005876 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005877 }
5878 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005879 __m.__matches_.clear();
5880 return false;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005881}
5882
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005883template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005884inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005885bool
5886regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5887 match_results<_BidirectionalIterator, _Allocator>& __m,
5888 const basic_regex<_CharT, _Traits>& __e,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005889 regex_constants::match_flag_type __flags = regex_constants::match_default)
5890{
Howard Hinnante8402082013-07-11 15:32:55 +00005891 int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
5892 basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005893 match_results<const _CharT*> __mc;
Howard Hinnante8402082013-07-11 15:32:55 +00005894 bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005895 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005896 return __r;
5897}
5898
Howard Hinnanta9602d52013-06-29 23:45:43 +00005899template <class _Iter, class _Allocator, class _CharT, class _Traits>
5900inline _LIBCPP_INLINE_VISIBILITY
5901bool
5902regex_search(__wrap_iter<_Iter> __first,
5903 __wrap_iter<_Iter> __last,
5904 match_results<__wrap_iter<_Iter>, _Allocator>& __m,
5905 const basic_regex<_CharT, _Traits>& __e,
5906 regex_constants::match_flag_type __flags = regex_constants::match_default)
5907{
5908 match_results<const _CharT*> __mc;
5909 bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
5910 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
5911 return __r;
5912}
5913
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005914template <class _Allocator, class _CharT, class _Traits>
5915inline _LIBCPP_INLINE_VISIBILITY
5916bool
5917regex_search(const _CharT* __first, const _CharT* __last,
5918 match_results<const _CharT*, _Allocator>& __m,
5919 const basic_regex<_CharT, _Traits>& __e,
5920 regex_constants::match_flag_type __flags = regex_constants::match_default)
5921{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005922 return __e.__search(__first, __last, __m, __flags);
5923}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005924
5925template <class _BidirectionalIterator, class _CharT, class _Traits>
5926inline _LIBCPP_INLINE_VISIBILITY
5927bool
5928regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5929 const basic_regex<_CharT, _Traits>& __e,
5930 regex_constants::match_flag_type __flags = regex_constants::match_default)
5931{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005932 basic_string<_CharT> __s(__first, __last);
5933 match_results<const _CharT*> __mc;
5934 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5935}
5936
5937template <class _CharT, class _Traits>
5938inline _LIBCPP_INLINE_VISIBILITY
5939bool
5940regex_search(const _CharT* __first, const _CharT* __last,
5941 const basic_regex<_CharT, _Traits>& __e,
5942 regex_constants::match_flag_type __flags = regex_constants::match_default)
5943{
5944 match_results<const _CharT*> __mc;
5945 return __e.__search(__first, __last, __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005946}
5947
5948template <class _CharT, class _Allocator, class _Traits>
5949inline _LIBCPP_INLINE_VISIBILITY
5950bool
5951regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5952 const basic_regex<_CharT, _Traits>& __e,
5953 regex_constants::match_flag_type __flags = regex_constants::match_default)
5954{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005955 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005956}
5957
5958template <class _CharT, class _Traits>
5959inline _LIBCPP_INLINE_VISIBILITY
5960bool
5961regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5962 regex_constants::match_flag_type __flags = regex_constants::match_default)
5963{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005964 match_results<const _CharT*> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005965 return _VSTD::regex_search(__str, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005966}
5967
5968template <class _ST, class _SA, class _CharT, class _Traits>
5969inline _LIBCPP_INLINE_VISIBILITY
5970bool
5971regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5972 const basic_regex<_CharT, _Traits>& __e,
5973 regex_constants::match_flag_type __flags = regex_constants::match_default)
5974{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005975 match_results<const _CharT*> __mc;
5976 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005977}
5978
5979template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5980inline _LIBCPP_INLINE_VISIBILITY
5981bool
5982regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5983 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5984 const basic_regex<_CharT, _Traits>& __e,
5985 regex_constants::match_flag_type __flags = regex_constants::match_default)
5986{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005987 match_results<const _CharT*> __mc;
5988 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005989 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005990 return __r;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005991}
5992
Marshall Clowe0f86722014-02-19 21:21:11 +00005993#if _LIBCPP_STD_VER > 11
5994template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
5995bool
5996regex_search(const basic_string<_Cp, _ST, _SA>&& __s,
5997 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
5998 const basic_regex<_Cp, _Tp>& __e,
5999 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6000#endif
6001
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006002// regex_match
6003
6004template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
6005bool
6006regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6007 match_results<_BidirectionalIterator, _Allocator>& __m,
6008 const basic_regex<_CharT, _Traits>& __e,
6009 regex_constants::match_flag_type __flags = regex_constants::match_default)
6010{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006011 bool __r = _VSTD::regex_search(__first, __last, __m, __e,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006012 __flags | regex_constants::match_continuous);
6013 if (__r)
6014 {
6015 __r = !__m.suffix().matched;
6016 if (!__r)
6017 __m.__matches_.clear();
6018 }
6019 return __r;
6020}
6021
6022template <class _BidirectionalIterator, class _CharT, class _Traits>
6023inline _LIBCPP_INLINE_VISIBILITY
6024bool
6025regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6026 const basic_regex<_CharT, _Traits>& __e,
6027 regex_constants::match_flag_type __flags = regex_constants::match_default)
6028{
6029 match_results<_BidirectionalIterator> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006030 return _VSTD::regex_match(__first, __last, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006031}
6032
6033template <class _CharT, class _Allocator, class _Traits>
6034inline _LIBCPP_INLINE_VISIBILITY
6035bool
6036regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6037 const basic_regex<_CharT, _Traits>& __e,
6038 regex_constants::match_flag_type __flags = regex_constants::match_default)
6039{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006040 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006041}
6042
6043template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6044inline _LIBCPP_INLINE_VISIBILITY
6045bool
6046regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6047 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6048 const basic_regex<_CharT, _Traits>& __e,
6049 regex_constants::match_flag_type __flags = regex_constants::match_default)
6050{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006051 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006052}
6053
Marshall Clowe0f86722014-02-19 21:21:11 +00006054#if _LIBCPP_STD_VER > 11
6055template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6056inline _LIBCPP_INLINE_VISIBILITY
6057bool
6058regex_match(const basic_string<_CharT, _ST, _SA>&& __s,
6059 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6060 const basic_regex<_CharT, _Traits>& __e,
6061 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6062#endif
6063
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006064template <class _CharT, class _Traits>
6065inline _LIBCPP_INLINE_VISIBILITY
6066bool
6067regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6068 regex_constants::match_flag_type __flags = regex_constants::match_default)
6069{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006070 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006071}
6072
6073template <class _ST, class _SA, class _CharT, class _Traits>
6074inline _LIBCPP_INLINE_VISIBILITY
6075bool
6076regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6077 const basic_regex<_CharT, _Traits>& __e,
6078 regex_constants::match_flag_type __flags = regex_constants::match_default)
6079{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006080 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006081}
6082
Howard Hinnanta712c722010-08-16 20:21:16 +00006083// regex_iterator
6084
6085template <class _BidirectionalIterator,
6086 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6087 class _Traits = regex_traits<_CharT> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +00006088class _LIBCPP_TYPE_VIS_ONLY regex_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00006089{
6090public:
6091 typedef basic_regex<_CharT, _Traits> regex_type;
6092 typedef match_results<_BidirectionalIterator> value_type;
6093 typedef ptrdiff_t difference_type;
6094 typedef const value_type* pointer;
6095 typedef const value_type& reference;
6096 typedef forward_iterator_tag iterator_category;
6097
6098private:
6099 _BidirectionalIterator __begin_;
6100 _BidirectionalIterator __end_;
6101 const regex_type* __pregex_;
6102 regex_constants::match_flag_type __flags_;
6103 value_type __match_;
6104
6105public:
6106 regex_iterator();
6107 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6108 const regex_type& __re,
Marshall Clowe0f86722014-02-19 21:21:11 +00006109 regex_constants::match_flag_type __m
6110 = regex_constants::match_default);
6111#if _LIBCPP_STD_VER > 11
6112 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6113 const regex_type&& __re,
6114 regex_constants::match_flag_type __m
6115 = regex_constants::match_default) = delete;
6116#endif
Howard Hinnanta712c722010-08-16 20:21:16 +00006117
6118 bool operator==(const regex_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006119 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006120 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
6121
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006122 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006123 reference operator*() const {return __match_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006124 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006125 pointer operator->() const {return &__match_;}
6126
6127 regex_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006128 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006129 regex_iterator operator++(int)
6130 {
6131 regex_iterator __t(*this);
6132 ++(*this);
6133 return __t;
6134 }
6135};
6136
6137template <class _BidirectionalIterator, class _CharT, class _Traits>
6138regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
6139 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
6140{
6141}
6142
6143template <class _BidirectionalIterator, class _CharT, class _Traits>
6144regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6145 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6146 const regex_type& __re, regex_constants::match_flag_type __m)
6147 : __begin_(__a),
6148 __end_(__b),
6149 __pregex_(&__re),
6150 __flags_(__m)
6151{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006152 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
Howard Hinnanta712c722010-08-16 20:21:16 +00006153}
6154
6155template <class _BidirectionalIterator, class _CharT, class _Traits>
6156bool
6157regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6158 operator==(const regex_iterator& __x) const
6159{
6160 if (__match_.empty() && __x.__match_.empty())
6161 return true;
6162 if (__match_.empty() || __x.__match_.empty())
6163 return false;
6164 return __begin_ == __x.__begin_ &&
6165 __end_ == __x.__end_ &&
6166 __pregex_ == __x.__pregex_ &&
6167 __flags_ == __x.__flags_ &&
6168 __match_[0] == __x.__match_[0];
6169}
6170
6171template <class _BidirectionalIterator, class _CharT, class _Traits>
6172regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6173regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6174{
6175 __flags_ |= regex_constants::__no_update_pos;
6176 _BidirectionalIterator __start = __match_[0].second;
Howard Hinnanta9602d52013-06-29 23:45:43 +00006177 if (__match_.empty())
Howard Hinnanta712c722010-08-16 20:21:16 +00006178 {
6179 if (__start == __end_)
6180 {
6181 __match_ = value_type();
6182 return *this;
6183 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00006184 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
Howard Hinnanta712c722010-08-16 20:21:16 +00006185 __flags_ | regex_constants::match_not_null |
6186 regex_constants::match_continuous))
6187 return *this;
6188 else
6189 ++__start;
6190 }
6191 __flags_ |= regex_constants::match_prev_avail;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006192 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
Howard Hinnanta712c722010-08-16 20:21:16 +00006193 __match_ = value_type();
6194 return *this;
6195}
6196
6197typedef regex_iterator<const char*> cregex_iterator;
6198typedef regex_iterator<const wchar_t*> wcregex_iterator;
6199typedef regex_iterator<string::const_iterator> sregex_iterator;
6200typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
6201
6202// regex_token_iterator
6203
6204template <class _BidirectionalIterator,
6205 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6206 class _Traits = regex_traits<_CharT> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +00006207class _LIBCPP_TYPE_VIS_ONLY regex_token_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00006208{
6209public:
6210 typedef basic_regex<_CharT, _Traits> regex_type;
6211 typedef sub_match<_BidirectionalIterator> value_type;
6212 typedef ptrdiff_t difference_type;
6213 typedef const value_type* pointer;
6214 typedef const value_type& reference;
6215 typedef forward_iterator_tag iterator_category;
6216
Howard Hinnant262b7792010-08-17 20:42:03 +00006217private:
6218 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6219
6220 _Position __position_;
6221 const value_type* __result_;
6222 value_type __suffix_;
6223 ptrdiff_t _N_;
6224 vector<int> __subs_;
6225
6226public:
Howard Hinnanta712c722010-08-16 20:21:16 +00006227 regex_token_iterator();
6228 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6229 const regex_type& __re, int __submatch = 0,
Howard Hinnant262b7792010-08-17 20:42:03 +00006230 regex_constants::match_flag_type __m =
6231 regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +00006232#if _LIBCPP_STD_VER > 11
6233 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6234 const regex_type&& __re, int __submatch = 0,
6235 regex_constants::match_flag_type __m =
6236 regex_constants::match_default) = delete;
6237#endif
6238
Howard Hinnanta712c722010-08-16 20:21:16 +00006239 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6240 const regex_type& __re, const vector<int>& __submatches,
Howard Hinnant262b7792010-08-17 20:42:03 +00006241 regex_constants::match_flag_type __m =
6242 regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +00006243#if _LIBCPP_STD_VER > 11
6244 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6245 const regex_type&& __re, const vector<int>& __submatches,
6246 regex_constants::match_flag_type __m =
6247 regex_constants::match_default) = delete;
6248#endif
6249
Howard Hinnante3e32912011-08-12 21:56:02 +00006250#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnanta712c722010-08-16 20:21:16 +00006251 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
Howard Hinnant262b7792010-08-17 20:42:03 +00006252 const regex_type& __re,
6253 initializer_list<int> __submatches,
6254 regex_constants::match_flag_type __m =
6255 regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +00006256
6257#if _LIBCPP_STD_VER > 11
6258 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6259 const regex_type&& __re,
6260 initializer_list<int> __submatches,
6261 regex_constants::match_flag_type __m =
6262 regex_constants::match_default) = delete;
6263#endif
Howard Hinnante3e32912011-08-12 21:56:02 +00006264#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant99968442011-11-29 18:15:50 +00006265 template <size_t _Np>
Howard Hinnant262b7792010-08-17 20:42:03 +00006266 regex_token_iterator(_BidirectionalIterator __a,
6267 _BidirectionalIterator __b,
6268 const regex_type& __re,
Howard Hinnant99968442011-11-29 18:15:50 +00006269 const int (&__submatches)[_Np],
Howard Hinnant262b7792010-08-17 20:42:03 +00006270 regex_constants::match_flag_type __m =
6271 regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +00006272#if _LIBCPP_STD_VER > 11
6273 template <std::size_t _Np>
6274 regex_token_iterator(_BidirectionalIterator __a,
6275 _BidirectionalIterator __b,
6276 const regex_type&& __re,
6277 const int (&__submatches)[_Np],
6278 regex_constants::match_flag_type __m =
6279 regex_constants::match_default) = delete;
6280#endif
6281
Howard Hinnanta712c722010-08-16 20:21:16 +00006282 regex_token_iterator(const regex_token_iterator&);
6283 regex_token_iterator& operator=(const regex_token_iterator&);
6284
Howard Hinnant262b7792010-08-17 20:42:03 +00006285 bool operator==(const regex_token_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006286 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006287 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
Howard Hinnanta712c722010-08-16 20:21:16 +00006288
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006289 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006290 const value_type& operator*() const {return *__result_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006291 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006292 const value_type* operator->() const {return __result_;}
Howard Hinnanta712c722010-08-16 20:21:16 +00006293
6294 regex_token_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006295 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006296 regex_token_iterator operator++(int)
6297 {
6298 regex_token_iterator __t(*this);
6299 ++(*this);
6300 return __t;
6301 }
6302
6303private:
6304 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006305 void __establish_result () {
6306 if (__subs_[_N_] == -1)
6307 __result_ = &__position_->prefix();
6308 else
6309 __result_ = &(*__position_)[__subs_[_N_]];
6310 }
Howard Hinnanta712c722010-08-16 20:21:16 +00006311};
6312
Howard Hinnant262b7792010-08-17 20:42:03 +00006313template <class _BidirectionalIterator, class _CharT, class _Traits>
6314regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6315 regex_token_iterator()
6316 : __result_(nullptr),
6317 __suffix_(),
6318 _N_(0)
6319{
6320}
6321
6322template <class _BidirectionalIterator, class _CharT, class _Traits>
6323void
6324regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6325 __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6326{
6327 if (__position_ != _Position())
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006328 __establish_result ();
Howard Hinnant262b7792010-08-17 20:42:03 +00006329 else if (__subs_[_N_] == -1)
6330 {
6331 __suffix_.matched = true;
6332 __suffix_.first = __a;
6333 __suffix_.second = __b;
6334 __result_ = &__suffix_;
6335 }
6336 else
6337 __result_ = nullptr;
6338}
6339
6340template <class _BidirectionalIterator, class _CharT, class _Traits>
6341regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6342 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6343 const regex_type& __re, int __submatch,
6344 regex_constants::match_flag_type __m)
6345 : __position_(__a, __b, __re, __m),
6346 _N_(0),
6347 __subs_(1, __submatch)
6348{
6349 __init(__a, __b);
6350}
6351
6352template <class _BidirectionalIterator, class _CharT, class _Traits>
6353regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6354 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6355 const regex_type& __re, const vector<int>& __submatches,
6356 regex_constants::match_flag_type __m)
6357 : __position_(__a, __b, __re, __m),
6358 _N_(0),
6359 __subs_(__submatches)
6360{
6361 __init(__a, __b);
6362}
6363
Howard Hinnante3e32912011-08-12 21:56:02 +00006364#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6365
Howard Hinnant262b7792010-08-17 20:42:03 +00006366template <class _BidirectionalIterator, class _CharT, class _Traits>
6367regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6368 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6369 const regex_type& __re,
6370 initializer_list<int> __submatches,
6371 regex_constants::match_flag_type __m)
6372 : __position_(__a, __b, __re, __m),
6373 _N_(0),
6374 __subs_(__submatches)
6375{
6376 __init(__a, __b);
6377}
6378
Howard Hinnante3e32912011-08-12 21:56:02 +00006379#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6380
Howard Hinnant262b7792010-08-17 20:42:03 +00006381template <class _BidirectionalIterator, class _CharT, class _Traits>
Howard Hinnant99968442011-11-29 18:15:50 +00006382template <size_t _Np>
Howard Hinnant262b7792010-08-17 20:42:03 +00006383regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6384 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6385 const regex_type& __re,
Howard Hinnant99968442011-11-29 18:15:50 +00006386 const int (&__submatches)[_Np],
Howard Hinnant262b7792010-08-17 20:42:03 +00006387 regex_constants::match_flag_type __m)
6388 : __position_(__a, __b, __re, __m),
6389 _N_(0),
Howard Hinnant99968442011-11-29 18:15:50 +00006390 __subs_(__submatches, __submatches + _Np)
Howard Hinnant262b7792010-08-17 20:42:03 +00006391{
6392 __init(__a, __b);
6393}
6394
6395template <class _BidirectionalIterator, class _CharT, class _Traits>
6396regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6397 regex_token_iterator(const regex_token_iterator& __x)
6398 : __position_(__x.__position_),
6399 __result_(__x.__result_),
6400 __suffix_(__x.__suffix_),
6401 _N_(__x._N_),
6402 __subs_(__x.__subs_)
6403{
6404 if (__x.__result_ == &__x.__suffix_)
Marshall Clow72fe0ae2014-01-13 17:47:08 +00006405 __result_ = &__suffix_;
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006406 else if ( __result_ != nullptr )
6407 __establish_result ();
Howard Hinnant262b7792010-08-17 20:42:03 +00006408}
6409
6410template <class _BidirectionalIterator, class _CharT, class _Traits>
6411regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6412regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6413 operator=(const regex_token_iterator& __x)
6414{
6415 if (this != &__x)
6416 {
6417 __position_ = __x.__position_;
6418 if (__x.__result_ == &__x.__suffix_)
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006419 __result_ = &__suffix_;
Howard Hinnant262b7792010-08-17 20:42:03 +00006420 else
6421 __result_ = __x.__result_;
6422 __suffix_ = __x.__suffix_;
6423 _N_ = __x._N_;
6424 __subs_ = __x.__subs_;
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006425
6426 if ( __result_ != nullptr && __result_ != &__suffix_ )
6427 __establish_result();
Howard Hinnant262b7792010-08-17 20:42:03 +00006428 }
6429 return *this;
6430}
6431
6432template <class _BidirectionalIterator, class _CharT, class _Traits>
6433bool
6434regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6435 operator==(const regex_token_iterator& __x) const
6436{
6437 if (__result_ == nullptr && __x.__result_ == nullptr)
6438 return true;
6439 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6440 __suffix_ == __x.__suffix_)
6441 return true;
6442 if (__result_ == nullptr || __x.__result_ == nullptr)
6443 return false;
6444 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6445 return false;
6446 return __position_ == __x.__position_ && _N_ == __x._N_ &&
6447 __subs_ == __x.__subs_;
6448}
6449
6450template <class _BidirectionalIterator, class _CharT, class _Traits>
6451regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6452regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6453{
6454 _Position __prev = __position_;
6455 if (__result_ == &__suffix_)
6456 __result_ = nullptr;
6457 else if (_N_ + 1 < __subs_.size())
6458 {
6459 ++_N_;
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006460 __establish_result();
Howard Hinnant262b7792010-08-17 20:42:03 +00006461 }
6462 else
6463 {
6464 _N_ = 0;
6465 ++__position_;
6466 if (__position_ != _Position())
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006467 __establish_result();
Howard Hinnant262b7792010-08-17 20:42:03 +00006468 else
6469 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00006470 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
Howard Hinnant262b7792010-08-17 20:42:03 +00006471 && __prev->suffix().length() != 0)
6472 {
6473 __suffix_.matched = true;
6474 __suffix_.first = __prev->suffix().first;
6475 __suffix_.second = __prev->suffix().second;
6476 __result_ = &__suffix_;
6477 }
6478 else
6479 __result_ = nullptr;
6480 }
6481 }
6482 return *this;
6483}
6484
Howard Hinnanta712c722010-08-16 20:21:16 +00006485typedef regex_token_iterator<const char*> cregex_token_iterator;
6486typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
6487typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
6488typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
6489
Howard Hinnanta8d77592010-08-18 00:13:08 +00006490// regex_replace
6491
6492template <class _OutputIterator, class _BidirectionalIterator,
6493 class _Traits, class _CharT>
6494_OutputIterator
6495regex_replace(_OutputIterator __out,
6496 _BidirectionalIterator __first, _BidirectionalIterator __last,
6497 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6498 regex_constants::match_flag_type __flags = regex_constants::match_default)
6499{
6500 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6501 _Iter __i(__first, __last, __e, __flags);
6502 _Iter __eof;
6503 if (__i == __eof)
6504 {
6505 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006506 __out = _VSTD::copy(__first, __last, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006507 }
6508 else
6509 {
6510 sub_match<_BidirectionalIterator> __lm;
6511 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6512 {
6513 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006514 __out = _VSTD::copy(__i->prefix().first, __i->prefix().second, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006515 __out = __i->format(__out, __fmt, __fmt + __len, __flags);
6516 __lm = __i->suffix();
6517 if (__flags & regex_constants::format_first_only)
6518 break;
6519 }
6520 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006521 __out = _VSTD::copy(__lm.first, __lm.second, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006522 }
6523 return __out;
6524}
6525
6526template <class _OutputIterator, class _BidirectionalIterator,
6527 class _Traits, class _CharT, class _ST, class _SA>
6528inline _LIBCPP_INLINE_VISIBILITY
6529_OutputIterator
6530regex_replace(_OutputIterator __out,
6531 _BidirectionalIterator __first, _BidirectionalIterator __last,
6532 const basic_regex<_CharT, _Traits>& __e,
6533 const basic_string<_CharT, _ST, _SA>& __fmt,
6534 regex_constants::match_flag_type __flags = regex_constants::match_default)
6535{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006536 return _VSTD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006537}
6538
6539template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6540 class _FSA>
6541inline _LIBCPP_INLINE_VISIBILITY
6542basic_string<_CharT, _ST, _SA>
6543regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6544 const basic_regex<_CharT, _Traits>& __e,
6545 const basic_string<_CharT, _FST, _FSA>& __fmt,
6546 regex_constants::match_flag_type __flags = regex_constants::match_default)
6547{
6548 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006549 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006550 __fmt.c_str(), __flags);
6551 return __r;
6552}
6553
6554template <class _Traits, class _CharT, class _ST, class _SA>
6555inline _LIBCPP_INLINE_VISIBILITY
6556basic_string<_CharT, _ST, _SA>
6557regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6558 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6559 regex_constants::match_flag_type __flags = regex_constants::match_default)
6560{
6561 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006562 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006563 __fmt, __flags);
6564 return __r;
6565}
6566
6567template <class _Traits, class _CharT, class _ST, class _SA>
6568inline _LIBCPP_INLINE_VISIBILITY
6569basic_string<_CharT>
6570regex_replace(const _CharT* __s,
6571 const basic_regex<_CharT, _Traits>& __e,
6572 const basic_string<_CharT, _ST, _SA>& __fmt,
6573 regex_constants::match_flag_type __flags = regex_constants::match_default)
6574{
6575 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006576 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006577 __s + char_traits<_CharT>::length(__s), __e,
6578 __fmt.c_str(), __flags);
6579 return __r;
6580}
6581
6582template <class _Traits, class _CharT>
6583inline _LIBCPP_INLINE_VISIBILITY
6584basic_string<_CharT>
6585regex_replace(const _CharT* __s,
6586 const basic_regex<_CharT, _Traits>& __e,
6587 const _CharT* __fmt,
6588 regex_constants::match_flag_type __flags = regex_constants::match_default)
6589{
6590 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006591 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006592 __s + char_traits<_CharT>::length(__s), __e,
6593 __fmt, __flags);
6594 return __r;
6595}
6596
Howard Hinnant3257c982010-06-17 00:34:59 +00006597_LIBCPP_END_NAMESPACE_STD
6598
6599#endif // _LIBCPP_REGEX