blob: 1da7b0e76f7227fdcd688d657a6134901224a4e3 [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&);
150 basic_regex(basic_regex&&);
151 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&);
162 basic_regex& operator=(basic_regex&&);
163 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);
170 basic_regex& assign(basic_regex&& that);
171 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;
440 typedef const_reference reference;
441 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);
452 match_results(match_results&& m);
453 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
549template <class charT, class traits>
550 bool
551 regex_match(const charT* str, const basic_regex<charT, traits>& e,
552 regex_constants::match_flag_type flags = regex_constants::match_default);
553
554template <class ST, class SA, class charT, class traits>
555 bool
556 regex_match(const basic_string<charT, ST, SA>& s,
557 const basic_regex<charT, traits>& e,
558 regex_constants::match_flag_type flags = regex_constants::match_default);
559
560template <class BidirectionalIterator, class Allocator, class charT, class traits>
561 bool
562 regex_search(BidirectionalIterator first, BidirectionalIterator last,
563 match_results<BidirectionalIterator, Allocator>& m,
564 const basic_regex<charT, traits>& e,
565 regex_constants::match_flag_type flags = regex_constants::match_default);
566
567template <class BidirectionalIterator, class charT, class traits>
568 bool
569 regex_search(BidirectionalIterator first, BidirectionalIterator last,
570 const basic_regex<charT, traits>& e,
571 regex_constants::match_flag_type flags = regex_constants::match_default);
572
573template <class charT, class Allocator, class traits>
574 bool
575 regex_search(const charT* str, match_results<const charT*, Allocator>& m,
576 const basic_regex<charT, traits>& e,
577 regex_constants::match_flag_type flags = regex_constants::match_default);
578
579template <class charT, class traits>
580 bool
581 regex_search(const charT* str, const basic_regex<charT, traits>& e,
582 regex_constants::match_flag_type flags = regex_constants::match_default);
583
584template <class ST, class SA, class charT, class traits>
585 bool
586 regex_search(const basic_string<charT, ST, SA>& s,
587 const basic_regex<charT, traits>& e,
588 regex_constants::match_flag_type flags = regex_constants::match_default);
589
590template <class ST, class SA, class Allocator, class charT, class traits>
591 bool
592 regex_search(const basic_string<charT, ST, SA>& s,
593 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
594 const basic_regex<charT, traits>& e,
595 regex_constants::match_flag_type flags = regex_constants::match_default);
596
597template <class OutputIterator, class BidirectionalIterator,
598 class traits, class charT, class ST, class SA>
599 OutputIterator
600 regex_replace(OutputIterator out,
601 BidirectionalIterator first, BidirectionalIterator last,
602 const basic_regex<charT, traits>& e,
603 const basic_string<charT, ST, SA>& fmt,
604 regex_constants::match_flag_type flags = regex_constants::match_default);
605
606template <class OutputIterator, class BidirectionalIterator,
607 class traits, class charT>
608 OutputIterator
609 regex_replace(OutputIterator out,
610 BidirectionalIterator first, BidirectionalIterator last,
611 const basic_regex<charT, traits>& e, const charT* fmt,
612 regex_constants::match_flag_type flags = regex_constants::match_default);
613
614template <class traits, class charT, class ST, class SA, class FST, class FSA>>
615 basic_string<charT, ST, SA>
616 regex_replace(const basic_string<charT, ST, SA>& s,
617 const basic_regex<charT, traits>& e,
618 const basic_string<charT, FST, FSA>& fmt,
619 regex_constants::match_flag_type flags = regex_constants::match_default);
620
621template <class traits, class charT, class ST, class SA>
622 basic_string<charT, ST, SA>
623 regex_replace(const basic_string<charT, ST, SA>& s,
624 const basic_regex<charT, traits>& e, const charT* fmt,
625 regex_constants::match_flag_type flags = regex_constants::match_default);
626
627template <class traits, class charT, class ST, class SA>
628 basic_string<charT>
629 regex_replace(const charT* s,
630 const basic_regex<charT, traits>& e,
631 const basic_string<charT, ST, SA>& fmt,
632 regex_constants::match_flag_type flags = regex_constants::match_default);
633
634template <class traits, class charT>
635 basic_string<charT>
636 regex_replace(const charT* s,
637 const basic_regex<charT, traits>& e,
638 const charT* fmt,
639 regex_constants::match_flag_type flags = regex_constants::match_default);
640
641template <class BidirectionalIterator,
642 class charT = typename iterator_traits< BidirectionalIterator>::value_type,
643 class traits = regex_traits<charT>>
644class regex_iterator
645{
646public:
647 typedef basic_regex<charT, traits> regex_type;
648 typedef match_results<BidirectionalIterator> value_type;
649 typedef ptrdiff_t difference_type;
650 typedef const value_type* pointer;
651 typedef const value_type& reference;
652 typedef forward_iterator_tag iterator_category;
653
654 regex_iterator();
655 regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
656 const regex_type& re,
657 regex_constants::match_flag_type m = regex_constants::match_default);
658 regex_iterator(const regex_iterator&);
659 regex_iterator& operator=(const regex_iterator&);
660
661 bool operator==(const regex_iterator&) const;
662 bool operator!=(const regex_iterator&) const;
663
664 const value_type& operator*() const;
665 const value_type* operator->() const;
666
667 regex_iterator& operator++();
668 regex_iterator operator++(int);
669};
670
671typedef regex_iterator<const char*> cregex_iterator;
672typedef regex_iterator<const wchar_t*> wcregex_iterator;
673typedef regex_iterator<string::const_iterator> sregex_iterator;
674typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
675
676template <class BidirectionalIterator,
677 class charT = typename iterator_traits< BidirectionalIterator>::value_type,
678 class traits = regex_traits<charT>>
679class regex_token_iterator
680{
681public:
682 typedef basic_regex<charT, traits> regex_type;
683 typedef sub_match<BidirectionalIterator> value_type;
684 typedef ptrdiff_t difference_type;
685 typedef const value_type* pointer;
686 typedef const value_type& reference;
687 typedef forward_iterator_tag iterator_category;
688
689 regex_token_iterator();
690 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
691 const regex_type& re, int submatch = 0,
692 regex_constants::match_flag_type m = regex_constants::match_default);
693 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
694 const regex_type& re, const vector<int>& submatches,
695 regex_constants::match_flag_type m = regex_constants::match_default);
696 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
697 const regex_type& re, initializer_list<int> submatches,
698 regex_constants::match_flag_type m = regex_constants::match_default);
699 template <size_t N>
700 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
701 const regex_type& re, const int (&submatches)[N],
702 regex_constants::match_flag_type m = regex_constants::match_default);
703 regex_token_iterator(const regex_token_iterator&);
704 regex_token_iterator& operator=(const regex_token_iterator&);
705
706 bool operator==(const regex_token_iterator&) const;
707 bool operator!=(const regex_token_iterator&) const;
708
709 const value_type& operator*() const;
710 const value_type* operator->() const;
711
712 regex_token_iterator& operator++();
713 regex_token_iterator operator++(int);
714};
715
716typedef regex_token_iterator<const char*> cregex_token_iterator;
717typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
718typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
719typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
720
721} // std
722*/
723
724#include <__config>
725#include <stdexcept>
726#include <__locale>
Howard Hinnant8c2c18d2010-06-24 21:28:00 +0000727#include <initializer_list>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +0000728#include <utility>
729#include <iterator>
730#include <string>
Howard Hinnant7e9d84b2010-06-30 00:21:42 +0000731#include <memory>
732#include <vector>
Howard Hinnantac303862010-07-12 15:51:17 +0000733#include <deque>
Howard Hinnant3257c982010-06-17 00:34:59 +0000734
Howard Hinnant66c6f972011-11-29 16:45:27 +0000735#include <__undef_min_max>
736
Howard Hinnant08e17472011-10-17 20:05:10 +0000737#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnant3257c982010-06-17 00:34:59 +0000738#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000739#endif
Howard Hinnant3257c982010-06-17 00:34:59 +0000740
741_LIBCPP_BEGIN_NAMESPACE_STD
742
743namespace regex_constants
744{
745
746// syntax_option_type
747
748enum syntax_option_type
749{
750 icase = 1 << 0,
751 nosubs = 1 << 1,
752 optimize = 1 << 2,
753 collate = 1 << 3,
Howard Hinnantad2a7ab2010-07-27 17:24:17 +0000754 ECMAScript = 0,
755 basic = 1 << 4,
756 extended = 1 << 5,
757 awk = 1 << 6,
758 grep = 1 << 7,
759 egrep = 1 << 8
Howard Hinnant3257c982010-06-17 00:34:59 +0000760};
761
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000762inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000763/*constexpr*/
764syntax_option_type
765operator~(syntax_option_type __x)
766{
767 return syntax_option_type(~int(__x));
768}
769
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000770inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000771/*constexpr*/
772syntax_option_type
773operator&(syntax_option_type __x, syntax_option_type __y)
774{
775 return syntax_option_type(int(__x) & int(__y));
776}
777
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000778inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000779/*constexpr*/
780syntax_option_type
781operator|(syntax_option_type __x, syntax_option_type __y)
782{
783 return syntax_option_type(int(__x) | int(__y));
784}
785
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000786inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000787/*constexpr*/
788syntax_option_type
789operator^(syntax_option_type __x, syntax_option_type __y)
790{
791 return syntax_option_type(int(__x) ^ int(__y));
792}
793
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000794inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000795/*constexpr*/
796syntax_option_type&
797operator&=(syntax_option_type& __x, syntax_option_type __y)
798{
799 __x = __x & __y;
800 return __x;
801}
802
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000803inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000804/*constexpr*/
805syntax_option_type&
806operator|=(syntax_option_type& __x, syntax_option_type __y)
807{
808 __x = __x | __y;
809 return __x;
810}
811
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000812inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000813/*constexpr*/
814syntax_option_type&
815operator^=(syntax_option_type& __x, syntax_option_type __y)
816{
817 __x = __x ^ __y;
818 return __x;
819}
820
821// match_flag_type
822
823enum match_flag_type
824{
825 match_default = 0,
826 match_not_bol = 1 << 0,
827 match_not_eol = 1 << 1,
828 match_not_bow = 1 << 2,
829 match_not_eow = 1 << 3,
830 match_any = 1 << 4,
831 match_not_null = 1 << 5,
832 match_continuous = 1 << 6,
833 match_prev_avail = 1 << 7,
834 format_default = 0,
835 format_sed = 1 << 8,
836 format_no_copy = 1 << 9,
Howard Hinnanta712c722010-08-16 20:21:16 +0000837 format_first_only = 1 << 10,
838 __no_update_pos = 1 << 11
Howard Hinnant3257c982010-06-17 00:34:59 +0000839};
840
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000841inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000842/*constexpr*/
843match_flag_type
844operator~(match_flag_type __x)
845{
846 return match_flag_type(~int(__x));
847}
848
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000849inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000850/*constexpr*/
851match_flag_type
852operator&(match_flag_type __x, match_flag_type __y)
853{
854 return match_flag_type(int(__x) & int(__y));
855}
856
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000857inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000858/*constexpr*/
859match_flag_type
860operator|(match_flag_type __x, match_flag_type __y)
861{
862 return match_flag_type(int(__x) | int(__y));
863}
864
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000865inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000866/*constexpr*/
867match_flag_type
868operator^(match_flag_type __x, match_flag_type __y)
869{
870 return match_flag_type(int(__x) ^ int(__y));
871}
872
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000873inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000874/*constexpr*/
875match_flag_type&
876operator&=(match_flag_type& __x, match_flag_type __y)
877{
878 __x = __x & __y;
879 return __x;
880}
881
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000882inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000883/*constexpr*/
884match_flag_type&
885operator|=(match_flag_type& __x, match_flag_type __y)
886{
887 __x = __x | __y;
888 return __x;
889}
890
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000891inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000892/*constexpr*/
893match_flag_type&
894operator^=(match_flag_type& __x, match_flag_type __y)
895{
896 __x = __x ^ __y;
897 return __x;
898}
899
900enum error_type
901{
902 error_collate = 1,
903 error_ctype,
904 error_escape,
905 error_backref,
906 error_brack,
907 error_paren,
908 error_brace,
909 error_badbrace,
910 error_range,
911 error_space,
912 error_badrepeat,
913 error_complexity,
Howard Hinnant8c2c18d2010-06-24 21:28:00 +0000914 error_stack,
Howard Hinnantad2a7ab2010-07-27 17:24:17 +0000915 __re_err_grammar,
916 __re_err_empty,
917 __re_err_unknown
Howard Hinnant3257c982010-06-17 00:34:59 +0000918};
919
920} // regex_constants
921
922class _LIBCPP_EXCEPTION_ABI regex_error
923 : public runtime_error
924{
925 regex_constants::error_type __code_;
926public:
927 explicit regex_error(regex_constants::error_type __ecode);
928 virtual ~regex_error() throw();
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000929 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000930 regex_constants::error_type code() const {return __code_;}
931};
932
933template <class _CharT>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000934struct _LIBCPP_VISIBLE regex_traits
Howard Hinnant3257c982010-06-17 00:34:59 +0000935{
936public:
937 typedef _CharT char_type;
938 typedef basic_string<char_type> string_type;
939 typedef locale locale_type;
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000940 typedef ctype_base::mask char_class_type;
Howard Hinnant3257c982010-06-17 00:34:59 +0000941
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000942 static const char_class_type __regex_word = 0x80;
Howard Hinnant3257c982010-06-17 00:34:59 +0000943private:
944 locale __loc_;
945 const ctype<char_type>* __ct_;
946 const collate<char_type>* __col_;
947
948public:
949 regex_traits();
950
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000951 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000952 static size_t length(const char_type* __p)
953 {return char_traits<char_type>::length(__p);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000954 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000955 char_type translate(char_type __c) const {return __c;}
956 char_type translate_nocase(char_type __c) const;
957 template <class _ForwardIterator>
958 string_type
959 transform(_ForwardIterator __f, _ForwardIterator __l) const;
960 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000961 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000962 string_type
963 transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
964 {return __transform_primary(__f, __l, char_type());}
965 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000966 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000967 string_type
968 lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
969 {return __lookup_collatename(__f, __l, char_type());}
970 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000971 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000972 char_class_type
973 lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000974 bool __icase = false) const
975 {return __lookup_classname(__f, __l, __icase, char_type());}
976 bool isctype(char_type __c, char_class_type __m) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000977 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000978 int value(char_type __ch, int __radix) const
979 {return __value(__ch, __radix);}
Howard Hinnant3257c982010-06-17 00:34:59 +0000980 locale_type imbue(locale_type __l);
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000981 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000982 locale_type getloc()const {return __loc_;}
983
984private:
985 void __init();
986
987 template <class _ForwardIterator>
988 string_type
989 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
990 template <class _ForwardIterator>
991 string_type
992 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
993
994 template <class _ForwardIterator>
995 string_type
996 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
997 template <class _ForwardIterator>
998 string_type
999 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001000
1001 template <class _ForwardIterator>
1002 char_class_type
1003 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1004 bool __icase, char) const;
1005 template <class _ForwardIterator>
1006 char_class_type
1007 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1008 bool __icase, wchar_t) const;
1009
1010 static int __value(unsigned char __ch, int __radix);
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001011 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001012 int __value(char __ch, int __radix) const
1013 {return __value(static_cast<unsigned char>(__ch), __radix);}
1014 int __value(wchar_t __ch, int __radix) const;
Howard Hinnant3257c982010-06-17 00:34:59 +00001015};
1016
1017template <class _CharT>
1018regex_traits<_CharT>::regex_traits()
1019{
1020 __init();
1021}
1022
1023template <class _CharT>
1024typename regex_traits<_CharT>::char_type
1025regex_traits<_CharT>::translate_nocase(char_type __c) const
1026{
1027 return __ct_->tolower(__c);
1028}
1029
1030template <class _CharT>
1031template <class _ForwardIterator>
1032typename regex_traits<_CharT>::string_type
1033regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
1034{
1035 string_type __s(__f, __l);
1036 return __col_->transform(__s.data(), __s.data() + __s.size());
1037}
1038
1039template <class _CharT>
1040void
1041regex_traits<_CharT>::__init()
1042{
1043 __ct_ = &use_facet<ctype<char_type> >(__loc_);
1044 __col_ = &use_facet<collate<char_type> >(__loc_);
1045}
1046
1047template <class _CharT>
1048typename regex_traits<_CharT>::locale_type
1049regex_traits<_CharT>::imbue(locale_type __l)
1050{
1051 locale __r = __loc_;
1052 __loc_ = __l;
1053 __init();
1054 return __r;
1055}
1056
1057// transform_primary is very FreeBSD-specific
1058
1059template <class _CharT>
1060template <class _ForwardIterator>
1061typename regex_traits<_CharT>::string_type
1062regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1063 _ForwardIterator __l, char) const
1064{
1065 const string_type __s(__f, __l);
1066 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1067 switch (__d.size())
1068 {
1069 case 1:
1070 break;
1071 case 12:
1072 __d[11] = __d[3];
1073 break;
1074 default:
1075 __d.clear();
1076 break;
1077 }
1078 return __d;
1079}
1080
1081template <class _CharT>
1082template <class _ForwardIterator>
1083typename regex_traits<_CharT>::string_type
1084regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1085 _ForwardIterator __l, wchar_t) const
1086{
1087 const string_type __s(__f, __l);
1088 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1089 switch (__d.size())
1090 {
1091 case 1:
1092 break;
1093 case 3:
1094 __d[2] = __d[0];
1095 break;
1096 default:
1097 __d.clear();
1098 break;
1099 }
1100 return __d;
1101}
1102
1103// lookup_collatename is very FreeBSD-specific
1104
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001105string __get_collation_name(const char* __s);
Howard Hinnant3257c982010-06-17 00:34:59 +00001106
1107template <class _CharT>
1108template <class _ForwardIterator>
1109typename regex_traits<_CharT>::string_type
1110regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1111 _ForwardIterator __l, char) const
1112{
1113 string_type __s(__f, __l);
1114 string_type __r;
1115 if (!__s.empty())
1116 {
1117 __r = __get_collation_name(__s.c_str());
1118 if (__r.empty() && __s.size() <= 2)
1119 {
1120 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1121 if (__r.size() == 1 || __r.size() == 12)
1122 __r = __s;
1123 else
1124 __r.clear();
1125 }
1126 }
1127 return __r;
1128}
1129
1130template <class _CharT>
1131template <class _ForwardIterator>
1132typename regex_traits<_CharT>::string_type
1133regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1134 _ForwardIterator __l, wchar_t) const
1135{
1136 string_type __s(__f, __l);
1137 string __n;
1138 __n.reserve(__s.size());
1139 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1140 __i != __e; ++__i)
1141 {
1142 if (static_cast<unsigned>(*__i) >= 127)
1143 return string_type();
1144 __n.push_back(char(*__i));
1145 }
1146 string_type __r;
1147 if (!__s.empty())
1148 {
1149 __n = __get_collation_name(__n.c_str());
1150 if (!__n.empty())
1151 __r.assign(__n.begin(), __n.end());
1152 else if (__s.size() <= 2)
1153 {
1154 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1155 if (__r.size() == 1 || __r.size() == 3)
1156 __r = __s;
1157 else
1158 __r.clear();
1159 }
1160 }
1161 return __r;
1162}
1163
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001164// lookup_classname
1165
1166ctype_base::mask __get_classname(const char* __s, bool __icase);
1167
1168template <class _CharT>
1169template <class _ForwardIterator>
1170typename regex_traits<_CharT>::char_class_type
1171regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1172 _ForwardIterator __l,
1173 bool __icase, char) const
1174{
1175 string_type __s(__f, __l);
1176 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1177 return __get_classname(__s.c_str(), __icase);
1178}
1179
1180template <class _CharT>
1181template <class _ForwardIterator>
1182typename regex_traits<_CharT>::char_class_type
1183regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1184 _ForwardIterator __l,
1185 bool __icase, wchar_t) const
1186{
1187 string_type __s(__f, __l);
1188 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1189 string __n;
1190 __n.reserve(__s.size());
1191 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1192 __i != __e; ++__i)
1193 {
1194 if (static_cast<unsigned>(*__i) >= 127)
1195 return char_class_type();
1196 __n.push_back(char(*__i));
1197 }
1198 return __get_classname(__n.c_str(), __icase);
1199}
1200
1201template <class _CharT>
1202bool
1203regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
1204{
1205 if (__ct_->is(__m, __c))
1206 return true;
1207 return (__c == '_' && (__m & __regex_word));
1208}
1209
1210template <class _CharT>
1211int
1212regex_traits<_CharT>::__value(unsigned char __ch, int __radix)
1213{
1214 if ((__ch & 0xF8u) == 0x30) // '0' <= __ch && __ch <= '7'
1215 return __ch - '0';
1216 if (__radix != 8)
1217 {
1218 if ((__ch & 0xFEu) == 0x38) // '8' <= __ch && __ch <= '9'
1219 return __ch - '0';
1220 if (__radix == 16)
1221 {
1222 __ch |= 0x20; // tolower
1223 if ('a' <= __ch && __ch <= 'f')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00001224 return __ch - ('a' - 10);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001225 }
1226 }
1227 return -1;
1228}
1229
1230template <class _CharT>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001231inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001232int
1233regex_traits<_CharT>::__value(wchar_t __ch, int __radix) const
1234{
1235 return __value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
1236}
1237
Howard Hinnantac303862010-07-12 15:51:17 +00001238template <class _CharT> class __node;
1239
1240template <class _BidirectionalIterator> class sub_match;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001241
Howard Hinnant17615b02010-07-27 01:25:38 +00001242template <class _BidirectionalIterator,
1243 class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
1244class match_results;
1245
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001246template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001247struct __state
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001248{
1249 enum
1250 {
1251 __end_state = -1000,
1252 __consume_input, // -999
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001253 __begin_marked_expr, // -998
1254 __end_marked_expr, // -997
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001255 __pop_state, // -996
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001256 __accept_and_consume, // -995
1257 __accept_but_not_consume, // -994
1258 __reject, // -993
Howard Hinnantac303862010-07-12 15:51:17 +00001259 __split,
1260 __repeat
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001261 };
1262
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001263 int __do_;
Howard Hinnantac303862010-07-12 15:51:17 +00001264 const _CharT* __first_;
1265 const _CharT* __current_;
1266 const _CharT* __last_;
1267 vector<sub_match<const _CharT*> > __sub_matches_;
1268 vector<pair<size_t, const _CharT*> > __loop_data_;
1269 const __node<_CharT>* __node_;
1270 regex_constants::match_flag_type __flags_;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001271 bool __at_first_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001272
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001273 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001274 __state()
1275 : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
1276 __node_(nullptr), __flags_() {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001277};
1278
Howard Hinnantac303862010-07-12 15:51:17 +00001279// __node
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001280
1281template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001282class __node
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001283{
Howard Hinnantac303862010-07-12 15:51:17 +00001284 __node(const __node&);
1285 __node& operator=(const __node&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001286public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001287 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001288
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001289 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001290 __node() {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001291 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001292 virtual ~__node() {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001293
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001294 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001295 virtual void __exec(__state&) const {};
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001296 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001297 virtual void __exec_split(bool, __state&) const {};
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001298};
1299
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001300// __end_state
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001301
1302template <class _CharT>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001303class __end_state
Howard Hinnantac303862010-07-12 15:51:17 +00001304 : public __node<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001305{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001306public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001307 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001308
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001309 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001310 __end_state() {}
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001311
Howard Hinnantac303862010-07-12 15:51:17 +00001312 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001313};
1314
1315template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001316void
1317__end_state<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001318{
Howard Hinnantac303862010-07-12 15:51:17 +00001319 __s.__do_ = __state::__end_state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001320}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001321
1322// __has_one_state
1323
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001324template <class _CharT>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001325class __has_one_state
Howard Hinnantac303862010-07-12 15:51:17 +00001326 : public __node<_CharT>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001327{
Howard Hinnantac303862010-07-12 15:51:17 +00001328 __node<_CharT>* __first_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001329
1330public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001331 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001332 explicit __has_one_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001333 : __first_(__s) {}
1334
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001335 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001336 __node<_CharT>* first() const {return __first_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001337 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001338 __node<_CharT>*& first() {return __first_;}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001339};
1340
1341// __owns_one_state
1342
1343template <class _CharT>
1344class __owns_one_state
1345 : public __has_one_state<_CharT>
1346{
1347 typedef __has_one_state<_CharT> base;
1348
1349public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001350 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001351 explicit __owns_one_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001352 : base(__s) {}
1353
1354 virtual ~__owns_one_state();
1355};
1356
1357template <class _CharT>
1358__owns_one_state<_CharT>::~__owns_one_state()
1359{
1360 delete this->first();
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001361}
1362
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001363// __empty_state
1364
1365template <class _CharT>
1366class __empty_state
1367 : public __owns_one_state<_CharT>
1368{
1369 typedef __owns_one_state<_CharT> base;
1370
1371public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001372 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001373
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001374 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001375 explicit __empty_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001376 : base(__s) {}
1377
Howard Hinnantac303862010-07-12 15:51:17 +00001378 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001379};
1380
1381template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001382void
1383__empty_state<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001384{
Howard Hinnantac303862010-07-12 15:51:17 +00001385 __s.__do_ = __state::__accept_but_not_consume;
1386 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001387}
1388
1389// __empty_non_own_state
1390
1391template <class _CharT>
1392class __empty_non_own_state
1393 : public __has_one_state<_CharT>
1394{
1395 typedef __has_one_state<_CharT> base;
1396
1397public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001398 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001399
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001400 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001401 explicit __empty_non_own_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001402 : base(__s) {}
1403
Howard Hinnantac303862010-07-12 15:51:17 +00001404 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001405};
1406
1407template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001408void
1409__empty_non_own_state<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001410{
Howard Hinnantac303862010-07-12 15:51:17 +00001411 __s.__do_ = __state::__accept_but_not_consume;
1412 __s.__node_ = this->first();
1413}
1414
1415// __repeat_one_loop
1416
1417template <class _CharT>
1418class __repeat_one_loop
1419 : public __has_one_state<_CharT>
1420{
1421 typedef __has_one_state<_CharT> base;
1422
1423public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001424 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantac303862010-07-12 15:51:17 +00001425
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001426 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001427 explicit __repeat_one_loop(__node<_CharT>* __s)
1428 : base(__s) {}
1429
1430 virtual void __exec(__state&) const;
Howard Hinnantac303862010-07-12 15:51:17 +00001431};
1432
1433template <class _CharT>
1434void
1435__repeat_one_loop<_CharT>::__exec(__state& __s) const
1436{
1437 __s.__do_ = __state::__repeat;
1438 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001439}
1440
1441// __owns_two_states
1442
1443template <class _CharT>
1444class __owns_two_states
1445 : public __owns_one_state<_CharT>
1446{
1447 typedef __owns_one_state<_CharT> base;
1448
1449 base* __second_;
1450
1451public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001452 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001453 explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001454 : base(__s1), __second_(__s2) {}
1455
1456 virtual ~__owns_two_states();
1457
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001458 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001459 base* second() const {return __second_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001460 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001461 base*& second() {return __second_;}
1462};
1463
1464template <class _CharT>
1465__owns_two_states<_CharT>::~__owns_two_states()
1466{
1467 delete __second_;
1468}
1469
1470// __loop
1471
1472template <class _CharT>
1473class __loop
1474 : public __owns_two_states<_CharT>
1475{
1476 typedef __owns_two_states<_CharT> base;
1477
1478 size_t __min_;
1479 size_t __max_;
1480 unsigned __loop_id_;
Howard Hinnantac303862010-07-12 15:51:17 +00001481 unsigned __mexp_begin_;
1482 unsigned __mexp_end_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001483 bool __greedy_;
1484
1485public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001486 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001487
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001488 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001489 explicit __loop(unsigned __loop_id,
Howard Hinnantac303862010-07-12 15:51:17 +00001490 __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
1491 unsigned __mexp_begin, unsigned __mexp_end,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001492 bool __greedy = true,
1493 size_t __min = 0,
1494 size_t __max = numeric_limits<size_t>::max())
1495 : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
Howard Hinnantac303862010-07-12 15:51:17 +00001496 __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001497 __greedy_(__greedy) {}
1498
Howard Hinnantac303862010-07-12 15:51:17 +00001499 virtual void __exec(__state& __s) const;
1500 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001501
Howard Hinnantac303862010-07-12 15:51:17 +00001502private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001503 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001504 void __init_repeat(__state& __s) const
1505 {
1506 __s.__loop_data_[__loop_id_].second = __s.__current_;
1507 for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
1508 {
1509 __s.__sub_matches_[__i].first = __s.__last_;
1510 __s.__sub_matches_[__i].second = __s.__last_;
1511 __s.__sub_matches_[__i].matched = false;
1512 }
1513 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001514};
1515
1516template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001517void
1518__loop<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001519{
Howard Hinnantac303862010-07-12 15:51:17 +00001520 if (__s.__do_ == __state::__repeat)
1521 {
1522 bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
1523 bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
1524 if (__do_repeat && __do_alt &&
1525 __s.__loop_data_[__loop_id_].second == __s.__current_)
1526 __do_repeat = false;
1527 if (__do_repeat && __do_alt)
1528 __s.__do_ = __state::__split;
1529 else if (__do_repeat)
1530 {
1531 __s.__do_ = __state::__accept_but_not_consume;
1532 __s.__node_ = this->first();
1533 __init_repeat(__s);
1534 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001535 else
Howard Hinnantac303862010-07-12 15:51:17 +00001536 {
1537 __s.__do_ = __state::__accept_but_not_consume;
1538 __s.__node_ = this->second();
1539 }
1540 }
1541 else
1542 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00001543 __s.__loop_data_[__loop_id_].first = 0;
1544 bool __do_repeat = 0 < __max_;
1545 bool __do_alt = 0 >= __min_;
1546 if (__do_repeat && __do_alt)
Howard Hinnantac303862010-07-12 15:51:17 +00001547 __s.__do_ = __state::__split;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00001548 else if (__do_repeat)
1549 {
1550 __s.__do_ = __state::__accept_but_not_consume;
1551 __s.__node_ = this->first();
1552 __init_repeat(__s);
1553 }
Howard Hinnantac303862010-07-12 15:51:17 +00001554 else
1555 {
1556 __s.__do_ = __state::__accept_but_not_consume;
1557 __s.__node_ = this->second();
1558 }
1559 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001560}
1561
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001562template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001563void
1564__loop<_CharT>::__exec_split(bool __second, __state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001565{
Howard Hinnantac303862010-07-12 15:51:17 +00001566 __s.__do_ = __state::__accept_but_not_consume;
1567 if (__greedy_ != __second)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001568 {
Howard Hinnantac303862010-07-12 15:51:17 +00001569 __s.__node_ = this->first();
1570 __init_repeat(__s);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001571 }
Howard Hinnantac303862010-07-12 15:51:17 +00001572 else
1573 __s.__node_ = this->second();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001574}
1575
Howard Hinnantaa698082010-07-16 19:08:36 +00001576// __alternate
1577
1578template <class _CharT>
1579class __alternate
1580 : public __owns_two_states<_CharT>
1581{
1582 typedef __owns_two_states<_CharT> base;
1583
1584public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001585 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantaa698082010-07-16 19:08:36 +00001586
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001587 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa698082010-07-16 19:08:36 +00001588 explicit __alternate(__owns_one_state<_CharT>* __s1,
1589 __owns_one_state<_CharT>* __s2)
1590 : base(__s1, __s2) {}
1591
1592 virtual void __exec(__state& __s) const;
1593 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnantaa698082010-07-16 19:08:36 +00001594};
1595
1596template <class _CharT>
1597void
1598__alternate<_CharT>::__exec(__state& __s) const
1599{
1600 __s.__do_ = __state::__split;
1601}
1602
1603template <class _CharT>
1604void
1605__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
1606{
1607 __s.__do_ = __state::__accept_but_not_consume;
Howard Hinnant1371b2e2010-07-22 14:12:20 +00001608 if (__second)
Howard Hinnantaa698082010-07-16 19:08:36 +00001609 __s.__node_ = this->second();
Howard Hinnant1371b2e2010-07-22 14:12:20 +00001610 else
1611 __s.__node_ = this->first();
Howard Hinnantaa698082010-07-16 19:08:36 +00001612}
1613
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001614// __begin_marked_subexpression
1615
1616template <class _CharT>
1617class __begin_marked_subexpression
1618 : public __owns_one_state<_CharT>
1619{
1620 typedef __owns_one_state<_CharT> base;
1621
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001622 unsigned __mexp_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001623public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001624 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001625
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001626 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001627 explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001628 : base(__s), __mexp_(__mexp) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001629
Howard Hinnantac303862010-07-12 15:51:17 +00001630 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001631};
1632
1633template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001634void
1635__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001636{
Howard Hinnantac303862010-07-12 15:51:17 +00001637 __s.__do_ = __state::__accept_but_not_consume;
1638 __s.__sub_matches_[__mexp_-1].first = __s.__current_;
1639 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001640}
1641
1642// __end_marked_subexpression
1643
1644template <class _CharT>
1645class __end_marked_subexpression
1646 : public __owns_one_state<_CharT>
1647{
1648 typedef __owns_one_state<_CharT> base;
1649
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001650 unsigned __mexp_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001651public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001652 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001653
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001654 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001655 explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001656 : base(__s), __mexp_(__mexp) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001657
Howard Hinnantac303862010-07-12 15:51:17 +00001658 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001659};
1660
1661template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001662void
1663__end_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001664{
Howard Hinnantac303862010-07-12 15:51:17 +00001665 __s.__do_ = __state::__accept_but_not_consume;
1666 __s.__sub_matches_[__mexp_-1].second = __s.__current_;
1667 __s.__sub_matches_[__mexp_-1].matched = true;
1668 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001669}
1670
Howard Hinnantcba352d2010-07-12 18:16:05 +00001671// __back_ref
1672
1673template <class _CharT>
1674class __back_ref
1675 : public __owns_one_state<_CharT>
1676{
1677 typedef __owns_one_state<_CharT> base;
1678
1679 unsigned __mexp_;
1680public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001681 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcba352d2010-07-12 18:16:05 +00001682
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001683 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcba352d2010-07-12 18:16:05 +00001684 explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
1685 : base(__s), __mexp_(__mexp) {}
1686
1687 virtual void __exec(__state&) const;
Howard Hinnantcba352d2010-07-12 18:16:05 +00001688};
1689
1690template <class _CharT>
1691void
1692__back_ref<_CharT>::__exec(__state& __s) const
1693{
1694 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1695 if (__sm.matched)
1696 {
1697 ptrdiff_t __len = __sm.second - __sm.first;
1698 if (__s.__last_ - __s.__current_ >= __len &&
Howard Hinnant0949eed2011-06-30 21:18:19 +00001699 _VSTD::equal(__sm.first, __sm.second, __s.__current_))
Howard Hinnantcba352d2010-07-12 18:16:05 +00001700 {
1701 __s.__do_ = __state::__accept_but_not_consume;
1702 __s.__current_ += __len;
1703 __s.__node_ = this->first();
1704 }
1705 else
1706 {
1707 __s.__do_ = __state::__reject;
1708 __s.__node_ = nullptr;
1709 }
1710 }
1711 else
1712 {
1713 __s.__do_ = __state::__reject;
1714 __s.__node_ = nullptr;
1715 }
1716}
1717
Howard Hinnante34f17d2010-07-12 19:11:27 +00001718// __back_ref_icase
1719
1720template <class _CharT, class _Traits>
1721class __back_ref_icase
1722 : public __owns_one_state<_CharT>
1723{
1724 typedef __owns_one_state<_CharT> base;
1725
1726 _Traits __traits_;
1727 unsigned __mexp_;
1728public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001729 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001730
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001731 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00001732 explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
1733 __node<_CharT>* __s)
1734 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1735
1736 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001737};
1738
1739template <class _CharT, class _Traits>
1740void
1741__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
1742{
1743 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1744 if (__sm.matched)
1745 {
1746 ptrdiff_t __len = __sm.second - __sm.first;
1747 if (__s.__last_ - __s.__current_ >= __len)
1748 {
1749 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1750 {
1751 if (__traits_.translate_nocase(__sm.first[__i]) !=
1752 __traits_.translate_nocase(__s.__current_[__i]))
1753 goto __not_equal;
1754 }
1755 __s.__do_ = __state::__accept_but_not_consume;
1756 __s.__current_ += __len;
1757 __s.__node_ = this->first();
1758 }
1759 else
1760 {
1761 __s.__do_ = __state::__reject;
1762 __s.__node_ = nullptr;
1763 }
1764 }
1765 else
1766 {
1767__not_equal:
1768 __s.__do_ = __state::__reject;
1769 __s.__node_ = nullptr;
1770 }
1771}
1772
1773// __back_ref_collate
1774
1775template <class _CharT, class _Traits>
1776class __back_ref_collate
1777 : public __owns_one_state<_CharT>
1778{
1779 typedef __owns_one_state<_CharT> base;
1780
1781 _Traits __traits_;
1782 unsigned __mexp_;
1783public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001784 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001785
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001786 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00001787 explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
1788 __node<_CharT>* __s)
1789 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1790
1791 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001792};
1793
1794template <class _CharT, class _Traits>
1795void
1796__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
1797{
1798 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1799 if (__sm.matched)
1800 {
1801 ptrdiff_t __len = __sm.second - __sm.first;
1802 if (__s.__last_ - __s.__current_ >= __len)
1803 {
1804 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1805 {
1806 if (__traits_.translate(__sm.first[__i]) !=
1807 __traits_.translate(__s.__current_[__i]))
1808 goto __not_equal;
1809 }
1810 __s.__do_ = __state::__accept_but_not_consume;
1811 __s.__current_ += __len;
1812 __s.__node_ = this->first();
1813 }
1814 else
1815 {
1816 __s.__do_ = __state::__reject;
1817 __s.__node_ = nullptr;
1818 }
1819 }
1820 else
1821 {
1822__not_equal:
1823 __s.__do_ = __state::__reject;
1824 __s.__node_ = nullptr;
1825 }
1826}
1827
Howard Hinnant17615b02010-07-27 01:25:38 +00001828// __word_boundary
1829
1830template <class _CharT, class _Traits>
1831class __word_boundary
1832 : public __owns_one_state<_CharT>
1833{
1834 typedef __owns_one_state<_CharT> base;
1835
1836 _Traits __traits_;
1837 bool __invert_;
1838public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001839 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant17615b02010-07-27 01:25:38 +00001840
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001841 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00001842 explicit __word_boundary(const _Traits& __traits, bool __invert,
1843 __node<_CharT>* __s)
1844 : base(__s), __traits_(__traits), __invert_(__invert) {}
1845
1846 virtual void __exec(__state&) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00001847};
1848
1849template <class _CharT, class _Traits>
1850void
1851__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
1852{
1853 bool __is_word_b = false;
1854 if (__s.__first_ != __s.__last_)
1855 {
1856 if (__s.__current_ == __s.__last_)
1857 {
1858 if (!(__s.__flags_ & regex_constants::match_not_eow))
1859 {
1860 _CharT __c = __s.__current_[-1];
1861 __is_word_b = __c == '_' ||
1862 __traits_.isctype(__c, ctype_base::alnum);
1863 }
1864 }
Howard Hinnantf3dcca02010-07-29 15:17:28 +00001865 else if (__s.__current_ == __s.__first_ &&
1866 !(__s.__flags_ & regex_constants::match_prev_avail))
Howard Hinnant17615b02010-07-27 01:25:38 +00001867 {
1868 if (!(__s.__flags_ & regex_constants::match_not_bow))
1869 {
1870 _CharT __c = *__s.__current_;
1871 __is_word_b = __c == '_' ||
1872 __traits_.isctype(__c, ctype_base::alnum);
1873 }
1874 }
1875 else
1876 {
1877 _CharT __c1 = __s.__current_[-1];
1878 _CharT __c2 = *__s.__current_;
1879 bool __is_c1_b = __c1 == '_' ||
1880 __traits_.isctype(__c1, ctype_base::alnum);
1881 bool __is_c2_b = __c2 == '_' ||
1882 __traits_.isctype(__c2, ctype_base::alnum);
1883 __is_word_b = __is_c1_b != __is_c2_b;
1884 }
1885 }
1886 if (__is_word_b != __invert_)
1887 {
1888 __s.__do_ = __state::__accept_but_not_consume;
1889 __s.__node_ = this->first();
1890 }
1891 else
1892 {
1893 __s.__do_ = __state::__reject;
1894 __s.__node_ = nullptr;
1895 }
1896}
1897
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001898// __l_anchor
1899
1900template <class _CharT>
1901class __l_anchor
1902 : public __owns_one_state<_CharT>
1903{
1904 typedef __owns_one_state<_CharT> base;
1905
1906public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001907 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001908
1909 _LIBCPP_INLINE_VISIBILITY
1910 __l_anchor(__node<_CharT>* __s)
1911 : base(__s) {}
1912
1913 virtual void __exec(__state&) const;
1914};
1915
1916template <class _CharT>
1917void
1918__l_anchor<_CharT>::__exec(__state& __s) const
1919{
1920 if (__s.__at_first_ && __s.__current_ == __s.__first_)
1921 {
1922 __s.__do_ = __state::__accept_but_not_consume;
1923 __s.__node_ = this->first();
1924 }
1925 else
1926 {
1927 __s.__do_ = __state::__reject;
1928 __s.__node_ = nullptr;
1929 }
1930}
1931
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001932// __r_anchor
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001933
1934template <class _CharT>
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001935class __r_anchor
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001936 : public __owns_one_state<_CharT>
1937{
1938 typedef __owns_one_state<_CharT> base;
1939
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001940public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001941 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001942
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001943 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001944 __r_anchor(__node<_CharT>* __s)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001945 : base(__s) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001946
Howard Hinnantac303862010-07-12 15:51:17 +00001947 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001948};
1949
1950template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001951void
1952__r_anchor<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001953{
Howard Hinnantac303862010-07-12 15:51:17 +00001954 if (__s.__current_ == __s.__last_)
1955 {
1956 __s.__do_ = __state::__accept_but_not_consume;
1957 __s.__node_ = this->first();
1958 }
1959 else
1960 {
1961 __s.__do_ = __state::__reject;
1962 __s.__node_ = nullptr;
1963 }
1964}
1965
1966// __match_any
1967
1968template <class _CharT>
1969class __match_any
1970 : public __owns_one_state<_CharT>
1971{
1972 typedef __owns_one_state<_CharT> base;
1973
1974public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001975 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantac303862010-07-12 15:51:17 +00001976
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001977 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001978 __match_any(__node<_CharT>* __s)
1979 : base(__s) {}
1980
1981 virtual void __exec(__state&) const;
Howard Hinnantac303862010-07-12 15:51:17 +00001982};
1983
1984template <class _CharT>
1985void
1986__match_any<_CharT>::__exec(__state& __s) const
1987{
1988 if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
1989 {
1990 __s.__do_ = __state::__accept_and_consume;
1991 ++__s.__current_;
1992 __s.__node_ = this->first();
1993 }
1994 else
1995 {
1996 __s.__do_ = __state::__reject;
1997 __s.__node_ = nullptr;
1998 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001999}
2000
Howard Hinnant17615b02010-07-27 01:25:38 +00002001// __match_any_but_newline
2002
2003template <class _CharT>
2004class __match_any_but_newline
2005 : public __owns_one_state<_CharT>
2006{
2007 typedef __owns_one_state<_CharT> base;
2008
2009public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002010 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant17615b02010-07-27 01:25:38 +00002011
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002012 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002013 __match_any_but_newline(__node<_CharT>* __s)
2014 : base(__s) {}
2015
2016 virtual void __exec(__state&) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00002017};
2018
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002019// __match_char
2020
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002021template <class _CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002022class __match_char
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002023 : public __owns_one_state<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002024{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002025 typedef __owns_one_state<_CharT> base;
2026
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002027 _CharT __c_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002028
2029 __match_char(const __match_char&);
2030 __match_char& operator=(const __match_char&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002031public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002032 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002033
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002034 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00002035 __match_char(_CharT __c, __node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002036 : base(__s), __c_(__c) {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002037
Howard Hinnantac303862010-07-12 15:51:17 +00002038 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002039};
2040
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002041template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00002042void
2043__match_char<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002044{
Howard Hinnantac303862010-07-12 15:51:17 +00002045 if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2046 {
2047 __s.__do_ = __state::__accept_and_consume;
2048 ++__s.__current_;
2049 __s.__node_ = this->first();
2050 }
2051 else
2052 {
2053 __s.__do_ = __state::__reject;
2054 __s.__node_ = nullptr;
2055 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002056}
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002057
Howard Hinnante34f17d2010-07-12 19:11:27 +00002058// __match_char_icase
2059
2060template <class _CharT, class _Traits>
2061class __match_char_icase
2062 : public __owns_one_state<_CharT>
2063{
2064 typedef __owns_one_state<_CharT> base;
2065
2066 _Traits __traits_;
2067 _CharT __c_;
2068
2069 __match_char_icase(const __match_char_icase&);
2070 __match_char_icase& operator=(const __match_char_icase&);
2071public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002072 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002073
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002074 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002075 __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2076 : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2077
2078 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002079};
2080
2081template <class _CharT, class _Traits>
2082void
2083__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2084{
2085 if (__s.__current_ != __s.__last_ &&
2086 __traits_.translate_nocase(*__s.__current_) == __c_)
2087 {
2088 __s.__do_ = __state::__accept_and_consume;
2089 ++__s.__current_;
2090 __s.__node_ = this->first();
2091 }
2092 else
2093 {
2094 __s.__do_ = __state::__reject;
2095 __s.__node_ = nullptr;
2096 }
2097}
2098
2099// __match_char_collate
2100
2101template <class _CharT, class _Traits>
2102class __match_char_collate
2103 : public __owns_one_state<_CharT>
2104{
2105 typedef __owns_one_state<_CharT> base;
2106
2107 _Traits __traits_;
2108 _CharT __c_;
2109
2110 __match_char_collate(const __match_char_collate&);
2111 __match_char_collate& operator=(const __match_char_collate&);
2112public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002113 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002114
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002115 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002116 __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2117 : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2118
2119 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002120};
2121
2122template <class _CharT, class _Traits>
2123void
2124__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2125{
2126 if (__s.__current_ != __s.__last_ &&
2127 __traits_.translate(*__s.__current_) == __c_)
2128 {
2129 __s.__do_ = __state::__accept_and_consume;
2130 ++__s.__current_;
2131 __s.__node_ = this->first();
2132 }
2133 else
2134 {
2135 __s.__do_ = __state::__reject;
2136 __s.__node_ = nullptr;
2137 }
2138}
2139
Howard Hinnant173968a2010-07-13 21:48:06 +00002140// __bracket_expression
2141
2142template <class _CharT, class _Traits>
2143class __bracket_expression
2144 : public __owns_one_state<_CharT>
2145{
2146 typedef __owns_one_state<_CharT> base;
2147 typedef typename _Traits::string_type string_type;
2148
2149 _Traits __traits_;
2150 vector<_CharT> __chars_;
Howard Hinnant15476f32010-07-28 17:35:27 +00002151 vector<_CharT> __neg_chars_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002152 vector<pair<string_type, string_type> > __ranges_;
2153 vector<pair<_CharT, _CharT> > __digraphs_;
2154 vector<string_type> __equivalences_;
2155 ctype_base::mask __mask_;
Howard Hinnant15476f32010-07-28 17:35:27 +00002156 ctype_base::mask __neg_mask_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002157 bool __negate_;
2158 bool __icase_;
2159 bool __collate_;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002160 bool __might_have_digraph_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002161
2162 __bracket_expression(const __bracket_expression&);
2163 __bracket_expression& operator=(const __bracket_expression&);
2164public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002165 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant173968a2010-07-13 21:48:06 +00002166
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002167 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002168 __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2169 bool __negate, bool __icase, bool __collate)
Howard Hinnant15476f32010-07-28 17:35:27 +00002170 : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2171 __negate_(__negate), __icase_(__icase), __collate_(__collate),
Howard Hinnant68025ed2010-07-14 15:45:11 +00002172 __might_have_digraph_(__traits_.getloc().name() != "C") {}
Howard Hinnant173968a2010-07-13 21:48:06 +00002173
2174 virtual void __exec(__state&) const;
2175
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002176 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002177 bool __negated() const {return __negate_;}
2178
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002179 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002180 void __add_char(_CharT __c)
2181 {
2182 if (__icase_)
2183 __chars_.push_back(__traits_.translate_nocase(__c));
2184 else if (__collate_)
2185 __chars_.push_back(__traits_.translate(__c));
2186 else
2187 __chars_.push_back(__c);
2188 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002189 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002190 void __add_neg_char(_CharT __c)
2191 {
2192 if (__icase_)
2193 __neg_chars_.push_back(__traits_.translate_nocase(__c));
2194 else if (__collate_)
2195 __neg_chars_.push_back(__traits_.translate(__c));
2196 else
2197 __neg_chars_.push_back(__c);
2198 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002199 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002200 void __add_range(string_type __b, string_type __e)
2201 {
2202 if (__collate_)
2203 {
2204 if (__icase_)
2205 {
2206 for (size_t __i = 0; __i < __b.size(); ++__i)
2207 __b[__i] = __traits_.translate_nocase(__b[__i]);
2208 for (size_t __i = 0; __i < __e.size(); ++__i)
2209 __e[__i] = __traits_.translate_nocase(__e[__i]);
2210 }
2211 else
2212 {
2213 for (size_t __i = 0; __i < __b.size(); ++__i)
2214 __b[__i] = __traits_.translate(__b[__i]);
2215 for (size_t __i = 0; __i < __e.size(); ++__i)
2216 __e[__i] = __traits_.translate(__e[__i]);
2217 }
2218 __ranges_.push_back(make_pair(
2219 __traits_.transform(__b.begin(), __b.end()),
2220 __traits_.transform(__e.begin(), __e.end())));
2221 }
2222 else
2223 {
Howard Hinnantd4444702010-08-11 17:04:31 +00002224#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00002225 if (__b.size() != 1 || __e.size() != 1)
2226 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00002227#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00002228 if (__icase_)
2229 {
2230 __b[0] = __traits_.translate_nocase(__b[0]);
2231 __e[0] = __traits_.translate_nocase(__e[0]);
2232 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002233 __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
Howard Hinnant173968a2010-07-13 21:48:06 +00002234 }
2235 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002236 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002237 void __add_digraph(_CharT __c1, _CharT __c2)
2238 {
2239 if (__icase_)
2240 __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
2241 __traits_.translate_nocase(__c2)));
2242 else if (__collate_)
2243 __digraphs_.push_back(make_pair(__traits_.translate(__c1),
2244 __traits_.translate(__c2)));
2245 else
2246 __digraphs_.push_back(make_pair(__c1, __c2));
2247 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002248 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002249 void __add_equivalence(const string_type& __s)
2250 {__equivalences_.push_back(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002251 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002252 void __add_class(ctype_base::mask __mask)
2253 {__mask_ |= __mask;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002254 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002255 void __add_neg_class(ctype_base::mask __mask)
2256 {__neg_mask_ |= __mask;}
Howard Hinnant173968a2010-07-13 21:48:06 +00002257};
2258
2259template <class _CharT, class _Traits>
2260void
2261__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2262{
2263 bool __found = false;
2264 unsigned __consumed = 0;
2265 if (__s.__current_ != __s.__last_)
2266 {
2267 ++__consumed;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002268 if (__might_have_digraph_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002269 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002270 const _CharT* __next = _VSTD::next(__s.__current_);
Howard Hinnant68025ed2010-07-14 15:45:11 +00002271 if (__next != __s.__last_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002272 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002273 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2274 if (__icase_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002275 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002276 __ch2.first = __traits_.translate_nocase(__ch2.first);
2277 __ch2.second = __traits_.translate_nocase(__ch2.second);
2278 }
2279 else if (__collate_)
2280 {
2281 __ch2.first = __traits_.translate(__ch2.first);
2282 __ch2.second = __traits_.translate(__ch2.second);
2283 }
2284 if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2285 {
2286 // __ch2 is a digraph in this locale
2287 ++__consumed;
2288 for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2289 {
2290 if (__ch2 == __digraphs_[__i])
2291 {
2292 __found = true;
2293 goto __exit;
2294 }
2295 }
2296 if (__collate_ && !__ranges_.empty())
2297 {
2298 string_type __s2 = __traits_.transform(&__ch2.first,
2299 &__ch2.first + 2);
2300 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2301 {
2302 if (__ranges_[__i].first <= __s2 &&
2303 __s2 <= __ranges_[__i].second)
2304 {
2305 __found = true;
2306 goto __exit;
2307 }
2308 }
2309 }
2310 if (!__equivalences_.empty())
2311 {
2312 string_type __s2 = __traits_.transform_primary(&__ch2.first,
2313 &__ch2.first + 2);
2314 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2315 {
2316 if (__s2 == __equivalences_[__i])
2317 {
2318 __found = true;
2319 goto __exit;
2320 }
2321 }
2322 }
2323 if (__traits_.isctype(__ch2.first, __mask_) &&
2324 __traits_.isctype(__ch2.second, __mask_))
Howard Hinnant173968a2010-07-13 21:48:06 +00002325 {
2326 __found = true;
2327 goto __exit;
2328 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002329 if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2330 !__traits_.isctype(__ch2.second, __neg_mask_))
2331 {
2332 __found = true;
2333 goto __exit;
2334 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002335 goto __exit;
2336 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002337 }
2338 }
2339 // test *__s.__current_ as not a digraph
2340 _CharT __ch = *__s.__current_;
2341 if (__icase_)
2342 __ch = __traits_.translate_nocase(__ch);
2343 else if (__collate_)
2344 __ch = __traits_.translate(__ch);
2345 for (size_t __i = 0; __i < __chars_.size(); ++__i)
2346 {
2347 if (__ch == __chars_[__i])
2348 {
2349 __found = true;
2350 goto __exit;
2351 }
2352 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002353 if (!__neg_chars_.empty())
2354 {
2355 for (size_t __i = 0; __i < __neg_chars_.size(); ++__i)
2356 {
2357 if (__ch == __neg_chars_[__i])
2358 goto __is_neg_char;
2359 }
2360 __found = true;
2361 goto __exit;
2362 }
2363__is_neg_char:
Howard Hinnant173968a2010-07-13 21:48:06 +00002364 if (!__ranges_.empty())
2365 {
2366 string_type __s2 = __collate_ ?
2367 __traits_.transform(&__ch, &__ch + 1) :
2368 string_type(1, __ch);
2369 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2370 {
2371 if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2372 {
2373 __found = true;
2374 goto __exit;
2375 }
2376 }
2377 }
2378 if (!__equivalences_.empty())
2379 {
2380 string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2381 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2382 {
2383 if (__s2 == __equivalences_[__i])
2384 {
2385 __found = true;
2386 goto __exit;
2387 }
2388 }
2389 }
2390 if (__traits_.isctype(__ch, __mask_))
Howard Hinnant15476f32010-07-28 17:35:27 +00002391 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002392 __found = true;
Howard Hinnant15476f32010-07-28 17:35:27 +00002393 goto __exit;
2394 }
2395 if (__neg_mask_ && !__traits_.isctype(__ch, __neg_mask_))
2396 {
2397 __found = true;
2398 goto __exit;
2399 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002400 }
2401 else
2402 __found = __negate_; // force reject
2403__exit:
2404 if (__found != __negate_)
2405 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002406 __s.__do_ = __state::__accept_and_consume;
2407 __s.__current_ += __consumed;
2408 __s.__node_ = this->first();
2409 }
2410 else
2411 {
2412 __s.__do_ = __state::__reject;
2413 __s.__node_ = nullptr;
2414 }
2415}
2416
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00002417template <class _CharT, class _Traits> class __lookahead;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002418
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002419template <class _CharT, class _Traits = regex_traits<_CharT> >
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002420class _LIBCPP_VISIBLE basic_regex
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002421{
2422public:
2423 // types:
2424 typedef _CharT value_type;
2425 typedef regex_constants::syntax_option_type flag_type;
2426 typedef typename _Traits::locale_type locale_type;
2427
2428private:
2429 _Traits __traits_;
2430 flag_type __flags_;
2431 unsigned __marked_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002432 unsigned __loop_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002433 int __open_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002434 shared_ptr<__empty_state<_CharT> > __start_;
2435 __owns_one_state<_CharT>* __end_;
2436
Howard Hinnant0949eed2011-06-30 21:18:19 +00002437 typedef _VSTD::__state<_CharT> __state;
2438 typedef _VSTD::__node<_CharT> __node;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002439
2440public:
2441 // constants:
2442 static const/*expr*/ regex_constants::syntax_option_type icase = regex_constants::icase;
2443 static const/*expr*/ regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2444 static const/*expr*/ regex_constants::syntax_option_type optimize = regex_constants::optimize;
2445 static const/*expr*/ regex_constants::syntax_option_type collate = regex_constants::collate;
2446 static const/*expr*/ regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2447 static const/*expr*/ regex_constants::syntax_option_type basic = regex_constants::basic;
2448 static const/*expr*/ regex_constants::syntax_option_type extended = regex_constants::extended;
2449 static const/*expr*/ regex_constants::syntax_option_type awk = regex_constants::awk;
2450 static const/*expr*/ regex_constants::syntax_option_type grep = regex_constants::grep;
2451 static const/*expr*/ regex_constants::syntax_option_type egrep = regex_constants::egrep;
2452
2453 // construct/copy/destroy:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002454 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002455 basic_regex()
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002456 : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002457 __end_(0)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002458 {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002459 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002460 explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002461 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002462 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002463 {__parse(__p, __p + __traits_.length(__p));}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002464 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002465 basic_regex(const value_type* __p, size_t __len, flag_type __f)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002466 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002467 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002468 {__parse(__p, __p + __len);}
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002469// basic_regex(const basic_regex&) = default;
2470// basic_regex(basic_regex&&) = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002471 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002472 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002473 explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2474 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002475 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002476 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002477 {__parse(__p.begin(), __p.end());}
2478 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002479 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002480 basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2481 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002482 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002483 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002484 {__parse(__first, __last);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002485#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002486 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002487 basic_regex(initializer_list<value_type> __il,
2488 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002489 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002490 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002491 {__parse(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00002492#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002493
Howard Hinnant7026a172010-08-13 18:11:23 +00002494// ~basic_regex() = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002495
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002496// basic_regex& operator=(const basic_regex&) = default;
2497// basic_regex& operator=(basic_regex&&) = default;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002498 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002499 basic_regex& operator=(const value_type* __p)
2500 {return assign(__p);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002501#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002502 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002503 basic_regex& operator=(initializer_list<value_type> __il)
2504 {return assign(__il);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002505#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002506 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002507 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002508 basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2509 {return assign(__p);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002510
2511 // assign:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002512 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002513 basic_regex& assign(const basic_regex& __that)
2514 {return *this = __that;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002515 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002516 basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2517 {return assign(__p, __p + __traits_.length(__p), __f);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002518 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002519 basic_regex& assign(const value_type* __p, size_t __len, flag_type __f)
2520 {return assign(__p, __p + __len, __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002521 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002522 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002523 basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
Howard Hinnant7026a172010-08-13 18:11:23 +00002524 flag_type __f = regex_constants::ECMAScript)
2525 {return assign(__s.begin(), __s.end(), __f);}
2526
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002527 template <class _InputIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002528 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002529 typename enable_if
2530 <
2531 __is_input_iterator <_InputIterator>::value &&
2532 !__is_forward_iterator<_InputIterator>::value,
2533 basic_regex&
2534 >::type
2535 assign(_InputIterator __first, _InputIterator __last,
2536 flag_type __f = regex_constants::ECMAScript)
2537 {
2538 basic_string<_CharT> __t(__first, __last);
2539 return assign(__t.begin(), __t.end(), __f);
2540 }
2541
2542private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002543 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002544 void __member_init(flag_type __f)
2545 {
2546 __flags_ = __f;
2547 __marked_count_ = 0;
2548 __loop_count_ = 0;
2549 __open_count_ = 0;
2550 __end_ = nullptr;
Howard Hinnant7026a172010-08-13 18:11:23 +00002551 }
2552public:
2553
2554 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002555 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002556 typename enable_if
2557 <
2558 __is_forward_iterator<_ForwardIterator>::value,
2559 basic_regex&
2560 >::type
2561 assign(_ForwardIterator __first, _ForwardIterator __last,
2562 flag_type __f = regex_constants::ECMAScript)
2563 {
2564 __member_init(__f);
2565 __parse(__first, __last);
2566 }
2567
Howard Hinnante3e32912011-08-12 21:56:02 +00002568#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2569
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002570 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002571 basic_regex& assign(initializer_list<value_type> __il,
Howard Hinnant7026a172010-08-13 18:11:23 +00002572 flag_type __f = regex_constants::ECMAScript)
2573 {return assign(__il.begin(), __il.end(), __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002574
Howard Hinnante3e32912011-08-12 21:56:02 +00002575#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2576
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002577 // const operations:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002578 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002579 unsigned mark_count() const {return __marked_count_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002580 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002581 flag_type flags() const {return __flags_;}
2582
2583 // locale:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002584 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002585 locale_type imbue(locale_type __loc)
2586 {
2587 __member_init(ECMAScript);
2588 __start_.reset();
2589 return __traits_.imbue(__loc);
2590 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002591 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002592 locale_type getloc() const {return __traits_.getloc();}
2593
2594 // swap:
Howard Hinnant7026a172010-08-13 18:11:23 +00002595 void swap(basic_regex& __r);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002596
2597private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002598 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002599 unsigned __loop_count() const {return __loop_count_;}
2600
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002601 template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002602 _ForwardIterator
2603 __parse(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002604 template <class _ForwardIterator>
2605 _ForwardIterator
2606 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2607 template <class _ForwardIterator>
2608 _ForwardIterator
2609 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2610 template <class _ForwardIterator>
2611 _ForwardIterator
2612 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2613 template <class _ForwardIterator>
2614 _ForwardIterator
2615 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2616 template <class _ForwardIterator>
2617 _ForwardIterator
2618 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2619 template <class _ForwardIterator>
2620 _ForwardIterator
2621 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2622 template <class _ForwardIterator>
2623 _ForwardIterator
2624 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2625 template <class _ForwardIterator>
2626 _ForwardIterator
2627 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2628 template <class _ForwardIterator>
2629 _ForwardIterator
2630 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2631 template <class _ForwardIterator>
2632 _ForwardIterator
2633 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2634 template <class _ForwardIterator>
2635 _ForwardIterator
2636 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2637 template <class _ForwardIterator>
2638 _ForwardIterator
2639 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2640 template <class _ForwardIterator>
2641 _ForwardIterator
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002642 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002643 __owns_one_state<_CharT>* __s,
2644 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002645 template <class _ForwardIterator>
2646 _ForwardIterator
Howard Hinnantaa698082010-07-16 19:08:36 +00002647 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2648 __owns_one_state<_CharT>* __s,
2649 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002650 template <class _ForwardIterator>
2651 _ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00002652 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2653 template <class _ForwardIterator>
2654 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002655 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2656 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002657 template <class _ForwardIterator>
2658 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002659 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2660 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002661 template <class _ForwardIterator>
2662 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002663 __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2664 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002665 template <class _ForwardIterator>
2666 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002667 __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2668 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002669 template <class _ForwardIterator>
2670 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002671 __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2672 basic_string<_CharT>& __col_sym);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002673 template <class _ForwardIterator>
2674 _ForwardIterator
2675 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002676 template <class _ForwardIterator>
2677 _ForwardIterator
2678 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2679 template <class _ForwardIterator>
2680 _ForwardIterator
2681 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2682 template <class _ForwardIterator>
2683 _ForwardIterator
2684 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2685 template <class _ForwardIterator>
2686 _ForwardIterator
2687 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2688 template <class _ForwardIterator>
2689 _ForwardIterator
2690 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2691 template <class _ForwardIterator>
2692 _ForwardIterator
2693 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002694 template <class _ForwardIterator>
2695 _ForwardIterator
2696 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2697 template <class _ForwardIterator>
2698 _ForwardIterator
2699 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2700 template <class _ForwardIterator>
2701 _ForwardIterator
2702 __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2703 template <class _ForwardIterator>
2704 _ForwardIterator
2705 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2706 template <class _ForwardIterator>
2707 _ForwardIterator
2708 __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2709 template <class _ForwardIterator>
2710 _ForwardIterator
Howard Hinnant17615b02010-07-27 01:25:38 +00002711 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2712 template <class _ForwardIterator>
2713 _ForwardIterator
2714 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2715 template <class _ForwardIterator>
2716 _ForwardIterator
2717 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2718 template <class _ForwardIterator>
2719 _ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00002720 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2721 basic_string<_CharT>* __str = nullptr);
Howard Hinnant17615b02010-07-27 01:25:38 +00002722 template <class _ForwardIterator>
2723 _ForwardIterator
2724 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant856846b2010-07-27 19:53:10 +00002725 template <class _ForwardIterator>
2726 _ForwardIterator
2727 __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2728 template <class _ForwardIterator>
2729 _ForwardIterator
2730 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant15476f32010-07-28 17:35:27 +00002731 template <class _ForwardIterator>
2732 _ForwardIterator
2733 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2734 basic_string<_CharT>& __str,
2735 __bracket_expression<_CharT, _Traits>* __ml);
2736 template <class _ForwardIterator>
2737 _ForwardIterator
2738 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2739 basic_string<_CharT>* __str = nullptr);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002740
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002741 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002742 void __push_l_anchor();
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002743 void __push_r_anchor();
Howard Hinnantac303862010-07-12 15:51:17 +00002744 void __push_match_any();
Howard Hinnant17615b02010-07-27 01:25:38 +00002745 void __push_match_any_but_newline();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002746 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002747 void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2748 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2749 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2750 __mexp_begin, __mexp_end);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002751 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002752 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2753 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2754 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2755 __mexp_begin, __mexp_end, false);}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002756 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
2757 size_t __mexp_begin = 0, size_t __mexp_end = 0,
2758 bool __greedy = true);
Howard Hinnant173968a2010-07-13 21:48:06 +00002759 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002760 void __push_char(value_type __c);
Howard Hinnantcba352d2010-07-12 18:16:05 +00002761 void __push_back_ref(int __i);
Howard Hinnantaa698082010-07-16 19:08:36 +00002762 void __push_alternation(__owns_one_state<_CharT>* __sa,
2763 __owns_one_state<_CharT>* __sb);
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002764 void __push_begin_marked_subexpression();
2765 void __push_end_marked_subexpression(unsigned);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002766 void __push_empty();
Howard Hinnant17615b02010-07-27 01:25:38 +00002767 void __push_word_boundary(bool);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002768 void __push_lookahead(const basic_regex&, bool);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002769
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002770 template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002771 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002772 __search(const _CharT* __first, const _CharT* __last,
2773 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002774 regex_constants::match_flag_type __flags) const;
2775
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002776 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002777 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002778 __match_at_start(const _CharT* __first, const _CharT* __last,
2779 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002780 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00002781 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002782 bool
Howard Hinnant17615b02010-07-27 01:25:38 +00002783 __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
2784 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002785 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002786 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002787 bool
2788 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002789 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002790 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002791 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002792 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002793 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
2794 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002795 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002796
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002797 template <class _B, class _A, class _C, class _T>
2798 friend
2799 bool
2800 regex_search(_B, _B, match_results<_B, _A>&, const basic_regex<_C, _T>&,
2801 regex_constants::match_flag_type);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002802
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002803 template <class _A, class _C, class _T>
2804 friend
2805 bool
2806 regex_search(const _C*, const _C*, match_results<const _C*, _A>&,
2807 const basic_regex<_C, _T>&, regex_constants::match_flag_type);
2808
2809 template <class _B, class _C, class _T>
2810 friend
2811 bool
2812 regex_search(_B, _B, const basic_regex<_C, _T>&,
2813 regex_constants::match_flag_type);
2814
2815 template <class _C, class _T>
2816 friend
2817 bool
2818 regex_search(const _C*, const _C*,
2819 const basic_regex<_C, _T>&, regex_constants::match_flag_type);
2820
2821 template <class _C, class _A, class _T>
2822 friend
2823 bool
2824 regex_search(const _C*, match_results<const _C*, _A>&, const basic_regex<_C, _T>&,
2825 regex_constants::match_flag_type);
2826
2827 template <class _ST, class _SA, class _C, class _T>
2828 friend
2829 bool
2830 regex_search(const basic_string<_C, _ST, _SA>& __s,
2831 const basic_regex<_C, _T>& __e,
2832 regex_constants::match_flag_type __flags);
2833
2834 template <class _ST, class _SA, class _A, class _C, class _T>
2835 friend
2836 bool
2837 regex_search(const basic_string<_C, _ST, _SA>& __s,
Howard Hinnant324bb032010-08-22 00:02:43 +00002838 match_results<typename basic_string<_C, _ST, _SA>::const_iterator, _A>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002839 const basic_regex<_C, _T>& __e,
2840 regex_constants::match_flag_type __flags);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002841
2842 template <class, class> friend class __lookahead;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002843};
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002844
2845template <class _CharT, class _Traits>
Howard Hinnant7026a172010-08-13 18:11:23 +00002846void
2847basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002848{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002849 using _VSTD::swap;
Howard Hinnant7026a172010-08-13 18:11:23 +00002850 swap(__traits_, __r.__traits_);
2851 swap(__flags_, __r.__flags_);
2852 swap(__marked_count_, __r.__marked_count_);
2853 swap(__loop_count_, __r.__loop_count_);
2854 swap(__open_count_, __r.__open_count_);
2855 swap(__start_, __r.__start_);
2856 swap(__end_, __r.__end_);
Howard Hinnant7026a172010-08-13 18:11:23 +00002857}
2858
2859template <class _CharT, class _Traits>
2860inline _LIBCPP_INLINE_VISIBILITY
2861void
2862swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
2863{
2864 return __x.swap(__y);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002865}
2866
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002867// __lookahead
2868
2869template <class _CharT, class _Traits>
2870class __lookahead
2871 : public __owns_one_state<_CharT>
2872{
2873 typedef __owns_one_state<_CharT> base;
2874
2875 basic_regex<_CharT, _Traits> __exp_;
2876 bool __invert_;
2877
2878 __lookahead(const __lookahead&);
2879 __lookahead& operator=(const __lookahead&);
2880public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002881 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002882
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002883 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002884 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s)
2885 : base(__s), __exp_(__exp), __invert_(__invert) {}
2886
2887 virtual void __exec(__state&) const;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002888};
2889
2890template <class _CharT, class _Traits>
2891void
2892__lookahead<_CharT, _Traits>::__exec(__state& __s) const
2893{
2894 match_results<const _CharT*> __m;
2895 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
2896 bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002897 __m,
2898 __s.__flags_ | regex_constants::match_continuous,
2899 true);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002900 if (__matched != __invert_)
2901 {
2902 __s.__do_ = __state::__accept_but_not_consume;
2903 __s.__node_ = this->first();
2904 }
2905 else
2906 {
2907 __s.__do_ = __state::__reject;
2908 __s.__node_ = nullptr;
2909 }
2910}
2911
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002912template <class _CharT, class _Traits>
2913template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002914_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002915basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
2916 _ForwardIterator __last)
2917{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002918 {
Howard Hinnantac303862010-07-12 15:51:17 +00002919 unique_ptr<__node> __h(new __end_state<_CharT>);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002920 __start_.reset(new __empty_state<_CharT>(__h.get()));
2921 __h.release();
2922 __end_ = __start_.get();
2923 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002924 switch (__flags_ & 0x1F0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002925 {
2926 case ECMAScript:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002927 __first = __parse_ecma_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002928 break;
2929 case basic:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002930 __first = __parse_basic_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002931 break;
2932 case extended:
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002933 case awk:
Howard Hinnant15476f32010-07-28 17:35:27 +00002934 __first = __parse_extended_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002935 break;
2936 case grep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002937 __first = __parse_grep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002938 break;
2939 case egrep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002940 __first = __parse_egrep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002941 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00002942#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002943 default:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002944 throw regex_error(regex_constants::__re_err_grammar);
Howard Hinnant324bb032010-08-22 00:02:43 +00002945#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002946 }
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002947 return __first;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002948}
2949
2950template <class _CharT, class _Traits>
2951template <class _ForwardIterator>
2952_ForwardIterator
2953basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
2954 _ForwardIterator __last)
2955{
2956 if (__first != __last)
2957 {
2958 if (*__first == '^')
2959 {
2960 __push_l_anchor();
2961 ++__first;
2962 }
2963 if (__first != __last)
2964 {
2965 __first = __parse_RE_expression(__first, __last);
2966 if (__first != __last)
2967 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002968 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002969 if (__temp == __last && *__first == '$')
2970 {
2971 __push_r_anchor();
2972 ++__first;
2973 }
2974 }
2975 }
Howard Hinnantd4444702010-08-11 17:04:31 +00002976#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002977 if (__first != __last)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002978 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00002979#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002980 }
2981 return __first;
2982}
2983
2984template <class _CharT, class _Traits>
2985template <class _ForwardIterator>
2986_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002987basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
2988 _ForwardIterator __last)
2989{
Howard Hinnantaa698082010-07-16 19:08:36 +00002990 __owns_one_state<_CharT>* __sa = __end_;
2991 _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00002992#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00002993 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002994 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00002995#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00002996 __first = __temp;
2997 while (__first != __last && *__first == '|')
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002998 {
Howard Hinnantaa698082010-07-16 19:08:36 +00002999 __owns_one_state<_CharT>* __sb = __end_;
3000 __temp = __parse_ERE_branch(++__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003001#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003002 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003003 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003004#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003005 __push_alternation(__sa, __sb);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003006 __first = __temp;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003007 }
3008 return __first;
3009}
3010
3011template <class _CharT, class _Traits>
3012template <class _ForwardIterator>
3013_ForwardIterator
3014basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3015 _ForwardIterator __last)
3016{
3017 _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003018#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003019 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003020 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003021#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003022 do
3023 {
3024 __first = __temp;
3025 __temp = __parse_ERE_expression(__first, __last);
3026 } while (__temp != __first);
3027 return __first;
3028}
3029
3030template <class _CharT, class _Traits>
3031template <class _ForwardIterator>
3032_ForwardIterator
3033basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3034 _ForwardIterator __last)
3035{
Howard Hinnantaa698082010-07-16 19:08:36 +00003036 __owns_one_state<_CharT>* __e = __end_;
3037 unsigned __mexp_begin = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003038 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3039 if (__temp == __first && __temp != __last)
3040 {
3041 switch (*__temp)
3042 {
3043 case '^':
3044 __push_l_anchor();
3045 ++__temp;
3046 break;
3047 case '$':
3048 __push_r_anchor();
3049 ++__temp;
3050 break;
3051 case '(':
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003052 __push_begin_marked_subexpression();
3053 unsigned __temp_count = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003054 ++__open_count_;
3055 __temp = __parse_extended_reg_exp(++__temp, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003056#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003057 if (__temp == __last || *__temp != ')')
3058 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00003059#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003060 __push_end_marked_subexpression(__temp_count);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003061 --__open_count_;
3062 ++__temp;
3063 break;
3064 }
3065 }
3066 if (__temp != __first)
Howard Hinnantaa698082010-07-16 19:08:36 +00003067 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3068 __marked_count_+1);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003069 __first = __temp;
3070 return __first;
3071}
3072
3073template <class _CharT, class _Traits>
3074template <class _ForwardIterator>
3075_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003076basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3077 _ForwardIterator __last)
3078{
3079 while (true)
3080 {
3081 _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3082 if (__temp == __first)
3083 break;
3084 __first = __temp;
3085 }
3086 return __first;
3087}
3088
3089template <class _CharT, class _Traits>
3090template <class _ForwardIterator>
3091_ForwardIterator
3092basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3093 _ForwardIterator __last)
3094{
3095 if (__first != __last)
3096 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003097 __owns_one_state<_CharT>* __e = __end_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003098 unsigned __mexp_begin = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003099 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3100 if (__temp != __first)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003101 __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3102 __mexp_begin+1, __marked_count_+1);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003103 }
3104 return __first;
3105}
3106
3107template <class _CharT, class _Traits>
3108template <class _ForwardIterator>
3109_ForwardIterator
3110basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3111 _ForwardIterator __last)
3112{
3113 _ForwardIterator __temp = __first;
3114 __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3115 if (__temp == __first)
3116 {
3117 __temp = __parse_Back_open_paren(__first, __last);
3118 if (__temp != __first)
3119 {
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003120 __push_begin_marked_subexpression();
3121 unsigned __temp_count = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003122 __first = __parse_RE_expression(__temp, __last);
3123 __temp = __parse_Back_close_paren(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003124#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003125 if (__temp == __first)
3126 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00003127#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003128 __push_end_marked_subexpression(__temp_count);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003129 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003130 }
3131 else
3132 __first = __parse_BACKREF(__first, __last);
3133 }
3134 return __first;
3135}
3136
3137template <class _CharT, class _Traits>
3138template <class _ForwardIterator>
3139_ForwardIterator
3140basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3141 _ForwardIterator __first,
3142 _ForwardIterator __last)
3143{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003144 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003145 if (__temp == __first)
3146 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003147 __temp = __parse_QUOTED_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003148 if (__temp == __first)
3149 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003150 if (__temp != __last && *__temp == '.')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003151 {
3152 __push_match_any();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003153 ++__temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003154 }
3155 else
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003156 __temp = __parse_bracket_expression(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003157 }
3158 }
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003159 __first = __temp;
3160 return __first;
3161}
3162
3163template <class _CharT, class _Traits>
3164template <class _ForwardIterator>
3165_ForwardIterator
3166basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3167 _ForwardIterator __first,
3168 _ForwardIterator __last)
3169{
3170 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3171 if (__temp == __first)
3172 {
3173 __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3174 if (__temp == __first)
3175 {
3176 if (__temp != __last && *__temp == '.')
3177 {
3178 __push_match_any();
3179 ++__temp;
3180 }
3181 else
3182 __temp = __parse_bracket_expression(__first, __last);
3183 }
3184 }
3185 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003186 return __first;
3187}
3188
3189template <class _CharT, class _Traits>
3190template <class _ForwardIterator>
3191_ForwardIterator
3192basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3193 _ForwardIterator __last)
3194{
3195 if (__first != __last)
3196 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003197 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003198 if (__temp != __last)
3199 {
3200 if (*__first == '\\' && *__temp == '(')
3201 __first = ++__temp;
3202 }
3203 }
3204 return __first;
3205}
3206
3207template <class _CharT, class _Traits>
3208template <class _ForwardIterator>
3209_ForwardIterator
3210basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3211 _ForwardIterator __last)
3212{
3213 if (__first != __last)
3214 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003215 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003216 if (__temp != __last)
3217 {
3218 if (*__first == '\\' && *__temp == ')')
3219 __first = ++__temp;
3220 }
3221 }
3222 return __first;
3223}
3224
3225template <class _CharT, class _Traits>
3226template <class _ForwardIterator>
3227_ForwardIterator
3228basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3229 _ForwardIterator __last)
3230{
3231 if (__first != __last)
3232 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003233 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003234 if (__temp != __last)
3235 {
3236 if (*__first == '\\' && *__temp == '{')
3237 __first = ++__temp;
3238 }
3239 }
3240 return __first;
3241}
3242
3243template <class _CharT, class _Traits>
3244template <class _ForwardIterator>
3245_ForwardIterator
3246basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3247 _ForwardIterator __last)
3248{
3249 if (__first != __last)
3250 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003251 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003252 if (__temp != __last)
3253 {
3254 if (*__first == '\\' && *__temp == '}')
3255 __first = ++__temp;
3256 }
3257 }
3258 return __first;
3259}
3260
3261template <class _CharT, class _Traits>
3262template <class _ForwardIterator>
3263_ForwardIterator
3264basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3265 _ForwardIterator __last)
3266{
3267 if (__first != __last)
3268 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003269 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003270 if (__temp != __last)
3271 {
3272 if (*__first == '\\' && '1' <= *__temp && *__temp <= '9')
3273 {
3274 __push_back_ref(*__temp - '0');
3275 __first = ++__temp;
3276 }
3277 }
3278 }
3279 return __first;
3280}
3281
3282template <class _CharT, class _Traits>
3283template <class _ForwardIterator>
3284_ForwardIterator
3285basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3286 _ForwardIterator __last)
3287{
3288 if (__first != __last)
3289 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003290 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003291 if (__temp == __last && *__first == '$')
3292 return __first;
3293 // Not called inside a bracket
3294 if (*__first == '.' || *__first == '\\' || *__first == '[')
3295 return __first;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003296 __push_char(*__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003297 ++__first;
3298 }
3299 return __first;
3300}
3301
3302template <class _CharT, class _Traits>
3303template <class _ForwardIterator>
3304_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003305basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3306 _ForwardIterator __last)
3307{
3308 if (__first != __last)
3309 {
3310 switch (*__first)
3311 {
3312 case '^':
3313 case '.':
3314 case '[':
3315 case '$':
3316 case '(':
3317 case '|':
3318 case '*':
3319 case '+':
3320 case '?':
3321 case '{':
3322 case '\\':
3323 break;
3324 case ')':
3325 if (__open_count_ == 0)
3326 {
3327 __push_char(*__first);
3328 ++__first;
3329 }
3330 break;
3331 default:
3332 __push_char(*__first);
3333 ++__first;
3334 break;
3335 }
3336 }
3337 return __first;
3338}
3339
3340template <class _CharT, class _Traits>
3341template <class _ForwardIterator>
3342_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003343basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3344 _ForwardIterator __last)
3345{
3346 if (__first != __last)
3347 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003348 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003349 if (__temp != __last)
3350 {
3351 if (*__first == '\\')
3352 {
3353 switch (*__temp)
3354 {
3355 case '^':
3356 case '.':
3357 case '*':
3358 case '[':
3359 case '$':
3360 case '\\':
Howard Hinnant0de86b62010-06-25 20:56:08 +00003361 __push_char(*__temp);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003362 __first = ++__temp;
3363 break;
3364 }
3365 }
3366 }
3367 }
3368 return __first;
3369}
3370
3371template <class _CharT, class _Traits>
3372template <class _ForwardIterator>
3373_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003374basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3375 _ForwardIterator __last)
3376{
3377 if (__first != __last)
3378 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003379 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003380 if (__temp != __last)
3381 {
3382 if (*__first == '\\')
3383 {
3384 switch (*__temp)
3385 {
3386 case '^':
3387 case '.':
3388 case '*':
3389 case '[':
3390 case '$':
3391 case '\\':
3392 case '(':
3393 case ')':
3394 case '|':
3395 case '+':
3396 case '?':
3397 case '{':
3398 __push_char(*__temp);
3399 __first = ++__temp;
3400 break;
Howard Hinnant15476f32010-07-28 17:35:27 +00003401 default:
3402 if ((__flags_ & 0x1F0) == awk)
3403 __first = __parse_awk_escape(++__first, __last);
3404 break;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003405 }
3406 }
3407 }
3408 }
3409 return __first;
3410}
3411
3412template <class _CharT, class _Traits>
3413template <class _ForwardIterator>
3414_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003415basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003416 _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003417 __owns_one_state<_CharT>* __s,
3418 unsigned __mexp_begin,
3419 unsigned __mexp_end)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003420{
3421 if (__first != __last)
3422 {
Howard Hinnant0de86b62010-06-25 20:56:08 +00003423 if (*__first == '*')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003424 {
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003425 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003426 ++__first;
3427 }
3428 else
3429 {
3430 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3431 if (__temp != __first)
3432 {
3433 int __min = 0;
3434 __first = __temp;
3435 __temp = __parse_DUP_COUNT(__first, __last, __min);
Howard Hinnantd4444702010-08-11 17:04:31 +00003436#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003437 if (__temp == __first)
3438 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003439#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003440 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003441#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003442 if (__first == __last)
3443 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003444#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003445 if (*__first != ',')
3446 {
3447 __temp = __parse_Back_close_brace(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003448#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003449 if (__temp == __first)
3450 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003451#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcba352d2010-07-12 18:16:05 +00003452 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3453 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003454 __first = __temp;
3455 }
3456 else
3457 {
3458 ++__first; // consume ','
3459 int __max = -1;
3460 __first = __parse_DUP_COUNT(__first, __last, __max);
3461 __temp = __parse_Back_close_brace(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003462#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003463 if (__temp == __first)
3464 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003465#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003466 if (__max == -1)
Howard Hinnantaa698082010-07-16 19:08:36 +00003467 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003468 else
3469 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003470#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003471 if (__max < __min)
3472 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003473#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcba352d2010-07-12 18:16:05 +00003474 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3475 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003476 }
3477 __first = __temp;
3478 }
3479 }
3480 }
3481 }
3482 return __first;
3483}
3484
Howard Hinnant0de86b62010-06-25 20:56:08 +00003485template <class _CharT, class _Traits>
3486template <class _ForwardIterator>
3487_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003488basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantaa698082010-07-16 19:08:36 +00003489 _ForwardIterator __last,
3490 __owns_one_state<_CharT>* __s,
3491 unsigned __mexp_begin,
3492 unsigned __mexp_end)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003493{
3494 if (__first != __last)
3495 {
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003496 unsigned __grammar = __flags_ & 0x1F0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003497 switch (*__first)
3498 {
3499 case '*':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003500 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003501 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003502 {
3503 ++__first;
3504 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3505 }
3506 else
3507 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003508 break;
3509 case '+':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003510 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003511 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003512 {
3513 ++__first;
3514 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3515 }
3516 else
3517 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003518 break;
3519 case '?':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003520 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003521 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003522 {
3523 ++__first;
3524 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3525 }
3526 else
3527 __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003528 break;
3529 case '{':
3530 {
3531 int __min;
Howard Hinnantaa698082010-07-16 19:08:36 +00003532 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
Howard Hinnantd4444702010-08-11 17:04:31 +00003533#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003534 if (__temp == __first)
3535 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003536#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003537 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003538#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003539 if (__first == __last)
3540 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003541#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003542 switch (*__first)
3543 {
3544 case '}':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003545 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003546 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003547 {
3548 ++__first;
3549 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3550 }
3551 else
3552 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003553 break;
3554 case ',':
Howard Hinnantd4444702010-08-11 17:04:31 +00003555 ++__first;
3556#ifndef _LIBCPP_NO_EXCEPTIONS
3557 if (__first == __last)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003558 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003559#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003560 if (*__first == '}')
3561 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003562 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003563 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003564 {
3565 ++__first;
3566 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3567 }
3568 else
3569 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003570 }
3571 else
3572 {
Howard Hinnantaa698082010-07-16 19:08:36 +00003573 int __max = -1;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003574 __temp = __parse_DUP_COUNT(__first, __last, __max);
Howard Hinnantd4444702010-08-11 17:04:31 +00003575#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003576 if (__temp == __first)
3577 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003578#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003579 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003580#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003581 if (__first == __last || *__first != '}')
3582 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003583#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003584 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00003585#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003586 if (__max < __min)
3587 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003588#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003589 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003590 {
3591 ++__first;
3592 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3593 }
3594 else
3595 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003596 }
Howard Hinnantaa698082010-07-16 19:08:36 +00003597 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003598#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003599 default:
3600 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003601#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003602 }
3603 }
3604 break;
3605 }
3606 }
3607 return __first;
3608}
3609
3610template <class _CharT, class _Traits>
3611template <class _ForwardIterator>
3612_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003613basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3614 _ForwardIterator __last)
3615{
3616 if (__first != __last && *__first == '[')
3617 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003618 ++__first;
3619#ifndef _LIBCPP_NO_EXCEPTIONS
3620 if (__first == __last)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003621 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003622#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003623 bool __negate = false;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003624 if (*__first == '^')
3625 {
3626 ++__first;
Howard Hinnant173968a2010-07-13 21:48:06 +00003627 __negate = true;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003628 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003629 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3630 // __ml owned by *this
Howard Hinnantd4444702010-08-11 17:04:31 +00003631#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003632 if (__first == __last)
3633 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003634#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003635 if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']')
Howard Hinnant0de86b62010-06-25 20:56:08 +00003636 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003637 __ml->__add_char(']');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003638 ++__first;
3639 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003640 __first = __parse_follow_list(__first, __last, __ml);
Howard Hinnantd4444702010-08-11 17:04:31 +00003641#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003642 if (__first == __last)
3643 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003644#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003645 if (*__first == '-')
3646 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003647 __ml->__add_char('-');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003648 ++__first;
3649 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003650#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003651 if (__first == __last || *__first != ']')
3652 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003653#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003654 ++__first;
3655 }
3656 return __first;
3657}
3658
3659template <class _CharT, class _Traits>
3660template <class _ForwardIterator>
3661_ForwardIterator
3662basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003663 _ForwardIterator __last,
3664 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003665{
3666 if (__first != __last)
3667 {
3668 while (true)
3669 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003670 _ForwardIterator __temp = __parse_expression_term(__first, __last,
3671 __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003672 if (__temp == __first)
3673 break;
3674 __first = __temp;
3675 }
3676 }
3677 return __first;
3678}
3679
3680template <class _CharT, class _Traits>
3681template <class _ForwardIterator>
3682_ForwardIterator
3683basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003684 _ForwardIterator __last,
3685 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003686{
3687 if (__first != __last && *__first != ']')
3688 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003689 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant173968a2010-07-13 21:48:06 +00003690 basic_string<_CharT> __start_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003691 if (__temp != __last && *__first == '[')
3692 {
3693 if (*__temp == '=')
Howard Hinnant173968a2010-07-13 21:48:06 +00003694 return __parse_equivalence_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003695 else if (*__temp == ':')
Howard Hinnant173968a2010-07-13 21:48:06 +00003696 return __parse_character_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003697 else if (*__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003698 __first = __parse_collating_symbol(++__temp, __last, __start_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003699 }
Howard Hinnant15476f32010-07-28 17:35:27 +00003700 unsigned __grammar = __flags_ & 0x1F0;
3701 if (__start_range.empty())
Howard Hinnant0de86b62010-06-25 20:56:08 +00003702 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003703 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3704 {
3705 if (__grammar == ECMAScript)
3706 __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3707 else
3708 __first = __parse_awk_escape(++__first, __last, &__start_range);
3709 }
3710 else
3711 {
3712 __start_range = *__first;
3713 ++__first;
3714 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003715 }
3716 if (__first != __last && *__first != ']')
3717 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003718 __temp = _VSTD::next(__first);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003719 if (__temp != __last && *__first == '-' && *__temp != ']')
3720 {
3721 // parse a range
Howard Hinnant173968a2010-07-13 21:48:06 +00003722 basic_string<_CharT> __end_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003723 __first = __temp;
3724 ++__temp;
3725 if (__temp != __last && *__first == '[' && *__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003726 __first = __parse_collating_symbol(++__temp, __last, __end_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003727 else
3728 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003729 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3730 {
3731 if (__grammar == ECMAScript)
3732 __first = __parse_class_escape(++__first, __last,
3733 __end_range, __ml);
3734 else
3735 __first = __parse_awk_escape(++__first, __last,
3736 &__end_range);
3737 }
3738 else
3739 {
3740 __end_range = *__first;
3741 ++__first;
3742 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003743 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003744 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
Howard Hinnant0de86b62010-06-25 20:56:08 +00003745 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003746 else
3747 {
3748 if (__start_range.size() == 1)
3749 __ml->__add_char(__start_range[0]);
3750 else
3751 __ml->__add_digraph(__start_range[0], __start_range[1]);
3752 }
3753 }
3754 else
3755 {
3756 if (__start_range.size() == 1)
3757 __ml->__add_char(__start_range[0]);
3758 else
3759 __ml->__add_digraph(__start_range[0], __start_range[1]);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003760 }
3761 }
3762 return __first;
3763}
3764
3765template <class _CharT, class _Traits>
3766template <class _ForwardIterator>
3767_ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00003768basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
3769 _ForwardIterator __last,
3770 basic_string<_CharT>& __str,
3771 __bracket_expression<_CharT, _Traits>* __ml)
3772{
Howard Hinnantd4444702010-08-11 17:04:31 +00003773#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003774 if (__first == __last)
3775 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003776#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003777 switch (*__first)
3778 {
3779 case 0:
3780 __str = *__first;
3781 return ++__first;
3782 case 'b':
3783 __str = _CharT(8);
3784 return ++__first;
3785 case 'd':
3786 __ml->__add_class(ctype_base::digit);
3787 return ++__first;
3788 case 'D':
3789 __ml->__add_neg_class(ctype_base::digit);
3790 return ++__first;
3791 case 's':
3792 __ml->__add_class(ctype_base::space);
3793 return ++__first;
3794 case 'S':
3795 __ml->__add_neg_class(ctype_base::space);
3796 return ++__first;
3797 case 'w':
3798 __ml->__add_class(ctype_base::alnum);
3799 __ml->__add_char('_');
3800 return ++__first;
3801 case 'W':
3802 __ml->__add_neg_class(ctype_base::alnum);
3803 __ml->__add_neg_char('_');
3804 return ++__first;
3805 }
3806 __first = __parse_character_escape(__first, __last, &__str);
3807 return __first;
3808}
3809
3810template <class _CharT, class _Traits>
3811template <class _ForwardIterator>
3812_ForwardIterator
3813basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
3814 _ForwardIterator __last,
3815 basic_string<_CharT>* __str)
3816{
Howard Hinnantd4444702010-08-11 17:04:31 +00003817#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003818 if (__first == __last)
3819 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003820#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003821 switch (*__first)
3822 {
3823 case '\\':
3824 case '"':
3825 case '/':
3826 if (__str)
3827 *__str = *__first;
3828 else
3829 __push_char(*__first);
3830 return ++__first;
3831 case 'a':
3832 if (__str)
3833 *__str = _CharT(7);
3834 else
3835 __push_char(_CharT(7));
3836 return ++__first;
3837 case 'b':
3838 if (__str)
3839 *__str = _CharT(8);
3840 else
3841 __push_char(_CharT(8));
3842 return ++__first;
3843 case 'f':
3844 if (__str)
3845 *__str = _CharT(0xC);
3846 else
3847 __push_char(_CharT(0xC));
3848 return ++__first;
3849 case 'n':
3850 if (__str)
3851 *__str = _CharT(0xA);
3852 else
3853 __push_char(_CharT(0xA));
3854 return ++__first;
3855 case 'r':
3856 if (__str)
3857 *__str = _CharT(0xD);
3858 else
3859 __push_char(_CharT(0xD));
3860 return ++__first;
3861 case 't':
3862 if (__str)
3863 *__str = _CharT(0x9);
3864 else
3865 __push_char(_CharT(0x9));
3866 return ++__first;
3867 case 'v':
3868 if (__str)
3869 *__str = _CharT(0xB);
3870 else
3871 __push_char(_CharT(0xB));
3872 return ++__first;
3873 }
3874 if ('0' <= *__first && *__first <= '7')
3875 {
3876 unsigned __val = *__first - '0';
3877 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3878 {
3879 __val = 8 * __val + *__first - '0';
3880 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3881 __val = 8 * __val + *__first - '0';
3882 }
3883 if (__str)
3884 *__str = _CharT(__val);
3885 else
3886 __push_char(_CharT(__val));
3887 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003888#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003889 else
3890 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003891#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003892 return __first;
3893}
3894
3895template <class _CharT, class _Traits>
3896template <class _ForwardIterator>
3897_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003898basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003899 _ForwardIterator __last,
3900 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003901{
3902 // Found [=
3903 // This means =] must exist
3904 value_type _Equal_close[2] = {'=', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003905 _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00003906 _Equal_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00003907#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003908 if (__temp == __last)
3909 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003910#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003911 // [__first, __temp) contains all text in [= ... =]
3912 typedef typename _Traits::string_type string_type;
3913 string_type __collate_name =
3914 __traits_.lookup_collatename(__first, __temp);
Howard Hinnantd4444702010-08-11 17:04:31 +00003915#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003916 if (__collate_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003917 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00003918#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003919 string_type __equiv_name =
3920 __traits_.transform_primary(__collate_name.begin(),
3921 __collate_name.end());
3922 if (!__equiv_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003923 __ml->__add_equivalence(__equiv_name);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003924 else
Howard Hinnant173968a2010-07-13 21:48:06 +00003925 {
3926 switch (__collate_name.size())
3927 {
3928 case 1:
3929 __ml->__add_char(__collate_name[0]);
3930 break;
3931 case 2:
3932 __ml->__add_digraph(__collate_name[0], __collate_name[1]);
3933 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003934#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003935 default:
3936 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00003937#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003938 }
3939 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003940 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003941 return __first;
3942}
3943
3944template <class _CharT, class _Traits>
3945template <class _ForwardIterator>
3946_ForwardIterator
3947basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003948 _ForwardIterator __last,
3949 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003950{
3951 // Found [:
3952 // This means :] must exist
3953 value_type _Colon_close[2] = {':', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003954 _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00003955 _Colon_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00003956#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003957 if (__temp == __last)
3958 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003959#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003960 // [__first, __temp) contains all text in [: ... :]
3961 typedef typename _Traits::char_class_type char_class_type;
3962 char_class_type __class_type =
3963 __traits_.lookup_classname(__first, __temp, __flags_ & icase);
Howard Hinnantd4444702010-08-11 17:04:31 +00003964#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003965 if (__class_type == 0)
3966 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003967#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003968 __ml->__add_class(__class_type);
Howard Hinnant0949eed2011-06-30 21:18:19 +00003969 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003970 return __first;
3971}
3972
3973template <class _CharT, class _Traits>
3974template <class _ForwardIterator>
3975_ForwardIterator
3976basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003977 _ForwardIterator __last,
3978 basic_string<_CharT>& __col_sym)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003979{
3980 // Found [.
3981 // This means .] must exist
3982 value_type _Dot_close[2] = {'.', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003983 _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00003984 _Dot_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00003985#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003986 if (__temp == __last)
3987 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003988#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003989 // [__first, __temp) contains all text in [. ... .]
3990 typedef typename _Traits::string_type string_type;
Howard Hinnant173968a2010-07-13 21:48:06 +00003991 __col_sym = __traits_.lookup_collatename(__first, __temp);
3992 switch (__col_sym.size())
3993 {
3994 case 1:
3995 case 2:
3996 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003997#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003998 default:
3999 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00004000#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004001 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004002 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004003 return __first;
4004}
4005
4006template <class _CharT, class _Traits>
4007template <class _ForwardIterator>
4008_ForwardIterator
4009basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4010 _ForwardIterator __last,
4011 int& __c)
4012{
4013 if (__first != __last && '0' <= *__first && *__first <= '9')
4014 {
4015 __c = *__first - '0';
4016 for (++__first; __first != __last && '0' <= *__first && *__first <= '9';
4017 ++__first)
4018 {
4019 __c *= 10;
4020 __c += *__first - '0';
4021 }
4022 }
4023 return __first;
4024}
4025
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004026template <class _CharT, class _Traits>
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004027template <class _ForwardIterator>
4028_ForwardIterator
4029basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4030 _ForwardIterator __last)
4031{
4032 __owns_one_state<_CharT>* __sa = __end_;
4033 _ForwardIterator __temp = __parse_alternative(__first, __last);
4034 if (__temp == __first)
4035 __push_empty();
4036 __first = __temp;
4037 while (__first != __last && *__first == '|')
4038 {
4039 __owns_one_state<_CharT>* __sb = __end_;
4040 __temp = __parse_alternative(++__first, __last);
4041 if (__temp == __first)
4042 __push_empty();
4043 __push_alternation(__sa, __sb);
4044 __first = __temp;
4045 }
4046 return __first;
4047}
4048
4049template <class _CharT, class _Traits>
4050template <class _ForwardIterator>
4051_ForwardIterator
4052basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4053 _ForwardIterator __last)
4054{
4055 while (true)
4056 {
4057 _ForwardIterator __temp = __parse_term(__first, __last);
4058 if (__temp == __first)
4059 break;
4060 __first = __temp;
4061 }
4062 return __first;
4063}
4064
4065template <class _CharT, class _Traits>
4066template <class _ForwardIterator>
4067_ForwardIterator
4068basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4069 _ForwardIterator __last)
4070{
4071 _ForwardIterator __temp = __parse_assertion(__first, __last);
4072 if (__temp == __first)
4073 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004074 __owns_one_state<_CharT>* __e = __end_;
4075 unsigned __mexp_begin = __marked_count_;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004076 __temp = __parse_atom(__first, __last);
4077 if (__temp != __first)
Howard Hinnant17615b02010-07-27 01:25:38 +00004078 __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4079 __mexp_begin+1, __marked_count_+1);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004080 }
Howard Hinnant17615b02010-07-27 01:25:38 +00004081 else
4082 __first = __temp;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004083 return __first;
4084}
4085
4086template <class _CharT, class _Traits>
4087template <class _ForwardIterator>
4088_ForwardIterator
4089basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4090 _ForwardIterator __last)
4091{
4092 if (__first != __last)
4093 {
4094 switch (*__first)
4095 {
4096 case '^':
4097 __push_l_anchor();
4098 ++__first;
4099 break;
4100 case '$':
4101 __push_r_anchor();
4102 ++__first;
4103 break;
4104 case '\\':
4105 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004106 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004107 if (__temp != __last)
4108 {
4109 if (*__temp == 'b')
4110 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004111 __push_word_boundary(false);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004112 __first = ++__temp;
4113 }
4114 else if (*__temp == 'B')
4115 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004116 __push_word_boundary(true);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004117 __first = ++__temp;
4118 }
4119 }
4120 }
4121 break;
4122 case '(':
4123 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004124 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004125 if (__temp != __last && *__temp == '?')
4126 {
4127 if (++__temp != __last)
4128 {
4129 switch (*__temp)
4130 {
4131 case '=':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004132 {
4133 basic_regex __exp;
4134 __exp.__flags_ = __flags_;
4135 __temp = __exp.__parse(++__temp, __last);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004136 __push_lookahead(_VSTD::move(__exp), false);
Howard Hinnantd4444702010-08-11 17:04:31 +00004137#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004138 if (__temp == __last || *__temp != ')')
4139 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004140#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004141 __first = ++__temp;
4142 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004143 break;
4144 case '!':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004145 {
4146 basic_regex __exp;
4147 __exp.__flags_ = __flags_;
4148 __temp = __exp.__parse(++__temp, __last);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004149 __push_lookahead(_VSTD::move(__exp), true);
Howard Hinnantd4444702010-08-11 17:04:31 +00004150#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004151 if (__temp == __last || *__temp != ')')
4152 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004153#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004154 __first = ++__temp;
4155 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004156 break;
4157 }
4158 }
4159 }
4160 }
4161 break;
4162 }
4163 }
4164 return __first;
4165}
4166
4167template <class _CharT, class _Traits>
4168template <class _ForwardIterator>
4169_ForwardIterator
4170basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4171 _ForwardIterator __last)
4172{
Howard Hinnant17615b02010-07-27 01:25:38 +00004173 if (__first != __last)
4174 {
4175 switch (*__first)
4176 {
4177 case '.':
4178 __push_match_any_but_newline();
4179 ++__first;
4180 break;
4181 case '\\':
4182 __first = __parse_atom_escape(__first, __last);
4183 break;
4184 case '[':
4185 __first = __parse_bracket_expression(__first, __last);
4186 break;
4187 case '(':
4188 {
Howard Hinnantd4444702010-08-11 17:04:31 +00004189 ++__first;
4190#ifndef _LIBCPP_NO_EXCEPTIONS
4191 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004192 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004193#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0949eed2011-06-30 21:18:19 +00004194 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004195 if (__temp != __last && *__first == '?' && *__temp == ':')
4196 {
4197 ++__open_count_;
4198 __first = __parse_ecma_exp(++__temp, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00004199#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004200 if (__first == __last || *__first != ')')
4201 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004202#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004203 --__open_count_;
4204 ++__first;
4205 }
4206 else
4207 {
4208 __push_begin_marked_subexpression();
4209 unsigned __temp_count = __marked_count_;
4210 ++__open_count_;
4211 __first = __parse_ecma_exp(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00004212#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004213 if (__first == __last || *__first != ')')
4214 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004215#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004216 __push_end_marked_subexpression(__temp_count);
4217 --__open_count_;
4218 ++__first;
4219 }
4220 }
4221 break;
4222 default:
4223 __first = __parse_pattern_character(__first, __last);
4224 break;
4225 }
4226 }
4227 return __first;
4228}
4229
4230template <class _CharT, class _Traits>
4231template <class _ForwardIterator>
4232_ForwardIterator
4233basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4234 _ForwardIterator __last)
4235{
4236 if (__first != __last && *__first == '\\')
4237 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004238 _ForwardIterator __t1 = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004239 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4240 if (__t2 != __t1)
4241 __first = __t2;
4242 else
4243 {
4244 __t2 = __parse_character_class_escape(__t1, __last);
4245 if (__t2 != __t1)
4246 __first = __t2;
4247 else
4248 {
4249 __t2 = __parse_character_escape(__t1, __last);
4250 if (__t2 != __t1)
4251 __first = __t2;
4252 }
4253 }
4254 }
4255 return __first;
4256}
4257
4258template <class _CharT, class _Traits>
4259template <class _ForwardIterator>
4260_ForwardIterator
4261basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4262 _ForwardIterator __last)
4263{
4264 if (__first != __last)
4265 {
4266 if (*__first == '0')
4267 {
4268 __push_char(_CharT());
4269 ++__first;
4270 }
4271 else if ('1' <= *__first && *__first <= '9')
4272 {
4273 unsigned __v = *__first - '0';
4274 for (++__first; '0' <= *__first && *__first <= '9'; ++__first)
4275 __v = 10 * __v + *__first - '0';
Howard Hinnantd4444702010-08-11 17:04:31 +00004276#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004277 if (__v > mark_count())
4278 throw regex_error(regex_constants::error_backref);
Howard Hinnant324bb032010-08-22 00:02:43 +00004279#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004280 __push_back_ref(__v);
4281 }
4282 }
4283 return __first;
4284}
4285
4286template <class _CharT, class _Traits>
4287template <class _ForwardIterator>
4288_ForwardIterator
4289basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4290 _ForwardIterator __last)
4291{
4292 if (__first != __last)
4293 {
4294 __bracket_expression<_CharT, _Traits>* __ml;
4295 switch (*__first)
4296 {
4297 case 'd':
4298 __ml = __start_matching_list(false);
4299 __ml->__add_class(ctype_base::digit);
4300 ++__first;
4301 break;
4302 case 'D':
4303 __ml = __start_matching_list(true);
4304 __ml->__add_class(ctype_base::digit);
4305 ++__first;
4306 break;
4307 case 's':
4308 __ml = __start_matching_list(false);
4309 __ml->__add_class(ctype_base::space);
4310 ++__first;
4311 break;
4312 case 'S':
4313 __ml = __start_matching_list(true);
4314 __ml->__add_class(ctype_base::space);
4315 ++__first;
4316 break;
4317 case 'w':
4318 __ml = __start_matching_list(false);
4319 __ml->__add_class(ctype_base::alnum);
4320 __ml->__add_char('_');
4321 ++__first;
4322 break;
4323 case 'W':
4324 __ml = __start_matching_list(true);
4325 __ml->__add_class(ctype_base::alnum);
4326 __ml->__add_char('_');
4327 ++__first;
4328 break;
4329 }
4330 }
4331 return __first;
4332}
4333
4334template <class _CharT, class _Traits>
4335template <class _ForwardIterator>
4336_ForwardIterator
4337basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
Howard Hinnant15476f32010-07-28 17:35:27 +00004338 _ForwardIterator __last,
4339 basic_string<_CharT>* __str)
Howard Hinnant17615b02010-07-27 01:25:38 +00004340{
4341 if (__first != __last)
4342 {
4343 _ForwardIterator __t;
4344 unsigned __sum = 0;
4345 int __hd;
4346 switch (*__first)
4347 {
4348 case 'f':
Howard Hinnant15476f32010-07-28 17:35:27 +00004349 if (__str)
4350 *__str = _CharT(0xC);
4351 else
4352 __push_char(_CharT(0xC));
Howard Hinnant17615b02010-07-27 01:25:38 +00004353 ++__first;
4354 break;
4355 case 'n':
Howard Hinnant15476f32010-07-28 17:35:27 +00004356 if (__str)
4357 *__str = _CharT(0xA);
4358 else
4359 __push_char(_CharT(0xA));
Howard Hinnant17615b02010-07-27 01:25:38 +00004360 ++__first;
4361 break;
4362 case 'r':
Howard Hinnant15476f32010-07-28 17:35:27 +00004363 if (__str)
4364 *__str = _CharT(0xD);
4365 else
4366 __push_char(_CharT(0xD));
Howard Hinnant17615b02010-07-27 01:25:38 +00004367 ++__first;
4368 break;
4369 case 't':
Howard Hinnant15476f32010-07-28 17:35:27 +00004370 if (__str)
4371 *__str = _CharT(0x9);
4372 else
4373 __push_char(_CharT(0x9));
Howard Hinnant17615b02010-07-27 01:25:38 +00004374 ++__first;
4375 break;
4376 case 'v':
Howard Hinnant15476f32010-07-28 17:35:27 +00004377 if (__str)
4378 *__str = _CharT(0xB);
4379 else
4380 __push_char(_CharT(0xB));
Howard Hinnant17615b02010-07-27 01:25:38 +00004381 ++__first;
4382 break;
4383 case 'c':
Howard Hinnant0949eed2011-06-30 21:18:19 +00004384 if ((__t = _VSTD::next(__first)) != __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004385 {
4386 if ('A' <= *__t <= 'Z' || 'a' <= *__t <= 'z')
4387 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004388 if (__str)
4389 *__str = _CharT(*__t % 32);
4390 else
4391 __push_char(_CharT(*__t % 32));
Howard Hinnant17615b02010-07-27 01:25:38 +00004392 __first = ++__t;
4393 }
4394 }
4395 break;
4396 case 'u':
Howard Hinnantd4444702010-08-11 17:04:31 +00004397 ++__first;
4398#ifndef _LIBCPP_NO_EXCEPTIONS
4399 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004400 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004401#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004402 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004403#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004404 if (__hd == -1)
4405 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004406#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004407 __sum = 16 * __sum + __hd;
Howard Hinnantd4444702010-08-11 17:04:31 +00004408 ++__first;
4409#ifndef _LIBCPP_NO_EXCEPTIONS
4410 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004411 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004412#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004413 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004414#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004415 if (__hd == -1)
4416 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004417#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004418 __sum = 16 * __sum + __hd;
4419 // drop through
4420 case 'x':
Howard Hinnantd4444702010-08-11 17:04:31 +00004421 ++__first;
4422#ifndef _LIBCPP_NO_EXCEPTIONS
4423 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004424 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004425#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004426 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004427#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004428 if (__hd == -1)
4429 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004430#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004431 __sum = 16 * __sum + __hd;
Howard Hinnantd4444702010-08-11 17:04:31 +00004432 ++__first;
4433#ifndef _LIBCPP_NO_EXCEPTIONS
4434 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004435 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004436#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004437 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004438#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004439 if (__hd == -1)
4440 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004441#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004442 __sum = 16 * __sum + __hd;
Howard Hinnant15476f32010-07-28 17:35:27 +00004443 if (__str)
4444 *__str = _CharT(__sum);
4445 else
4446 __push_char(_CharT(__sum));
Howard Hinnant17615b02010-07-27 01:25:38 +00004447 ++__first;
4448 break;
4449 default:
4450 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4451 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004452 if (__str)
4453 *__str = *__first;
4454 else
4455 __push_char(*__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004456 ++__first;
4457 }
Howard Hinnantd4444702010-08-11 17:04:31 +00004458#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00004459 else if (__str)
4460 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004461#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004462 break;
4463 }
4464 }
4465 return __first;
4466}
4467
4468template <class _CharT, class _Traits>
4469template <class _ForwardIterator>
4470_ForwardIterator
4471basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4472 _ForwardIterator __last)
4473{
4474 if (__first != __last)
4475 {
4476 switch (*__first)
4477 {
4478 case '^':
4479 case '$':
4480 case '\\':
4481 case '.':
4482 case '*':
4483 case '+':
4484 case '?':
4485 case '(':
4486 case ')':
4487 case '[':
4488 case ']':
4489 case '{':
4490 case '}':
4491 case '|':
4492 break;
4493 default:
4494 __push_char(*__first);
4495 ++__first;
4496 break;
4497 }
4498 }
4499 return __first;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004500}
4501
4502template <class _CharT, class _Traits>
Howard Hinnant856846b2010-07-27 19:53:10 +00004503template <class _ForwardIterator>
4504_ForwardIterator
4505basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4506 _ForwardIterator __last)
4507{
4508 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004509 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004510 if (__t1 != __first)
4511 __parse_basic_reg_exp(__first, __t1);
4512 else
4513 __push_empty();
4514 __first = __t1;
4515 if (__first != __last)
4516 ++__first;
4517 while (__first != __last)
4518 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004519 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004520 __owns_one_state<_CharT>* __sb = __end_;
4521 if (__t1 != __first)
4522 __parse_basic_reg_exp(__first, __t1);
4523 else
4524 __push_empty();
4525 __push_alternation(__sa, __sb);
4526 __first = __t1;
4527 if (__first != __last)
4528 ++__first;
4529 }
4530 return __first;
4531}
4532
4533template <class _CharT, class _Traits>
4534template <class _ForwardIterator>
4535_ForwardIterator
4536basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4537 _ForwardIterator __last)
4538{
4539 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004540 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004541 if (__t1 != __first)
4542 __parse_extended_reg_exp(__first, __t1);
4543 else
4544 __push_empty();
4545 __first = __t1;
4546 if (__first != __last)
4547 ++__first;
4548 while (__first != __last)
4549 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004550 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004551 __owns_one_state<_CharT>* __sb = __end_;
4552 if (__t1 != __first)
4553 __parse_extended_reg_exp(__first, __t1);
4554 else
4555 __push_empty();
4556 __push_alternation(__sa, __sb);
4557 __first = __t1;
4558 if (__first != __last)
4559 ++__first;
4560 }
4561 return __first;
4562}
4563
4564template <class _CharT, class _Traits>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004565void
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004566basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4567 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4568 bool __greedy)
4569{
4570 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4571 __end_->first() = nullptr;
Howard Hinnantac303862010-07-12 15:51:17 +00004572 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4573 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4574 __min, __max));
4575 __s->first() = nullptr;
4576 __e1.release();
4577 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004578 __end_ = __e2->second();
Howard Hinnantac303862010-07-12 15:51:17 +00004579 __s->first() = __e2.release();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004580 ++__loop_count_;
4581}
4582
4583template <class _CharT, class _Traits>
4584void
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004585basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4586{
Howard Hinnant173968a2010-07-13 21:48:06 +00004587 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004588 __end_->first() = new __match_char_icase<_CharT, _Traits>
4589 (__traits_, __c, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004590 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004591 __end_->first() = new __match_char_collate<_CharT, _Traits>
4592 (__traits_, __c, __end_->first());
4593 else
4594 __end_->first() = new __match_char<_CharT>(__c, __end_->first());
Howard Hinnante77aa5e2010-07-08 17:43:58 +00004595 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004596}
4597
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004598template <class _CharT, class _Traits>
4599void
4600basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4601{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004602 if (!(__flags_ & nosubs))
4603 {
4604 __end_->first() =
4605 new __begin_marked_subexpression<_CharT>(++__marked_count_,
4606 __end_->first());
4607 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4608 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004609}
4610
4611template <class _CharT, class _Traits>
4612void
4613basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4614{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004615 if (!(__flags_ & nosubs))
4616 {
4617 __end_->first() =
4618 new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4619 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4620 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004621}
4622
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004623template <class _CharT, class _Traits>
4624void
Howard Hinnant41fb6e12011-03-26 20:02:27 +00004625basic_regex<_CharT, _Traits>::__push_l_anchor()
4626{
4627 __end_->first() = new __l_anchor<_CharT>(__end_->first());
4628 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4629}
4630
4631template <class _CharT, class _Traits>
4632void
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004633basic_regex<_CharT, _Traits>::__push_r_anchor()
4634{
4635 __end_->first() = new __r_anchor<_CharT>(__end_->first());
4636 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4637}
4638
Howard Hinnantac303862010-07-12 15:51:17 +00004639template <class _CharT, class _Traits>
4640void
4641basic_regex<_CharT, _Traits>::__push_match_any()
4642{
4643 __end_->first() = new __match_any<_CharT>(__end_->first());
4644 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4645}
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004646
Howard Hinnantcba352d2010-07-12 18:16:05 +00004647template <class _CharT, class _Traits>
4648void
Howard Hinnant17615b02010-07-27 01:25:38 +00004649basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4650{
4651 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4652 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4653}
4654
4655template <class _CharT, class _Traits>
4656void
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004657basic_regex<_CharT, _Traits>::__push_empty()
4658{
4659 __end_->first() = new __empty_state<_CharT>(__end_->first());
4660 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4661}
4662
4663template <class _CharT, class _Traits>
4664void
Howard Hinnant17615b02010-07-27 01:25:38 +00004665basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4666{
4667 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4668 __end_->first());
4669 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4670}
4671
4672template <class _CharT, class _Traits>
4673void
Howard Hinnantcba352d2010-07-12 18:16:05 +00004674basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4675{
Howard Hinnant173968a2010-07-13 21:48:06 +00004676 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004677 __end_->first() = new __back_ref_icase<_CharT, _Traits>
4678 (__traits_, __i, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004679 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004680 __end_->first() = new __back_ref_collate<_CharT, _Traits>
4681 (__traits_, __i, __end_->first());
4682 else
4683 __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
Howard Hinnantcba352d2010-07-12 18:16:05 +00004684 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4685}
4686
Howard Hinnant173968a2010-07-13 21:48:06 +00004687template <class _CharT, class _Traits>
Howard Hinnantaa698082010-07-16 19:08:36 +00004688void
4689basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4690 __owns_one_state<_CharT>* __ea)
4691{
4692 __sa->first() = new __alternate<_CharT>(
4693 static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4694 static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4695 __ea->first() = nullptr;
4696 __ea->first() = new __empty_state<_CharT>(__end_->first());
4697 __end_->first() = nullptr;
4698 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4699 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4700}
4701
4702template <class _CharT, class _Traits>
Howard Hinnant173968a2010-07-13 21:48:06 +00004703__bracket_expression<_CharT, _Traits>*
4704basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4705{
4706 __bracket_expression<_CharT, _Traits>* __r =
4707 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4708 __negate, __flags_ & icase,
4709 __flags_ & collate);
4710 __end_->first() = __r;
4711 __end_ = __r;
4712 return __r;
4713}
4714
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004715template <class _CharT, class _Traits>
4716void
4717basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
4718 bool __invert)
4719{
4720 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
4721 __end_->first());
4722 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4723}
4724
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00004725typedef basic_regex<char> regex;
4726typedef basic_regex<wchar_t> wregex;
4727
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004728// sub_match
4729
4730template <class _BidirectionalIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004731class _LIBCPP_VISIBLE sub_match
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004732 : public pair<_BidirectionalIterator, _BidirectionalIterator>
4733{
4734public:
4735 typedef _BidirectionalIterator iterator;
4736 typedef typename iterator_traits<iterator>::value_type value_type;
4737 typedef typename iterator_traits<iterator>::difference_type difference_type;
4738 typedef basic_string<value_type> string_type;
4739
4740 bool matched;
4741
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004742 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant31aaf552010-12-08 21:07:55 +00004743 /*constexpr*/ sub_match() : matched() {}
4744
4745 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004746 difference_type length() const
Howard Hinnant0949eed2011-06-30 21:18:19 +00004747 {return matched ? _VSTD::distance(this->first, this->second) : 0;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004748 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004749 string_type str() const
4750 {return matched ? string_type(this->first, this->second) : string_type();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004751 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004752 operator string_type() const
4753 {return str();}
4754
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004755 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004756 int compare(const sub_match& __s) const
4757 {return str().compare(__s.str());}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004758 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004759 int compare(const string_type& __s) const
4760 {return str().compare(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004761 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004762 int compare(const value_type* __s) const
4763 {return str().compare(__s);}
4764};
4765
4766typedef sub_match<const char*> csub_match;
4767typedef sub_match<const wchar_t*> wcsub_match;
4768typedef sub_match<string::const_iterator> ssub_match;
4769typedef sub_match<wstring::const_iterator> wssub_match;
4770
4771template <class _BiIter>
4772inline _LIBCPP_INLINE_VISIBILITY
4773bool
4774operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4775{
4776 return __x.compare(__y) == 0;
4777}
4778
4779template <class _BiIter>
4780inline _LIBCPP_INLINE_VISIBILITY
4781bool
4782operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4783{
4784 return !(__x == __y);
4785}
4786
4787template <class _BiIter>
4788inline _LIBCPP_INLINE_VISIBILITY
4789bool
4790operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4791{
4792 return __x.compare(__y) < 0;
4793}
4794
4795template <class _BiIter>
4796inline _LIBCPP_INLINE_VISIBILITY
4797bool
4798operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4799{
4800 return !(__y < __x);
4801}
4802
4803template <class _BiIter>
4804inline _LIBCPP_INLINE_VISIBILITY
4805bool
4806operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4807{
4808 return !(__x < __y);
4809}
4810
4811template <class _BiIter>
4812inline _LIBCPP_INLINE_VISIBILITY
4813bool
4814operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4815{
4816 return __y < __x;
4817}
4818
4819template <class _BiIter, class _ST, class _SA>
4820inline _LIBCPP_INLINE_VISIBILITY
4821bool
4822operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4823 const sub_match<_BiIter>& __y)
4824{
4825 return __y.compare(__x.c_str()) == 0;
4826}
4827
4828template <class _BiIter, class _ST, class _SA>
4829inline _LIBCPP_INLINE_VISIBILITY
4830bool
4831operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4832 const sub_match<_BiIter>& __y)
4833{
4834 return !(__x == __y);
4835}
4836
4837template <class _BiIter, class _ST, class _SA>
4838inline _LIBCPP_INLINE_VISIBILITY
4839bool
4840operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4841 const sub_match<_BiIter>& __y)
4842{
4843 return __y.compare(__x.c_str()) > 0;
4844}
4845
4846template <class _BiIter, class _ST, class _SA>
4847inline _LIBCPP_INLINE_VISIBILITY
4848bool
4849operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4850 const sub_match<_BiIter>& __y)
4851{
4852 return __y < __x;
4853}
4854
4855template <class _BiIter, class _ST, class _SA>
4856inline _LIBCPP_INLINE_VISIBILITY
4857bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4858 const sub_match<_BiIter>& __y)
4859{
4860 return !(__x < __y);
4861}
4862
4863template <class _BiIter, class _ST, class _SA>
4864inline _LIBCPP_INLINE_VISIBILITY
4865bool
4866operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4867 const sub_match<_BiIter>& __y)
4868{
4869 return !(__y < __x);
4870}
4871
4872template <class _BiIter, class _ST, class _SA>
4873inline _LIBCPP_INLINE_VISIBILITY
4874bool
4875operator==(const sub_match<_BiIter>& __x,
4876 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4877{
4878 return __x.compare(__y.c_str()) == 0;
4879}
4880
4881template <class _BiIter, class _ST, class _SA>
4882inline _LIBCPP_INLINE_VISIBILITY
4883bool
4884operator!=(const sub_match<_BiIter>& __x,
4885 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4886{
4887 return !(__x == __y);
4888}
4889
4890template <class _BiIter, class _ST, class _SA>
4891inline _LIBCPP_INLINE_VISIBILITY
4892bool
4893operator<(const sub_match<_BiIter>& __x,
4894 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4895{
4896 return __x.compare(__y.c_str()) < 0;
4897}
4898
4899template <class _BiIter, class _ST, class _SA>
4900inline _LIBCPP_INLINE_VISIBILITY
4901bool operator>(const sub_match<_BiIter>& __x,
4902 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4903{
4904 return __y < __x;
4905}
4906
4907template <class _BiIter, class _ST, class _SA>
4908inline _LIBCPP_INLINE_VISIBILITY
4909bool
4910operator>=(const sub_match<_BiIter>& __x,
4911 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4912{
4913 return !(__x < __y);
4914}
4915
4916template <class _BiIter, class _ST, class _SA>
4917inline _LIBCPP_INLINE_VISIBILITY
4918bool
4919operator<=(const sub_match<_BiIter>& __x,
4920 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4921{
4922 return !(__y < __x);
4923}
4924
4925template <class _BiIter>
4926inline _LIBCPP_INLINE_VISIBILITY
4927bool
4928operator==(typename iterator_traits<_BiIter>::value_type const* __x,
4929 const sub_match<_BiIter>& __y)
4930{
4931 return __y.compare(__x) == 0;
4932}
4933
4934template <class _BiIter>
4935inline _LIBCPP_INLINE_VISIBILITY
4936bool
4937operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
4938 const sub_match<_BiIter>& __y)
4939{
4940 return !(__x == __y);
4941}
4942
4943template <class _BiIter>
4944inline _LIBCPP_INLINE_VISIBILITY
4945bool
4946operator<(typename iterator_traits<_BiIter>::value_type const* __x,
4947 const sub_match<_BiIter>& __y)
4948{
4949 return __y.compare(__x) > 0;
4950}
4951
4952template <class _BiIter>
4953inline _LIBCPP_INLINE_VISIBILITY
4954bool
4955operator>(typename iterator_traits<_BiIter>::value_type const* __x,
4956 const sub_match<_BiIter>& __y)
4957{
4958 return __y < __x;
4959}
4960
4961template <class _BiIter>
4962inline _LIBCPP_INLINE_VISIBILITY
4963bool
4964operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
4965 const sub_match<_BiIter>& __y)
4966{
4967 return !(__x < __y);
4968}
4969
4970template <class _BiIter>
4971inline _LIBCPP_INLINE_VISIBILITY
4972bool
4973operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
4974 const sub_match<_BiIter>& __y)
4975{
4976 return !(__y < __x);
4977}
4978
4979template <class _BiIter>
4980inline _LIBCPP_INLINE_VISIBILITY
4981bool
4982operator==(const sub_match<_BiIter>& __x,
4983 typename iterator_traits<_BiIter>::value_type const* __y)
4984{
4985 return __x.compare(__y) == 0;
4986}
4987
4988template <class _BiIter>
4989inline _LIBCPP_INLINE_VISIBILITY
4990bool
4991operator!=(const sub_match<_BiIter>& __x,
4992 typename iterator_traits<_BiIter>::value_type const* __y)
4993{
4994 return !(__x == __y);
4995}
4996
4997template <class _BiIter>
4998inline _LIBCPP_INLINE_VISIBILITY
4999bool
5000operator<(const sub_match<_BiIter>& __x,
5001 typename iterator_traits<_BiIter>::value_type const* __y)
5002{
5003 return __x.compare(__y) < 0;
5004}
5005
5006template <class _BiIter>
5007inline _LIBCPP_INLINE_VISIBILITY
5008bool
5009operator>(const sub_match<_BiIter>& __x,
5010 typename iterator_traits<_BiIter>::value_type const* __y)
5011{
5012 return __y < __x;
5013}
5014
5015template <class _BiIter>
5016inline _LIBCPP_INLINE_VISIBILITY
5017bool
5018operator>=(const sub_match<_BiIter>& __x,
5019 typename iterator_traits<_BiIter>::value_type const* __y)
5020{
5021 return !(__x < __y);
5022}
5023
5024template <class _BiIter>
5025inline _LIBCPP_INLINE_VISIBILITY
5026bool
5027operator<=(const sub_match<_BiIter>& __x,
5028 typename iterator_traits<_BiIter>::value_type const* __y)
5029{
5030 return !(__y < __x);
5031}
5032
5033template <class _BiIter>
5034inline _LIBCPP_INLINE_VISIBILITY
5035bool
5036operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5037 const sub_match<_BiIter>& __y)
5038{
5039 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5040 return __y.compare(string_type(1, __x)) == 0;
5041}
5042
5043template <class _BiIter>
5044inline _LIBCPP_INLINE_VISIBILITY
5045bool
5046operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5047 const sub_match<_BiIter>& __y)
5048{
5049 return !(__x == __y);
5050}
5051
5052template <class _BiIter>
5053inline _LIBCPP_INLINE_VISIBILITY
5054bool
5055operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5056 const sub_match<_BiIter>& __y)
5057{
5058 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5059 return __y.compare(string_type(1, __x)) > 0;
5060}
5061
5062template <class _BiIter>
5063inline _LIBCPP_INLINE_VISIBILITY
5064bool
5065operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5066 const sub_match<_BiIter>& __y)
5067{
5068 return __y < __x;
5069}
5070
5071template <class _BiIter>
5072inline _LIBCPP_INLINE_VISIBILITY
5073bool
5074operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5075 const sub_match<_BiIter>& __y)
5076{
5077 return !(__x < __y);
5078}
5079
5080template <class _BiIter>
5081inline _LIBCPP_INLINE_VISIBILITY
5082bool
5083operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5084 const sub_match<_BiIter>& __y)
5085{
5086 return !(__y < __x);
5087}
5088
5089template <class _BiIter>
5090inline _LIBCPP_INLINE_VISIBILITY
5091bool
5092operator==(const sub_match<_BiIter>& __x,
5093 typename iterator_traits<_BiIter>::value_type const& __y)
5094{
5095 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5096 return __x.compare(string_type(1, __y)) == 0;
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 == __y);
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 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5115 return __x.compare(string_type(1, __y)) < 0;
5116}
5117
5118template <class _BiIter>
5119inline _LIBCPP_INLINE_VISIBILITY
5120bool
5121operator>(const sub_match<_BiIter>& __x,
5122 typename iterator_traits<_BiIter>::value_type const& __y)
5123{
5124 return __y < __x;
5125}
5126
5127template <class _BiIter>
5128inline _LIBCPP_INLINE_VISIBILITY
5129bool
5130operator>=(const sub_match<_BiIter>& __x,
5131 typename iterator_traits<_BiIter>::value_type const& __y)
5132{
5133 return !(__x < __y);
5134}
5135
5136template <class _BiIter>
5137inline _LIBCPP_INLINE_VISIBILITY
5138bool
5139operator<=(const sub_match<_BiIter>& __x,
5140 typename iterator_traits<_BiIter>::value_type const& __y)
5141{
5142 return !(__y < __x);
5143}
5144
5145template <class _CharT, class _ST, class _BiIter>
5146inline _LIBCPP_INLINE_VISIBILITY
5147basic_ostream<_CharT, _ST>&
5148operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5149{
5150 return __os << __m.str();
5151}
5152
Howard Hinnant17615b02010-07-27 01:25:38 +00005153template <class _BidirectionalIterator, class _Allocator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005154class _LIBCPP_VISIBLE match_results
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005155{
5156public:
5157 typedef _Allocator allocator_type;
5158 typedef sub_match<_BidirectionalIterator> value_type;
5159private:
5160 typedef vector<value_type, allocator_type> __container_type;
5161
5162 __container_type __matches_;
5163 value_type __unmatched_;
5164 value_type __prefix_;
5165 value_type __suffix_;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005166 bool __ready_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005167public:
Howard Hinnanta712c722010-08-16 20:21:16 +00005168 _BidirectionalIterator __position_start_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005169 typedef const value_type& const_reference;
5170 typedef const_reference reference;
5171 typedef typename __container_type::const_iterator const_iterator;
5172 typedef const_iterator iterator;
5173 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5174 typedef typename allocator_traits<allocator_type>::size_type size_type;
5175 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5176 typedef basic_string<char_type> string_type;
5177
5178 // construct/copy/destroy:
5179 explicit match_results(const allocator_type& __a = allocator_type());
5180// match_results(const match_results&) = default;
5181// match_results& operator=(const match_results&) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005182// match_results(match_results&& __m) = default;
5183// match_results& operator=(match_results&& __m) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005184// ~match_results() = default;
5185
Howard Hinnant31aaf552010-12-08 21:07:55 +00005186 _LIBCPP_INLINE_VISIBILITY
5187 bool ready() const {return __ready_;}
5188
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005189 // size:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005190 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005191 size_type size() const {return __matches_.size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005192 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005193 size_type max_size() const {return __matches_.max_size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005194 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005195 bool empty() const {return size() == 0;}
5196
5197 // element access:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005198 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005199 difference_type length(size_type __sub = 0) const
5200 {return (*this)[__sub].length();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005201 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005202 difference_type position(size_type __sub = 0) const
Howard Hinnant0949eed2011-06-30 21:18:19 +00005203 {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005204 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005205 string_type str(size_type __sub = 0) const
5206 {return (*this)[__sub].str();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005207 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005208 const_reference operator[](size_type __n) const
5209 {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
5210
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005211 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005212 const_reference prefix() const {return __prefix_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005213 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005214 const_reference suffix() const {return __suffix_;}
5215
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005216 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005217 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005218 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005219 const_iterator end() const {return __matches_.end();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005220 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005221 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005222 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005223 const_iterator cend() const {return __matches_.end();}
5224
5225 // format:
5226 template <class _OutputIter>
5227 _OutputIter
5228 format(_OutputIter __out, const char_type* __fmt_first,
5229 const char_type* __fmt_last,
5230 regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5231 template <class _OutputIter, class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005232 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005233 _OutputIter
5234 format(_OutputIter __out, const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005235 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5236 {return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005237 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005238 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005239 basic_string<char_type, _ST, _SA>
5240 format(const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005241 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5242 {
5243 basic_string<char_type, _ST, _SA> __r;
5244 format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5245 __flags);
5246 return __r;
5247 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005248 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005249 string_type
5250 format(const char_type* __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005251 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5252 {
5253 string_type __r;
5254 format(back_inserter(__r), __fmt,
5255 __fmt + char_traits<char_type>::length(__fmt), __flags);
5256 return __r;
5257 }
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005258
5259 // allocator:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005260 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005261 allocator_type get_allocator() const {return __matches_.get_allocator();}
5262
5263 // swap:
5264 void swap(match_results& __m);
5265
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005266 template <class _B, class _A>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005267 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005268 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
Howard Hinnanta712c722010-08-16 20:21:16 +00005269 const match_results<_B, _A>& __m, bool __no_update_pos)
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005270 {
5271 _B __mf = __m.prefix().first;
5272 __matches_.resize(__m.size());
5273 for (size_type __i = 0; __i < __matches_.size(); ++__i)
5274 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005275 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5276 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005277 __matches_[__i].matched = __m[__i].matched;
5278 }
5279 __unmatched_.first = __l;
5280 __unmatched_.second = __l;
5281 __unmatched_.matched = false;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005282 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5283 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005284 __prefix_.matched = __m.prefix().matched;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005285 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5286 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005287 __suffix_.matched = __m.suffix().matched;
Howard Hinnanta712c722010-08-16 20:21:16 +00005288 if (!__no_update_pos)
5289 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005290 __ready_ = __m.ready();
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005291 }
5292
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005293private:
5294 void __init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005295 _BidirectionalIterator __f, _BidirectionalIterator __l,
5296 bool __no_update_pos = false);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005297
5298 template <class, class> friend class basic_regex;
5299
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005300 template <class _B, class _A, class _C, class _T>
5301 friend
5302 bool
5303 regex_match(_B, _B, match_results<_B, _A>&, const basic_regex<_C, _T>&,
5304 regex_constants::match_flag_type);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005305
Howard Hinnant27405f92010-08-14 18:14:02 +00005306 template <class _B, class _A>
5307 friend
5308 bool
5309 operator==(const match_results<_B, _A>&, const match_results<_B, _A>&);
5310
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005311 template <class, class> friend class __lookahead;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005312};
5313
5314template <class _BidirectionalIterator, class _Allocator>
5315match_results<_BidirectionalIterator, _Allocator>::match_results(
5316 const allocator_type& __a)
5317 : __matches_(__a),
5318 __unmatched_(),
5319 __prefix_(),
Howard Hinnanta712c722010-08-16 20:21:16 +00005320 __suffix_(),
Howard Hinnant31aaf552010-12-08 21:07:55 +00005321 __position_start_(),
5322 __ready_(false)
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005323{
5324}
5325
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005326template <class _BidirectionalIterator, class _Allocator>
5327void
5328match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005329 _BidirectionalIterator __f, _BidirectionalIterator __l,
5330 bool __no_update_pos)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005331{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005332 __unmatched_.first = __l;
5333 __unmatched_.second = __l;
5334 __unmatched_.matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005335 __matches_.assign(__s, __unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005336 __prefix_.first = __f;
5337 __prefix_.second = __f;
5338 __prefix_.matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005339 __suffix_ = __unmatched_;
Howard Hinnanta712c722010-08-16 20:21:16 +00005340 if (!__no_update_pos)
5341 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005342 __ready_ = true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005343}
5344
Howard Hinnant27405f92010-08-14 18:14:02 +00005345template <class _BidirectionalIterator, class _Allocator>
5346template <class _OutputIter>
5347_OutputIter
5348match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __out,
5349 const char_type* __fmt_first, const char_type* __fmt_last,
5350 regex_constants::match_flag_type __flags) const
5351{
5352 if (__flags & regex_constants::format_sed)
5353 {
5354 for (; __fmt_first != __fmt_last; ++__fmt_first)
5355 {
5356 if (*__fmt_first == '&')
Howard Hinnant0949eed2011-06-30 21:18:19 +00005357 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
Howard Hinnant27405f92010-08-14 18:14:02 +00005358 __out);
5359 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5360 {
5361 ++__fmt_first;
5362 if ('0' <= *__fmt_first && *__fmt_first <= '9')
5363 {
5364 size_t __i = *__fmt_first - '0';
Howard Hinnant0949eed2011-06-30 21:18:19 +00005365 __out = _VSTD::copy(__matches_[__i].first,
Howard Hinnant27405f92010-08-14 18:14:02 +00005366 __matches_[__i].second, __out);
5367 }
5368 else
5369 {
5370 *__out = *__fmt_first;
5371 ++__out;
5372 }
5373 }
5374 else
5375 {
5376 *__out = *__fmt_first;
5377 ++__out;
5378 }
5379 }
5380 }
5381 else
5382 {
5383 for (; __fmt_first != __fmt_last; ++__fmt_first)
5384 {
5385 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5386 {
5387 switch (__fmt_first[1])
5388 {
5389 case '$':
5390 *__out = *++__fmt_first;
5391 ++__out;
5392 break;
5393 case '&':
5394 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005395 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
Howard Hinnant27405f92010-08-14 18:14:02 +00005396 __out);
5397 break;
5398 case '`':
5399 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005400 __out = _VSTD::copy(__prefix_.first, __prefix_.second, __out);
Howard Hinnant27405f92010-08-14 18:14:02 +00005401 break;
5402 case '\'':
5403 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005404 __out = _VSTD::copy(__suffix_.first, __suffix_.second, __out);
Howard Hinnant27405f92010-08-14 18:14:02 +00005405 break;
5406 default:
5407 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5408 {
5409 ++__fmt_first;
5410 size_t __i = *__fmt_first - '0';
5411 if (__fmt_first + 1 != __fmt_last &&
5412 '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5413 {
5414 ++__fmt_first;
5415 __i = 10 * __i + *__fmt_first - '0';
5416 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005417 __out = _VSTD::copy(__matches_[__i].first,
Howard Hinnant27405f92010-08-14 18:14:02 +00005418 __matches_[__i].second, __out);
5419 }
5420 else
5421 {
5422 *__out = *__fmt_first;
5423 ++__out;
5424 }
5425 break;
5426 }
5427 }
5428 else
5429 {
5430 *__out = *__fmt_first;
5431 ++__out;
5432 }
5433 }
5434 }
5435 return __out;
5436}
5437
5438template <class _BidirectionalIterator, class _Allocator>
5439void
5440match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5441{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005442 using _VSTD::swap;
Howard Hinnant27405f92010-08-14 18:14:02 +00005443 swap(__matches_, __m.__matches_);
5444 swap(__unmatched_, __m.__unmatched_);
5445 swap(__prefix_, __m.__prefix_);
5446 swap(__suffix_, __m.__suffix_);
Howard Hinnanta712c722010-08-16 20:21:16 +00005447 swap(__position_start_, __m.__position_start_);
Howard Hinnant31aaf552010-12-08 21:07:55 +00005448 swap(__ready_, __m.__ready_);
Howard Hinnant27405f92010-08-14 18:14:02 +00005449}
5450
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005451typedef match_results<const char*> cmatch;
5452typedef match_results<const wchar_t*> wcmatch;
5453typedef match_results<string::const_iterator> smatch;
5454typedef match_results<wstring::const_iterator> wsmatch;
5455
5456template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005457bool
5458operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5459 const match_results<_BidirectionalIterator, _Allocator>& __y)
5460{
Howard Hinnant31aaf552010-12-08 21:07:55 +00005461 if (__x.__ready_ != __y.__ready_)
5462 return false;
5463 if (!__x.__ready_)
5464 return true;
Howard Hinnant27405f92010-08-14 18:14:02 +00005465 return __x.__matches_ == __y.__matches_ &&
5466 __x.__prefix_ == __y.__prefix_ &&
Howard Hinnant31aaf552010-12-08 21:07:55 +00005467 __x.__suffix_ == __y.__suffix_;
Howard Hinnant27405f92010-08-14 18:14:02 +00005468}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005469
5470template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005471inline _LIBCPP_INLINE_VISIBILITY
5472bool
5473operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5474 const match_results<_BidirectionalIterator, _Allocator>& __y)
5475{
5476 return !(__x == __y);
5477}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005478
5479template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005480inline _LIBCPP_INLINE_VISIBILITY
5481void
5482swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5483 match_results<_BidirectionalIterator, _Allocator>& __y)
5484{
5485 __x.swap(__y);
5486}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005487
5488// regex_search
5489
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005490template <class _CharT, class _Traits>
Howard Hinnant17615b02010-07-27 01:25:38 +00005491template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005492bool
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005493basic_regex<_CharT, _Traits>::__match_at_start_ecma(
Howard Hinnant17615b02010-07-27 01:25:38 +00005494 const _CharT* __first, const _CharT* __last,
5495 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005496 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005497{
Howard Hinnant17615b02010-07-27 01:25:38 +00005498 vector<__state> __states;
5499 ptrdiff_t __j = 0;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005500 ptrdiff_t _N = _VSTD::distance(__first, __last);
Howard Hinnant17615b02010-07-27 01:25:38 +00005501 __node* __st = __start_.get();
5502 if (__st)
5503 {
5504 __states.push_back(__state());
5505 __states.back().__do_ = 0;
5506 __states.back().__first_ = __first;
5507 __states.back().__current_ = __first;
5508 __states.back().__last_ = __last;
5509 __states.back().__sub_matches_.resize(mark_count());
5510 __states.back().__loop_data_.resize(__loop_count());
5511 __states.back().__node_ = __st;
5512 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005513 __states.back().__at_first_ = __at_first;
Howard Hinnant17615b02010-07-27 01:25:38 +00005514 bool __matched = false;
5515 do
5516 {
5517 __state& __s = __states.back();
5518 if (__s.__node_)
5519 __s.__node_->__exec(__s);
5520 switch (__s.__do_)
5521 {
5522 case __state::__end_state:
5523 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005524 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
Howard Hinnant17615b02010-07-27 01:25:38 +00005525 __m.__matches_[0].matched = true;
5526 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5527 __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5528 return true;
5529 case __state::__accept_and_consume:
5530 case __state::__repeat:
5531 case __state::__accept_but_not_consume:
5532 break;
5533 case __state::__split:
5534 {
5535 __state __snext = __s;
5536 __s.__node_->__exec_split(true, __s);
5537 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005538 __states.push_back(_VSTD::move(__snext));
Howard Hinnant17615b02010-07-27 01:25:38 +00005539 }
5540 break;
5541 case __state::__reject:
5542 __states.pop_back();
5543 break;
5544 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005545#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005546 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005547#endif
Howard Hinnant17615b02010-07-27 01:25:38 +00005548 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00005549
Howard Hinnant17615b02010-07-27 01:25:38 +00005550 }
5551 } while (!__states.empty());
5552 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005553 return false;
5554}
5555
5556template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005557template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005558bool
5559basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5560 const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005561 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005562 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005563{
Howard Hinnantac303862010-07-12 15:51:17 +00005564 deque<__state> __states;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005565 ptrdiff_t __highest_j = 0;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005566 ptrdiff_t _N = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005567 __node* __st = __start_.get();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005568 if (__st)
5569 {
Howard Hinnantac303862010-07-12 15:51:17 +00005570 __states.push_back(__state());
Howard Hinnantac303862010-07-12 15:51:17 +00005571 __states.back().__do_ = 0;
5572 __states.back().__first_ = __first;
5573 __states.back().__current_ = __first;
5574 __states.back().__last_ = __last;
5575 __states.back().__loop_data_.resize(__loop_count());
5576 __states.back().__node_ = __st;
5577 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005578 __states.back().__at_first_ = __at_first;
Howard Hinnant68025ed2010-07-14 15:45:11 +00005579 bool __matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005580 do
5581 {
Howard Hinnantac303862010-07-12 15:51:17 +00005582 __state& __s = __states.back();
5583 if (__s.__node_)
5584 __s.__node_->__exec(__s);
5585 switch (__s.__do_)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005586 {
Howard Hinnantac303862010-07-12 15:51:17 +00005587 case __state::__end_state:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005588 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant68025ed2010-07-14 15:45:11 +00005589 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005590 __matched = true;
Howard Hinnantac303862010-07-12 15:51:17 +00005591 if (__highest_j == _N)
5592 __states.clear();
5593 else
5594 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005595 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005596 case __state::__consume_input:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005597 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005598 case __state::__accept_and_consume:
Howard Hinnant0949eed2011-06-30 21:18:19 +00005599 __states.push_front(_VSTD::move(__s));
Howard Hinnantac303862010-07-12 15:51:17 +00005600 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005601 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005602 case __state::__repeat:
5603 case __state::__accept_but_not_consume:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005604 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005605 case __state::__split:
5606 {
5607 __state __snext = __s;
5608 __s.__node_->__exec_split(true, __s);
5609 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005610 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005611 }
5612 break;
5613 case __state::__reject:
5614 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005615 break;
5616 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005617#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005618 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005619#endif
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005620 break;
5621 }
Howard Hinnantac303862010-07-12 15:51:17 +00005622 } while (!__states.empty());
Howard Hinnant68025ed2010-07-14 15:45:11 +00005623 if (__matched)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005624 {
5625 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005626 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005627 __m.__matches_[0].matched = true;
5628 return true;
5629 }
5630 }
5631 return false;
5632}
5633
5634template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005635template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005636bool
5637basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005638 const _CharT* __first, const _CharT* __last,
5639 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005640 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005641{
Howard Hinnantac303862010-07-12 15:51:17 +00005642 vector<__state> __states;
Howard Hinnantac303862010-07-12 15:51:17 +00005643 __state __best_state;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005644 ptrdiff_t __j = 0;
5645 ptrdiff_t __highest_j = 0;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005646 ptrdiff_t _N = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005647 __node* __st = __start_.get();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005648 if (__st)
5649 {
Howard Hinnantac303862010-07-12 15:51:17 +00005650 __states.push_back(__state());
5651 __states.back().__do_ = 0;
5652 __states.back().__first_ = __first;
5653 __states.back().__current_ = __first;
5654 __states.back().__last_ = __last;
5655 __states.back().__sub_matches_.resize(mark_count());
5656 __states.back().__loop_data_.resize(__loop_count());
5657 __states.back().__node_ = __st;
5658 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005659 __states.back().__at_first_ = __at_first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005660 const _CharT* __current = __first;
Howard Hinnantac303862010-07-12 15:51:17 +00005661 bool __matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005662 do
5663 {
Howard Hinnantac303862010-07-12 15:51:17 +00005664 __state& __s = __states.back();
5665 if (__s.__node_)
5666 __s.__node_->__exec(__s);
5667 switch (__s.__do_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005668 {
Howard Hinnantac303862010-07-12 15:51:17 +00005669 case __state::__end_state:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005670 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005671 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005672 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantac303862010-07-12 15:51:17 +00005673 __best_state = __s;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005674 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005675 __matched = true;
5676 if (__highest_j == _N)
5677 __states.clear();
5678 else
5679 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005680 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005681 case __state::__accept_and_consume:
Howard Hinnantcba352d2010-07-12 18:16:05 +00005682 __j += __s.__current_ - __current;
5683 __current = __s.__current_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005684 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005685 case __state::__repeat:
5686 case __state::__accept_but_not_consume:
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005687 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005688 case __state::__split:
5689 {
5690 __state __snext = __s;
5691 __s.__node_->__exec_split(true, __s);
5692 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005693 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005694 }
5695 break;
5696 case __state::__reject:
5697 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005698 break;
5699 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005700#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005701 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005702#endif
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005703 break;
5704 }
Howard Hinnantac303862010-07-12 15:51:17 +00005705 } while (!__states.empty());
5706 if (__matched)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005707 {
5708 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005709 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005710 __m.__matches_[0].matched = true;
Howard Hinnantac303862010-07-12 15:51:17 +00005711 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
5712 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005713 return true;
5714 }
5715 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005716 return false;
5717}
5718
5719template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005720template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005721bool
5722basic_regex<_CharT, _Traits>::__match_at_start(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005723 const _CharT* __first, const _CharT* __last,
5724 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005725 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005726{
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005727 if ((__flags_ & 0x1F0) == ECMAScript)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005728 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005729 if (mark_count() == 0)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005730 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
5731 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005732}
5733
5734template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005735template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005736bool
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005737basic_regex<_CharT, _Traits>::__search(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005738 const _CharT* __first, const _CharT* __last,
5739 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005740 regex_constants::match_flag_type __flags) const
5741{
Howard Hinnanta712c722010-08-16 20:21:16 +00005742 __m.__init(1 + mark_count(), __first, __last,
5743 __flags & regex_constants::__no_update_pos);
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005744 if (__match_at_start(__first, __last, __m, __flags, true))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005745 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005746 __m.__prefix_.second = __m[0].first;
5747 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5748 __m.__suffix_.first = __m[0].second;
5749 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5750 return true;
5751 }
Howard Hinnant8daa7332010-07-29 01:15:27 +00005752 if (__first != __last && !(__flags & regex_constants::match_continuous))
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005753 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005754 __flags |= regex_constants::match_prev_avail;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005755 for (++__first; __first != __last; ++__first)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005756 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005757 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005758 if (__match_at_start(__first, __last, __m, __flags, false))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005759 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005760 __m.__prefix_.second = __m[0].first;
5761 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5762 __m.__suffix_.first = __m[0].second;
5763 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5764 return true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005765 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005766 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005767 }
5768 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005769 __m.__matches_.clear();
5770 return false;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005771}
5772
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005773template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005774inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005775bool
5776regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5777 match_results<_BidirectionalIterator, _Allocator>& __m,
5778 const basic_regex<_CharT, _Traits>& __e,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005779 regex_constants::match_flag_type __flags = regex_constants::match_default)
5780{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005781 basic_string<_CharT> __s(__first, __last);
5782 match_results<const _CharT*> __mc;
5783 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005784 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005785 return __r;
5786}
5787
5788template <class _Allocator, class _CharT, class _Traits>
5789inline _LIBCPP_INLINE_VISIBILITY
5790bool
5791regex_search(const _CharT* __first, const _CharT* __last,
5792 match_results<const _CharT*, _Allocator>& __m,
5793 const basic_regex<_CharT, _Traits>& __e,
5794 regex_constants::match_flag_type __flags = regex_constants::match_default)
5795{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005796 return __e.__search(__first, __last, __m, __flags);
5797}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005798
5799template <class _BidirectionalIterator, class _CharT, class _Traits>
5800inline _LIBCPP_INLINE_VISIBILITY
5801bool
5802regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5803 const basic_regex<_CharT, _Traits>& __e,
5804 regex_constants::match_flag_type __flags = regex_constants::match_default)
5805{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005806 basic_string<_CharT> __s(__first, __last);
5807 match_results<const _CharT*> __mc;
5808 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5809}
5810
5811template <class _CharT, class _Traits>
5812inline _LIBCPP_INLINE_VISIBILITY
5813bool
5814regex_search(const _CharT* __first, const _CharT* __last,
5815 const basic_regex<_CharT, _Traits>& __e,
5816 regex_constants::match_flag_type __flags = regex_constants::match_default)
5817{
5818 match_results<const _CharT*> __mc;
5819 return __e.__search(__first, __last, __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005820}
5821
5822template <class _CharT, class _Allocator, class _Traits>
5823inline _LIBCPP_INLINE_VISIBILITY
5824bool
5825regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5826 const basic_regex<_CharT, _Traits>& __e,
5827 regex_constants::match_flag_type __flags = regex_constants::match_default)
5828{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005829 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005830}
5831
5832template <class _CharT, class _Traits>
5833inline _LIBCPP_INLINE_VISIBILITY
5834bool
5835regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5836 regex_constants::match_flag_type __flags = regex_constants::match_default)
5837{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005838 match_results<const _CharT*> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005839 return _VSTD::regex_search(__str, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005840}
5841
5842template <class _ST, class _SA, class _CharT, class _Traits>
5843inline _LIBCPP_INLINE_VISIBILITY
5844bool
5845regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5846 const basic_regex<_CharT, _Traits>& __e,
5847 regex_constants::match_flag_type __flags = regex_constants::match_default)
5848{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005849 match_results<const _CharT*> __mc;
5850 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005851}
5852
5853template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5854inline _LIBCPP_INLINE_VISIBILITY
5855bool
5856regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5857 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5858 const basic_regex<_CharT, _Traits>& __e,
5859 regex_constants::match_flag_type __flags = regex_constants::match_default)
5860{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005861 match_results<const _CharT*> __mc;
5862 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005863 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005864 return __r;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005865}
5866
5867// regex_match
5868
5869template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
5870bool
5871regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
5872 match_results<_BidirectionalIterator, _Allocator>& __m,
5873 const basic_regex<_CharT, _Traits>& __e,
5874 regex_constants::match_flag_type __flags = regex_constants::match_default)
5875{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005876 bool __r = _VSTD::regex_search(__first, __last, __m, __e,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005877 __flags | regex_constants::match_continuous);
5878 if (__r)
5879 {
5880 __r = !__m.suffix().matched;
5881 if (!__r)
5882 __m.__matches_.clear();
5883 }
5884 return __r;
5885}
5886
5887template <class _BidirectionalIterator, class _CharT, class _Traits>
5888inline _LIBCPP_INLINE_VISIBILITY
5889bool
5890regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
5891 const basic_regex<_CharT, _Traits>& __e,
5892 regex_constants::match_flag_type __flags = regex_constants::match_default)
5893{
5894 match_results<_BidirectionalIterator> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005895 return _VSTD::regex_match(__first, __last, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005896}
5897
5898template <class _CharT, class _Allocator, class _Traits>
5899inline _LIBCPP_INLINE_VISIBILITY
5900bool
5901regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5902 const basic_regex<_CharT, _Traits>& __e,
5903 regex_constants::match_flag_type __flags = regex_constants::match_default)
5904{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005905 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005906}
5907
5908template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5909inline _LIBCPP_INLINE_VISIBILITY
5910bool
5911regex_match(const basic_string<_CharT, _ST, _SA>& __s,
5912 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5913 const basic_regex<_CharT, _Traits>& __e,
5914 regex_constants::match_flag_type __flags = regex_constants::match_default)
5915{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005916 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005917}
5918
5919template <class _CharT, class _Traits>
5920inline _LIBCPP_INLINE_VISIBILITY
5921bool
5922regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5923 regex_constants::match_flag_type __flags = regex_constants::match_default)
5924{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005925 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005926}
5927
5928template <class _ST, class _SA, class _CharT, class _Traits>
5929inline _LIBCPP_INLINE_VISIBILITY
5930bool
5931regex_match(const basic_string<_CharT, _ST, _SA>& __s,
5932 const basic_regex<_CharT, _Traits>& __e,
5933 regex_constants::match_flag_type __flags = regex_constants::match_default)
5934{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005935 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005936}
5937
Howard Hinnanta712c722010-08-16 20:21:16 +00005938// regex_iterator
5939
5940template <class _BidirectionalIterator,
5941 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
5942 class _Traits = regex_traits<_CharT> >
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005943class _LIBCPP_VISIBLE regex_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00005944{
5945public:
5946 typedef basic_regex<_CharT, _Traits> regex_type;
5947 typedef match_results<_BidirectionalIterator> value_type;
5948 typedef ptrdiff_t difference_type;
5949 typedef const value_type* pointer;
5950 typedef const value_type& reference;
5951 typedef forward_iterator_tag iterator_category;
5952
5953private:
5954 _BidirectionalIterator __begin_;
5955 _BidirectionalIterator __end_;
5956 const regex_type* __pregex_;
5957 regex_constants::match_flag_type __flags_;
5958 value_type __match_;
5959
5960public:
5961 regex_iterator();
5962 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
5963 const regex_type& __re,
5964 regex_constants::match_flag_type __m = regex_constants::match_default);
5965
5966 bool operator==(const regex_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005967 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00005968 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
5969
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005970 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00005971 reference operator*() const {return __match_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005972 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00005973 pointer operator->() const {return &__match_;}
5974
5975 regex_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005976 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00005977 regex_iterator operator++(int)
5978 {
5979 regex_iterator __t(*this);
5980 ++(*this);
5981 return __t;
5982 }
5983};
5984
5985template <class _BidirectionalIterator, class _CharT, class _Traits>
5986regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
5987 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
5988{
5989}
5990
5991template <class _BidirectionalIterator, class _CharT, class _Traits>
5992regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
5993 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
5994 const regex_type& __re, regex_constants::match_flag_type __m)
5995 : __begin_(__a),
5996 __end_(__b),
5997 __pregex_(&__re),
5998 __flags_(__m)
5999{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006000 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
Howard Hinnanta712c722010-08-16 20:21:16 +00006001}
6002
6003template <class _BidirectionalIterator, class _CharT, class _Traits>
6004bool
6005regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6006 operator==(const regex_iterator& __x) const
6007{
6008 if (__match_.empty() && __x.__match_.empty())
6009 return true;
6010 if (__match_.empty() || __x.__match_.empty())
6011 return false;
6012 return __begin_ == __x.__begin_ &&
6013 __end_ == __x.__end_ &&
6014 __pregex_ == __x.__pregex_ &&
6015 __flags_ == __x.__flags_ &&
6016 __match_[0] == __x.__match_[0];
6017}
6018
6019template <class _BidirectionalIterator, class _CharT, class _Traits>
6020regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6021regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6022{
6023 __flags_ |= regex_constants::__no_update_pos;
6024 _BidirectionalIterator __start = __match_[0].second;
6025 if (__match_.length() == 0)
6026 {
6027 if (__start == __end_)
6028 {
6029 __match_ = value_type();
6030 return *this;
6031 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00006032 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
Howard Hinnanta712c722010-08-16 20:21:16 +00006033 __flags_ | regex_constants::match_not_null |
6034 regex_constants::match_continuous))
6035 return *this;
6036 else
6037 ++__start;
6038 }
6039 __flags_ |= regex_constants::match_prev_avail;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006040 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
Howard Hinnanta712c722010-08-16 20:21:16 +00006041 __match_ = value_type();
6042 return *this;
6043}
6044
6045typedef regex_iterator<const char*> cregex_iterator;
6046typedef regex_iterator<const wchar_t*> wcregex_iterator;
6047typedef regex_iterator<string::const_iterator> sregex_iterator;
6048typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
6049
6050// regex_token_iterator
6051
6052template <class _BidirectionalIterator,
6053 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6054 class _Traits = regex_traits<_CharT> >
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006055class _LIBCPP_VISIBLE regex_token_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00006056{
6057public:
6058 typedef basic_regex<_CharT, _Traits> regex_type;
6059 typedef sub_match<_BidirectionalIterator> value_type;
6060 typedef ptrdiff_t difference_type;
6061 typedef const value_type* pointer;
6062 typedef const value_type& reference;
6063 typedef forward_iterator_tag iterator_category;
6064
Howard Hinnant262b7792010-08-17 20:42:03 +00006065private:
6066 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6067
6068 _Position __position_;
6069 const value_type* __result_;
6070 value_type __suffix_;
6071 ptrdiff_t _N_;
6072 vector<int> __subs_;
6073
6074public:
Howard Hinnanta712c722010-08-16 20:21:16 +00006075 regex_token_iterator();
6076 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6077 const regex_type& __re, int __submatch = 0,
Howard Hinnant262b7792010-08-17 20:42:03 +00006078 regex_constants::match_flag_type __m =
6079 regex_constants::match_default);
Howard Hinnanta712c722010-08-16 20:21:16 +00006080 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6081 const regex_type& __re, const vector<int>& __submatches,
Howard Hinnant262b7792010-08-17 20:42:03 +00006082 regex_constants::match_flag_type __m =
6083 regex_constants::match_default);
Howard Hinnante3e32912011-08-12 21:56:02 +00006084#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnanta712c722010-08-16 20:21:16 +00006085 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
Howard Hinnant262b7792010-08-17 20:42:03 +00006086 const regex_type& __re,
6087 initializer_list<int> __submatches,
6088 regex_constants::match_flag_type __m =
6089 regex_constants::match_default);
Howard Hinnante3e32912011-08-12 21:56:02 +00006090#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnanta712c722010-08-16 20:21:16 +00006091 template <size_t _N>
Howard Hinnant262b7792010-08-17 20:42:03 +00006092 regex_token_iterator(_BidirectionalIterator __a,
6093 _BidirectionalIterator __b,
6094 const regex_type& __re,
6095 const int (&__submatches)[_N],
6096 regex_constants::match_flag_type __m =
6097 regex_constants::match_default);
Howard Hinnanta712c722010-08-16 20:21:16 +00006098 regex_token_iterator(const regex_token_iterator&);
6099 regex_token_iterator& operator=(const regex_token_iterator&);
6100
Howard Hinnant262b7792010-08-17 20:42:03 +00006101 bool operator==(const regex_token_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006102 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006103 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
Howard Hinnanta712c722010-08-16 20:21:16 +00006104
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006105 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006106 const value_type& operator*() const {return *__result_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006107 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006108 const value_type* operator->() const {return __result_;}
Howard Hinnanta712c722010-08-16 20:21:16 +00006109
6110 regex_token_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006111 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006112 regex_token_iterator operator++(int)
6113 {
6114 regex_token_iterator __t(*this);
6115 ++(*this);
6116 return __t;
6117 }
6118
6119private:
6120 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
Howard Hinnanta712c722010-08-16 20:21:16 +00006121};
6122
Howard Hinnant262b7792010-08-17 20:42:03 +00006123template <class _BidirectionalIterator, class _CharT, class _Traits>
6124regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6125 regex_token_iterator()
6126 : __result_(nullptr),
6127 __suffix_(),
6128 _N_(0)
6129{
6130}
6131
6132template <class _BidirectionalIterator, class _CharT, class _Traits>
6133void
6134regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6135 __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6136{
6137 if (__position_ != _Position())
6138 {
6139 if (__subs_[_N_] == -1)
6140 __result_ = &__position_->prefix();
6141 else
6142 __result_ = &(*__position_)[__subs_[_N_]];
6143 }
6144 else if (__subs_[_N_] == -1)
6145 {
6146 __suffix_.matched = true;
6147 __suffix_.first = __a;
6148 __suffix_.second = __b;
6149 __result_ = &__suffix_;
6150 }
6151 else
6152 __result_ = nullptr;
6153}
6154
6155template <class _BidirectionalIterator, class _CharT, class _Traits>
6156regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6157 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6158 const regex_type& __re, int __submatch,
6159 regex_constants::match_flag_type __m)
6160 : __position_(__a, __b, __re, __m),
6161 _N_(0),
6162 __subs_(1, __submatch)
6163{
6164 __init(__a, __b);
6165}
6166
6167template <class _BidirectionalIterator, class _CharT, class _Traits>
6168regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6169 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6170 const regex_type& __re, const vector<int>& __submatches,
6171 regex_constants::match_flag_type __m)
6172 : __position_(__a, __b, __re, __m),
6173 _N_(0),
6174 __subs_(__submatches)
6175{
6176 __init(__a, __b);
6177}
6178
Howard Hinnante3e32912011-08-12 21:56:02 +00006179#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6180
Howard Hinnant262b7792010-08-17 20:42:03 +00006181template <class _BidirectionalIterator, class _CharT, class _Traits>
6182regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6183 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6184 const regex_type& __re,
6185 initializer_list<int> __submatches,
6186 regex_constants::match_flag_type __m)
6187 : __position_(__a, __b, __re, __m),
6188 _N_(0),
6189 __subs_(__submatches)
6190{
6191 __init(__a, __b);
6192}
6193
Howard Hinnante3e32912011-08-12 21:56:02 +00006194#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6195
Howard Hinnant262b7792010-08-17 20:42:03 +00006196template <class _BidirectionalIterator, class _CharT, class _Traits>
6197template <size_t _N>
6198regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6199 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6200 const regex_type& __re,
6201 const int (&__submatches)[_N],
6202 regex_constants::match_flag_type __m)
6203 : __position_(__a, __b, __re, __m),
6204 _N_(0),
6205 __subs_(__submatches, __submatches + _N)
6206{
6207 __init(__a, __b);
6208}
6209
6210template <class _BidirectionalIterator, class _CharT, class _Traits>
6211regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6212 regex_token_iterator(const regex_token_iterator& __x)
6213 : __position_(__x.__position_),
6214 __result_(__x.__result_),
6215 __suffix_(__x.__suffix_),
6216 _N_(__x._N_),
6217 __subs_(__x.__subs_)
6218{
6219 if (__x.__result_ == &__x.__suffix_)
6220 __result_ == &__suffix_;
6221}
6222
6223template <class _BidirectionalIterator, class _CharT, class _Traits>
6224regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6225regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6226 operator=(const regex_token_iterator& __x)
6227{
6228 if (this != &__x)
6229 {
6230 __position_ = __x.__position_;
6231 if (__x.__result_ == &__x.__suffix_)
6232 __result_ == &__suffix_;
6233 else
6234 __result_ = __x.__result_;
6235 __suffix_ = __x.__suffix_;
6236 _N_ = __x._N_;
6237 __subs_ = __x.__subs_;
6238 }
6239 return *this;
6240}
6241
6242template <class _BidirectionalIterator, class _CharT, class _Traits>
6243bool
6244regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6245 operator==(const regex_token_iterator& __x) const
6246{
6247 if (__result_ == nullptr && __x.__result_ == nullptr)
6248 return true;
6249 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6250 __suffix_ == __x.__suffix_)
6251 return true;
6252 if (__result_ == nullptr || __x.__result_ == nullptr)
6253 return false;
6254 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6255 return false;
6256 return __position_ == __x.__position_ && _N_ == __x._N_ &&
6257 __subs_ == __x.__subs_;
6258}
6259
6260template <class _BidirectionalIterator, class _CharT, class _Traits>
6261regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6262regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6263{
6264 _Position __prev = __position_;
6265 if (__result_ == &__suffix_)
6266 __result_ = nullptr;
6267 else if (_N_ + 1 < __subs_.size())
6268 {
6269 ++_N_;
6270 if (__subs_[_N_] == -1)
6271 __result_ = &__position_->prefix();
6272 else
6273 __result_ = &(*__position_)[__subs_[_N_]];
6274 }
6275 else
6276 {
6277 _N_ = 0;
6278 ++__position_;
6279 if (__position_ != _Position())
6280 {
6281 if (__subs_[_N_] == -1)
6282 __result_ = &__position_->prefix();
6283 else
6284 __result_ = &(*__position_)[__subs_[_N_]];
6285 }
6286 else
6287 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00006288 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
Howard Hinnant262b7792010-08-17 20:42:03 +00006289 && __prev->suffix().length() != 0)
6290 {
6291 __suffix_.matched = true;
6292 __suffix_.first = __prev->suffix().first;
6293 __suffix_.second = __prev->suffix().second;
6294 __result_ = &__suffix_;
6295 }
6296 else
6297 __result_ = nullptr;
6298 }
6299 }
6300 return *this;
6301}
6302
Howard Hinnanta712c722010-08-16 20:21:16 +00006303typedef regex_token_iterator<const char*> cregex_token_iterator;
6304typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
6305typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
6306typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
6307
Howard Hinnanta8d77592010-08-18 00:13:08 +00006308// regex_replace
6309
6310template <class _OutputIterator, class _BidirectionalIterator,
6311 class _Traits, class _CharT>
6312_OutputIterator
6313regex_replace(_OutputIterator __out,
6314 _BidirectionalIterator __first, _BidirectionalIterator __last,
6315 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6316 regex_constants::match_flag_type __flags = regex_constants::match_default)
6317{
6318 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6319 _Iter __i(__first, __last, __e, __flags);
6320 _Iter __eof;
6321 if (__i == __eof)
6322 {
6323 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006324 __out = _VSTD::copy(__first, __last, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006325 }
6326 else
6327 {
6328 sub_match<_BidirectionalIterator> __lm;
6329 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6330 {
6331 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006332 __out = _VSTD::copy(__i->prefix().first, __i->prefix().second, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006333 __out = __i->format(__out, __fmt, __fmt + __len, __flags);
6334 __lm = __i->suffix();
6335 if (__flags & regex_constants::format_first_only)
6336 break;
6337 }
6338 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006339 __out = _VSTD::copy(__lm.first, __lm.second, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006340 }
6341 return __out;
6342}
6343
6344template <class _OutputIterator, class _BidirectionalIterator,
6345 class _Traits, class _CharT, class _ST, class _SA>
6346inline _LIBCPP_INLINE_VISIBILITY
6347_OutputIterator
6348regex_replace(_OutputIterator __out,
6349 _BidirectionalIterator __first, _BidirectionalIterator __last,
6350 const basic_regex<_CharT, _Traits>& __e,
6351 const basic_string<_CharT, _ST, _SA>& __fmt,
6352 regex_constants::match_flag_type __flags = regex_constants::match_default)
6353{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006354 return _VSTD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006355}
6356
6357template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6358 class _FSA>
6359inline _LIBCPP_INLINE_VISIBILITY
6360basic_string<_CharT, _ST, _SA>
6361regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6362 const basic_regex<_CharT, _Traits>& __e,
6363 const basic_string<_CharT, _FST, _FSA>& __fmt,
6364 regex_constants::match_flag_type __flags = regex_constants::match_default)
6365{
6366 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006367 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006368 __fmt.c_str(), __flags);
6369 return __r;
6370}
6371
6372template <class _Traits, class _CharT, class _ST, class _SA>
6373inline _LIBCPP_INLINE_VISIBILITY
6374basic_string<_CharT, _ST, _SA>
6375regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6376 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6377 regex_constants::match_flag_type __flags = regex_constants::match_default)
6378{
6379 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006380 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006381 __fmt, __flags);
6382 return __r;
6383}
6384
6385template <class _Traits, class _CharT, class _ST, class _SA>
6386inline _LIBCPP_INLINE_VISIBILITY
6387basic_string<_CharT>
6388regex_replace(const _CharT* __s,
6389 const basic_regex<_CharT, _Traits>& __e,
6390 const basic_string<_CharT, _ST, _SA>& __fmt,
6391 regex_constants::match_flag_type __flags = regex_constants::match_default)
6392{
6393 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006394 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006395 __s + char_traits<_CharT>::length(__s), __e,
6396 __fmt.c_str(), __flags);
6397 return __r;
6398}
6399
6400template <class _Traits, class _CharT>
6401inline _LIBCPP_INLINE_VISIBILITY
6402basic_string<_CharT>
6403regex_replace(const _CharT* __s,
6404 const basic_regex<_CharT, _Traits>& __e,
6405 const _CharT* __fmt,
6406 regex_constants::match_flag_type __flags = regex_constants::match_default)
6407{
6408 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006409 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006410 __s + char_traits<_CharT>::length(__s), __e,
6411 __fmt, __flags);
6412 return __r;
6413}
6414
Howard Hinnant3257c982010-06-17 00:34:59 +00006415_LIBCPP_END_NAMESPACE_STD
6416
6417#endif // _LIBCPP_REGEX