blob: 16d6102c9583140d11bced8bc4cb8708cf322ed3 [file] [log] [blame]
Howard Hinnant3257c982010-06-17 00:34:59 +00001// -*- C++ -*-
2//===--------------------------- regex ------------------------------------===//
3//
4// The LLVM Compiler Infrastructure
5//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnant3257c982010-06-17 00:34:59 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_REGEX
12#define _LIBCPP_REGEX
13
14/*
15 regex synopsis
16
17#include <initializer_list>
18
19namespace std
20{
21
22namespace regex_constants
23{
24
25emum syntax_option_type
26{
27 icase = unspecified,
28 nosubs = unspecified,
29 optimize = unspecified,
30 collate = unspecified,
31 ECMAScript = unspecified,
32 basic = unspecified,
33 extended = unspecified,
34 awk = unspecified,
35 grep = unspecified,
36 egrep = unspecified
37};
38
39constexpr syntax_option_type operator~(syntax_option_type f);
40constexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs);
41constexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs);
42
43enum match_flag_type
44{
45 match_default = 0,
46 match_not_bol = unspecified,
47 match_not_eol = unspecified,
48 match_not_bow = unspecified,
49 match_not_eow = unspecified,
50 match_any = unspecified,
51 match_not_null = unspecified,
52 match_continuous = unspecified,
53 match_prev_avail = unspecified,
54 format_default = 0,
55 format_sed = unspecified,
56 format_no_copy = unspecified,
57 format_first_only = unspecified
58};
59
60constexpr match_flag_type operator~(match_flag_type f);
61constexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs);
62constexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs);
63
64enum error_type
65{
66 error_collate = unspecified,
67 error_ctype = unspecified,
68 error_escape = unspecified,
69 error_backref = unspecified,
70 error_brack = unspecified,
71 error_paren = unspecified,
72 error_brace = unspecified,
73 error_badbrace = unspecified,
74 error_range = unspecified,
75 error_space = unspecified,
76 error_badrepeat = unspecified,
77 error_complexity = unspecified,
78 error_stack = unspecified
79};
80
81} // regex_constants
82
83class regex_error
84 : public runtime_error
85{
86public:
87 explicit regex_error(regex_constants::error_type ecode);
88 regex_constants::error_type code() const;
89};
90
91template <class charT>
92struct regex_traits
93{
94public:
95 typedef charT char_type;
96 typedef basic_string<char_type> string_type;
97 typedef locale locale_type;
98 typedef /bitmask_type/ char_class_type;
99
100 regex_traits();
101
102 static size_t length(const char_type* p);
103 charT translate(charT c) const;
104 charT translate_nocase(charT c) const;
105 template <class ForwardIterator>
106 string_type
107 transform(ForwardIterator first, ForwardIterator last) const;
108 template <class ForwardIterator>
109 string_type
110 transform_primary( ForwardIterator first, ForwardIterator last) const;
111 template <class ForwardIterator>
112 string_type
113 lookup_collatename(ForwardIterator first, ForwardIterator last) const;
114 template <class ForwardIterator>
115 char_class_type
116 lookup_classname(ForwardIterator first, ForwardIterator last,
117 bool icase = false) const;
118 bool isctype(charT c, char_class_type f) const;
119 int value(charT ch, int radix) const;
120 locale_type imbue(locale_type l);
121 locale_type getloc()const;
122};
123
124template <class charT, class traits = regex_traits<charT>>
125class basic_regex
126{
127public:
128 // types:
129 typedef charT value_type;
130 typedef regex_constants::syntax_option_type flag_type;
131 typedef typename traits::locale_type locale_type;
132
133 // constants:
134 static constexpr regex_constants::syntax_option_type icase = regex_constants::icase;
135 static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
136 static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize;
137 static constexpr regex_constants::syntax_option_type collate = regex_constants::collate;
138 static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
139 static constexpr regex_constants::syntax_option_type basic = regex_constants::basic;
140 static constexpr regex_constants::syntax_option_type extended = regex_constants::extended;
141 static constexpr regex_constants::syntax_option_type awk = regex_constants::awk;
142 static constexpr regex_constants::syntax_option_type grep = regex_constants::grep;
143 static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep;
144
145 // construct/copy/destroy:
146 basic_regex();
147 explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
148 basic_regex(const charT* p, size_t len, flag_type f);
149 basic_regex(const basic_regex&);
Howard Hinnant46623a02012-07-21 01:31:58 +0000150 basic_regex(basic_regex&&) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000151 template <class ST, class SA>
152 explicit basic_regex(const basic_string<charT, ST, SA>& p,
153 flag_type f = regex_constants::ECMAScript);
154 template <class ForwardIterator>
155 basic_regex(ForwardIterator first, ForwardIterator last,
156 flag_type f = regex_constants::ECMAScript);
157 basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
158
159 ~basic_regex();
160
161 basic_regex& operator=(const basic_regex&);
Howard Hinnant46623a02012-07-21 01:31:58 +0000162 basic_regex& operator=(basic_regex&&) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000163 basic_regex& operator=(const charT* ptr);
164 basic_regex& operator=(initializer_list<charT> il);
165 template <class ST, class SA>
166 basic_regex& operator=(const basic_string<charT, ST, SA>& p);
167
168 // assign:
169 basic_regex& assign(const basic_regex& that);
Howard Hinnant46623a02012-07-21 01:31:58 +0000170 basic_regex& assign(basic_regex&& that) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000171 basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);
172 basic_regex& assign(const charT* p, size_t len, flag_type f);
173 template <class string_traits, class A>
174 basic_regex& assign(const basic_string<charT, string_traits, A>& s,
175 flag_type f = regex_constants::ECMAScript);
176 template <class InputIterator>
177 basic_regex& assign(InputIterator first, InputIterator last,
178 flag_type f = regex_constants::ECMAScript);
179 basic_regex& assign(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
180
181 // const operations:
182 unsigned mark_count() const;
183 flag_type flags() const;
184
185 // locale:
186 locale_type imbue(locale_type loc);
187 locale_type getloc() const;
188
189 // swap:
190 void swap(basic_regex&);
191};
192
193typedef basic_regex<char> regex;
194typedef basic_regex<wchar_t> wregex;
195
196template <class charT, class traits>
197 void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
198
199template <class BidirectionalIterator>
200class sub_match
201 : public pair<BidirectionalIterator, BidirectionalIterator>
202{
203public:
204 typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
205 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
206 typedef BidirectionalIterator iterator;
207 typedef basic_string<value_type> string_type;
208
209 bool matched;
210
Howard Hinnant31aaf552010-12-08 21:07:55 +0000211 constexpr sub_match();
212
Howard Hinnant3257c982010-06-17 00:34:59 +0000213 difference_type length() const;
214 operator string_type() const;
215 string_type str() const;
216
217 int compare(const sub_match& s) const;
218 int compare(const string_type& s) const;
219 int compare(const value_type* s) const;
220};
221
222typedef sub_match<const char*> csub_match;
223typedef sub_match<const wchar_t*> wcsub_match;
224typedef sub_match<string::const_iterator> ssub_match;
225typedef sub_match<wstring::const_iterator> wssub_match;
226
227template <class BiIter>
228 bool
229 operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
230
231template <class BiIter>
232 bool
233 operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
234
235template <class BiIter>
236 bool
237 operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
238
239template <class BiIter>
240 bool
241 operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
242
243template <class BiIter>
244 bool
245 operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
246
247template <class BiIter>
248 bool
249 operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
250
251template <class BiIter, class ST, class SA>
252 bool
253 operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
254 const sub_match<BiIter>& rhs);
255
256template <class BiIter, class ST, class SA>
257 bool
258 operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
259 const sub_match<BiIter>& rhs);
260
261template <class BiIter, class ST, class SA>
262 bool
263 operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
264 const sub_match<BiIter>& rhs);
265
266template <class BiIter, class ST, class SA>
267 bool
268 operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
269 const sub_match<BiIter>& rhs);
270
271template <class BiIter, class ST, class SA>
272 bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
273 const sub_match<BiIter>& rhs);
274
275template <class BiIter, class ST, class SA>
276 bool
277 operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
278 const sub_match<BiIter>& rhs);
279
280template <class BiIter, class ST, class SA>
281 bool
282 operator==(const sub_match<BiIter>& lhs,
283 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
284
285template <class BiIter, class ST, class SA>
286 bool
287 operator!=(const sub_match<BiIter>& lhs,
288 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
289
290template <class BiIter, class ST, class SA>
291 bool
292 operator<(const sub_match<BiIter>& lhs,
293 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
294
295template <class BiIter, class ST, class SA>
296 bool operator>(const sub_match<BiIter>& lhs,
297 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
298
299template <class BiIter, class ST, class SA>
300 bool
301 operator>=(const sub_match<BiIter>& lhs,
302 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
303
304template <class BiIter, class ST, class SA>
305 bool
306 operator<=(const sub_match<BiIter>& lhs,
307 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
308
309template <class BiIter>
310 bool
311 operator==(typename iterator_traits<BiIter>::value_type const* lhs,
312 const sub_match<BiIter>& rhs);
313
314template <class BiIter>
315 bool
316 operator!=(typename iterator_traits<BiIter>::value_type const* lhs,
317 const sub_match<BiIter>& rhs);
318
319template <class BiIter>
320 bool
321 operator<(typename iterator_traits<BiIter>::value_type const* lhs,
322 const sub_match<BiIter>& rhs);
323
324template <class BiIter>
325 bool
326 operator>(typename iterator_traits<BiIter>::value_type const* lhs,
327 const sub_match<BiIter>& rhs);
328
329template <class BiIter>
330 bool
331 operator>=(typename iterator_traits<BiIter>::value_type const* lhs,
332 const sub_match<BiIter>& rhs);
333
334template <class BiIter>
335 bool
336 operator<=(typename iterator_traits<BiIter>::value_type const* lhs,
337 const sub_match<BiIter>& rhs);
338
339template <class BiIter>
340 bool
341 operator==(const sub_match<BiIter>& lhs,
342 typename iterator_traits<BiIter>::value_type const* rhs);
343
344template <class BiIter>
345 bool
346 operator!=(const sub_match<BiIter>& lhs,
347 typename iterator_traits<BiIter>::value_type const* rhs);
348
349template <class BiIter>
350 bool
351 operator<(const sub_match<BiIter>& lhs,
352 typename iterator_traits<BiIter>::value_type const* rhs);
353
354template <class BiIter>
355 bool
356 operator>(const sub_match<BiIter>& lhs,
357 typename iterator_traits<BiIter>::value_type const* rhs);
358
359template <class BiIter>
360 bool
361 operator>=(const sub_match<BiIter>& lhs,
362 typename iterator_traits<BiIter>::value_type const* rhs);
363
364template <class BiIter>
365 bool
366 operator<=(const sub_match<BiIter>& lhs,
367 typename iterator_traits<BiIter>::value_type const* rhs);
368
369template <class BiIter>
370 bool
371 operator==(typename iterator_traits<BiIter>::value_type const& lhs,
372 const sub_match<BiIter>& rhs);
373
374template <class BiIter>
375 bool
376 operator!=(typename iterator_traits<BiIter>::value_type const& lhs,
377 const sub_match<BiIter>& rhs);
378
379template <class BiIter>
380 bool
381 operator<(typename iterator_traits<BiIter>::value_type const& lhs,
382 const sub_match<BiIter>& rhs);
383
384template <class BiIter>
385 bool
386 operator>(typename iterator_traits<BiIter>::value_type const& lhs,
387 const sub_match<BiIter>& rhs);
388
389template <class BiIter>
390 bool
391 operator>=(typename iterator_traits<BiIter>::value_type const& lhs,
392 const sub_match<BiIter>& rhs);
393
394template <class BiIter>
395 bool
396 operator<=(typename iterator_traits<BiIter>::value_type const& lhs,
397 const sub_match<BiIter>& rhs);
398
399template <class BiIter>
400 bool
401 operator==(const sub_match<BiIter>& lhs,
402 typename iterator_traits<BiIter>::value_type const& rhs);
403
404template <class BiIter>
405 bool
406 operator!=(const sub_match<BiIter>& lhs,
407 typename iterator_traits<BiIter>::value_type const& rhs);
408
409template <class BiIter>
410 bool
411 operator<(const sub_match<BiIter>& lhs,
412 typename iterator_traits<BiIter>::value_type const& rhs);
413
414template <class BiIter>
415 bool
416 operator>(const sub_match<BiIter>& lhs,
417 typename iterator_traits<BiIter>::value_type const& rhs);
418
419template <class BiIter>
420 bool
421 operator>=(const sub_match<BiIter>& lhs,
422 typename iterator_traits<BiIter>::value_type const& rhs);
423
424template <class BiIter>
425 bool
426 operator<=(const sub_match<BiIter>& lhs,
427 typename iterator_traits<BiIter>::value_type const& rhs);
428
429template <class charT, class ST, class BiIter>
430 basic_ostream<charT, ST>&
431 operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
432
433template <class BidirectionalIterator,
434 class Allocator = allocator<sub_match<BidirectionalIterator>>>
435class match_results
436{
437public:
438 typedef sub_match<BidirectionalIterator> value_type;
439 typedef const value_type& const_reference;
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);
Howard Hinnant46623a02012-07-21 01:31:58 +0000452 match_results(match_results&& m) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000453 match_results& operator=(const match_results& m);
454 match_results& operator=(match_results&& m);
455 ~match_results();
456
Howard Hinnant31aaf552010-12-08 21:07:55 +0000457 bool ready() const;
458
Howard Hinnant3257c982010-06-17 00:34:59 +0000459 // size:
460 size_type size() const;
461 size_type max_size() const;
462 bool empty() const;
463
464 // element access:
465 difference_type length(size_type sub = 0) const;
466 difference_type position(size_type sub = 0) const;
467 string_type str(size_type sub = 0) const;
468 const_reference operator[](size_type n) const;
469
470 const_reference prefix() const;
471 const_reference suffix() const;
472
473 const_iterator begin() const;
474 const_iterator end() const;
475 const_iterator cbegin() const;
476 const_iterator cend() const;
477
478 // format:
479 template <class OutputIter>
480 OutputIter
481 format(OutputIter out, const char_type* fmt_first,
482 const char_type* fmt_last,
483 regex_constants::match_flag_type flags = regex_constants::format_default) const;
484 template <class OutputIter, class ST, class SA>
485 OutputIter
486 format(OutputIter out, const basic_string<char_type, ST, SA>& fmt,
487 regex_constants::match_flag_type flags = regex_constants::format_default) const;
488 template <class ST, class SA>
489 basic_string<char_type, ST, SA>
490 format(const basic_string<char_type, ST, SA>& fmt,
491 regex_constants::match_flag_type flags = regex_constants::format_default) const;
492 string_type
493 format(const char_type* fmt,
494 regex_constants::match_flag_type flags = regex_constants::format_default) const;
495
496 // allocator:
497 allocator_type get_allocator() const;
498
499 // swap:
500 void swap(match_results& that);
501};
502
503typedef match_results<const char*> cmatch;
504typedef match_results<const wchar_t*> wcmatch;
505typedef match_results<string::const_iterator> smatch;
506typedef match_results<wstring::const_iterator> wsmatch;
507
508template <class BidirectionalIterator, class Allocator>
509 bool
510 operator==(const match_results<BidirectionalIterator, Allocator>& m1,
511 const match_results<BidirectionalIterator, Allocator>& m2);
512
513template <class BidirectionalIterator, class Allocator>
514 bool
515 operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
516 const match_results<BidirectionalIterator, Allocator>& m2);
517
518template <class BidirectionalIterator, class Allocator>
519 void
520 swap(match_results<BidirectionalIterator, Allocator>& m1,
521 match_results<BidirectionalIterator, Allocator>& m2);
522
523template <class BidirectionalIterator, class Allocator, class charT, class traits>
524 bool
525 regex_match(BidirectionalIterator first, BidirectionalIterator last,
526 match_results<BidirectionalIterator, Allocator>& m,
527 const basic_regex<charT, traits>& e,
528 regex_constants::match_flag_type flags = regex_constants::match_default);
529
530template <class BidirectionalIterator, class charT, class traits>
531 bool
532 regex_match(BidirectionalIterator first, BidirectionalIterator last,
533 const basic_regex<charT, traits>& e,
534 regex_constants::match_flag_type flags = regex_constants::match_default);
535
536template <class charT, class Allocator, class traits>
537 bool
538 regex_match(const charT* str, match_results<const charT*, Allocator>& m,
539 const basic_regex<charT, traits>& e,
540 regex_constants::match_flag_type flags = regex_constants::match_default);
541
542template <class ST, class SA, class Allocator, class charT, class traits>
543 bool
544 regex_match(const basic_string<charT, ST, SA>& s,
545 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
546 const basic_regex<charT, traits>& e,
547 regex_constants::match_flag_type flags = regex_constants::match_default);
548
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 Hinnant46623a02012-07-21 01:31:58 +0000763_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000764syntax_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 Hinnant46623a02012-07-21 01:31:58 +0000771_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000772syntax_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 Hinnant46623a02012-07-21 01:31:58 +0000779_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000780syntax_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 Hinnant46623a02012-07-21 01:31:58 +0000787_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000788syntax_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 +0000795syntax_option_type&
796operator&=(syntax_option_type& __x, syntax_option_type __y)
797{
798 __x = __x & __y;
799 return __x;
800}
801
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000802inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000803syntax_option_type&
804operator|=(syntax_option_type& __x, syntax_option_type __y)
805{
806 __x = __x | __y;
807 return __x;
808}
809
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000810inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000811syntax_option_type&
812operator^=(syntax_option_type& __x, syntax_option_type __y)
813{
814 __x = __x ^ __y;
815 return __x;
816}
817
818// match_flag_type
819
820enum match_flag_type
821{
822 match_default = 0,
823 match_not_bol = 1 << 0,
824 match_not_eol = 1 << 1,
825 match_not_bow = 1 << 2,
826 match_not_eow = 1 << 3,
827 match_any = 1 << 4,
828 match_not_null = 1 << 5,
829 match_continuous = 1 << 6,
830 match_prev_avail = 1 << 7,
831 format_default = 0,
832 format_sed = 1 << 8,
833 format_no_copy = 1 << 9,
Howard Hinnanta712c722010-08-16 20:21:16 +0000834 format_first_only = 1 << 10,
835 __no_update_pos = 1 << 11
Howard Hinnant3257c982010-06-17 00:34:59 +0000836};
837
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000838inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000839_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000840match_flag_type
841operator~(match_flag_type __x)
842{
843 return match_flag_type(~int(__x));
844}
845
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000846inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000847_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000848match_flag_type
849operator&(match_flag_type __x, match_flag_type __y)
850{
851 return match_flag_type(int(__x) & int(__y));
852}
853
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000854inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000855_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000856match_flag_type
857operator|(match_flag_type __x, match_flag_type __y)
858{
859 return match_flag_type(int(__x) | int(__y));
860}
861
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000862inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000863_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000864match_flag_type
865operator^(match_flag_type __x, match_flag_type __y)
866{
867 return match_flag_type(int(__x) ^ int(__y));
868}
869
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000870inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000871match_flag_type&
872operator&=(match_flag_type& __x, match_flag_type __y)
873{
874 __x = __x & __y;
875 return __x;
876}
877
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000878inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000879match_flag_type&
880operator|=(match_flag_type& __x, match_flag_type __y)
881{
882 __x = __x | __y;
883 return __x;
884}
885
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000886inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000887match_flag_type&
888operator^=(match_flag_type& __x, match_flag_type __y)
889{
890 __x = __x ^ __y;
891 return __x;
892}
893
894enum error_type
895{
896 error_collate = 1,
897 error_ctype,
898 error_escape,
899 error_backref,
900 error_brack,
901 error_paren,
902 error_brace,
903 error_badbrace,
904 error_range,
905 error_space,
906 error_badrepeat,
907 error_complexity,
Howard Hinnant8c2c18d2010-06-24 21:28:00 +0000908 error_stack,
Howard Hinnantad2a7ab2010-07-27 17:24:17 +0000909 __re_err_grammar,
910 __re_err_empty,
911 __re_err_unknown
Howard Hinnant3257c982010-06-17 00:34:59 +0000912};
913
914} // regex_constants
915
916class _LIBCPP_EXCEPTION_ABI regex_error
917 : public runtime_error
918{
919 regex_constants::error_type __code_;
920public:
921 explicit regex_error(regex_constants::error_type __ecode);
922 virtual ~regex_error() throw();
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000923 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000924 regex_constants::error_type code() const {return __code_;}
925};
926
927template <class _CharT>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000928struct _LIBCPP_VISIBLE regex_traits
Howard Hinnant3257c982010-06-17 00:34:59 +0000929{
930public:
931 typedef _CharT char_type;
932 typedef basic_string<char_type> string_type;
933 typedef locale locale_type;
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000934 typedef ctype_base::mask char_class_type;
Howard Hinnant3257c982010-06-17 00:34:59 +0000935
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000936 static const char_class_type __regex_word = 0x80;
Howard Hinnant3257c982010-06-17 00:34:59 +0000937private:
938 locale __loc_;
939 const ctype<char_type>* __ct_;
940 const collate<char_type>* __col_;
941
942public:
943 regex_traits();
944
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000945 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000946 static size_t length(const char_type* __p)
947 {return char_traits<char_type>::length(__p);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000948 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000949 char_type translate(char_type __c) const {return __c;}
950 char_type translate_nocase(char_type __c) const;
951 template <class _ForwardIterator>
952 string_type
953 transform(_ForwardIterator __f, _ForwardIterator __l) const;
954 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000955 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000956 string_type
957 transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
958 {return __transform_primary(__f, __l, char_type());}
959 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000960 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000961 string_type
962 lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
963 {return __lookup_collatename(__f, __l, char_type());}
964 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000965 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000966 char_class_type
967 lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000968 bool __icase = false) const
969 {return __lookup_classname(__f, __l, __icase, char_type());}
970 bool isctype(char_type __c, char_class_type __m) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000971 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000972 int value(char_type __ch, int __radix) const
973 {return __value(__ch, __radix);}
Howard Hinnant3257c982010-06-17 00:34:59 +0000974 locale_type imbue(locale_type __l);
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000975 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000976 locale_type getloc()const {return __loc_;}
977
978private:
979 void __init();
980
981 template <class _ForwardIterator>
982 string_type
983 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
984 template <class _ForwardIterator>
985 string_type
986 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
987
988 template <class _ForwardIterator>
989 string_type
990 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
991 template <class _ForwardIterator>
992 string_type
993 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000994
995 template <class _ForwardIterator>
996 char_class_type
997 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
998 bool __icase, char) const;
999 template <class _ForwardIterator>
1000 char_class_type
1001 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1002 bool __icase, wchar_t) const;
1003
1004 static int __value(unsigned char __ch, int __radix);
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001005 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001006 int __value(char __ch, int __radix) const
1007 {return __value(static_cast<unsigned char>(__ch), __radix);}
1008 int __value(wchar_t __ch, int __radix) const;
Howard Hinnant3257c982010-06-17 00:34:59 +00001009};
1010
1011template <class _CharT>
1012regex_traits<_CharT>::regex_traits()
1013{
1014 __init();
1015}
1016
1017template <class _CharT>
1018typename regex_traits<_CharT>::char_type
1019regex_traits<_CharT>::translate_nocase(char_type __c) const
1020{
1021 return __ct_->tolower(__c);
1022}
1023
1024template <class _CharT>
1025template <class _ForwardIterator>
1026typename regex_traits<_CharT>::string_type
1027regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
1028{
1029 string_type __s(__f, __l);
1030 return __col_->transform(__s.data(), __s.data() + __s.size());
1031}
1032
1033template <class _CharT>
1034void
1035regex_traits<_CharT>::__init()
1036{
1037 __ct_ = &use_facet<ctype<char_type> >(__loc_);
1038 __col_ = &use_facet<collate<char_type> >(__loc_);
1039}
1040
1041template <class _CharT>
1042typename regex_traits<_CharT>::locale_type
1043regex_traits<_CharT>::imbue(locale_type __l)
1044{
1045 locale __r = __loc_;
1046 __loc_ = __l;
1047 __init();
1048 return __r;
1049}
1050
1051// transform_primary is very FreeBSD-specific
1052
1053template <class _CharT>
1054template <class _ForwardIterator>
1055typename regex_traits<_CharT>::string_type
1056regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1057 _ForwardIterator __l, char) const
1058{
1059 const string_type __s(__f, __l);
1060 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1061 switch (__d.size())
1062 {
1063 case 1:
1064 break;
1065 case 12:
1066 __d[11] = __d[3];
1067 break;
1068 default:
1069 __d.clear();
1070 break;
1071 }
1072 return __d;
1073}
1074
1075template <class _CharT>
1076template <class _ForwardIterator>
1077typename regex_traits<_CharT>::string_type
1078regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1079 _ForwardIterator __l, wchar_t) const
1080{
1081 const string_type __s(__f, __l);
1082 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1083 switch (__d.size())
1084 {
1085 case 1:
1086 break;
1087 case 3:
1088 __d[2] = __d[0];
1089 break;
1090 default:
1091 __d.clear();
1092 break;
1093 }
1094 return __d;
1095}
1096
1097// lookup_collatename is very FreeBSD-specific
1098
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001099string __get_collation_name(const char* __s);
Howard Hinnant3257c982010-06-17 00:34:59 +00001100
1101template <class _CharT>
1102template <class _ForwardIterator>
1103typename regex_traits<_CharT>::string_type
1104regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1105 _ForwardIterator __l, char) const
1106{
1107 string_type __s(__f, __l);
1108 string_type __r;
1109 if (!__s.empty())
1110 {
1111 __r = __get_collation_name(__s.c_str());
1112 if (__r.empty() && __s.size() <= 2)
1113 {
1114 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1115 if (__r.size() == 1 || __r.size() == 12)
1116 __r = __s;
1117 else
1118 __r.clear();
1119 }
1120 }
1121 return __r;
1122}
1123
1124template <class _CharT>
1125template <class _ForwardIterator>
1126typename regex_traits<_CharT>::string_type
1127regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1128 _ForwardIterator __l, wchar_t) const
1129{
1130 string_type __s(__f, __l);
1131 string __n;
1132 __n.reserve(__s.size());
1133 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1134 __i != __e; ++__i)
1135 {
1136 if (static_cast<unsigned>(*__i) >= 127)
1137 return string_type();
1138 __n.push_back(char(*__i));
1139 }
1140 string_type __r;
1141 if (!__s.empty())
1142 {
1143 __n = __get_collation_name(__n.c_str());
1144 if (!__n.empty())
1145 __r.assign(__n.begin(), __n.end());
1146 else if (__s.size() <= 2)
1147 {
1148 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1149 if (__r.size() == 1 || __r.size() == 3)
1150 __r = __s;
1151 else
1152 __r.clear();
1153 }
1154 }
1155 return __r;
1156}
1157
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001158// lookup_classname
1159
1160ctype_base::mask __get_classname(const char* __s, bool __icase);
1161
1162template <class _CharT>
1163template <class _ForwardIterator>
1164typename regex_traits<_CharT>::char_class_type
1165regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1166 _ForwardIterator __l,
1167 bool __icase, char) const
1168{
1169 string_type __s(__f, __l);
1170 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1171 return __get_classname(__s.c_str(), __icase);
1172}
1173
1174template <class _CharT>
1175template <class _ForwardIterator>
1176typename regex_traits<_CharT>::char_class_type
1177regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1178 _ForwardIterator __l,
1179 bool __icase, wchar_t) const
1180{
1181 string_type __s(__f, __l);
1182 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1183 string __n;
1184 __n.reserve(__s.size());
1185 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1186 __i != __e; ++__i)
1187 {
1188 if (static_cast<unsigned>(*__i) >= 127)
1189 return char_class_type();
1190 __n.push_back(char(*__i));
1191 }
1192 return __get_classname(__n.c_str(), __icase);
1193}
1194
1195template <class _CharT>
1196bool
1197regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
1198{
1199 if (__ct_->is(__m, __c))
1200 return true;
1201 return (__c == '_' && (__m & __regex_word));
1202}
1203
1204template <class _CharT>
1205int
1206regex_traits<_CharT>::__value(unsigned char __ch, int __radix)
1207{
1208 if ((__ch & 0xF8u) == 0x30) // '0' <= __ch && __ch <= '7'
1209 return __ch - '0';
1210 if (__radix != 8)
1211 {
1212 if ((__ch & 0xFEu) == 0x38) // '8' <= __ch && __ch <= '9'
1213 return __ch - '0';
1214 if (__radix == 16)
1215 {
1216 __ch |= 0x20; // tolower
1217 if ('a' <= __ch && __ch <= 'f')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00001218 return __ch - ('a' - 10);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001219 }
1220 }
1221 return -1;
1222}
1223
1224template <class _CharT>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001225inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001226int
1227regex_traits<_CharT>::__value(wchar_t __ch, int __radix) const
1228{
1229 return __value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
1230}
1231
Howard Hinnantac303862010-07-12 15:51:17 +00001232template <class _CharT> class __node;
1233
1234template <class _BidirectionalIterator> class sub_match;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001235
Howard Hinnant17615b02010-07-27 01:25:38 +00001236template <class _BidirectionalIterator,
1237 class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
1238class match_results;
1239
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001240template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001241struct __state
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001242{
1243 enum
1244 {
1245 __end_state = -1000,
1246 __consume_input, // -999
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001247 __begin_marked_expr, // -998
1248 __end_marked_expr, // -997
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001249 __pop_state, // -996
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001250 __accept_and_consume, // -995
1251 __accept_but_not_consume, // -994
1252 __reject, // -993
Howard Hinnantac303862010-07-12 15:51:17 +00001253 __split,
1254 __repeat
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001255 };
1256
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001257 int __do_;
Howard Hinnantac303862010-07-12 15:51:17 +00001258 const _CharT* __first_;
1259 const _CharT* __current_;
1260 const _CharT* __last_;
1261 vector<sub_match<const _CharT*> > __sub_matches_;
1262 vector<pair<size_t, const _CharT*> > __loop_data_;
1263 const __node<_CharT>* __node_;
1264 regex_constants::match_flag_type __flags_;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001265 bool __at_first_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001266
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001267 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001268 __state()
1269 : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
1270 __node_(nullptr), __flags_() {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001271};
1272
Howard Hinnantac303862010-07-12 15:51:17 +00001273// __node
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001274
1275template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001276class __node
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001277{
Howard Hinnantac303862010-07-12 15:51:17 +00001278 __node(const __node&);
1279 __node& operator=(const __node&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001280public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001281 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001282
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001283 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001284 __node() {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001285 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001286 virtual ~__node() {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001287
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001288 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001289 virtual void __exec(__state&) const {};
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001290 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001291 virtual void __exec_split(bool, __state&) const {};
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001292};
1293
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001294// __end_state
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001295
1296template <class _CharT>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001297class __end_state
Howard Hinnantac303862010-07-12 15:51:17 +00001298 : public __node<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001299{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001300public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001301 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001302
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001303 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001304 __end_state() {}
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001305
Howard Hinnantac303862010-07-12 15:51:17 +00001306 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001307};
1308
1309template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001310void
1311__end_state<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001312{
Howard Hinnantac303862010-07-12 15:51:17 +00001313 __s.__do_ = __state::__end_state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001314}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001315
1316// __has_one_state
1317
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001318template <class _CharT>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001319class __has_one_state
Howard Hinnantac303862010-07-12 15:51:17 +00001320 : public __node<_CharT>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001321{
Howard Hinnantac303862010-07-12 15:51:17 +00001322 __node<_CharT>* __first_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001323
1324public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001325 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001326 explicit __has_one_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001327 : __first_(__s) {}
1328
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001329 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001330 __node<_CharT>* first() const {return __first_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001331 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001332 __node<_CharT>*& first() {return __first_;}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001333};
1334
1335// __owns_one_state
1336
1337template <class _CharT>
1338class __owns_one_state
1339 : public __has_one_state<_CharT>
1340{
1341 typedef __has_one_state<_CharT> base;
1342
1343public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001344 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001345 explicit __owns_one_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001346 : base(__s) {}
1347
1348 virtual ~__owns_one_state();
1349};
1350
1351template <class _CharT>
1352__owns_one_state<_CharT>::~__owns_one_state()
1353{
1354 delete this->first();
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001355}
1356
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001357// __empty_state
1358
1359template <class _CharT>
1360class __empty_state
1361 : public __owns_one_state<_CharT>
1362{
1363 typedef __owns_one_state<_CharT> base;
1364
1365public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001366 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001367
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001368 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001369 explicit __empty_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001370 : base(__s) {}
1371
Howard Hinnantac303862010-07-12 15:51:17 +00001372 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001373};
1374
1375template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001376void
1377__empty_state<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001378{
Howard Hinnantac303862010-07-12 15:51:17 +00001379 __s.__do_ = __state::__accept_but_not_consume;
1380 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001381}
1382
1383// __empty_non_own_state
1384
1385template <class _CharT>
1386class __empty_non_own_state
1387 : public __has_one_state<_CharT>
1388{
1389 typedef __has_one_state<_CharT> base;
1390
1391public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001392 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001393
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001394 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001395 explicit __empty_non_own_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001396 : base(__s) {}
1397
Howard Hinnantac303862010-07-12 15:51:17 +00001398 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001399};
1400
1401template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001402void
1403__empty_non_own_state<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001404{
Howard Hinnantac303862010-07-12 15:51:17 +00001405 __s.__do_ = __state::__accept_but_not_consume;
1406 __s.__node_ = this->first();
1407}
1408
1409// __repeat_one_loop
1410
1411template <class _CharT>
1412class __repeat_one_loop
1413 : public __has_one_state<_CharT>
1414{
1415 typedef __has_one_state<_CharT> base;
1416
1417public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001418 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantac303862010-07-12 15:51:17 +00001419
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001420 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001421 explicit __repeat_one_loop(__node<_CharT>* __s)
1422 : base(__s) {}
1423
1424 virtual void __exec(__state&) const;
Howard Hinnantac303862010-07-12 15:51:17 +00001425};
1426
1427template <class _CharT>
1428void
1429__repeat_one_loop<_CharT>::__exec(__state& __s) const
1430{
1431 __s.__do_ = __state::__repeat;
1432 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001433}
1434
1435// __owns_two_states
1436
1437template <class _CharT>
1438class __owns_two_states
1439 : public __owns_one_state<_CharT>
1440{
1441 typedef __owns_one_state<_CharT> base;
1442
1443 base* __second_;
1444
1445public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001446 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001447 explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001448 : base(__s1), __second_(__s2) {}
1449
1450 virtual ~__owns_two_states();
1451
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001452 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001453 base* second() const {return __second_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001454 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001455 base*& second() {return __second_;}
1456};
1457
1458template <class _CharT>
1459__owns_two_states<_CharT>::~__owns_two_states()
1460{
1461 delete __second_;
1462}
1463
1464// __loop
1465
1466template <class _CharT>
1467class __loop
1468 : public __owns_two_states<_CharT>
1469{
1470 typedef __owns_two_states<_CharT> base;
1471
1472 size_t __min_;
1473 size_t __max_;
1474 unsigned __loop_id_;
Howard Hinnantac303862010-07-12 15:51:17 +00001475 unsigned __mexp_begin_;
1476 unsigned __mexp_end_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001477 bool __greedy_;
1478
1479public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001480 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001481
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001482 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001483 explicit __loop(unsigned __loop_id,
Howard Hinnantac303862010-07-12 15:51:17 +00001484 __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
1485 unsigned __mexp_begin, unsigned __mexp_end,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001486 bool __greedy = true,
1487 size_t __min = 0,
1488 size_t __max = numeric_limits<size_t>::max())
1489 : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
Howard Hinnantac303862010-07-12 15:51:17 +00001490 __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001491 __greedy_(__greedy) {}
1492
Howard Hinnantac303862010-07-12 15:51:17 +00001493 virtual void __exec(__state& __s) const;
1494 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001495
Howard Hinnantac303862010-07-12 15:51:17 +00001496private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001497 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001498 void __init_repeat(__state& __s) const
1499 {
1500 __s.__loop_data_[__loop_id_].second = __s.__current_;
1501 for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
1502 {
1503 __s.__sub_matches_[__i].first = __s.__last_;
1504 __s.__sub_matches_[__i].second = __s.__last_;
1505 __s.__sub_matches_[__i].matched = false;
1506 }
1507 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001508};
1509
1510template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001511void
1512__loop<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001513{
Howard Hinnantac303862010-07-12 15:51:17 +00001514 if (__s.__do_ == __state::__repeat)
1515 {
1516 bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
1517 bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
1518 if (__do_repeat && __do_alt &&
1519 __s.__loop_data_[__loop_id_].second == __s.__current_)
1520 __do_repeat = false;
1521 if (__do_repeat && __do_alt)
1522 __s.__do_ = __state::__split;
1523 else if (__do_repeat)
1524 {
1525 __s.__do_ = __state::__accept_but_not_consume;
1526 __s.__node_ = this->first();
1527 __init_repeat(__s);
1528 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001529 else
Howard Hinnantac303862010-07-12 15:51:17 +00001530 {
1531 __s.__do_ = __state::__accept_but_not_consume;
1532 __s.__node_ = this->second();
1533 }
1534 }
1535 else
1536 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00001537 __s.__loop_data_[__loop_id_].first = 0;
1538 bool __do_repeat = 0 < __max_;
1539 bool __do_alt = 0 >= __min_;
1540 if (__do_repeat && __do_alt)
Howard Hinnantac303862010-07-12 15:51:17 +00001541 __s.__do_ = __state::__split;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00001542 else if (__do_repeat)
1543 {
1544 __s.__do_ = __state::__accept_but_not_consume;
1545 __s.__node_ = this->first();
1546 __init_repeat(__s);
1547 }
Howard Hinnantac303862010-07-12 15:51:17 +00001548 else
1549 {
1550 __s.__do_ = __state::__accept_but_not_consume;
1551 __s.__node_ = this->second();
1552 }
1553 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001554}
1555
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001556template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001557void
1558__loop<_CharT>::__exec_split(bool __second, __state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001559{
Howard Hinnantac303862010-07-12 15:51:17 +00001560 __s.__do_ = __state::__accept_but_not_consume;
1561 if (__greedy_ != __second)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001562 {
Howard Hinnantac303862010-07-12 15:51:17 +00001563 __s.__node_ = this->first();
1564 __init_repeat(__s);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001565 }
Howard Hinnantac303862010-07-12 15:51:17 +00001566 else
1567 __s.__node_ = this->second();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001568}
1569
Howard Hinnantaa698082010-07-16 19:08:36 +00001570// __alternate
1571
1572template <class _CharT>
1573class __alternate
1574 : public __owns_two_states<_CharT>
1575{
1576 typedef __owns_two_states<_CharT> base;
1577
1578public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001579 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantaa698082010-07-16 19:08:36 +00001580
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001581 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa698082010-07-16 19:08:36 +00001582 explicit __alternate(__owns_one_state<_CharT>* __s1,
1583 __owns_one_state<_CharT>* __s2)
1584 : base(__s1, __s2) {}
1585
1586 virtual void __exec(__state& __s) const;
1587 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnantaa698082010-07-16 19:08:36 +00001588};
1589
1590template <class _CharT>
1591void
1592__alternate<_CharT>::__exec(__state& __s) const
1593{
1594 __s.__do_ = __state::__split;
1595}
1596
1597template <class _CharT>
1598void
1599__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
1600{
1601 __s.__do_ = __state::__accept_but_not_consume;
Howard Hinnant1371b2e2010-07-22 14:12:20 +00001602 if (__second)
Howard Hinnantaa698082010-07-16 19:08:36 +00001603 __s.__node_ = this->second();
Howard Hinnant1371b2e2010-07-22 14:12:20 +00001604 else
1605 __s.__node_ = this->first();
Howard Hinnantaa698082010-07-16 19:08:36 +00001606}
1607
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001608// __begin_marked_subexpression
1609
1610template <class _CharT>
1611class __begin_marked_subexpression
1612 : public __owns_one_state<_CharT>
1613{
1614 typedef __owns_one_state<_CharT> base;
1615
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001616 unsigned __mexp_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001617public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001618 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001619
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001620 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001621 explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001622 : base(__s), __mexp_(__mexp) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001623
Howard Hinnantac303862010-07-12 15:51:17 +00001624 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001625};
1626
1627template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001628void
1629__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001630{
Howard Hinnantac303862010-07-12 15:51:17 +00001631 __s.__do_ = __state::__accept_but_not_consume;
1632 __s.__sub_matches_[__mexp_-1].first = __s.__current_;
1633 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001634}
1635
1636// __end_marked_subexpression
1637
1638template <class _CharT>
1639class __end_marked_subexpression
1640 : public __owns_one_state<_CharT>
1641{
1642 typedef __owns_one_state<_CharT> base;
1643
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001644 unsigned __mexp_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001645public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001646 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001647
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001648 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001649 explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001650 : base(__s), __mexp_(__mexp) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001651
Howard Hinnantac303862010-07-12 15:51:17 +00001652 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001653};
1654
1655template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001656void
1657__end_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001658{
Howard Hinnantac303862010-07-12 15:51:17 +00001659 __s.__do_ = __state::__accept_but_not_consume;
1660 __s.__sub_matches_[__mexp_-1].second = __s.__current_;
1661 __s.__sub_matches_[__mexp_-1].matched = true;
1662 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001663}
1664
Howard Hinnantcba352d2010-07-12 18:16:05 +00001665// __back_ref
1666
1667template <class _CharT>
1668class __back_ref
1669 : public __owns_one_state<_CharT>
1670{
1671 typedef __owns_one_state<_CharT> base;
1672
1673 unsigned __mexp_;
1674public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001675 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcba352d2010-07-12 18:16:05 +00001676
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001677 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcba352d2010-07-12 18:16:05 +00001678 explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
1679 : base(__s), __mexp_(__mexp) {}
1680
1681 virtual void __exec(__state&) const;
Howard Hinnantcba352d2010-07-12 18:16:05 +00001682};
1683
1684template <class _CharT>
1685void
1686__back_ref<_CharT>::__exec(__state& __s) const
1687{
1688 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1689 if (__sm.matched)
1690 {
1691 ptrdiff_t __len = __sm.second - __sm.first;
1692 if (__s.__last_ - __s.__current_ >= __len &&
Howard Hinnant0949eed2011-06-30 21:18:19 +00001693 _VSTD::equal(__sm.first, __sm.second, __s.__current_))
Howard Hinnantcba352d2010-07-12 18:16:05 +00001694 {
1695 __s.__do_ = __state::__accept_but_not_consume;
1696 __s.__current_ += __len;
1697 __s.__node_ = this->first();
1698 }
1699 else
1700 {
1701 __s.__do_ = __state::__reject;
1702 __s.__node_ = nullptr;
1703 }
1704 }
1705 else
1706 {
1707 __s.__do_ = __state::__reject;
1708 __s.__node_ = nullptr;
1709 }
1710}
1711
Howard Hinnante34f17d2010-07-12 19:11:27 +00001712// __back_ref_icase
1713
1714template <class _CharT, class _Traits>
1715class __back_ref_icase
1716 : public __owns_one_state<_CharT>
1717{
1718 typedef __owns_one_state<_CharT> base;
1719
1720 _Traits __traits_;
1721 unsigned __mexp_;
1722public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001723 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001724
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001725 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00001726 explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
1727 __node<_CharT>* __s)
1728 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1729
1730 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001731};
1732
1733template <class _CharT, class _Traits>
1734void
1735__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
1736{
1737 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1738 if (__sm.matched)
1739 {
1740 ptrdiff_t __len = __sm.second - __sm.first;
1741 if (__s.__last_ - __s.__current_ >= __len)
1742 {
1743 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1744 {
1745 if (__traits_.translate_nocase(__sm.first[__i]) !=
1746 __traits_.translate_nocase(__s.__current_[__i]))
1747 goto __not_equal;
1748 }
1749 __s.__do_ = __state::__accept_but_not_consume;
1750 __s.__current_ += __len;
1751 __s.__node_ = this->first();
1752 }
1753 else
1754 {
1755 __s.__do_ = __state::__reject;
1756 __s.__node_ = nullptr;
1757 }
1758 }
1759 else
1760 {
1761__not_equal:
1762 __s.__do_ = __state::__reject;
1763 __s.__node_ = nullptr;
1764 }
1765}
1766
1767// __back_ref_collate
1768
1769template <class _CharT, class _Traits>
1770class __back_ref_collate
1771 : public __owns_one_state<_CharT>
1772{
1773 typedef __owns_one_state<_CharT> base;
1774
1775 _Traits __traits_;
1776 unsigned __mexp_;
1777public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001778 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001779
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001780 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00001781 explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
1782 __node<_CharT>* __s)
1783 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1784
1785 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001786};
1787
1788template <class _CharT, class _Traits>
1789void
1790__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
1791{
1792 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1793 if (__sm.matched)
1794 {
1795 ptrdiff_t __len = __sm.second - __sm.first;
1796 if (__s.__last_ - __s.__current_ >= __len)
1797 {
1798 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1799 {
1800 if (__traits_.translate(__sm.first[__i]) !=
1801 __traits_.translate(__s.__current_[__i]))
1802 goto __not_equal;
1803 }
1804 __s.__do_ = __state::__accept_but_not_consume;
1805 __s.__current_ += __len;
1806 __s.__node_ = this->first();
1807 }
1808 else
1809 {
1810 __s.__do_ = __state::__reject;
1811 __s.__node_ = nullptr;
1812 }
1813 }
1814 else
1815 {
1816__not_equal:
1817 __s.__do_ = __state::__reject;
1818 __s.__node_ = nullptr;
1819 }
1820}
1821
Howard Hinnant17615b02010-07-27 01:25:38 +00001822// __word_boundary
1823
1824template <class _CharT, class _Traits>
1825class __word_boundary
1826 : public __owns_one_state<_CharT>
1827{
1828 typedef __owns_one_state<_CharT> base;
1829
1830 _Traits __traits_;
1831 bool __invert_;
1832public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001833 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant17615b02010-07-27 01:25:38 +00001834
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001835 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00001836 explicit __word_boundary(const _Traits& __traits, bool __invert,
1837 __node<_CharT>* __s)
1838 : base(__s), __traits_(__traits), __invert_(__invert) {}
1839
1840 virtual void __exec(__state&) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00001841};
1842
1843template <class _CharT, class _Traits>
1844void
1845__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
1846{
1847 bool __is_word_b = false;
1848 if (__s.__first_ != __s.__last_)
1849 {
1850 if (__s.__current_ == __s.__last_)
1851 {
1852 if (!(__s.__flags_ & regex_constants::match_not_eow))
1853 {
1854 _CharT __c = __s.__current_[-1];
1855 __is_word_b = __c == '_' ||
1856 __traits_.isctype(__c, ctype_base::alnum);
1857 }
1858 }
Howard Hinnantf3dcca02010-07-29 15:17:28 +00001859 else if (__s.__current_ == __s.__first_ &&
1860 !(__s.__flags_ & regex_constants::match_prev_avail))
Howard Hinnant17615b02010-07-27 01:25:38 +00001861 {
1862 if (!(__s.__flags_ & regex_constants::match_not_bow))
1863 {
1864 _CharT __c = *__s.__current_;
1865 __is_word_b = __c == '_' ||
1866 __traits_.isctype(__c, ctype_base::alnum);
1867 }
1868 }
1869 else
1870 {
1871 _CharT __c1 = __s.__current_[-1];
1872 _CharT __c2 = *__s.__current_;
1873 bool __is_c1_b = __c1 == '_' ||
1874 __traits_.isctype(__c1, ctype_base::alnum);
1875 bool __is_c2_b = __c2 == '_' ||
1876 __traits_.isctype(__c2, ctype_base::alnum);
1877 __is_word_b = __is_c1_b != __is_c2_b;
1878 }
1879 }
1880 if (__is_word_b != __invert_)
1881 {
1882 __s.__do_ = __state::__accept_but_not_consume;
1883 __s.__node_ = this->first();
1884 }
1885 else
1886 {
1887 __s.__do_ = __state::__reject;
1888 __s.__node_ = nullptr;
1889 }
1890}
1891
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001892// __l_anchor
1893
1894template <class _CharT>
1895class __l_anchor
1896 : public __owns_one_state<_CharT>
1897{
1898 typedef __owns_one_state<_CharT> base;
1899
1900public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001901 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001902
1903 _LIBCPP_INLINE_VISIBILITY
1904 __l_anchor(__node<_CharT>* __s)
1905 : base(__s) {}
1906
1907 virtual void __exec(__state&) const;
1908};
1909
1910template <class _CharT>
1911void
1912__l_anchor<_CharT>::__exec(__state& __s) const
1913{
1914 if (__s.__at_first_ && __s.__current_ == __s.__first_)
1915 {
1916 __s.__do_ = __state::__accept_but_not_consume;
1917 __s.__node_ = this->first();
1918 }
1919 else
1920 {
1921 __s.__do_ = __state::__reject;
1922 __s.__node_ = nullptr;
1923 }
1924}
1925
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001926// __r_anchor
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001927
1928template <class _CharT>
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001929class __r_anchor
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001930 : public __owns_one_state<_CharT>
1931{
1932 typedef __owns_one_state<_CharT> base;
1933
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001934public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001935 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001936
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001937 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001938 __r_anchor(__node<_CharT>* __s)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001939 : base(__s) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001940
Howard Hinnantac303862010-07-12 15:51:17 +00001941 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001942};
1943
1944template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001945void
1946__r_anchor<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001947{
Howard Hinnantac303862010-07-12 15:51:17 +00001948 if (__s.__current_ == __s.__last_)
1949 {
1950 __s.__do_ = __state::__accept_but_not_consume;
1951 __s.__node_ = this->first();
1952 }
1953 else
1954 {
1955 __s.__do_ = __state::__reject;
1956 __s.__node_ = nullptr;
1957 }
1958}
1959
1960// __match_any
1961
1962template <class _CharT>
1963class __match_any
1964 : public __owns_one_state<_CharT>
1965{
1966 typedef __owns_one_state<_CharT> base;
1967
1968public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001969 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantac303862010-07-12 15:51:17 +00001970
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001971 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001972 __match_any(__node<_CharT>* __s)
1973 : base(__s) {}
1974
1975 virtual void __exec(__state&) const;
Howard Hinnantac303862010-07-12 15:51:17 +00001976};
1977
1978template <class _CharT>
1979void
1980__match_any<_CharT>::__exec(__state& __s) const
1981{
1982 if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
1983 {
1984 __s.__do_ = __state::__accept_and_consume;
1985 ++__s.__current_;
1986 __s.__node_ = this->first();
1987 }
1988 else
1989 {
1990 __s.__do_ = __state::__reject;
1991 __s.__node_ = nullptr;
1992 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001993}
1994
Howard Hinnant17615b02010-07-27 01:25:38 +00001995// __match_any_but_newline
1996
1997template <class _CharT>
1998class __match_any_but_newline
1999 : public __owns_one_state<_CharT>
2000{
2001 typedef __owns_one_state<_CharT> base;
2002
2003public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002004 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant17615b02010-07-27 01:25:38 +00002005
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002006 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002007 __match_any_but_newline(__node<_CharT>* __s)
2008 : base(__s) {}
2009
2010 virtual void __exec(__state&) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00002011};
2012
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002013// __match_char
2014
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002015template <class _CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002016class __match_char
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002017 : public __owns_one_state<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002018{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002019 typedef __owns_one_state<_CharT> base;
2020
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002021 _CharT __c_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002022
2023 __match_char(const __match_char&);
2024 __match_char& operator=(const __match_char&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002025public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002026 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002027
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002028 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00002029 __match_char(_CharT __c, __node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002030 : base(__s), __c_(__c) {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002031
Howard Hinnantac303862010-07-12 15:51:17 +00002032 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002033};
2034
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002035template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00002036void
2037__match_char<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002038{
Howard Hinnantac303862010-07-12 15:51:17 +00002039 if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2040 {
2041 __s.__do_ = __state::__accept_and_consume;
2042 ++__s.__current_;
2043 __s.__node_ = this->first();
2044 }
2045 else
2046 {
2047 __s.__do_ = __state::__reject;
2048 __s.__node_ = nullptr;
2049 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002050}
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002051
Howard Hinnante34f17d2010-07-12 19:11:27 +00002052// __match_char_icase
2053
2054template <class _CharT, class _Traits>
2055class __match_char_icase
2056 : public __owns_one_state<_CharT>
2057{
2058 typedef __owns_one_state<_CharT> base;
2059
2060 _Traits __traits_;
2061 _CharT __c_;
2062
2063 __match_char_icase(const __match_char_icase&);
2064 __match_char_icase& operator=(const __match_char_icase&);
2065public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002066 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002067
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002068 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002069 __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2070 : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2071
2072 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002073};
2074
2075template <class _CharT, class _Traits>
2076void
2077__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2078{
2079 if (__s.__current_ != __s.__last_ &&
2080 __traits_.translate_nocase(*__s.__current_) == __c_)
2081 {
2082 __s.__do_ = __state::__accept_and_consume;
2083 ++__s.__current_;
2084 __s.__node_ = this->first();
2085 }
2086 else
2087 {
2088 __s.__do_ = __state::__reject;
2089 __s.__node_ = nullptr;
2090 }
2091}
2092
2093// __match_char_collate
2094
2095template <class _CharT, class _Traits>
2096class __match_char_collate
2097 : public __owns_one_state<_CharT>
2098{
2099 typedef __owns_one_state<_CharT> base;
2100
2101 _Traits __traits_;
2102 _CharT __c_;
2103
2104 __match_char_collate(const __match_char_collate&);
2105 __match_char_collate& operator=(const __match_char_collate&);
2106public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002107 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002108
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002109 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002110 __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2111 : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2112
2113 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002114};
2115
2116template <class _CharT, class _Traits>
2117void
2118__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2119{
2120 if (__s.__current_ != __s.__last_ &&
2121 __traits_.translate(*__s.__current_) == __c_)
2122 {
2123 __s.__do_ = __state::__accept_and_consume;
2124 ++__s.__current_;
2125 __s.__node_ = this->first();
2126 }
2127 else
2128 {
2129 __s.__do_ = __state::__reject;
2130 __s.__node_ = nullptr;
2131 }
2132}
2133
Howard Hinnant173968a2010-07-13 21:48:06 +00002134// __bracket_expression
2135
2136template <class _CharT, class _Traits>
2137class __bracket_expression
2138 : public __owns_one_state<_CharT>
2139{
2140 typedef __owns_one_state<_CharT> base;
2141 typedef typename _Traits::string_type string_type;
2142
2143 _Traits __traits_;
2144 vector<_CharT> __chars_;
Howard Hinnant15476f32010-07-28 17:35:27 +00002145 vector<_CharT> __neg_chars_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002146 vector<pair<string_type, string_type> > __ranges_;
2147 vector<pair<_CharT, _CharT> > __digraphs_;
2148 vector<string_type> __equivalences_;
2149 ctype_base::mask __mask_;
Howard Hinnant15476f32010-07-28 17:35:27 +00002150 ctype_base::mask __neg_mask_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002151 bool __negate_;
2152 bool __icase_;
2153 bool __collate_;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002154 bool __might_have_digraph_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002155
2156 __bracket_expression(const __bracket_expression&);
2157 __bracket_expression& operator=(const __bracket_expression&);
2158public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002159 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant173968a2010-07-13 21:48:06 +00002160
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002161 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002162 __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2163 bool __negate, bool __icase, bool __collate)
Howard Hinnant15476f32010-07-28 17:35:27 +00002164 : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2165 __negate_(__negate), __icase_(__icase), __collate_(__collate),
Howard Hinnant68025ed2010-07-14 15:45:11 +00002166 __might_have_digraph_(__traits_.getloc().name() != "C") {}
Howard Hinnant173968a2010-07-13 21:48:06 +00002167
2168 virtual void __exec(__state&) const;
2169
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002170 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002171 bool __negated() const {return __negate_;}
2172
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002173 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002174 void __add_char(_CharT __c)
2175 {
2176 if (__icase_)
2177 __chars_.push_back(__traits_.translate_nocase(__c));
2178 else if (__collate_)
2179 __chars_.push_back(__traits_.translate(__c));
2180 else
2181 __chars_.push_back(__c);
2182 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002183 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002184 void __add_neg_char(_CharT __c)
2185 {
2186 if (__icase_)
2187 __neg_chars_.push_back(__traits_.translate_nocase(__c));
2188 else if (__collate_)
2189 __neg_chars_.push_back(__traits_.translate(__c));
2190 else
2191 __neg_chars_.push_back(__c);
2192 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002193 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002194 void __add_range(string_type __b, string_type __e)
2195 {
2196 if (__collate_)
2197 {
2198 if (__icase_)
2199 {
2200 for (size_t __i = 0; __i < __b.size(); ++__i)
2201 __b[__i] = __traits_.translate_nocase(__b[__i]);
2202 for (size_t __i = 0; __i < __e.size(); ++__i)
2203 __e[__i] = __traits_.translate_nocase(__e[__i]);
2204 }
2205 else
2206 {
2207 for (size_t __i = 0; __i < __b.size(); ++__i)
2208 __b[__i] = __traits_.translate(__b[__i]);
2209 for (size_t __i = 0; __i < __e.size(); ++__i)
2210 __e[__i] = __traits_.translate(__e[__i]);
2211 }
2212 __ranges_.push_back(make_pair(
2213 __traits_.transform(__b.begin(), __b.end()),
2214 __traits_.transform(__e.begin(), __e.end())));
2215 }
2216 else
2217 {
Howard Hinnantd4444702010-08-11 17:04:31 +00002218#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00002219 if (__b.size() != 1 || __e.size() != 1)
2220 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00002221#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00002222 if (__icase_)
2223 {
2224 __b[0] = __traits_.translate_nocase(__b[0]);
2225 __e[0] = __traits_.translate_nocase(__e[0]);
2226 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002227 __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
Howard Hinnant173968a2010-07-13 21:48:06 +00002228 }
2229 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002230 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002231 void __add_digraph(_CharT __c1, _CharT __c2)
2232 {
2233 if (__icase_)
2234 __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
2235 __traits_.translate_nocase(__c2)));
2236 else if (__collate_)
2237 __digraphs_.push_back(make_pair(__traits_.translate(__c1),
2238 __traits_.translate(__c2)));
2239 else
2240 __digraphs_.push_back(make_pair(__c1, __c2));
2241 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002242 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002243 void __add_equivalence(const string_type& __s)
2244 {__equivalences_.push_back(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002245 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002246 void __add_class(ctype_base::mask __mask)
2247 {__mask_ |= __mask;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002248 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002249 void __add_neg_class(ctype_base::mask __mask)
2250 {__neg_mask_ |= __mask;}
Howard Hinnant173968a2010-07-13 21:48:06 +00002251};
2252
2253template <class _CharT, class _Traits>
2254void
2255__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2256{
2257 bool __found = false;
2258 unsigned __consumed = 0;
2259 if (__s.__current_ != __s.__last_)
2260 {
2261 ++__consumed;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002262 if (__might_have_digraph_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002263 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002264 const _CharT* __next = _VSTD::next(__s.__current_);
Howard Hinnant68025ed2010-07-14 15:45:11 +00002265 if (__next != __s.__last_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002266 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002267 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2268 if (__icase_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002269 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002270 __ch2.first = __traits_.translate_nocase(__ch2.first);
2271 __ch2.second = __traits_.translate_nocase(__ch2.second);
2272 }
2273 else if (__collate_)
2274 {
2275 __ch2.first = __traits_.translate(__ch2.first);
2276 __ch2.second = __traits_.translate(__ch2.second);
2277 }
2278 if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2279 {
2280 // __ch2 is a digraph in this locale
2281 ++__consumed;
2282 for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2283 {
2284 if (__ch2 == __digraphs_[__i])
2285 {
2286 __found = true;
2287 goto __exit;
2288 }
2289 }
2290 if (__collate_ && !__ranges_.empty())
2291 {
2292 string_type __s2 = __traits_.transform(&__ch2.first,
2293 &__ch2.first + 2);
2294 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2295 {
2296 if (__ranges_[__i].first <= __s2 &&
2297 __s2 <= __ranges_[__i].second)
2298 {
2299 __found = true;
2300 goto __exit;
2301 }
2302 }
2303 }
2304 if (!__equivalences_.empty())
2305 {
2306 string_type __s2 = __traits_.transform_primary(&__ch2.first,
2307 &__ch2.first + 2);
2308 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2309 {
2310 if (__s2 == __equivalences_[__i])
2311 {
2312 __found = true;
2313 goto __exit;
2314 }
2315 }
2316 }
2317 if (__traits_.isctype(__ch2.first, __mask_) &&
2318 __traits_.isctype(__ch2.second, __mask_))
Howard Hinnant173968a2010-07-13 21:48:06 +00002319 {
2320 __found = true;
2321 goto __exit;
2322 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002323 if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2324 !__traits_.isctype(__ch2.second, __neg_mask_))
2325 {
2326 __found = true;
2327 goto __exit;
2328 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002329 goto __exit;
2330 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002331 }
2332 }
2333 // test *__s.__current_ as not a digraph
2334 _CharT __ch = *__s.__current_;
2335 if (__icase_)
2336 __ch = __traits_.translate_nocase(__ch);
2337 else if (__collate_)
2338 __ch = __traits_.translate(__ch);
2339 for (size_t __i = 0; __i < __chars_.size(); ++__i)
2340 {
2341 if (__ch == __chars_[__i])
2342 {
2343 __found = true;
2344 goto __exit;
2345 }
2346 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002347 if (!__neg_chars_.empty())
2348 {
2349 for (size_t __i = 0; __i < __neg_chars_.size(); ++__i)
2350 {
2351 if (__ch == __neg_chars_[__i])
2352 goto __is_neg_char;
2353 }
2354 __found = true;
2355 goto __exit;
2356 }
2357__is_neg_char:
Howard Hinnant173968a2010-07-13 21:48:06 +00002358 if (!__ranges_.empty())
2359 {
2360 string_type __s2 = __collate_ ?
2361 __traits_.transform(&__ch, &__ch + 1) :
2362 string_type(1, __ch);
2363 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2364 {
2365 if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2366 {
2367 __found = true;
2368 goto __exit;
2369 }
2370 }
2371 }
2372 if (!__equivalences_.empty())
2373 {
2374 string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2375 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2376 {
2377 if (__s2 == __equivalences_[__i])
2378 {
2379 __found = true;
2380 goto __exit;
2381 }
2382 }
2383 }
2384 if (__traits_.isctype(__ch, __mask_))
Howard Hinnant15476f32010-07-28 17:35:27 +00002385 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002386 __found = true;
Howard Hinnant15476f32010-07-28 17:35:27 +00002387 goto __exit;
2388 }
2389 if (__neg_mask_ && !__traits_.isctype(__ch, __neg_mask_))
2390 {
2391 __found = true;
2392 goto __exit;
2393 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002394 }
2395 else
2396 __found = __negate_; // force reject
2397__exit:
2398 if (__found != __negate_)
2399 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002400 __s.__do_ = __state::__accept_and_consume;
2401 __s.__current_ += __consumed;
2402 __s.__node_ = this->first();
2403 }
2404 else
2405 {
2406 __s.__do_ = __state::__reject;
2407 __s.__node_ = nullptr;
2408 }
2409}
2410
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00002411template <class _CharT, class _Traits> class __lookahead;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002412
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002413template <class _CharT, class _Traits = regex_traits<_CharT> >
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002414class _LIBCPP_VISIBLE basic_regex
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002415{
2416public:
2417 // types:
2418 typedef _CharT value_type;
2419 typedef regex_constants::syntax_option_type flag_type;
2420 typedef typename _Traits::locale_type locale_type;
2421
2422private:
2423 _Traits __traits_;
2424 flag_type __flags_;
2425 unsigned __marked_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002426 unsigned __loop_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002427 int __open_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002428 shared_ptr<__empty_state<_CharT> > __start_;
2429 __owns_one_state<_CharT>* __end_;
2430
Howard Hinnant0949eed2011-06-30 21:18:19 +00002431 typedef _VSTD::__state<_CharT> __state;
2432 typedef _VSTD::__node<_CharT> __node;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002433
2434public:
2435 // constants:
Howard Hinnant46623a02012-07-21 01:31:58 +00002436 static const regex_constants::syntax_option_type icase = regex_constants::icase;
2437 static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2438 static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
2439 static const regex_constants::syntax_option_type collate = regex_constants::collate;
2440 static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2441 static const regex_constants::syntax_option_type basic = regex_constants::basic;
2442 static const regex_constants::syntax_option_type extended = regex_constants::extended;
2443 static const regex_constants::syntax_option_type awk = regex_constants::awk;
2444 static const regex_constants::syntax_option_type grep = regex_constants::grep;
2445 static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002446
2447 // construct/copy/destroy:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002448 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002449 basic_regex()
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002450 : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002451 __end_(0)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002452 {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002453 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002454 explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002455 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002456 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002457 {__parse(__p, __p + __traits_.length(__p));}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002458 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002459 basic_regex(const value_type* __p, size_t __len, flag_type __f)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002460 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002461 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002462 {__parse(__p, __p + __len);}
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002463// basic_regex(const basic_regex&) = default;
2464// basic_regex(basic_regex&&) = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002465 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002466 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002467 explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2468 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002469 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002470 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002471 {__parse(__p.begin(), __p.end());}
2472 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002473 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002474 basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2475 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002476 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002477 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002478 {__parse(__first, __last);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002479#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002480 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002481 basic_regex(initializer_list<value_type> __il,
2482 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002483 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002484 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002485 {__parse(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00002486#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002487
Howard Hinnant7026a172010-08-13 18:11:23 +00002488// ~basic_regex() = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002489
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002490// basic_regex& operator=(const basic_regex&) = default;
2491// basic_regex& operator=(basic_regex&&) = default;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002492 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002493 basic_regex& operator=(const value_type* __p)
2494 {return assign(__p);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002495#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002496 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002497 basic_regex& operator=(initializer_list<value_type> __il)
2498 {return assign(__il);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002499#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002500 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002501 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002502 basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2503 {return assign(__p);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002504
2505 // assign:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002506 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002507 basic_regex& assign(const basic_regex& __that)
2508 {return *this = __that;}
Howard Hinnant46623a02012-07-21 01:31:58 +00002509#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2510 _LIBCPP_INLINE_VISIBILITY
2511 basic_regex& assign(basic_regex&& __that) _NOEXCEPT
2512 {return *this = _VSTD::move(__that);}
2513#endif
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002514 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002515 basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2516 {return assign(__p, __p + __traits_.length(__p), __f);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002517 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002518 basic_regex& assign(const value_type* __p, size_t __len, flag_type __f)
2519 {return assign(__p, __p + __len, __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002520 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002521 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002522 basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
Howard Hinnant7026a172010-08-13 18:11:23 +00002523 flag_type __f = regex_constants::ECMAScript)
2524 {return assign(__s.begin(), __s.end(), __f);}
2525
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002526 template <class _InputIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002527 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002528 typename enable_if
2529 <
2530 __is_input_iterator <_InputIterator>::value &&
2531 !__is_forward_iterator<_InputIterator>::value,
2532 basic_regex&
2533 >::type
2534 assign(_InputIterator __first, _InputIterator __last,
2535 flag_type __f = regex_constants::ECMAScript)
2536 {
2537 basic_string<_CharT> __t(__first, __last);
2538 return assign(__t.begin(), __t.end(), __f);
2539 }
2540
2541private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002542 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002543 void __member_init(flag_type __f)
2544 {
2545 __flags_ = __f;
2546 __marked_count_ = 0;
2547 __loop_count_ = 0;
2548 __open_count_ = 0;
2549 __end_ = nullptr;
Howard Hinnant7026a172010-08-13 18:11:23 +00002550 }
2551public:
2552
2553 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002554 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002555 typename enable_if
2556 <
2557 __is_forward_iterator<_ForwardIterator>::value,
2558 basic_regex&
2559 >::type
2560 assign(_ForwardIterator __first, _ForwardIterator __last,
2561 flag_type __f = regex_constants::ECMAScript)
2562 {
2563 __member_init(__f);
2564 __parse(__first, __last);
2565 }
2566
Howard Hinnante3e32912011-08-12 21:56:02 +00002567#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2568
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002569 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002570 basic_regex& assign(initializer_list<value_type> __il,
Howard Hinnant7026a172010-08-13 18:11:23 +00002571 flag_type __f = regex_constants::ECMAScript)
2572 {return assign(__il.begin(), __il.end(), __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002573
Howard Hinnante3e32912011-08-12 21:56:02 +00002574#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2575
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002576 // const operations:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002578 unsigned mark_count() const {return __marked_count_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002579 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002580 flag_type flags() const {return __flags_;}
2581
2582 // locale:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002583 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002584 locale_type imbue(locale_type __loc)
2585 {
2586 __member_init(ECMAScript);
2587 __start_.reset();
2588 return __traits_.imbue(__loc);
2589 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002590 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002591 locale_type getloc() const {return __traits_.getloc();}
2592
2593 // swap:
Howard Hinnant7026a172010-08-13 18:11:23 +00002594 void swap(basic_regex& __r);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002595
2596private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002597 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002598 unsigned __loop_count() const {return __loop_count_;}
2599
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002600 template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002601 _ForwardIterator
2602 __parse(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002603 template <class _ForwardIterator>
2604 _ForwardIterator
2605 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2606 template <class _ForwardIterator>
2607 _ForwardIterator
2608 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2609 template <class _ForwardIterator>
2610 _ForwardIterator
2611 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2612 template <class _ForwardIterator>
2613 _ForwardIterator
2614 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2615 template <class _ForwardIterator>
2616 _ForwardIterator
2617 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2618 template <class _ForwardIterator>
2619 _ForwardIterator
2620 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2621 template <class _ForwardIterator>
2622 _ForwardIterator
2623 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2624 template <class _ForwardIterator>
2625 _ForwardIterator
2626 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2627 template <class _ForwardIterator>
2628 _ForwardIterator
2629 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2630 template <class _ForwardIterator>
2631 _ForwardIterator
2632 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2633 template <class _ForwardIterator>
2634 _ForwardIterator
2635 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2636 template <class _ForwardIterator>
2637 _ForwardIterator
2638 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2639 template <class _ForwardIterator>
2640 _ForwardIterator
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002641 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002642 __owns_one_state<_CharT>* __s,
2643 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002644 template <class _ForwardIterator>
2645 _ForwardIterator
Howard Hinnantaa698082010-07-16 19:08:36 +00002646 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2647 __owns_one_state<_CharT>* __s,
2648 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002649 template <class _ForwardIterator>
2650 _ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00002651 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2652 template <class _ForwardIterator>
2653 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002654 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2655 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002656 template <class _ForwardIterator>
2657 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002658 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2659 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002660 template <class _ForwardIterator>
2661 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002662 __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2663 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002664 template <class _ForwardIterator>
2665 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002666 __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2667 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002668 template <class _ForwardIterator>
2669 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002670 __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2671 basic_string<_CharT>& __col_sym);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002672 template <class _ForwardIterator>
2673 _ForwardIterator
2674 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002675 template <class _ForwardIterator>
2676 _ForwardIterator
2677 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2678 template <class _ForwardIterator>
2679 _ForwardIterator
2680 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2681 template <class _ForwardIterator>
2682 _ForwardIterator
2683 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2684 template <class _ForwardIterator>
2685 _ForwardIterator
2686 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2687 template <class _ForwardIterator>
2688 _ForwardIterator
2689 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2690 template <class _ForwardIterator>
2691 _ForwardIterator
2692 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002693 template <class _ForwardIterator>
2694 _ForwardIterator
2695 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2696 template <class _ForwardIterator>
2697 _ForwardIterator
2698 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2699 template <class _ForwardIterator>
2700 _ForwardIterator
2701 __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2702 template <class _ForwardIterator>
2703 _ForwardIterator
2704 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2705 template <class _ForwardIterator>
2706 _ForwardIterator
2707 __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2708 template <class _ForwardIterator>
2709 _ForwardIterator
Howard Hinnant17615b02010-07-27 01:25:38 +00002710 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2711 template <class _ForwardIterator>
2712 _ForwardIterator
2713 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2714 template <class _ForwardIterator>
2715 _ForwardIterator
2716 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2717 template <class _ForwardIterator>
2718 _ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00002719 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2720 basic_string<_CharT>* __str = nullptr);
Howard Hinnant17615b02010-07-27 01:25:38 +00002721 template <class _ForwardIterator>
2722 _ForwardIterator
2723 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant856846b2010-07-27 19:53:10 +00002724 template <class _ForwardIterator>
2725 _ForwardIterator
2726 __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2727 template <class _ForwardIterator>
2728 _ForwardIterator
2729 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant15476f32010-07-28 17:35:27 +00002730 template <class _ForwardIterator>
2731 _ForwardIterator
2732 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2733 basic_string<_CharT>& __str,
2734 __bracket_expression<_CharT, _Traits>* __ml);
2735 template <class _ForwardIterator>
2736 _ForwardIterator
2737 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2738 basic_string<_CharT>* __str = nullptr);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002739
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002740 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002741 void __push_l_anchor();
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002742 void __push_r_anchor();
Howard Hinnantac303862010-07-12 15:51:17 +00002743 void __push_match_any();
Howard Hinnant17615b02010-07-27 01:25:38 +00002744 void __push_match_any_but_newline();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002745 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002746 void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2747 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2748 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2749 __mexp_begin, __mexp_end);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002750 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002751 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2752 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2753 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2754 __mexp_begin, __mexp_end, false);}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002755 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
2756 size_t __mexp_begin = 0, size_t __mexp_end = 0,
2757 bool __greedy = true);
Howard Hinnant173968a2010-07-13 21:48:06 +00002758 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002759 void __push_char(value_type __c);
Howard Hinnantcba352d2010-07-12 18:16:05 +00002760 void __push_back_ref(int __i);
Howard Hinnantaa698082010-07-16 19:08:36 +00002761 void __push_alternation(__owns_one_state<_CharT>* __sa,
2762 __owns_one_state<_CharT>* __sb);
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002763 void __push_begin_marked_subexpression();
2764 void __push_end_marked_subexpression(unsigned);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002765 void __push_empty();
Howard Hinnant17615b02010-07-27 01:25:38 +00002766 void __push_word_boundary(bool);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002767 void __push_lookahead(const basic_regex&, bool);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002768
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002769 template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002770 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002771 __search(const _CharT* __first, const _CharT* __last,
2772 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002773 regex_constants::match_flag_type __flags) const;
2774
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002775 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002776 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002777 __match_at_start(const _CharT* __first, const _CharT* __last,
2778 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002779 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00002780 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002781 bool
Howard Hinnant17615b02010-07-27 01:25:38 +00002782 __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
2783 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002784 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002785 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002786 bool
2787 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002788 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002789 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002790 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002791 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002792 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
2793 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002794 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002795
Howard Hinnant99968442011-11-29 18:15:50 +00002796 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002797 friend
2798 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002799 regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002800 regex_constants::match_flag_type);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002801
Howard Hinnant99968442011-11-29 18:15:50 +00002802 template <class _Ap, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002803 friend
2804 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002805 regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
2806 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002807
Howard Hinnant99968442011-11-29 18:15:50 +00002808 template <class _Bp, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002809 friend
2810 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002811 regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002812 regex_constants::match_flag_type);
2813
Howard Hinnant99968442011-11-29 18:15:50 +00002814 template <class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002815 friend
2816 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002817 regex_search(const _Cp*, const _Cp*,
2818 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002819
Howard Hinnant99968442011-11-29 18:15:50 +00002820 template <class _Cp, class _Ap, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002821 friend
2822 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002823 regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002824 regex_constants::match_flag_type);
2825
Howard Hinnant99968442011-11-29 18:15:50 +00002826 template <class _ST, class _SA, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002827 friend
2828 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002829 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2830 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002831 regex_constants::match_flag_type __flags);
2832
Howard Hinnant99968442011-11-29 18:15:50 +00002833 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002834 friend
2835 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002836 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2837 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
2838 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002839 regex_constants::match_flag_type __flags);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002840
2841 template <class, class> friend class __lookahead;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002842};
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002843
2844template <class _CharT, class _Traits>
Howard Hinnant7026a172010-08-13 18:11:23 +00002845void
2846basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002847{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002848 using _VSTD::swap;
Howard Hinnant7026a172010-08-13 18:11:23 +00002849 swap(__traits_, __r.__traits_);
2850 swap(__flags_, __r.__flags_);
2851 swap(__marked_count_, __r.__marked_count_);
2852 swap(__loop_count_, __r.__loop_count_);
2853 swap(__open_count_, __r.__open_count_);
2854 swap(__start_, __r.__start_);
2855 swap(__end_, __r.__end_);
Howard Hinnant7026a172010-08-13 18:11:23 +00002856}
2857
2858template <class _CharT, class _Traits>
2859inline _LIBCPP_INLINE_VISIBILITY
2860void
2861swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
2862{
2863 return __x.swap(__y);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002864}
2865
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002866// __lookahead
2867
2868template <class _CharT, class _Traits>
2869class __lookahead
2870 : public __owns_one_state<_CharT>
2871{
2872 typedef __owns_one_state<_CharT> base;
2873
2874 basic_regex<_CharT, _Traits> __exp_;
2875 bool __invert_;
2876
2877 __lookahead(const __lookahead&);
2878 __lookahead& operator=(const __lookahead&);
2879public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002880 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002881
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002882 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002883 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s)
2884 : base(__s), __exp_(__exp), __invert_(__invert) {}
2885
2886 virtual void __exec(__state&) const;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002887};
2888
2889template <class _CharT, class _Traits>
2890void
2891__lookahead<_CharT, _Traits>::__exec(__state& __s) const
2892{
2893 match_results<const _CharT*> __m;
2894 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
2895 bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002896 __m,
2897 __s.__flags_ | regex_constants::match_continuous,
2898 true);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002899 if (__matched != __invert_)
2900 {
2901 __s.__do_ = __state::__accept_but_not_consume;
2902 __s.__node_ = this->first();
2903 }
2904 else
2905 {
2906 __s.__do_ = __state::__reject;
2907 __s.__node_ = nullptr;
2908 }
2909}
2910
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002911template <class _CharT, class _Traits>
2912template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002913_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002914basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
2915 _ForwardIterator __last)
2916{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002917 {
Howard Hinnantac303862010-07-12 15:51:17 +00002918 unique_ptr<__node> __h(new __end_state<_CharT>);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002919 __start_.reset(new __empty_state<_CharT>(__h.get()));
2920 __h.release();
2921 __end_ = __start_.get();
2922 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002923 switch (__flags_ & 0x1F0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002924 {
2925 case ECMAScript:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002926 __first = __parse_ecma_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002927 break;
2928 case basic:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002929 __first = __parse_basic_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002930 break;
2931 case extended:
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002932 case awk:
Howard Hinnant15476f32010-07-28 17:35:27 +00002933 __first = __parse_extended_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002934 break;
2935 case grep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002936 __first = __parse_grep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002937 break;
2938 case egrep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002939 __first = __parse_egrep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002940 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00002941#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002942 default:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002943 throw regex_error(regex_constants::__re_err_grammar);
Howard Hinnant324bb032010-08-22 00:02:43 +00002944#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002945 }
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002946 return __first;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002947}
2948
2949template <class _CharT, class _Traits>
2950template <class _ForwardIterator>
2951_ForwardIterator
2952basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
2953 _ForwardIterator __last)
2954{
2955 if (__first != __last)
2956 {
2957 if (*__first == '^')
2958 {
2959 __push_l_anchor();
2960 ++__first;
2961 }
2962 if (__first != __last)
2963 {
2964 __first = __parse_RE_expression(__first, __last);
2965 if (__first != __last)
2966 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002967 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002968 if (__temp == __last && *__first == '$')
2969 {
2970 __push_r_anchor();
2971 ++__first;
2972 }
2973 }
2974 }
Howard Hinnantd4444702010-08-11 17:04:31 +00002975#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002976 if (__first != __last)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002977 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00002978#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002979 }
2980 return __first;
2981}
2982
2983template <class _CharT, class _Traits>
2984template <class _ForwardIterator>
2985_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002986basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
2987 _ForwardIterator __last)
2988{
Howard Hinnantaa698082010-07-16 19:08:36 +00002989 __owns_one_state<_CharT>* __sa = __end_;
2990 _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00002991#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00002992 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002993 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00002994#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00002995 __first = __temp;
2996 while (__first != __last && *__first == '|')
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002997 {
Howard Hinnantaa698082010-07-16 19:08:36 +00002998 __owns_one_state<_CharT>* __sb = __end_;
2999 __temp = __parse_ERE_branch(++__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003000#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003001 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003002 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003003#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003004 __push_alternation(__sa, __sb);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003005 __first = __temp;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003006 }
3007 return __first;
3008}
3009
3010template <class _CharT, class _Traits>
3011template <class _ForwardIterator>
3012_ForwardIterator
3013basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3014 _ForwardIterator __last)
3015{
3016 _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003017#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003018 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003019 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003020#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003021 do
3022 {
3023 __first = __temp;
3024 __temp = __parse_ERE_expression(__first, __last);
3025 } while (__temp != __first);
3026 return __first;
3027}
3028
3029template <class _CharT, class _Traits>
3030template <class _ForwardIterator>
3031_ForwardIterator
3032basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3033 _ForwardIterator __last)
3034{
Howard Hinnantaa698082010-07-16 19:08:36 +00003035 __owns_one_state<_CharT>* __e = __end_;
3036 unsigned __mexp_begin = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003037 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3038 if (__temp == __first && __temp != __last)
3039 {
3040 switch (*__temp)
3041 {
3042 case '^':
3043 __push_l_anchor();
3044 ++__temp;
3045 break;
3046 case '$':
3047 __push_r_anchor();
3048 ++__temp;
3049 break;
3050 case '(':
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003051 __push_begin_marked_subexpression();
3052 unsigned __temp_count = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003053 ++__open_count_;
3054 __temp = __parse_extended_reg_exp(++__temp, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003055#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003056 if (__temp == __last || *__temp != ')')
3057 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00003058#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003059 __push_end_marked_subexpression(__temp_count);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003060 --__open_count_;
3061 ++__temp;
3062 break;
3063 }
3064 }
3065 if (__temp != __first)
Howard Hinnantaa698082010-07-16 19:08:36 +00003066 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3067 __marked_count_+1);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003068 __first = __temp;
3069 return __first;
3070}
3071
3072template <class _CharT, class _Traits>
3073template <class _ForwardIterator>
3074_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003075basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3076 _ForwardIterator __last)
3077{
3078 while (true)
3079 {
3080 _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3081 if (__temp == __first)
3082 break;
3083 __first = __temp;
3084 }
3085 return __first;
3086}
3087
3088template <class _CharT, class _Traits>
3089template <class _ForwardIterator>
3090_ForwardIterator
3091basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3092 _ForwardIterator __last)
3093{
3094 if (__first != __last)
3095 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003096 __owns_one_state<_CharT>* __e = __end_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003097 unsigned __mexp_begin = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003098 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3099 if (__temp != __first)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003100 __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3101 __mexp_begin+1, __marked_count_+1);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003102 }
3103 return __first;
3104}
3105
3106template <class _CharT, class _Traits>
3107template <class _ForwardIterator>
3108_ForwardIterator
3109basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3110 _ForwardIterator __last)
3111{
3112 _ForwardIterator __temp = __first;
3113 __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3114 if (__temp == __first)
3115 {
3116 __temp = __parse_Back_open_paren(__first, __last);
3117 if (__temp != __first)
3118 {
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003119 __push_begin_marked_subexpression();
3120 unsigned __temp_count = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003121 __first = __parse_RE_expression(__temp, __last);
3122 __temp = __parse_Back_close_paren(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003123#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003124 if (__temp == __first)
3125 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00003126#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003127 __push_end_marked_subexpression(__temp_count);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003128 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003129 }
3130 else
3131 __first = __parse_BACKREF(__first, __last);
3132 }
3133 return __first;
3134}
3135
3136template <class _CharT, class _Traits>
3137template <class _ForwardIterator>
3138_ForwardIterator
3139basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3140 _ForwardIterator __first,
3141 _ForwardIterator __last)
3142{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003143 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003144 if (__temp == __first)
3145 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003146 __temp = __parse_QUOTED_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003147 if (__temp == __first)
3148 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003149 if (__temp != __last && *__temp == '.')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003150 {
3151 __push_match_any();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003152 ++__temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003153 }
3154 else
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003155 __temp = __parse_bracket_expression(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003156 }
3157 }
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003158 __first = __temp;
3159 return __first;
3160}
3161
3162template <class _CharT, class _Traits>
3163template <class _ForwardIterator>
3164_ForwardIterator
3165basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3166 _ForwardIterator __first,
3167 _ForwardIterator __last)
3168{
3169 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3170 if (__temp == __first)
3171 {
3172 __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3173 if (__temp == __first)
3174 {
3175 if (__temp != __last && *__temp == '.')
3176 {
3177 __push_match_any();
3178 ++__temp;
3179 }
3180 else
3181 __temp = __parse_bracket_expression(__first, __last);
3182 }
3183 }
3184 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003185 return __first;
3186}
3187
3188template <class _CharT, class _Traits>
3189template <class _ForwardIterator>
3190_ForwardIterator
3191basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3192 _ForwardIterator __last)
3193{
3194 if (__first != __last)
3195 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003196 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003197 if (__temp != __last)
3198 {
3199 if (*__first == '\\' && *__temp == '(')
3200 __first = ++__temp;
3201 }
3202 }
3203 return __first;
3204}
3205
3206template <class _CharT, class _Traits>
3207template <class _ForwardIterator>
3208_ForwardIterator
3209basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3210 _ForwardIterator __last)
3211{
3212 if (__first != __last)
3213 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003214 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003215 if (__temp != __last)
3216 {
3217 if (*__first == '\\' && *__temp == ')')
3218 __first = ++__temp;
3219 }
3220 }
3221 return __first;
3222}
3223
3224template <class _CharT, class _Traits>
3225template <class _ForwardIterator>
3226_ForwardIterator
3227basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3228 _ForwardIterator __last)
3229{
3230 if (__first != __last)
3231 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003232 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003233 if (__temp != __last)
3234 {
3235 if (*__first == '\\' && *__temp == '{')
3236 __first = ++__temp;
3237 }
3238 }
3239 return __first;
3240}
3241
3242template <class _CharT, class _Traits>
3243template <class _ForwardIterator>
3244_ForwardIterator
3245basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3246 _ForwardIterator __last)
3247{
3248 if (__first != __last)
3249 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003250 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003251 if (__temp != __last)
3252 {
3253 if (*__first == '\\' && *__temp == '}')
3254 __first = ++__temp;
3255 }
3256 }
3257 return __first;
3258}
3259
3260template <class _CharT, class _Traits>
3261template <class _ForwardIterator>
3262_ForwardIterator
3263basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3264 _ForwardIterator __last)
3265{
3266 if (__first != __last)
3267 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003268 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003269 if (__temp != __last)
3270 {
3271 if (*__first == '\\' && '1' <= *__temp && *__temp <= '9')
3272 {
3273 __push_back_ref(*__temp - '0');
3274 __first = ++__temp;
3275 }
3276 }
3277 }
3278 return __first;
3279}
3280
3281template <class _CharT, class _Traits>
3282template <class _ForwardIterator>
3283_ForwardIterator
3284basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3285 _ForwardIterator __last)
3286{
3287 if (__first != __last)
3288 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003289 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003290 if (__temp == __last && *__first == '$')
3291 return __first;
3292 // Not called inside a bracket
3293 if (*__first == '.' || *__first == '\\' || *__first == '[')
3294 return __first;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003295 __push_char(*__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003296 ++__first;
3297 }
3298 return __first;
3299}
3300
3301template <class _CharT, class _Traits>
3302template <class _ForwardIterator>
3303_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003304basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3305 _ForwardIterator __last)
3306{
3307 if (__first != __last)
3308 {
3309 switch (*__first)
3310 {
3311 case '^':
3312 case '.':
3313 case '[':
3314 case '$':
3315 case '(':
3316 case '|':
3317 case '*':
3318 case '+':
3319 case '?':
3320 case '{':
3321 case '\\':
3322 break;
3323 case ')':
3324 if (__open_count_ == 0)
3325 {
3326 __push_char(*__first);
3327 ++__first;
3328 }
3329 break;
3330 default:
3331 __push_char(*__first);
3332 ++__first;
3333 break;
3334 }
3335 }
3336 return __first;
3337}
3338
3339template <class _CharT, class _Traits>
3340template <class _ForwardIterator>
3341_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003342basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3343 _ForwardIterator __last)
3344{
3345 if (__first != __last)
3346 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003347 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003348 if (__temp != __last)
3349 {
3350 if (*__first == '\\')
3351 {
3352 switch (*__temp)
3353 {
3354 case '^':
3355 case '.':
3356 case '*':
3357 case '[':
3358 case '$':
3359 case '\\':
Howard Hinnant0de86b62010-06-25 20:56:08 +00003360 __push_char(*__temp);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003361 __first = ++__temp;
3362 break;
3363 }
3364 }
3365 }
3366 }
3367 return __first;
3368}
3369
3370template <class _CharT, class _Traits>
3371template <class _ForwardIterator>
3372_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003373basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3374 _ForwardIterator __last)
3375{
3376 if (__first != __last)
3377 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003378 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003379 if (__temp != __last)
3380 {
3381 if (*__first == '\\')
3382 {
3383 switch (*__temp)
3384 {
3385 case '^':
3386 case '.':
3387 case '*':
3388 case '[':
3389 case '$':
3390 case '\\':
3391 case '(':
3392 case ')':
3393 case '|':
3394 case '+':
3395 case '?':
3396 case '{':
3397 __push_char(*__temp);
3398 __first = ++__temp;
3399 break;
Howard Hinnant15476f32010-07-28 17:35:27 +00003400 default:
3401 if ((__flags_ & 0x1F0) == awk)
3402 __first = __parse_awk_escape(++__first, __last);
3403 break;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003404 }
3405 }
3406 }
3407 }
3408 return __first;
3409}
3410
3411template <class _CharT, class _Traits>
3412template <class _ForwardIterator>
3413_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003414basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003415 _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003416 __owns_one_state<_CharT>* __s,
3417 unsigned __mexp_begin,
3418 unsigned __mexp_end)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003419{
3420 if (__first != __last)
3421 {
Howard Hinnant0de86b62010-06-25 20:56:08 +00003422 if (*__first == '*')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003423 {
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003424 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003425 ++__first;
3426 }
3427 else
3428 {
3429 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3430 if (__temp != __first)
3431 {
3432 int __min = 0;
3433 __first = __temp;
3434 __temp = __parse_DUP_COUNT(__first, __last, __min);
Howard Hinnantd4444702010-08-11 17:04:31 +00003435#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003436 if (__temp == __first)
3437 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003438#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003439 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003440#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003441 if (__first == __last)
3442 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003443#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003444 if (*__first != ',')
3445 {
3446 __temp = __parse_Back_close_brace(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003447#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003448 if (__temp == __first)
3449 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003450#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcba352d2010-07-12 18:16:05 +00003451 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3452 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003453 __first = __temp;
3454 }
3455 else
3456 {
3457 ++__first; // consume ','
3458 int __max = -1;
3459 __first = __parse_DUP_COUNT(__first, __last, __max);
3460 __temp = __parse_Back_close_brace(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003461#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003462 if (__temp == __first)
3463 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003464#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003465 if (__max == -1)
Howard Hinnantaa698082010-07-16 19:08:36 +00003466 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003467 else
3468 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003469#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003470 if (__max < __min)
3471 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003472#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcba352d2010-07-12 18:16:05 +00003473 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3474 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003475 }
3476 __first = __temp;
3477 }
3478 }
3479 }
3480 }
3481 return __first;
3482}
3483
Howard Hinnant0de86b62010-06-25 20:56:08 +00003484template <class _CharT, class _Traits>
3485template <class _ForwardIterator>
3486_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003487basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantaa698082010-07-16 19:08:36 +00003488 _ForwardIterator __last,
3489 __owns_one_state<_CharT>* __s,
3490 unsigned __mexp_begin,
3491 unsigned __mexp_end)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003492{
3493 if (__first != __last)
3494 {
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003495 unsigned __grammar = __flags_ & 0x1F0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003496 switch (*__first)
3497 {
3498 case '*':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003499 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003500 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003501 {
3502 ++__first;
3503 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3504 }
3505 else
3506 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003507 break;
3508 case '+':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003509 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003510 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003511 {
3512 ++__first;
3513 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3514 }
3515 else
3516 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003517 break;
3518 case '?':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003519 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003520 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003521 {
3522 ++__first;
3523 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3524 }
3525 else
3526 __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003527 break;
3528 case '{':
3529 {
3530 int __min;
Howard Hinnantaa698082010-07-16 19:08:36 +00003531 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
Howard Hinnantd4444702010-08-11 17:04:31 +00003532#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003533 if (__temp == __first)
3534 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003535#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003536 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003537#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003538 if (__first == __last)
3539 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003540#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003541 switch (*__first)
3542 {
3543 case '}':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003544 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003545 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003546 {
3547 ++__first;
3548 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3549 }
3550 else
3551 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003552 break;
3553 case ',':
Howard Hinnantd4444702010-08-11 17:04:31 +00003554 ++__first;
3555#ifndef _LIBCPP_NO_EXCEPTIONS
3556 if (__first == __last)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003557 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003558#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003559 if (*__first == '}')
3560 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003561 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003562 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003563 {
3564 ++__first;
3565 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3566 }
3567 else
3568 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003569 }
3570 else
3571 {
Howard Hinnantaa698082010-07-16 19:08:36 +00003572 int __max = -1;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003573 __temp = __parse_DUP_COUNT(__first, __last, __max);
Howard Hinnantd4444702010-08-11 17:04:31 +00003574#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003575 if (__temp == __first)
3576 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003577#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003578 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003579#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003580 if (__first == __last || *__first != '}')
3581 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003582#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003583 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00003584#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003585 if (__max < __min)
3586 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003587#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003588 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003589 {
3590 ++__first;
3591 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3592 }
3593 else
3594 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003595 }
Howard Hinnantaa698082010-07-16 19:08:36 +00003596 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003597#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003598 default:
3599 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003600#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003601 }
3602 }
3603 break;
3604 }
3605 }
3606 return __first;
3607}
3608
3609template <class _CharT, class _Traits>
3610template <class _ForwardIterator>
3611_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003612basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3613 _ForwardIterator __last)
3614{
3615 if (__first != __last && *__first == '[')
3616 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003617 ++__first;
3618#ifndef _LIBCPP_NO_EXCEPTIONS
3619 if (__first == __last)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003620 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003621#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003622 bool __negate = false;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003623 if (*__first == '^')
3624 {
3625 ++__first;
Howard Hinnant173968a2010-07-13 21:48:06 +00003626 __negate = true;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003627 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003628 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3629 // __ml owned by *this
Howard Hinnantd4444702010-08-11 17:04:31 +00003630#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003631 if (__first == __last)
3632 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003633#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003634 if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']')
Howard Hinnant0de86b62010-06-25 20:56:08 +00003635 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003636 __ml->__add_char(']');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003637 ++__first;
3638 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003639 __first = __parse_follow_list(__first, __last, __ml);
Howard Hinnantd4444702010-08-11 17:04:31 +00003640#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003641 if (__first == __last)
3642 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003643#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003644 if (*__first == '-')
3645 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003646 __ml->__add_char('-');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003647 ++__first;
3648 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003649#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003650 if (__first == __last || *__first != ']')
3651 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003652#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003653 ++__first;
3654 }
3655 return __first;
3656}
3657
3658template <class _CharT, class _Traits>
3659template <class _ForwardIterator>
3660_ForwardIterator
3661basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003662 _ForwardIterator __last,
3663 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003664{
3665 if (__first != __last)
3666 {
3667 while (true)
3668 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003669 _ForwardIterator __temp = __parse_expression_term(__first, __last,
3670 __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003671 if (__temp == __first)
3672 break;
3673 __first = __temp;
3674 }
3675 }
3676 return __first;
3677}
3678
3679template <class _CharT, class _Traits>
3680template <class _ForwardIterator>
3681_ForwardIterator
3682basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003683 _ForwardIterator __last,
3684 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003685{
3686 if (__first != __last && *__first != ']')
3687 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003688 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant173968a2010-07-13 21:48:06 +00003689 basic_string<_CharT> __start_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003690 if (__temp != __last && *__first == '[')
3691 {
3692 if (*__temp == '=')
Howard Hinnant173968a2010-07-13 21:48:06 +00003693 return __parse_equivalence_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003694 else if (*__temp == ':')
Howard Hinnant173968a2010-07-13 21:48:06 +00003695 return __parse_character_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003696 else if (*__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003697 __first = __parse_collating_symbol(++__temp, __last, __start_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003698 }
Howard Hinnant15476f32010-07-28 17:35:27 +00003699 unsigned __grammar = __flags_ & 0x1F0;
3700 if (__start_range.empty())
Howard Hinnant0de86b62010-06-25 20:56:08 +00003701 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003702 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3703 {
3704 if (__grammar == ECMAScript)
3705 __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3706 else
3707 __first = __parse_awk_escape(++__first, __last, &__start_range);
3708 }
3709 else
3710 {
3711 __start_range = *__first;
3712 ++__first;
3713 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003714 }
3715 if (__first != __last && *__first != ']')
3716 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003717 __temp = _VSTD::next(__first);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003718 if (__temp != __last && *__first == '-' && *__temp != ']')
3719 {
3720 // parse a range
Howard Hinnant173968a2010-07-13 21:48:06 +00003721 basic_string<_CharT> __end_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003722 __first = __temp;
3723 ++__temp;
3724 if (__temp != __last && *__first == '[' && *__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003725 __first = __parse_collating_symbol(++__temp, __last, __end_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003726 else
3727 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003728 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3729 {
3730 if (__grammar == ECMAScript)
3731 __first = __parse_class_escape(++__first, __last,
3732 __end_range, __ml);
3733 else
3734 __first = __parse_awk_escape(++__first, __last,
3735 &__end_range);
3736 }
3737 else
3738 {
3739 __end_range = *__first;
3740 ++__first;
3741 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003742 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003743 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
Howard Hinnant0de86b62010-06-25 20:56:08 +00003744 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003745 else
3746 {
3747 if (__start_range.size() == 1)
3748 __ml->__add_char(__start_range[0]);
3749 else
3750 __ml->__add_digraph(__start_range[0], __start_range[1]);
3751 }
3752 }
3753 else
3754 {
3755 if (__start_range.size() == 1)
3756 __ml->__add_char(__start_range[0]);
3757 else
3758 __ml->__add_digraph(__start_range[0], __start_range[1]);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003759 }
3760 }
3761 return __first;
3762}
3763
3764template <class _CharT, class _Traits>
3765template <class _ForwardIterator>
3766_ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00003767basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
3768 _ForwardIterator __last,
3769 basic_string<_CharT>& __str,
3770 __bracket_expression<_CharT, _Traits>* __ml)
3771{
Howard Hinnantd4444702010-08-11 17:04:31 +00003772#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003773 if (__first == __last)
3774 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003775#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003776 switch (*__first)
3777 {
3778 case 0:
3779 __str = *__first;
3780 return ++__first;
3781 case 'b':
3782 __str = _CharT(8);
3783 return ++__first;
3784 case 'd':
3785 __ml->__add_class(ctype_base::digit);
3786 return ++__first;
3787 case 'D':
3788 __ml->__add_neg_class(ctype_base::digit);
3789 return ++__first;
3790 case 's':
3791 __ml->__add_class(ctype_base::space);
3792 return ++__first;
3793 case 'S':
3794 __ml->__add_neg_class(ctype_base::space);
3795 return ++__first;
3796 case 'w':
3797 __ml->__add_class(ctype_base::alnum);
3798 __ml->__add_char('_');
3799 return ++__first;
3800 case 'W':
3801 __ml->__add_neg_class(ctype_base::alnum);
3802 __ml->__add_neg_char('_');
3803 return ++__first;
3804 }
3805 __first = __parse_character_escape(__first, __last, &__str);
3806 return __first;
3807}
3808
3809template <class _CharT, class _Traits>
3810template <class _ForwardIterator>
3811_ForwardIterator
3812basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
3813 _ForwardIterator __last,
3814 basic_string<_CharT>* __str)
3815{
Howard Hinnantd4444702010-08-11 17:04:31 +00003816#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003817 if (__first == __last)
3818 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003819#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003820 switch (*__first)
3821 {
3822 case '\\':
3823 case '"':
3824 case '/':
3825 if (__str)
3826 *__str = *__first;
3827 else
3828 __push_char(*__first);
3829 return ++__first;
3830 case 'a':
3831 if (__str)
3832 *__str = _CharT(7);
3833 else
3834 __push_char(_CharT(7));
3835 return ++__first;
3836 case 'b':
3837 if (__str)
3838 *__str = _CharT(8);
3839 else
3840 __push_char(_CharT(8));
3841 return ++__first;
3842 case 'f':
3843 if (__str)
3844 *__str = _CharT(0xC);
3845 else
3846 __push_char(_CharT(0xC));
3847 return ++__first;
3848 case 'n':
3849 if (__str)
3850 *__str = _CharT(0xA);
3851 else
3852 __push_char(_CharT(0xA));
3853 return ++__first;
3854 case 'r':
3855 if (__str)
3856 *__str = _CharT(0xD);
3857 else
3858 __push_char(_CharT(0xD));
3859 return ++__first;
3860 case 't':
3861 if (__str)
3862 *__str = _CharT(0x9);
3863 else
3864 __push_char(_CharT(0x9));
3865 return ++__first;
3866 case 'v':
3867 if (__str)
3868 *__str = _CharT(0xB);
3869 else
3870 __push_char(_CharT(0xB));
3871 return ++__first;
3872 }
3873 if ('0' <= *__first && *__first <= '7')
3874 {
3875 unsigned __val = *__first - '0';
3876 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3877 {
3878 __val = 8 * __val + *__first - '0';
3879 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3880 __val = 8 * __val + *__first - '0';
3881 }
3882 if (__str)
3883 *__str = _CharT(__val);
3884 else
3885 __push_char(_CharT(__val));
3886 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003887#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003888 else
3889 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003890#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003891 return __first;
3892}
3893
3894template <class _CharT, class _Traits>
3895template <class _ForwardIterator>
3896_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003897basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003898 _ForwardIterator __last,
3899 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003900{
3901 // Found [=
3902 // This means =] must exist
3903 value_type _Equal_close[2] = {'=', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003904 _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00003905 _Equal_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00003906#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003907 if (__temp == __last)
3908 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003909#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003910 // [__first, __temp) contains all text in [= ... =]
3911 typedef typename _Traits::string_type string_type;
3912 string_type __collate_name =
3913 __traits_.lookup_collatename(__first, __temp);
Howard Hinnantd4444702010-08-11 17:04:31 +00003914#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003915 if (__collate_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003916 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00003917#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003918 string_type __equiv_name =
3919 __traits_.transform_primary(__collate_name.begin(),
3920 __collate_name.end());
3921 if (!__equiv_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003922 __ml->__add_equivalence(__equiv_name);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003923 else
Howard Hinnant173968a2010-07-13 21:48:06 +00003924 {
3925 switch (__collate_name.size())
3926 {
3927 case 1:
3928 __ml->__add_char(__collate_name[0]);
3929 break;
3930 case 2:
3931 __ml->__add_digraph(__collate_name[0], __collate_name[1]);
3932 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003933#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003934 default:
3935 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00003936#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003937 }
3938 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003939 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003940 return __first;
3941}
3942
3943template <class _CharT, class _Traits>
3944template <class _ForwardIterator>
3945_ForwardIterator
3946basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003947 _ForwardIterator __last,
3948 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003949{
3950 // Found [:
3951 // This means :] must exist
3952 value_type _Colon_close[2] = {':', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003953 _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00003954 _Colon_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00003955#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003956 if (__temp == __last)
3957 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003958#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003959 // [__first, __temp) contains all text in [: ... :]
3960 typedef typename _Traits::char_class_type char_class_type;
3961 char_class_type __class_type =
3962 __traits_.lookup_classname(__first, __temp, __flags_ & icase);
Howard Hinnantd4444702010-08-11 17:04:31 +00003963#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003964 if (__class_type == 0)
3965 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003966#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003967 __ml->__add_class(__class_type);
Howard Hinnant0949eed2011-06-30 21:18:19 +00003968 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003969 return __first;
3970}
3971
3972template <class _CharT, class _Traits>
3973template <class _ForwardIterator>
3974_ForwardIterator
3975basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003976 _ForwardIterator __last,
3977 basic_string<_CharT>& __col_sym)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003978{
3979 // Found [.
3980 // This means .] must exist
3981 value_type _Dot_close[2] = {'.', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003982 _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00003983 _Dot_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00003984#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003985 if (__temp == __last)
3986 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003987#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003988 // [__first, __temp) contains all text in [. ... .]
3989 typedef typename _Traits::string_type string_type;
Howard Hinnant173968a2010-07-13 21:48:06 +00003990 __col_sym = __traits_.lookup_collatename(__first, __temp);
3991 switch (__col_sym.size())
3992 {
3993 case 1:
3994 case 2:
3995 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003996#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003997 default:
3998 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00003999#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004000 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004001 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004002 return __first;
4003}
4004
4005template <class _CharT, class _Traits>
4006template <class _ForwardIterator>
4007_ForwardIterator
4008basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4009 _ForwardIterator __last,
4010 int& __c)
4011{
4012 if (__first != __last && '0' <= *__first && *__first <= '9')
4013 {
4014 __c = *__first - '0';
4015 for (++__first; __first != __last && '0' <= *__first && *__first <= '9';
4016 ++__first)
4017 {
4018 __c *= 10;
4019 __c += *__first - '0';
4020 }
4021 }
4022 return __first;
4023}
4024
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004025template <class _CharT, class _Traits>
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004026template <class _ForwardIterator>
4027_ForwardIterator
4028basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4029 _ForwardIterator __last)
4030{
4031 __owns_one_state<_CharT>* __sa = __end_;
4032 _ForwardIterator __temp = __parse_alternative(__first, __last);
4033 if (__temp == __first)
4034 __push_empty();
4035 __first = __temp;
4036 while (__first != __last && *__first == '|')
4037 {
4038 __owns_one_state<_CharT>* __sb = __end_;
4039 __temp = __parse_alternative(++__first, __last);
4040 if (__temp == __first)
4041 __push_empty();
4042 __push_alternation(__sa, __sb);
4043 __first = __temp;
4044 }
4045 return __first;
4046}
4047
4048template <class _CharT, class _Traits>
4049template <class _ForwardIterator>
4050_ForwardIterator
4051basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4052 _ForwardIterator __last)
4053{
4054 while (true)
4055 {
4056 _ForwardIterator __temp = __parse_term(__first, __last);
4057 if (__temp == __first)
4058 break;
4059 __first = __temp;
4060 }
4061 return __first;
4062}
4063
4064template <class _CharT, class _Traits>
4065template <class _ForwardIterator>
4066_ForwardIterator
4067basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4068 _ForwardIterator __last)
4069{
4070 _ForwardIterator __temp = __parse_assertion(__first, __last);
4071 if (__temp == __first)
4072 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004073 __owns_one_state<_CharT>* __e = __end_;
4074 unsigned __mexp_begin = __marked_count_;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004075 __temp = __parse_atom(__first, __last);
4076 if (__temp != __first)
Howard Hinnant17615b02010-07-27 01:25:38 +00004077 __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4078 __mexp_begin+1, __marked_count_+1);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004079 }
Howard Hinnant17615b02010-07-27 01:25:38 +00004080 else
4081 __first = __temp;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004082 return __first;
4083}
4084
4085template <class _CharT, class _Traits>
4086template <class _ForwardIterator>
4087_ForwardIterator
4088basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4089 _ForwardIterator __last)
4090{
4091 if (__first != __last)
4092 {
4093 switch (*__first)
4094 {
4095 case '^':
4096 __push_l_anchor();
4097 ++__first;
4098 break;
4099 case '$':
4100 __push_r_anchor();
4101 ++__first;
4102 break;
4103 case '\\':
4104 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004105 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004106 if (__temp != __last)
4107 {
4108 if (*__temp == 'b')
4109 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004110 __push_word_boundary(false);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004111 __first = ++__temp;
4112 }
4113 else if (*__temp == 'B')
4114 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004115 __push_word_boundary(true);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004116 __first = ++__temp;
4117 }
4118 }
4119 }
4120 break;
4121 case '(':
4122 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004123 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004124 if (__temp != __last && *__temp == '?')
4125 {
4126 if (++__temp != __last)
4127 {
4128 switch (*__temp)
4129 {
4130 case '=':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004131 {
4132 basic_regex __exp;
4133 __exp.__flags_ = __flags_;
4134 __temp = __exp.__parse(++__temp, __last);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004135 __push_lookahead(_VSTD::move(__exp), false);
Howard Hinnantd4444702010-08-11 17:04:31 +00004136#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004137 if (__temp == __last || *__temp != ')')
4138 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004139#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004140 __first = ++__temp;
4141 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004142 break;
4143 case '!':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004144 {
4145 basic_regex __exp;
4146 __exp.__flags_ = __flags_;
4147 __temp = __exp.__parse(++__temp, __last);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004148 __push_lookahead(_VSTD::move(__exp), true);
Howard Hinnantd4444702010-08-11 17:04:31 +00004149#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004150 if (__temp == __last || *__temp != ')')
4151 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004152#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004153 __first = ++__temp;
4154 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004155 break;
4156 }
4157 }
4158 }
4159 }
4160 break;
4161 }
4162 }
4163 return __first;
4164}
4165
4166template <class _CharT, class _Traits>
4167template <class _ForwardIterator>
4168_ForwardIterator
4169basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4170 _ForwardIterator __last)
4171{
Howard Hinnant17615b02010-07-27 01:25:38 +00004172 if (__first != __last)
4173 {
4174 switch (*__first)
4175 {
4176 case '.':
4177 __push_match_any_but_newline();
4178 ++__first;
4179 break;
4180 case '\\':
4181 __first = __parse_atom_escape(__first, __last);
4182 break;
4183 case '[':
4184 __first = __parse_bracket_expression(__first, __last);
4185 break;
4186 case '(':
4187 {
Howard Hinnantd4444702010-08-11 17:04:31 +00004188 ++__first;
4189#ifndef _LIBCPP_NO_EXCEPTIONS
4190 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004191 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004192#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0949eed2011-06-30 21:18:19 +00004193 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004194 if (__temp != __last && *__first == '?' && *__temp == ':')
4195 {
4196 ++__open_count_;
4197 __first = __parse_ecma_exp(++__temp, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00004198#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004199 if (__first == __last || *__first != ')')
4200 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004201#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004202 --__open_count_;
4203 ++__first;
4204 }
4205 else
4206 {
4207 __push_begin_marked_subexpression();
4208 unsigned __temp_count = __marked_count_;
4209 ++__open_count_;
4210 __first = __parse_ecma_exp(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00004211#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004212 if (__first == __last || *__first != ')')
4213 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004214#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004215 __push_end_marked_subexpression(__temp_count);
4216 --__open_count_;
4217 ++__first;
4218 }
4219 }
4220 break;
4221 default:
4222 __first = __parse_pattern_character(__first, __last);
4223 break;
4224 }
4225 }
4226 return __first;
4227}
4228
4229template <class _CharT, class _Traits>
4230template <class _ForwardIterator>
4231_ForwardIterator
4232basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4233 _ForwardIterator __last)
4234{
4235 if (__first != __last && *__first == '\\')
4236 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004237 _ForwardIterator __t1 = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004238 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4239 if (__t2 != __t1)
4240 __first = __t2;
4241 else
4242 {
4243 __t2 = __parse_character_class_escape(__t1, __last);
4244 if (__t2 != __t1)
4245 __first = __t2;
4246 else
4247 {
4248 __t2 = __parse_character_escape(__t1, __last);
4249 if (__t2 != __t1)
4250 __first = __t2;
4251 }
4252 }
4253 }
4254 return __first;
4255}
4256
4257template <class _CharT, class _Traits>
4258template <class _ForwardIterator>
4259_ForwardIterator
4260basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4261 _ForwardIterator __last)
4262{
4263 if (__first != __last)
4264 {
4265 if (*__first == '0')
4266 {
4267 __push_char(_CharT());
4268 ++__first;
4269 }
4270 else if ('1' <= *__first && *__first <= '9')
4271 {
4272 unsigned __v = *__first - '0';
4273 for (++__first; '0' <= *__first && *__first <= '9'; ++__first)
4274 __v = 10 * __v + *__first - '0';
Howard Hinnantd4444702010-08-11 17:04:31 +00004275#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004276 if (__v > mark_count())
4277 throw regex_error(regex_constants::error_backref);
Howard Hinnant324bb032010-08-22 00:02:43 +00004278#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004279 __push_back_ref(__v);
4280 }
4281 }
4282 return __first;
4283}
4284
4285template <class _CharT, class _Traits>
4286template <class _ForwardIterator>
4287_ForwardIterator
4288basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4289 _ForwardIterator __last)
4290{
4291 if (__first != __last)
4292 {
4293 __bracket_expression<_CharT, _Traits>* __ml;
4294 switch (*__first)
4295 {
4296 case 'd':
4297 __ml = __start_matching_list(false);
4298 __ml->__add_class(ctype_base::digit);
4299 ++__first;
4300 break;
4301 case 'D':
4302 __ml = __start_matching_list(true);
4303 __ml->__add_class(ctype_base::digit);
4304 ++__first;
4305 break;
4306 case 's':
4307 __ml = __start_matching_list(false);
4308 __ml->__add_class(ctype_base::space);
4309 ++__first;
4310 break;
4311 case 'S':
4312 __ml = __start_matching_list(true);
4313 __ml->__add_class(ctype_base::space);
4314 ++__first;
4315 break;
4316 case 'w':
4317 __ml = __start_matching_list(false);
4318 __ml->__add_class(ctype_base::alnum);
4319 __ml->__add_char('_');
4320 ++__first;
4321 break;
4322 case 'W':
4323 __ml = __start_matching_list(true);
4324 __ml->__add_class(ctype_base::alnum);
4325 __ml->__add_char('_');
4326 ++__first;
4327 break;
4328 }
4329 }
4330 return __first;
4331}
4332
4333template <class _CharT, class _Traits>
4334template <class _ForwardIterator>
4335_ForwardIterator
4336basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
Howard Hinnant15476f32010-07-28 17:35:27 +00004337 _ForwardIterator __last,
4338 basic_string<_CharT>* __str)
Howard Hinnant17615b02010-07-27 01:25:38 +00004339{
4340 if (__first != __last)
4341 {
4342 _ForwardIterator __t;
4343 unsigned __sum = 0;
4344 int __hd;
4345 switch (*__first)
4346 {
4347 case 'f':
Howard Hinnant15476f32010-07-28 17:35:27 +00004348 if (__str)
4349 *__str = _CharT(0xC);
4350 else
4351 __push_char(_CharT(0xC));
Howard Hinnant17615b02010-07-27 01:25:38 +00004352 ++__first;
4353 break;
4354 case 'n':
Howard Hinnant15476f32010-07-28 17:35:27 +00004355 if (__str)
4356 *__str = _CharT(0xA);
4357 else
4358 __push_char(_CharT(0xA));
Howard Hinnant17615b02010-07-27 01:25:38 +00004359 ++__first;
4360 break;
4361 case 'r':
Howard Hinnant15476f32010-07-28 17:35:27 +00004362 if (__str)
4363 *__str = _CharT(0xD);
4364 else
4365 __push_char(_CharT(0xD));
Howard Hinnant17615b02010-07-27 01:25:38 +00004366 ++__first;
4367 break;
4368 case 't':
Howard Hinnant15476f32010-07-28 17:35:27 +00004369 if (__str)
4370 *__str = _CharT(0x9);
4371 else
4372 __push_char(_CharT(0x9));
Howard Hinnant17615b02010-07-27 01:25:38 +00004373 ++__first;
4374 break;
4375 case 'v':
Howard Hinnant15476f32010-07-28 17:35:27 +00004376 if (__str)
4377 *__str = _CharT(0xB);
4378 else
4379 __push_char(_CharT(0xB));
Howard Hinnant17615b02010-07-27 01:25:38 +00004380 ++__first;
4381 break;
4382 case 'c':
Howard Hinnant0949eed2011-06-30 21:18:19 +00004383 if ((__t = _VSTD::next(__first)) != __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004384 {
4385 if ('A' <= *__t <= 'Z' || 'a' <= *__t <= 'z')
4386 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004387 if (__str)
4388 *__str = _CharT(*__t % 32);
4389 else
4390 __push_char(_CharT(*__t % 32));
Howard Hinnant17615b02010-07-27 01:25:38 +00004391 __first = ++__t;
4392 }
4393 }
4394 break;
4395 case 'u':
Howard Hinnantd4444702010-08-11 17:04:31 +00004396 ++__first;
4397#ifndef _LIBCPP_NO_EXCEPTIONS
4398 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004399 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004400#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004401 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004402#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004403 if (__hd == -1)
4404 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004405#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004406 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnantd4444702010-08-11 17:04:31 +00004407 ++__first;
4408#ifndef _LIBCPP_NO_EXCEPTIONS
4409 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004410 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004411#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004412 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004413#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004414 if (__hd == -1)
4415 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004416#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004417 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant17615b02010-07-27 01:25:38 +00004418 // drop through
4419 case 'x':
Howard Hinnantd4444702010-08-11 17:04:31 +00004420 ++__first;
4421#ifndef _LIBCPP_NO_EXCEPTIONS
4422 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004423 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004424#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004425 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004426#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004427 if (__hd == -1)
4428 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004429#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004430 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnantd4444702010-08-11 17:04:31 +00004431 ++__first;
4432#ifndef _LIBCPP_NO_EXCEPTIONS
4433 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004434 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004435#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004436 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004437#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004438 if (__hd == -1)
4439 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004440#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004441 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant15476f32010-07-28 17:35:27 +00004442 if (__str)
4443 *__str = _CharT(__sum);
4444 else
4445 __push_char(_CharT(__sum));
Howard Hinnant17615b02010-07-27 01:25:38 +00004446 ++__first;
4447 break;
4448 default:
4449 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4450 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004451 if (__str)
4452 *__str = *__first;
4453 else
4454 __push_char(*__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004455 ++__first;
4456 }
Howard Hinnantd4444702010-08-11 17:04:31 +00004457#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00004458 else if (__str)
4459 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004460#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004461 break;
4462 }
4463 }
4464 return __first;
4465}
4466
4467template <class _CharT, class _Traits>
4468template <class _ForwardIterator>
4469_ForwardIterator
4470basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4471 _ForwardIterator __last)
4472{
4473 if (__first != __last)
4474 {
4475 switch (*__first)
4476 {
4477 case '^':
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 break;
4492 default:
4493 __push_char(*__first);
4494 ++__first;
4495 break;
4496 }
4497 }
4498 return __first;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004499}
4500
4501template <class _CharT, class _Traits>
Howard Hinnant856846b2010-07-27 19:53:10 +00004502template <class _ForwardIterator>
4503_ForwardIterator
4504basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4505 _ForwardIterator __last)
4506{
4507 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004508 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004509 if (__t1 != __first)
4510 __parse_basic_reg_exp(__first, __t1);
4511 else
4512 __push_empty();
4513 __first = __t1;
4514 if (__first != __last)
4515 ++__first;
4516 while (__first != __last)
4517 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004518 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004519 __owns_one_state<_CharT>* __sb = __end_;
4520 if (__t1 != __first)
4521 __parse_basic_reg_exp(__first, __t1);
4522 else
4523 __push_empty();
4524 __push_alternation(__sa, __sb);
4525 __first = __t1;
4526 if (__first != __last)
4527 ++__first;
4528 }
4529 return __first;
4530}
4531
4532template <class _CharT, class _Traits>
4533template <class _ForwardIterator>
4534_ForwardIterator
4535basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4536 _ForwardIterator __last)
4537{
4538 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004539 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004540 if (__t1 != __first)
4541 __parse_extended_reg_exp(__first, __t1);
4542 else
4543 __push_empty();
4544 __first = __t1;
4545 if (__first != __last)
4546 ++__first;
4547 while (__first != __last)
4548 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004549 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004550 __owns_one_state<_CharT>* __sb = __end_;
4551 if (__t1 != __first)
4552 __parse_extended_reg_exp(__first, __t1);
4553 else
4554 __push_empty();
4555 __push_alternation(__sa, __sb);
4556 __first = __t1;
4557 if (__first != __last)
4558 ++__first;
4559 }
4560 return __first;
4561}
4562
4563template <class _CharT, class _Traits>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004564void
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004565basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4566 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4567 bool __greedy)
4568{
4569 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4570 __end_->first() = nullptr;
Howard Hinnantac303862010-07-12 15:51:17 +00004571 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4572 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4573 __min, __max));
4574 __s->first() = nullptr;
4575 __e1.release();
4576 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004577 __end_ = __e2->second();
Howard Hinnantac303862010-07-12 15:51:17 +00004578 __s->first() = __e2.release();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004579 ++__loop_count_;
4580}
4581
4582template <class _CharT, class _Traits>
4583void
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004584basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4585{
Howard Hinnant173968a2010-07-13 21:48:06 +00004586 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004587 __end_->first() = new __match_char_icase<_CharT, _Traits>
4588 (__traits_, __c, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004589 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004590 __end_->first() = new __match_char_collate<_CharT, _Traits>
4591 (__traits_, __c, __end_->first());
4592 else
4593 __end_->first() = new __match_char<_CharT>(__c, __end_->first());
Howard Hinnante77aa5e2010-07-08 17:43:58 +00004594 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004595}
4596
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004597template <class _CharT, class _Traits>
4598void
4599basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4600{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004601 if (!(__flags_ & nosubs))
4602 {
4603 __end_->first() =
4604 new __begin_marked_subexpression<_CharT>(++__marked_count_,
4605 __end_->first());
4606 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4607 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004608}
4609
4610template <class _CharT, class _Traits>
4611void
4612basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4613{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004614 if (!(__flags_ & nosubs))
4615 {
4616 __end_->first() =
4617 new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4618 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4619 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004620}
4621
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004622template <class _CharT, class _Traits>
4623void
Howard Hinnant41fb6e12011-03-26 20:02:27 +00004624basic_regex<_CharT, _Traits>::__push_l_anchor()
4625{
4626 __end_->first() = new __l_anchor<_CharT>(__end_->first());
4627 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4628}
4629
4630template <class _CharT, class _Traits>
4631void
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004632basic_regex<_CharT, _Traits>::__push_r_anchor()
4633{
4634 __end_->first() = new __r_anchor<_CharT>(__end_->first());
4635 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4636}
4637
Howard Hinnantac303862010-07-12 15:51:17 +00004638template <class _CharT, class _Traits>
4639void
4640basic_regex<_CharT, _Traits>::__push_match_any()
4641{
4642 __end_->first() = new __match_any<_CharT>(__end_->first());
4643 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4644}
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004645
Howard Hinnantcba352d2010-07-12 18:16:05 +00004646template <class _CharT, class _Traits>
4647void
Howard Hinnant17615b02010-07-27 01:25:38 +00004648basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4649{
4650 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4651 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4652}
4653
4654template <class _CharT, class _Traits>
4655void
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004656basic_regex<_CharT, _Traits>::__push_empty()
4657{
4658 __end_->first() = new __empty_state<_CharT>(__end_->first());
4659 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4660}
4661
4662template <class _CharT, class _Traits>
4663void
Howard Hinnant17615b02010-07-27 01:25:38 +00004664basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4665{
4666 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4667 __end_->first());
4668 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4669}
4670
4671template <class _CharT, class _Traits>
4672void
Howard Hinnantcba352d2010-07-12 18:16:05 +00004673basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4674{
Howard Hinnant173968a2010-07-13 21:48:06 +00004675 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004676 __end_->first() = new __back_ref_icase<_CharT, _Traits>
4677 (__traits_, __i, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004678 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004679 __end_->first() = new __back_ref_collate<_CharT, _Traits>
4680 (__traits_, __i, __end_->first());
4681 else
4682 __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
Howard Hinnantcba352d2010-07-12 18:16:05 +00004683 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4684}
4685
Howard Hinnant173968a2010-07-13 21:48:06 +00004686template <class _CharT, class _Traits>
Howard Hinnantaa698082010-07-16 19:08:36 +00004687void
4688basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4689 __owns_one_state<_CharT>* __ea)
4690{
4691 __sa->first() = new __alternate<_CharT>(
4692 static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4693 static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4694 __ea->first() = nullptr;
4695 __ea->first() = new __empty_state<_CharT>(__end_->first());
4696 __end_->first() = nullptr;
4697 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4698 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4699}
4700
4701template <class _CharT, class _Traits>
Howard Hinnant173968a2010-07-13 21:48:06 +00004702__bracket_expression<_CharT, _Traits>*
4703basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4704{
4705 __bracket_expression<_CharT, _Traits>* __r =
4706 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4707 __negate, __flags_ & icase,
4708 __flags_ & collate);
4709 __end_->first() = __r;
4710 __end_ = __r;
4711 return __r;
4712}
4713
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004714template <class _CharT, class _Traits>
4715void
4716basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
4717 bool __invert)
4718{
4719 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
4720 __end_->first());
4721 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4722}
4723
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00004724typedef basic_regex<char> regex;
4725typedef basic_regex<wchar_t> wregex;
4726
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004727// sub_match
4728
4729template <class _BidirectionalIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004730class _LIBCPP_VISIBLE sub_match
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004731 : public pair<_BidirectionalIterator, _BidirectionalIterator>
4732{
4733public:
4734 typedef _BidirectionalIterator iterator;
4735 typedef typename iterator_traits<iterator>::value_type value_type;
4736 typedef typename iterator_traits<iterator>::difference_type difference_type;
4737 typedef basic_string<value_type> string_type;
4738
4739 bool matched;
4740
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004741 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +00004742 _LIBCPP_CONSTEXPR sub_match() : matched() {}
Howard Hinnant31aaf552010-12-08 21:07:55 +00004743
4744 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004745 difference_type length() const
Howard Hinnant0949eed2011-06-30 21:18:19 +00004746 {return matched ? _VSTD::distance(this->first, this->second) : 0;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004747 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004748 string_type str() const
4749 {return matched ? string_type(this->first, this->second) : string_type();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004750 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004751 operator string_type() const
4752 {return str();}
4753
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004754 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004755 int compare(const sub_match& __s) const
4756 {return str().compare(__s.str());}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004757 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004758 int compare(const string_type& __s) const
4759 {return str().compare(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004760 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004761 int compare(const value_type* __s) const
4762 {return str().compare(__s);}
4763};
4764
4765typedef sub_match<const char*> csub_match;
4766typedef sub_match<const wchar_t*> wcsub_match;
4767typedef sub_match<string::const_iterator> ssub_match;
4768typedef sub_match<wstring::const_iterator> wssub_match;
4769
4770template <class _BiIter>
4771inline _LIBCPP_INLINE_VISIBILITY
4772bool
4773operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4774{
4775 return __x.compare(__y) == 0;
4776}
4777
4778template <class _BiIter>
4779inline _LIBCPP_INLINE_VISIBILITY
4780bool
4781operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4782{
4783 return !(__x == __y);
4784}
4785
4786template <class _BiIter>
4787inline _LIBCPP_INLINE_VISIBILITY
4788bool
4789operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4790{
4791 return __x.compare(__y) < 0;
4792}
4793
4794template <class _BiIter>
4795inline _LIBCPP_INLINE_VISIBILITY
4796bool
4797operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4798{
4799 return !(__y < __x);
4800}
4801
4802template <class _BiIter>
4803inline _LIBCPP_INLINE_VISIBILITY
4804bool
4805operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4806{
4807 return !(__x < __y);
4808}
4809
4810template <class _BiIter>
4811inline _LIBCPP_INLINE_VISIBILITY
4812bool
4813operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4814{
4815 return __y < __x;
4816}
4817
4818template <class _BiIter, class _ST, class _SA>
4819inline _LIBCPP_INLINE_VISIBILITY
4820bool
4821operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4822 const sub_match<_BiIter>& __y)
4823{
4824 return __y.compare(__x.c_str()) == 0;
4825}
4826
4827template <class _BiIter, class _ST, class _SA>
4828inline _LIBCPP_INLINE_VISIBILITY
4829bool
4830operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4831 const sub_match<_BiIter>& __y)
4832{
4833 return !(__x == __y);
4834}
4835
4836template <class _BiIter, class _ST, class _SA>
4837inline _LIBCPP_INLINE_VISIBILITY
4838bool
4839operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4840 const sub_match<_BiIter>& __y)
4841{
4842 return __y.compare(__x.c_str()) > 0;
4843}
4844
4845template <class _BiIter, class _ST, class _SA>
4846inline _LIBCPP_INLINE_VISIBILITY
4847bool
4848operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4849 const sub_match<_BiIter>& __y)
4850{
4851 return __y < __x;
4852}
4853
4854template <class _BiIter, class _ST, class _SA>
4855inline _LIBCPP_INLINE_VISIBILITY
4856bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4857 const sub_match<_BiIter>& __y)
4858{
4859 return !(__x < __y);
4860}
4861
4862template <class _BiIter, class _ST, class _SA>
4863inline _LIBCPP_INLINE_VISIBILITY
4864bool
4865operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4866 const sub_match<_BiIter>& __y)
4867{
4868 return !(__y < __x);
4869}
4870
4871template <class _BiIter, class _ST, class _SA>
4872inline _LIBCPP_INLINE_VISIBILITY
4873bool
4874operator==(const sub_match<_BiIter>& __x,
4875 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4876{
4877 return __x.compare(__y.c_str()) == 0;
4878}
4879
4880template <class _BiIter, class _ST, class _SA>
4881inline _LIBCPP_INLINE_VISIBILITY
4882bool
4883operator!=(const sub_match<_BiIter>& __x,
4884 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4885{
4886 return !(__x == __y);
4887}
4888
4889template <class _BiIter, class _ST, class _SA>
4890inline _LIBCPP_INLINE_VISIBILITY
4891bool
4892operator<(const sub_match<_BiIter>& __x,
4893 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4894{
4895 return __x.compare(__y.c_str()) < 0;
4896}
4897
4898template <class _BiIter, class _ST, class _SA>
4899inline _LIBCPP_INLINE_VISIBILITY
4900bool operator>(const sub_match<_BiIter>& __x,
4901 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4902{
4903 return __y < __x;
4904}
4905
4906template <class _BiIter, class _ST, class _SA>
4907inline _LIBCPP_INLINE_VISIBILITY
4908bool
4909operator>=(const sub_match<_BiIter>& __x,
4910 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4911{
4912 return !(__x < __y);
4913}
4914
4915template <class _BiIter, class _ST, class _SA>
4916inline _LIBCPP_INLINE_VISIBILITY
4917bool
4918operator<=(const sub_match<_BiIter>& __x,
4919 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4920{
4921 return !(__y < __x);
4922}
4923
4924template <class _BiIter>
4925inline _LIBCPP_INLINE_VISIBILITY
4926bool
4927operator==(typename iterator_traits<_BiIter>::value_type const* __x,
4928 const sub_match<_BiIter>& __y)
4929{
4930 return __y.compare(__x) == 0;
4931}
4932
4933template <class _BiIter>
4934inline _LIBCPP_INLINE_VISIBILITY
4935bool
4936operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
4937 const sub_match<_BiIter>& __y)
4938{
4939 return !(__x == __y);
4940}
4941
4942template <class _BiIter>
4943inline _LIBCPP_INLINE_VISIBILITY
4944bool
4945operator<(typename iterator_traits<_BiIter>::value_type const* __x,
4946 const sub_match<_BiIter>& __y)
4947{
4948 return __y.compare(__x) > 0;
4949}
4950
4951template <class _BiIter>
4952inline _LIBCPP_INLINE_VISIBILITY
4953bool
4954operator>(typename iterator_traits<_BiIter>::value_type const* __x,
4955 const sub_match<_BiIter>& __y)
4956{
4957 return __y < __x;
4958}
4959
4960template <class _BiIter>
4961inline _LIBCPP_INLINE_VISIBILITY
4962bool
4963operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
4964 const sub_match<_BiIter>& __y)
4965{
4966 return !(__x < __y);
4967}
4968
4969template <class _BiIter>
4970inline _LIBCPP_INLINE_VISIBILITY
4971bool
4972operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
4973 const sub_match<_BiIter>& __y)
4974{
4975 return !(__y < __x);
4976}
4977
4978template <class _BiIter>
4979inline _LIBCPP_INLINE_VISIBILITY
4980bool
4981operator==(const sub_match<_BiIter>& __x,
4982 typename iterator_traits<_BiIter>::value_type const* __y)
4983{
4984 return __x.compare(__y) == 0;
4985}
4986
4987template <class _BiIter>
4988inline _LIBCPP_INLINE_VISIBILITY
4989bool
4990operator!=(const sub_match<_BiIter>& __x,
4991 typename iterator_traits<_BiIter>::value_type const* __y)
4992{
4993 return !(__x == __y);
4994}
4995
4996template <class _BiIter>
4997inline _LIBCPP_INLINE_VISIBILITY
4998bool
4999operator<(const sub_match<_BiIter>& __x,
5000 typename iterator_traits<_BiIter>::value_type const* __y)
5001{
5002 return __x.compare(__y) < 0;
5003}
5004
5005template <class _BiIter>
5006inline _LIBCPP_INLINE_VISIBILITY
5007bool
5008operator>(const sub_match<_BiIter>& __x,
5009 typename iterator_traits<_BiIter>::value_type const* __y)
5010{
5011 return __y < __x;
5012}
5013
5014template <class _BiIter>
5015inline _LIBCPP_INLINE_VISIBILITY
5016bool
5017operator>=(const sub_match<_BiIter>& __x,
5018 typename iterator_traits<_BiIter>::value_type const* __y)
5019{
5020 return !(__x < __y);
5021}
5022
5023template <class _BiIter>
5024inline _LIBCPP_INLINE_VISIBILITY
5025bool
5026operator<=(const sub_match<_BiIter>& __x,
5027 typename iterator_traits<_BiIter>::value_type const* __y)
5028{
5029 return !(__y < __x);
5030}
5031
5032template <class _BiIter>
5033inline _LIBCPP_INLINE_VISIBILITY
5034bool
5035operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5036 const sub_match<_BiIter>& __y)
5037{
5038 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5039 return __y.compare(string_type(1, __x)) == 0;
5040}
5041
5042template <class _BiIter>
5043inline _LIBCPP_INLINE_VISIBILITY
5044bool
5045operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5046 const sub_match<_BiIter>& __y)
5047{
5048 return !(__x == __y);
5049}
5050
5051template <class _BiIter>
5052inline _LIBCPP_INLINE_VISIBILITY
5053bool
5054operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5055 const sub_match<_BiIter>& __y)
5056{
5057 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5058 return __y.compare(string_type(1, __x)) > 0;
5059}
5060
5061template <class _BiIter>
5062inline _LIBCPP_INLINE_VISIBILITY
5063bool
5064operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5065 const sub_match<_BiIter>& __y)
5066{
5067 return __y < __x;
5068}
5069
5070template <class _BiIter>
5071inline _LIBCPP_INLINE_VISIBILITY
5072bool
5073operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5074 const sub_match<_BiIter>& __y)
5075{
5076 return !(__x < __y);
5077}
5078
5079template <class _BiIter>
5080inline _LIBCPP_INLINE_VISIBILITY
5081bool
5082operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5083 const sub_match<_BiIter>& __y)
5084{
5085 return !(__y < __x);
5086}
5087
5088template <class _BiIter>
5089inline _LIBCPP_INLINE_VISIBILITY
5090bool
5091operator==(const sub_match<_BiIter>& __x,
5092 typename iterator_traits<_BiIter>::value_type const& __y)
5093{
5094 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5095 return __x.compare(string_type(1, __y)) == 0;
5096}
5097
5098template <class _BiIter>
5099inline _LIBCPP_INLINE_VISIBILITY
5100bool
5101operator!=(const sub_match<_BiIter>& __x,
5102 typename iterator_traits<_BiIter>::value_type const& __y)
5103{
5104 return !(__x == __y);
5105}
5106
5107template <class _BiIter>
5108inline _LIBCPP_INLINE_VISIBILITY
5109bool
5110operator<(const sub_match<_BiIter>& __x,
5111 typename iterator_traits<_BiIter>::value_type const& __y)
5112{
5113 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5114 return __x.compare(string_type(1, __y)) < 0;
5115}
5116
5117template <class _BiIter>
5118inline _LIBCPP_INLINE_VISIBILITY
5119bool
5120operator>(const sub_match<_BiIter>& __x,
5121 typename iterator_traits<_BiIter>::value_type const& __y)
5122{
5123 return __y < __x;
5124}
5125
5126template <class _BiIter>
5127inline _LIBCPP_INLINE_VISIBILITY
5128bool
5129operator>=(const sub_match<_BiIter>& __x,
5130 typename iterator_traits<_BiIter>::value_type const& __y)
5131{
5132 return !(__x < __y);
5133}
5134
5135template <class _BiIter>
5136inline _LIBCPP_INLINE_VISIBILITY
5137bool
5138operator<=(const sub_match<_BiIter>& __x,
5139 typename iterator_traits<_BiIter>::value_type const& __y)
5140{
5141 return !(__y < __x);
5142}
5143
5144template <class _CharT, class _ST, class _BiIter>
5145inline _LIBCPP_INLINE_VISIBILITY
5146basic_ostream<_CharT, _ST>&
5147operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5148{
5149 return __os << __m.str();
5150}
5151
Howard Hinnant17615b02010-07-27 01:25:38 +00005152template <class _BidirectionalIterator, class _Allocator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005153class _LIBCPP_VISIBLE match_results
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005154{
5155public:
5156 typedef _Allocator allocator_type;
5157 typedef sub_match<_BidirectionalIterator> value_type;
5158private:
5159 typedef vector<value_type, allocator_type> __container_type;
5160
5161 __container_type __matches_;
5162 value_type __unmatched_;
5163 value_type __prefix_;
5164 value_type __suffix_;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005165 bool __ready_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005166public:
Howard Hinnanta712c722010-08-16 20:21:16 +00005167 _BidirectionalIterator __position_start_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005168 typedef const value_type& const_reference;
5169 typedef const_reference reference;
5170 typedef typename __container_type::const_iterator const_iterator;
5171 typedef const_iterator iterator;
5172 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5173 typedef typename allocator_traits<allocator_type>::size_type size_type;
5174 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5175 typedef basic_string<char_type> string_type;
5176
5177 // construct/copy/destroy:
5178 explicit match_results(const allocator_type& __a = allocator_type());
5179// match_results(const match_results&) = default;
5180// match_results& operator=(const match_results&) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005181// match_results(match_results&& __m) = default;
5182// match_results& operator=(match_results&& __m) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005183// ~match_results() = default;
5184
Howard Hinnant31aaf552010-12-08 21:07:55 +00005185 _LIBCPP_INLINE_VISIBILITY
5186 bool ready() const {return __ready_;}
5187
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005188 // size:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005189 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005190 size_type size() const {return __matches_.size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005191 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005192 size_type max_size() const {return __matches_.max_size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005193 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005194 bool empty() const {return size() == 0;}
5195
5196 // element access:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005197 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005198 difference_type length(size_type __sub = 0) const
5199 {return (*this)[__sub].length();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005200 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005201 difference_type position(size_type __sub = 0) const
Howard Hinnant0949eed2011-06-30 21:18:19 +00005202 {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005203 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005204 string_type str(size_type __sub = 0) const
5205 {return (*this)[__sub].str();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005206 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005207 const_reference operator[](size_type __n) const
5208 {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
5209
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005210 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005211 const_reference prefix() const {return __prefix_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005212 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005213 const_reference suffix() const {return __suffix_;}
5214
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005215 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005216 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005217 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005218 const_iterator end() const {return __matches_.end();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005219 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005220 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005221 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005222 const_iterator cend() const {return __matches_.end();}
5223
5224 // format:
5225 template <class _OutputIter>
5226 _OutputIter
5227 format(_OutputIter __out, const char_type* __fmt_first,
5228 const char_type* __fmt_last,
5229 regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5230 template <class _OutputIter, class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005231 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005232 _OutputIter
5233 format(_OutputIter __out, const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005234 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5235 {return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005236 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005237 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005238 basic_string<char_type, _ST, _SA>
5239 format(const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005240 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5241 {
5242 basic_string<char_type, _ST, _SA> __r;
5243 format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5244 __flags);
5245 return __r;
5246 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005247 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005248 string_type
5249 format(const char_type* __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005250 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5251 {
5252 string_type __r;
5253 format(back_inserter(__r), __fmt,
5254 __fmt + char_traits<char_type>::length(__fmt), __flags);
5255 return __r;
5256 }
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005257
5258 // allocator:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005259 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005260 allocator_type get_allocator() const {return __matches_.get_allocator();}
5261
5262 // swap:
5263 void swap(match_results& __m);
5264
Howard Hinnant99968442011-11-29 18:15:50 +00005265 template <class _Bp, class _Ap>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005266 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005267 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
Howard Hinnant99968442011-11-29 18:15:50 +00005268 const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005269 {
Howard Hinnant99968442011-11-29 18:15:50 +00005270 _Bp __mf = __m.prefix().first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005271 __matches_.resize(__m.size());
5272 for (size_type __i = 0; __i < __matches_.size(); ++__i)
5273 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005274 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5275 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005276 __matches_[__i].matched = __m[__i].matched;
5277 }
5278 __unmatched_.first = __l;
5279 __unmatched_.second = __l;
5280 __unmatched_.matched = false;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005281 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5282 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005283 __prefix_.matched = __m.prefix().matched;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005284 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5285 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005286 __suffix_.matched = __m.suffix().matched;
Howard Hinnanta712c722010-08-16 20:21:16 +00005287 if (!__no_update_pos)
5288 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005289 __ready_ = __m.ready();
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005290 }
5291
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005292private:
5293 void __init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005294 _BidirectionalIterator __f, _BidirectionalIterator __l,
5295 bool __no_update_pos = false);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005296
5297 template <class, class> friend class basic_regex;
5298
Howard Hinnant99968442011-11-29 18:15:50 +00005299 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005300 friend
5301 bool
Howard Hinnant99968442011-11-29 18:15:50 +00005302 regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005303 regex_constants::match_flag_type);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005304
Howard Hinnant99968442011-11-29 18:15:50 +00005305 template <class _Bp, class _Ap>
Howard Hinnant27405f92010-08-14 18:14:02 +00005306 friend
5307 bool
Howard Hinnant99968442011-11-29 18:15:50 +00005308 operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
Howard Hinnant27405f92010-08-14 18:14:02 +00005309
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005310 template <class, class> friend class __lookahead;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005311};
5312
5313template <class _BidirectionalIterator, class _Allocator>
5314match_results<_BidirectionalIterator, _Allocator>::match_results(
5315 const allocator_type& __a)
5316 : __matches_(__a),
5317 __unmatched_(),
5318 __prefix_(),
Howard Hinnanta712c722010-08-16 20:21:16 +00005319 __suffix_(),
Howard Hinnant31aaf552010-12-08 21:07:55 +00005320 __position_start_(),
5321 __ready_(false)
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005322{
5323}
5324
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005325template <class _BidirectionalIterator, class _Allocator>
5326void
5327match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005328 _BidirectionalIterator __f, _BidirectionalIterator __l,
5329 bool __no_update_pos)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005330{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005331 __unmatched_.first = __l;
5332 __unmatched_.second = __l;
5333 __unmatched_.matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005334 __matches_.assign(__s, __unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005335 __prefix_.first = __f;
5336 __prefix_.second = __f;
5337 __prefix_.matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005338 __suffix_ = __unmatched_;
Howard Hinnanta712c722010-08-16 20:21:16 +00005339 if (!__no_update_pos)
5340 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005341 __ready_ = true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005342}
5343
Howard Hinnant27405f92010-08-14 18:14:02 +00005344template <class _BidirectionalIterator, class _Allocator>
5345template <class _OutputIter>
5346_OutputIter
5347match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __out,
5348 const char_type* __fmt_first, const char_type* __fmt_last,
5349 regex_constants::match_flag_type __flags) const
5350{
5351 if (__flags & regex_constants::format_sed)
5352 {
5353 for (; __fmt_first != __fmt_last; ++__fmt_first)
5354 {
5355 if (*__fmt_first == '&')
Howard Hinnant0949eed2011-06-30 21:18:19 +00005356 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
Howard Hinnant27405f92010-08-14 18:14:02 +00005357 __out);
5358 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5359 {
5360 ++__fmt_first;
5361 if ('0' <= *__fmt_first && *__fmt_first <= '9')
5362 {
5363 size_t __i = *__fmt_first - '0';
Howard Hinnant0949eed2011-06-30 21:18:19 +00005364 __out = _VSTD::copy(__matches_[__i].first,
Howard Hinnant27405f92010-08-14 18:14:02 +00005365 __matches_[__i].second, __out);
5366 }
5367 else
5368 {
5369 *__out = *__fmt_first;
5370 ++__out;
5371 }
5372 }
5373 else
5374 {
5375 *__out = *__fmt_first;
5376 ++__out;
5377 }
5378 }
5379 }
5380 else
5381 {
5382 for (; __fmt_first != __fmt_last; ++__fmt_first)
5383 {
5384 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5385 {
5386 switch (__fmt_first[1])
5387 {
5388 case '$':
5389 *__out = *++__fmt_first;
5390 ++__out;
5391 break;
5392 case '&':
5393 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005394 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
Howard Hinnant27405f92010-08-14 18:14:02 +00005395 __out);
5396 break;
5397 case '`':
5398 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005399 __out = _VSTD::copy(__prefix_.first, __prefix_.second, __out);
Howard Hinnant27405f92010-08-14 18:14:02 +00005400 break;
5401 case '\'':
5402 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005403 __out = _VSTD::copy(__suffix_.first, __suffix_.second, __out);
Howard Hinnant27405f92010-08-14 18:14:02 +00005404 break;
5405 default:
5406 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5407 {
5408 ++__fmt_first;
5409 size_t __i = *__fmt_first - '0';
5410 if (__fmt_first + 1 != __fmt_last &&
5411 '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5412 {
5413 ++__fmt_first;
5414 __i = 10 * __i + *__fmt_first - '0';
5415 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005416 __out = _VSTD::copy(__matches_[__i].first,
Howard Hinnant27405f92010-08-14 18:14:02 +00005417 __matches_[__i].second, __out);
5418 }
5419 else
5420 {
5421 *__out = *__fmt_first;
5422 ++__out;
5423 }
5424 break;
5425 }
5426 }
5427 else
5428 {
5429 *__out = *__fmt_first;
5430 ++__out;
5431 }
5432 }
5433 }
5434 return __out;
5435}
5436
5437template <class _BidirectionalIterator, class _Allocator>
5438void
5439match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5440{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005441 using _VSTD::swap;
Howard Hinnant27405f92010-08-14 18:14:02 +00005442 swap(__matches_, __m.__matches_);
5443 swap(__unmatched_, __m.__unmatched_);
5444 swap(__prefix_, __m.__prefix_);
5445 swap(__suffix_, __m.__suffix_);
Howard Hinnanta712c722010-08-16 20:21:16 +00005446 swap(__position_start_, __m.__position_start_);
Howard Hinnant31aaf552010-12-08 21:07:55 +00005447 swap(__ready_, __m.__ready_);
Howard Hinnant27405f92010-08-14 18:14:02 +00005448}
5449
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005450typedef match_results<const char*> cmatch;
5451typedef match_results<const wchar_t*> wcmatch;
5452typedef match_results<string::const_iterator> smatch;
5453typedef match_results<wstring::const_iterator> wsmatch;
5454
5455template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005456bool
5457operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5458 const match_results<_BidirectionalIterator, _Allocator>& __y)
5459{
Howard Hinnant31aaf552010-12-08 21:07:55 +00005460 if (__x.__ready_ != __y.__ready_)
5461 return false;
5462 if (!__x.__ready_)
5463 return true;
Howard Hinnant27405f92010-08-14 18:14:02 +00005464 return __x.__matches_ == __y.__matches_ &&
5465 __x.__prefix_ == __y.__prefix_ &&
Howard Hinnant31aaf552010-12-08 21:07:55 +00005466 __x.__suffix_ == __y.__suffix_;
Howard Hinnant27405f92010-08-14 18:14:02 +00005467}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005468
5469template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005470inline _LIBCPP_INLINE_VISIBILITY
5471bool
5472operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5473 const match_results<_BidirectionalIterator, _Allocator>& __y)
5474{
5475 return !(__x == __y);
5476}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005477
5478template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005479inline _LIBCPP_INLINE_VISIBILITY
5480void
5481swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5482 match_results<_BidirectionalIterator, _Allocator>& __y)
5483{
5484 __x.swap(__y);
5485}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005486
5487// regex_search
5488
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005489template <class _CharT, class _Traits>
Howard Hinnant17615b02010-07-27 01:25:38 +00005490template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005491bool
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005492basic_regex<_CharT, _Traits>::__match_at_start_ecma(
Howard Hinnant17615b02010-07-27 01:25:38 +00005493 const _CharT* __first, const _CharT* __last,
5494 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005495 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005496{
Howard Hinnant17615b02010-07-27 01:25:38 +00005497 vector<__state> __states;
Howard Hinnant17615b02010-07-27 01:25:38 +00005498 __node* __st = __start_.get();
5499 if (__st)
5500 {
5501 __states.push_back(__state());
5502 __states.back().__do_ = 0;
5503 __states.back().__first_ = __first;
5504 __states.back().__current_ = __first;
5505 __states.back().__last_ = __last;
5506 __states.back().__sub_matches_.resize(mark_count());
5507 __states.back().__loop_data_.resize(__loop_count());
5508 __states.back().__node_ = __st;
5509 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005510 __states.back().__at_first_ = __at_first;
Howard Hinnant17615b02010-07-27 01:25:38 +00005511 do
5512 {
5513 __state& __s = __states.back();
5514 if (__s.__node_)
5515 __s.__node_->__exec(__s);
5516 switch (__s.__do_)
5517 {
5518 case __state::__end_state:
5519 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005520 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
Howard Hinnant17615b02010-07-27 01:25:38 +00005521 __m.__matches_[0].matched = true;
5522 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5523 __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5524 return true;
5525 case __state::__accept_and_consume:
5526 case __state::__repeat:
5527 case __state::__accept_but_not_consume:
5528 break;
5529 case __state::__split:
5530 {
5531 __state __snext = __s;
5532 __s.__node_->__exec_split(true, __s);
5533 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005534 __states.push_back(_VSTD::move(__snext));
Howard Hinnant17615b02010-07-27 01:25:38 +00005535 }
5536 break;
5537 case __state::__reject:
5538 __states.pop_back();
5539 break;
5540 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005541#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005542 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005543#endif
Howard Hinnant17615b02010-07-27 01:25:38 +00005544 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00005545
Howard Hinnant17615b02010-07-27 01:25:38 +00005546 }
5547 } while (!__states.empty());
5548 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005549 return false;
5550}
5551
5552template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005553template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005554bool
5555basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5556 const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005557 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005558 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005559{
Howard Hinnantac303862010-07-12 15:51:17 +00005560 deque<__state> __states;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005561 ptrdiff_t __highest_j = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00005562 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005563 __node* __st = __start_.get();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005564 if (__st)
5565 {
Howard Hinnantac303862010-07-12 15:51:17 +00005566 __states.push_back(__state());
Howard Hinnantac303862010-07-12 15:51:17 +00005567 __states.back().__do_ = 0;
5568 __states.back().__first_ = __first;
5569 __states.back().__current_ = __first;
5570 __states.back().__last_ = __last;
5571 __states.back().__loop_data_.resize(__loop_count());
5572 __states.back().__node_ = __st;
5573 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005574 __states.back().__at_first_ = __at_first;
Howard Hinnant68025ed2010-07-14 15:45:11 +00005575 bool __matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005576 do
5577 {
Howard Hinnantac303862010-07-12 15:51:17 +00005578 __state& __s = __states.back();
5579 if (__s.__node_)
5580 __s.__node_->__exec(__s);
5581 switch (__s.__do_)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005582 {
Howard Hinnantac303862010-07-12 15:51:17 +00005583 case __state::__end_state:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005584 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant68025ed2010-07-14 15:45:11 +00005585 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005586 __matched = true;
Howard Hinnant99968442011-11-29 18:15:50 +00005587 if (__highest_j == _Np)
Howard Hinnantac303862010-07-12 15:51:17 +00005588 __states.clear();
5589 else
5590 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005591 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005592 case __state::__consume_input:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005593 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005594 case __state::__accept_and_consume:
Howard Hinnant0949eed2011-06-30 21:18:19 +00005595 __states.push_front(_VSTD::move(__s));
Howard Hinnantac303862010-07-12 15:51:17 +00005596 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005597 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005598 case __state::__repeat:
5599 case __state::__accept_but_not_consume:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005600 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005601 case __state::__split:
5602 {
5603 __state __snext = __s;
5604 __s.__node_->__exec_split(true, __s);
5605 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005606 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005607 }
5608 break;
5609 case __state::__reject:
5610 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005611 break;
5612 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005613#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005614 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005615#endif
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005616 break;
5617 }
Howard Hinnantac303862010-07-12 15:51:17 +00005618 } while (!__states.empty());
Howard Hinnant68025ed2010-07-14 15:45:11 +00005619 if (__matched)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005620 {
5621 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005622 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005623 __m.__matches_[0].matched = true;
5624 return true;
5625 }
5626 }
5627 return false;
5628}
5629
5630template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005631template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005632bool
5633basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005634 const _CharT* __first, const _CharT* __last,
5635 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005636 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005637{
Howard Hinnantac303862010-07-12 15:51:17 +00005638 vector<__state> __states;
Howard Hinnantac303862010-07-12 15:51:17 +00005639 __state __best_state;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005640 ptrdiff_t __j = 0;
5641 ptrdiff_t __highest_j = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00005642 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005643 __node* __st = __start_.get();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005644 if (__st)
5645 {
Howard Hinnantac303862010-07-12 15:51:17 +00005646 __states.push_back(__state());
5647 __states.back().__do_ = 0;
5648 __states.back().__first_ = __first;
5649 __states.back().__current_ = __first;
5650 __states.back().__last_ = __last;
5651 __states.back().__sub_matches_.resize(mark_count());
5652 __states.back().__loop_data_.resize(__loop_count());
5653 __states.back().__node_ = __st;
5654 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005655 __states.back().__at_first_ = __at_first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005656 const _CharT* __current = __first;
Howard Hinnantac303862010-07-12 15:51:17 +00005657 bool __matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005658 do
5659 {
Howard Hinnantac303862010-07-12 15:51:17 +00005660 __state& __s = __states.back();
5661 if (__s.__node_)
5662 __s.__node_->__exec(__s);
5663 switch (__s.__do_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005664 {
Howard Hinnantac303862010-07-12 15:51:17 +00005665 case __state::__end_state:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005666 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005667 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005668 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantac303862010-07-12 15:51:17 +00005669 __best_state = __s;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005670 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005671 __matched = true;
Howard Hinnant99968442011-11-29 18:15:50 +00005672 if (__highest_j == _Np)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005673 __states.clear();
5674 else
5675 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005676 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005677 case __state::__accept_and_consume:
Howard Hinnantcba352d2010-07-12 18:16:05 +00005678 __j += __s.__current_ - __current;
5679 __current = __s.__current_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005680 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005681 case __state::__repeat:
5682 case __state::__accept_but_not_consume:
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005683 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005684 case __state::__split:
5685 {
5686 __state __snext = __s;
5687 __s.__node_->__exec_split(true, __s);
5688 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005689 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005690 }
5691 break;
5692 case __state::__reject:
5693 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005694 break;
5695 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005696#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005697 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005698#endif
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005699 break;
5700 }
Howard Hinnantac303862010-07-12 15:51:17 +00005701 } while (!__states.empty());
5702 if (__matched)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005703 {
5704 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005705 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005706 __m.__matches_[0].matched = true;
Howard Hinnantac303862010-07-12 15:51:17 +00005707 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
5708 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005709 return true;
5710 }
5711 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005712 return false;
5713}
5714
5715template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005716template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005717bool
5718basic_regex<_CharT, _Traits>::__match_at_start(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005719 const _CharT* __first, const _CharT* __last,
5720 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005721 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005722{
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005723 if ((__flags_ & 0x1F0) == ECMAScript)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005724 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005725 if (mark_count() == 0)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005726 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
5727 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005728}
5729
5730template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005731template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005732bool
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005733basic_regex<_CharT, _Traits>::__search(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005734 const _CharT* __first, const _CharT* __last,
5735 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005736 regex_constants::match_flag_type __flags) const
5737{
Howard Hinnanta712c722010-08-16 20:21:16 +00005738 __m.__init(1 + mark_count(), __first, __last,
5739 __flags & regex_constants::__no_update_pos);
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005740 if (__match_at_start(__first, __last, __m, __flags, true))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005741 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005742 __m.__prefix_.second = __m[0].first;
5743 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5744 __m.__suffix_.first = __m[0].second;
5745 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5746 return true;
5747 }
Howard Hinnant8daa7332010-07-29 01:15:27 +00005748 if (__first != __last && !(__flags & regex_constants::match_continuous))
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005749 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005750 __flags |= regex_constants::match_prev_avail;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005751 for (++__first; __first != __last; ++__first)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005752 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005753 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005754 if (__match_at_start(__first, __last, __m, __flags, false))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005755 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005756 __m.__prefix_.second = __m[0].first;
5757 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5758 __m.__suffix_.first = __m[0].second;
5759 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5760 return true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005761 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005762 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005763 }
5764 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005765 __m.__matches_.clear();
5766 return false;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005767}
5768
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005769template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005770inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005771bool
5772regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5773 match_results<_BidirectionalIterator, _Allocator>& __m,
5774 const basic_regex<_CharT, _Traits>& __e,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005775 regex_constants::match_flag_type __flags = regex_constants::match_default)
5776{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005777 basic_string<_CharT> __s(__first, __last);
5778 match_results<const _CharT*> __mc;
5779 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005780 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005781 return __r;
5782}
5783
5784template <class _Allocator, class _CharT, class _Traits>
5785inline _LIBCPP_INLINE_VISIBILITY
5786bool
5787regex_search(const _CharT* __first, const _CharT* __last,
5788 match_results<const _CharT*, _Allocator>& __m,
5789 const basic_regex<_CharT, _Traits>& __e,
5790 regex_constants::match_flag_type __flags = regex_constants::match_default)
5791{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005792 return __e.__search(__first, __last, __m, __flags);
5793}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005794
5795template <class _BidirectionalIterator, class _CharT, class _Traits>
5796inline _LIBCPP_INLINE_VISIBILITY
5797bool
5798regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5799 const basic_regex<_CharT, _Traits>& __e,
5800 regex_constants::match_flag_type __flags = regex_constants::match_default)
5801{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005802 basic_string<_CharT> __s(__first, __last);
5803 match_results<const _CharT*> __mc;
5804 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5805}
5806
5807template <class _CharT, class _Traits>
5808inline _LIBCPP_INLINE_VISIBILITY
5809bool
5810regex_search(const _CharT* __first, const _CharT* __last,
5811 const basic_regex<_CharT, _Traits>& __e,
5812 regex_constants::match_flag_type __flags = regex_constants::match_default)
5813{
5814 match_results<const _CharT*> __mc;
5815 return __e.__search(__first, __last, __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005816}
5817
5818template <class _CharT, class _Allocator, class _Traits>
5819inline _LIBCPP_INLINE_VISIBILITY
5820bool
5821regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5822 const basic_regex<_CharT, _Traits>& __e,
5823 regex_constants::match_flag_type __flags = regex_constants::match_default)
5824{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005825 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005826}
5827
5828template <class _CharT, class _Traits>
5829inline _LIBCPP_INLINE_VISIBILITY
5830bool
5831regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5832 regex_constants::match_flag_type __flags = regex_constants::match_default)
5833{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005834 match_results<const _CharT*> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005835 return _VSTD::regex_search(__str, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005836}
5837
5838template <class _ST, class _SA, class _CharT, class _Traits>
5839inline _LIBCPP_INLINE_VISIBILITY
5840bool
5841regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5842 const basic_regex<_CharT, _Traits>& __e,
5843 regex_constants::match_flag_type __flags = regex_constants::match_default)
5844{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005845 match_results<const _CharT*> __mc;
5846 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005847}
5848
5849template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5850inline _LIBCPP_INLINE_VISIBILITY
5851bool
5852regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5853 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5854 const basic_regex<_CharT, _Traits>& __e,
5855 regex_constants::match_flag_type __flags = regex_constants::match_default)
5856{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005857 match_results<const _CharT*> __mc;
5858 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005859 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005860 return __r;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005861}
5862
5863// regex_match
5864
5865template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
5866bool
5867regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
5868 match_results<_BidirectionalIterator, _Allocator>& __m,
5869 const basic_regex<_CharT, _Traits>& __e,
5870 regex_constants::match_flag_type __flags = regex_constants::match_default)
5871{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005872 bool __r = _VSTD::regex_search(__first, __last, __m, __e,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005873 __flags | regex_constants::match_continuous);
5874 if (__r)
5875 {
5876 __r = !__m.suffix().matched;
5877 if (!__r)
5878 __m.__matches_.clear();
5879 }
5880 return __r;
5881}
5882
5883template <class _BidirectionalIterator, class _CharT, class _Traits>
5884inline _LIBCPP_INLINE_VISIBILITY
5885bool
5886regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
5887 const basic_regex<_CharT, _Traits>& __e,
5888 regex_constants::match_flag_type __flags = regex_constants::match_default)
5889{
5890 match_results<_BidirectionalIterator> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005891 return _VSTD::regex_match(__first, __last, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005892}
5893
5894template <class _CharT, class _Allocator, class _Traits>
5895inline _LIBCPP_INLINE_VISIBILITY
5896bool
5897regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5898 const basic_regex<_CharT, _Traits>& __e,
5899 regex_constants::match_flag_type __flags = regex_constants::match_default)
5900{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005901 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005902}
5903
5904template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5905inline _LIBCPP_INLINE_VISIBILITY
5906bool
5907regex_match(const basic_string<_CharT, _ST, _SA>& __s,
5908 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5909 const basic_regex<_CharT, _Traits>& __e,
5910 regex_constants::match_flag_type __flags = regex_constants::match_default)
5911{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005912 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005913}
5914
5915template <class _CharT, class _Traits>
5916inline _LIBCPP_INLINE_VISIBILITY
5917bool
5918regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5919 regex_constants::match_flag_type __flags = regex_constants::match_default)
5920{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005921 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005922}
5923
5924template <class _ST, class _SA, class _CharT, class _Traits>
5925inline _LIBCPP_INLINE_VISIBILITY
5926bool
5927regex_match(const basic_string<_CharT, _ST, _SA>& __s,
5928 const basic_regex<_CharT, _Traits>& __e,
5929 regex_constants::match_flag_type __flags = regex_constants::match_default)
5930{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005931 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005932}
5933
Howard Hinnanta712c722010-08-16 20:21:16 +00005934// regex_iterator
5935
5936template <class _BidirectionalIterator,
5937 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
5938 class _Traits = regex_traits<_CharT> >
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005939class _LIBCPP_VISIBLE regex_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00005940{
5941public:
5942 typedef basic_regex<_CharT, _Traits> regex_type;
5943 typedef match_results<_BidirectionalIterator> value_type;
5944 typedef ptrdiff_t difference_type;
5945 typedef const value_type* pointer;
5946 typedef const value_type& reference;
5947 typedef forward_iterator_tag iterator_category;
5948
5949private:
5950 _BidirectionalIterator __begin_;
5951 _BidirectionalIterator __end_;
5952 const regex_type* __pregex_;
5953 regex_constants::match_flag_type __flags_;
5954 value_type __match_;
5955
5956public:
5957 regex_iterator();
5958 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
5959 const regex_type& __re,
5960 regex_constants::match_flag_type __m = regex_constants::match_default);
5961
5962 bool operator==(const regex_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005963 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00005964 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
5965
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005966 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00005967 reference operator*() const {return __match_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005968 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00005969 pointer operator->() const {return &__match_;}
5970
5971 regex_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005972 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00005973 regex_iterator operator++(int)
5974 {
5975 regex_iterator __t(*this);
5976 ++(*this);
5977 return __t;
5978 }
5979};
5980
5981template <class _BidirectionalIterator, class _CharT, class _Traits>
5982regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
5983 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
5984{
5985}
5986
5987template <class _BidirectionalIterator, class _CharT, class _Traits>
5988regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
5989 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
5990 const regex_type& __re, regex_constants::match_flag_type __m)
5991 : __begin_(__a),
5992 __end_(__b),
5993 __pregex_(&__re),
5994 __flags_(__m)
5995{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005996 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
Howard Hinnanta712c722010-08-16 20:21:16 +00005997}
5998
5999template <class _BidirectionalIterator, class _CharT, class _Traits>
6000bool
6001regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6002 operator==(const regex_iterator& __x) const
6003{
6004 if (__match_.empty() && __x.__match_.empty())
6005 return true;
6006 if (__match_.empty() || __x.__match_.empty())
6007 return false;
6008 return __begin_ == __x.__begin_ &&
6009 __end_ == __x.__end_ &&
6010 __pregex_ == __x.__pregex_ &&
6011 __flags_ == __x.__flags_ &&
6012 __match_[0] == __x.__match_[0];
6013}
6014
6015template <class _BidirectionalIterator, class _CharT, class _Traits>
6016regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6017regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6018{
6019 __flags_ |= regex_constants::__no_update_pos;
6020 _BidirectionalIterator __start = __match_[0].second;
6021 if (__match_.length() == 0)
6022 {
6023 if (__start == __end_)
6024 {
6025 __match_ = value_type();
6026 return *this;
6027 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00006028 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
Howard Hinnanta712c722010-08-16 20:21:16 +00006029 __flags_ | regex_constants::match_not_null |
6030 regex_constants::match_continuous))
6031 return *this;
6032 else
6033 ++__start;
6034 }
6035 __flags_ |= regex_constants::match_prev_avail;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006036 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
Howard Hinnanta712c722010-08-16 20:21:16 +00006037 __match_ = value_type();
6038 return *this;
6039}
6040
6041typedef regex_iterator<const char*> cregex_iterator;
6042typedef regex_iterator<const wchar_t*> wcregex_iterator;
6043typedef regex_iterator<string::const_iterator> sregex_iterator;
6044typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
6045
6046// regex_token_iterator
6047
6048template <class _BidirectionalIterator,
6049 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6050 class _Traits = regex_traits<_CharT> >
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006051class _LIBCPP_VISIBLE regex_token_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00006052{
6053public:
6054 typedef basic_regex<_CharT, _Traits> regex_type;
6055 typedef sub_match<_BidirectionalIterator> value_type;
6056 typedef ptrdiff_t difference_type;
6057 typedef const value_type* pointer;
6058 typedef const value_type& reference;
6059 typedef forward_iterator_tag iterator_category;
6060
Howard Hinnant262b7792010-08-17 20:42:03 +00006061private:
6062 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6063
6064 _Position __position_;
6065 const value_type* __result_;
6066 value_type __suffix_;
6067 ptrdiff_t _N_;
6068 vector<int> __subs_;
6069
6070public:
Howard Hinnanta712c722010-08-16 20:21:16 +00006071 regex_token_iterator();
6072 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6073 const regex_type& __re, int __submatch = 0,
Howard Hinnant262b7792010-08-17 20:42:03 +00006074 regex_constants::match_flag_type __m =
6075 regex_constants::match_default);
Howard Hinnanta712c722010-08-16 20:21:16 +00006076 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6077 const regex_type& __re, const vector<int>& __submatches,
Howard Hinnant262b7792010-08-17 20:42:03 +00006078 regex_constants::match_flag_type __m =
6079 regex_constants::match_default);
Howard Hinnante3e32912011-08-12 21:56:02 +00006080#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnanta712c722010-08-16 20:21:16 +00006081 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
Howard Hinnant262b7792010-08-17 20:42:03 +00006082 const regex_type& __re,
6083 initializer_list<int> __submatches,
6084 regex_constants::match_flag_type __m =
6085 regex_constants::match_default);
Howard Hinnante3e32912011-08-12 21:56:02 +00006086#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant99968442011-11-29 18:15:50 +00006087 template <size_t _Np>
Howard Hinnant262b7792010-08-17 20:42:03 +00006088 regex_token_iterator(_BidirectionalIterator __a,
6089 _BidirectionalIterator __b,
6090 const regex_type& __re,
Howard Hinnant99968442011-11-29 18:15:50 +00006091 const int (&__submatches)[_Np],
Howard Hinnant262b7792010-08-17 20:42:03 +00006092 regex_constants::match_flag_type __m =
6093 regex_constants::match_default);
Howard Hinnanta712c722010-08-16 20:21:16 +00006094 regex_token_iterator(const regex_token_iterator&);
6095 regex_token_iterator& operator=(const regex_token_iterator&);
6096
Howard Hinnant262b7792010-08-17 20:42:03 +00006097 bool operator==(const regex_token_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006098 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006099 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
Howard Hinnanta712c722010-08-16 20:21:16 +00006100
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006101 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006102 const value_type& operator*() const {return *__result_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006103 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006104 const value_type* operator->() const {return __result_;}
Howard Hinnanta712c722010-08-16 20:21:16 +00006105
6106 regex_token_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006107 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006108 regex_token_iterator operator++(int)
6109 {
6110 regex_token_iterator __t(*this);
6111 ++(*this);
6112 return __t;
6113 }
6114
6115private:
6116 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
Howard Hinnanta712c722010-08-16 20:21:16 +00006117};
6118
Howard Hinnant262b7792010-08-17 20:42:03 +00006119template <class _BidirectionalIterator, class _CharT, class _Traits>
6120regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6121 regex_token_iterator()
6122 : __result_(nullptr),
6123 __suffix_(),
6124 _N_(0)
6125{
6126}
6127
6128template <class _BidirectionalIterator, class _CharT, class _Traits>
6129void
6130regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6131 __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6132{
6133 if (__position_ != _Position())
6134 {
6135 if (__subs_[_N_] == -1)
6136 __result_ = &__position_->prefix();
6137 else
6138 __result_ = &(*__position_)[__subs_[_N_]];
6139 }
6140 else if (__subs_[_N_] == -1)
6141 {
6142 __suffix_.matched = true;
6143 __suffix_.first = __a;
6144 __suffix_.second = __b;
6145 __result_ = &__suffix_;
6146 }
6147 else
6148 __result_ = nullptr;
6149}
6150
6151template <class _BidirectionalIterator, class _CharT, class _Traits>
6152regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6153 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6154 const regex_type& __re, int __submatch,
6155 regex_constants::match_flag_type __m)
6156 : __position_(__a, __b, __re, __m),
6157 _N_(0),
6158 __subs_(1, __submatch)
6159{
6160 __init(__a, __b);
6161}
6162
6163template <class _BidirectionalIterator, class _CharT, class _Traits>
6164regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6165 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6166 const regex_type& __re, const vector<int>& __submatches,
6167 regex_constants::match_flag_type __m)
6168 : __position_(__a, __b, __re, __m),
6169 _N_(0),
6170 __subs_(__submatches)
6171{
6172 __init(__a, __b);
6173}
6174
Howard Hinnante3e32912011-08-12 21:56:02 +00006175#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6176
Howard Hinnant262b7792010-08-17 20:42:03 +00006177template <class _BidirectionalIterator, class _CharT, class _Traits>
6178regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6179 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6180 const regex_type& __re,
6181 initializer_list<int> __submatches,
6182 regex_constants::match_flag_type __m)
6183 : __position_(__a, __b, __re, __m),
6184 _N_(0),
6185 __subs_(__submatches)
6186{
6187 __init(__a, __b);
6188}
6189
Howard Hinnante3e32912011-08-12 21:56:02 +00006190#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6191
Howard Hinnant262b7792010-08-17 20:42:03 +00006192template <class _BidirectionalIterator, class _CharT, class _Traits>
Howard Hinnant99968442011-11-29 18:15:50 +00006193template <size_t _Np>
Howard Hinnant262b7792010-08-17 20:42:03 +00006194regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6195 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6196 const regex_type& __re,
Howard Hinnant99968442011-11-29 18:15:50 +00006197 const int (&__submatches)[_Np],
Howard Hinnant262b7792010-08-17 20:42:03 +00006198 regex_constants::match_flag_type __m)
6199 : __position_(__a, __b, __re, __m),
6200 _N_(0),
Howard Hinnant99968442011-11-29 18:15:50 +00006201 __subs_(__submatches, __submatches + _Np)
Howard Hinnant262b7792010-08-17 20:42:03 +00006202{
6203 __init(__a, __b);
6204}
6205
6206template <class _BidirectionalIterator, class _CharT, class _Traits>
6207regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6208 regex_token_iterator(const regex_token_iterator& __x)
6209 : __position_(__x.__position_),
6210 __result_(__x.__result_),
6211 __suffix_(__x.__suffix_),
6212 _N_(__x._N_),
6213 __subs_(__x.__subs_)
6214{
6215 if (__x.__result_ == &__x.__suffix_)
6216 __result_ == &__suffix_;
6217}
6218
6219template <class _BidirectionalIterator, class _CharT, class _Traits>
6220regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6221regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6222 operator=(const regex_token_iterator& __x)
6223{
6224 if (this != &__x)
6225 {
6226 __position_ = __x.__position_;
6227 if (__x.__result_ == &__x.__suffix_)
6228 __result_ == &__suffix_;
6229 else
6230 __result_ = __x.__result_;
6231 __suffix_ = __x.__suffix_;
6232 _N_ = __x._N_;
6233 __subs_ = __x.__subs_;
6234 }
6235 return *this;
6236}
6237
6238template <class _BidirectionalIterator, class _CharT, class _Traits>
6239bool
6240regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6241 operator==(const regex_token_iterator& __x) const
6242{
6243 if (__result_ == nullptr && __x.__result_ == nullptr)
6244 return true;
6245 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6246 __suffix_ == __x.__suffix_)
6247 return true;
6248 if (__result_ == nullptr || __x.__result_ == nullptr)
6249 return false;
6250 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6251 return false;
6252 return __position_ == __x.__position_ && _N_ == __x._N_ &&
6253 __subs_ == __x.__subs_;
6254}
6255
6256template <class _BidirectionalIterator, class _CharT, class _Traits>
6257regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6258regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6259{
6260 _Position __prev = __position_;
6261 if (__result_ == &__suffix_)
6262 __result_ = nullptr;
6263 else if (_N_ + 1 < __subs_.size())
6264 {
6265 ++_N_;
6266 if (__subs_[_N_] == -1)
6267 __result_ = &__position_->prefix();
6268 else
6269 __result_ = &(*__position_)[__subs_[_N_]];
6270 }
6271 else
6272 {
6273 _N_ = 0;
6274 ++__position_;
6275 if (__position_ != _Position())
6276 {
6277 if (__subs_[_N_] == -1)
6278 __result_ = &__position_->prefix();
6279 else
6280 __result_ = &(*__position_)[__subs_[_N_]];
6281 }
6282 else
6283 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00006284 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
Howard Hinnant262b7792010-08-17 20:42:03 +00006285 && __prev->suffix().length() != 0)
6286 {
6287 __suffix_.matched = true;
6288 __suffix_.first = __prev->suffix().first;
6289 __suffix_.second = __prev->suffix().second;
6290 __result_ = &__suffix_;
6291 }
6292 else
6293 __result_ = nullptr;
6294 }
6295 }
6296 return *this;
6297}
6298
Howard Hinnanta712c722010-08-16 20:21:16 +00006299typedef regex_token_iterator<const char*> cregex_token_iterator;
6300typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
6301typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
6302typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
6303
Howard Hinnanta8d77592010-08-18 00:13:08 +00006304// regex_replace
6305
6306template <class _OutputIterator, class _BidirectionalIterator,
6307 class _Traits, class _CharT>
6308_OutputIterator
6309regex_replace(_OutputIterator __out,
6310 _BidirectionalIterator __first, _BidirectionalIterator __last,
6311 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6312 regex_constants::match_flag_type __flags = regex_constants::match_default)
6313{
6314 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6315 _Iter __i(__first, __last, __e, __flags);
6316 _Iter __eof;
6317 if (__i == __eof)
6318 {
6319 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006320 __out = _VSTD::copy(__first, __last, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006321 }
6322 else
6323 {
6324 sub_match<_BidirectionalIterator> __lm;
6325 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6326 {
6327 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006328 __out = _VSTD::copy(__i->prefix().first, __i->prefix().second, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006329 __out = __i->format(__out, __fmt, __fmt + __len, __flags);
6330 __lm = __i->suffix();
6331 if (__flags & regex_constants::format_first_only)
6332 break;
6333 }
6334 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006335 __out = _VSTD::copy(__lm.first, __lm.second, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006336 }
6337 return __out;
6338}
6339
6340template <class _OutputIterator, class _BidirectionalIterator,
6341 class _Traits, class _CharT, class _ST, class _SA>
6342inline _LIBCPP_INLINE_VISIBILITY
6343_OutputIterator
6344regex_replace(_OutputIterator __out,
6345 _BidirectionalIterator __first, _BidirectionalIterator __last,
6346 const basic_regex<_CharT, _Traits>& __e,
6347 const basic_string<_CharT, _ST, _SA>& __fmt,
6348 regex_constants::match_flag_type __flags = regex_constants::match_default)
6349{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006350 return _VSTD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006351}
6352
6353template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6354 class _FSA>
6355inline _LIBCPP_INLINE_VISIBILITY
6356basic_string<_CharT, _ST, _SA>
6357regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6358 const basic_regex<_CharT, _Traits>& __e,
6359 const basic_string<_CharT, _FST, _FSA>& __fmt,
6360 regex_constants::match_flag_type __flags = regex_constants::match_default)
6361{
6362 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006363 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006364 __fmt.c_str(), __flags);
6365 return __r;
6366}
6367
6368template <class _Traits, class _CharT, class _ST, class _SA>
6369inline _LIBCPP_INLINE_VISIBILITY
6370basic_string<_CharT, _ST, _SA>
6371regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6372 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6373 regex_constants::match_flag_type __flags = regex_constants::match_default)
6374{
6375 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006376 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006377 __fmt, __flags);
6378 return __r;
6379}
6380
6381template <class _Traits, class _CharT, class _ST, class _SA>
6382inline _LIBCPP_INLINE_VISIBILITY
6383basic_string<_CharT>
6384regex_replace(const _CharT* __s,
6385 const basic_regex<_CharT, _Traits>& __e,
6386 const basic_string<_CharT, _ST, _SA>& __fmt,
6387 regex_constants::match_flag_type __flags = regex_constants::match_default)
6388{
6389 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006390 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006391 __s + char_traits<_CharT>::length(__s), __e,
6392 __fmt.c_str(), __flags);
6393 return __r;
6394}
6395
6396template <class _Traits, class _CharT>
6397inline _LIBCPP_INLINE_VISIBILITY
6398basic_string<_CharT>
6399regex_replace(const _CharT* __s,
6400 const basic_regex<_CharT, _Traits>& __e,
6401 const _CharT* __fmt,
6402 regex_constants::match_flag_type __flags = regex_constants::match_default)
6403{
6404 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006405 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006406 __s + char_traits<_CharT>::length(__s), __e,
6407 __fmt, __flags);
6408 return __r;
6409}
6410
Howard Hinnant3257c982010-06-17 00:34:59 +00006411_LIBCPP_END_NAMESPACE_STD
6412
6413#endif // _LIBCPP_REGEX