blob: bde3af7e455cb7c136869ef0f96a0b785d1f83b9 [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{
Marshall Clow04bd79b2013-03-22 02:13:55 +0000767 return syntax_option_type(~int(__x) & 0x1FF);
Howard Hinnant3257c982010-06-17 00:34:59 +0000768}
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{
Marshall Clow04bd79b2013-03-22 02:13:55 +0000843 return match_flag_type(~int(__x) & 0x0FFF);
Howard Hinnant3257c982010-06-17 00:34:59 +0000844}
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 Hinnant83eade62013-03-06 23:30:19 +0000928struct _LIBCPP_TYPE_VIS 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>
Howard Hinnant23fb9722013-03-07 19:38:08 +00001012const typename regex_traits<_CharT>::char_class_type
1013regex_traits<_CharT>::__regex_word;
1014
1015template <class _CharT>
Howard Hinnant3257c982010-06-17 00:34:59 +00001016regex_traits<_CharT>::regex_traits()
1017{
1018 __init();
1019}
1020
1021template <class _CharT>
1022typename regex_traits<_CharT>::char_type
1023regex_traits<_CharT>::translate_nocase(char_type __c) const
1024{
1025 return __ct_->tolower(__c);
1026}
1027
1028template <class _CharT>
1029template <class _ForwardIterator>
1030typename regex_traits<_CharT>::string_type
1031regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
1032{
1033 string_type __s(__f, __l);
1034 return __col_->transform(__s.data(), __s.data() + __s.size());
1035}
1036
1037template <class _CharT>
1038void
1039regex_traits<_CharT>::__init()
1040{
1041 __ct_ = &use_facet<ctype<char_type> >(__loc_);
1042 __col_ = &use_facet<collate<char_type> >(__loc_);
1043}
1044
1045template <class _CharT>
1046typename regex_traits<_CharT>::locale_type
1047regex_traits<_CharT>::imbue(locale_type __l)
1048{
1049 locale __r = __loc_;
1050 __loc_ = __l;
1051 __init();
1052 return __r;
1053}
1054
1055// transform_primary is very FreeBSD-specific
1056
1057template <class _CharT>
1058template <class _ForwardIterator>
1059typename regex_traits<_CharT>::string_type
1060regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1061 _ForwardIterator __l, char) const
1062{
1063 const string_type __s(__f, __l);
1064 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1065 switch (__d.size())
1066 {
1067 case 1:
1068 break;
1069 case 12:
1070 __d[11] = __d[3];
1071 break;
1072 default:
1073 __d.clear();
1074 break;
1075 }
1076 return __d;
1077}
1078
1079template <class _CharT>
1080template <class _ForwardIterator>
1081typename regex_traits<_CharT>::string_type
1082regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1083 _ForwardIterator __l, wchar_t) const
1084{
1085 const string_type __s(__f, __l);
1086 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1087 switch (__d.size())
1088 {
1089 case 1:
1090 break;
1091 case 3:
1092 __d[2] = __d[0];
1093 break;
1094 default:
1095 __d.clear();
1096 break;
1097 }
1098 return __d;
1099}
1100
1101// lookup_collatename is very FreeBSD-specific
1102
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001103string __get_collation_name(const char* __s);
Howard Hinnant3257c982010-06-17 00:34:59 +00001104
1105template <class _CharT>
1106template <class _ForwardIterator>
1107typename regex_traits<_CharT>::string_type
1108regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1109 _ForwardIterator __l, char) const
1110{
1111 string_type __s(__f, __l);
1112 string_type __r;
1113 if (!__s.empty())
1114 {
1115 __r = __get_collation_name(__s.c_str());
1116 if (__r.empty() && __s.size() <= 2)
1117 {
1118 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1119 if (__r.size() == 1 || __r.size() == 12)
1120 __r = __s;
1121 else
1122 __r.clear();
1123 }
1124 }
1125 return __r;
1126}
1127
1128template <class _CharT>
1129template <class _ForwardIterator>
1130typename regex_traits<_CharT>::string_type
1131regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1132 _ForwardIterator __l, wchar_t) const
1133{
1134 string_type __s(__f, __l);
1135 string __n;
1136 __n.reserve(__s.size());
1137 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1138 __i != __e; ++__i)
1139 {
1140 if (static_cast<unsigned>(*__i) >= 127)
1141 return string_type();
1142 __n.push_back(char(*__i));
1143 }
1144 string_type __r;
1145 if (!__s.empty())
1146 {
1147 __n = __get_collation_name(__n.c_str());
1148 if (!__n.empty())
1149 __r.assign(__n.begin(), __n.end());
1150 else if (__s.size() <= 2)
1151 {
1152 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1153 if (__r.size() == 1 || __r.size() == 3)
1154 __r = __s;
1155 else
1156 __r.clear();
1157 }
1158 }
1159 return __r;
1160}
1161
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001162// lookup_classname
1163
1164ctype_base::mask __get_classname(const char* __s, bool __icase);
1165
1166template <class _CharT>
1167template <class _ForwardIterator>
1168typename regex_traits<_CharT>::char_class_type
1169regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1170 _ForwardIterator __l,
1171 bool __icase, char) const
1172{
1173 string_type __s(__f, __l);
1174 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1175 return __get_classname(__s.c_str(), __icase);
1176}
1177
1178template <class _CharT>
1179template <class _ForwardIterator>
1180typename regex_traits<_CharT>::char_class_type
1181regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1182 _ForwardIterator __l,
1183 bool __icase, wchar_t) const
1184{
1185 string_type __s(__f, __l);
1186 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1187 string __n;
1188 __n.reserve(__s.size());
1189 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1190 __i != __e; ++__i)
1191 {
1192 if (static_cast<unsigned>(*__i) >= 127)
1193 return char_class_type();
1194 __n.push_back(char(*__i));
1195 }
1196 return __get_classname(__n.c_str(), __icase);
1197}
1198
1199template <class _CharT>
1200bool
1201regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
1202{
1203 if (__ct_->is(__m, __c))
1204 return true;
1205 return (__c == '_' && (__m & __regex_word));
1206}
1207
1208template <class _CharT>
1209int
1210regex_traits<_CharT>::__value(unsigned char __ch, int __radix)
1211{
1212 if ((__ch & 0xF8u) == 0x30) // '0' <= __ch && __ch <= '7'
1213 return __ch - '0';
1214 if (__radix != 8)
1215 {
1216 if ((__ch & 0xFEu) == 0x38) // '8' <= __ch && __ch <= '9'
1217 return __ch - '0';
1218 if (__radix == 16)
1219 {
1220 __ch |= 0x20; // tolower
1221 if ('a' <= __ch && __ch <= 'f')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00001222 return __ch - ('a' - 10);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001223 }
1224 }
1225 return -1;
1226}
1227
1228template <class _CharT>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001229inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001230int
1231regex_traits<_CharT>::__value(wchar_t __ch, int __radix) const
1232{
1233 return __value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
1234}
1235
Howard Hinnantac303862010-07-12 15:51:17 +00001236template <class _CharT> class __node;
1237
Howard Hinnant83eade62013-03-06 23:30:19 +00001238template <class _BidirectionalIterator> class _LIBCPP_TYPE_VIS sub_match;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001239
Howard Hinnant17615b02010-07-27 01:25:38 +00001240template <class _BidirectionalIterator,
1241 class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
Howard Hinnant83eade62013-03-06 23:30:19 +00001242class _LIBCPP_TYPE_VIS match_results;
Howard Hinnant17615b02010-07-27 01:25:38 +00001243
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001244template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001245struct __state
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001246{
1247 enum
1248 {
1249 __end_state = -1000,
1250 __consume_input, // -999
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001251 __begin_marked_expr, // -998
1252 __end_marked_expr, // -997
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001253 __pop_state, // -996
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001254 __accept_and_consume, // -995
1255 __accept_but_not_consume, // -994
1256 __reject, // -993
Howard Hinnantac303862010-07-12 15:51:17 +00001257 __split,
1258 __repeat
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001259 };
1260
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001261 int __do_;
Howard Hinnantac303862010-07-12 15:51:17 +00001262 const _CharT* __first_;
1263 const _CharT* __current_;
1264 const _CharT* __last_;
1265 vector<sub_match<const _CharT*> > __sub_matches_;
1266 vector<pair<size_t, const _CharT*> > __loop_data_;
1267 const __node<_CharT>* __node_;
1268 regex_constants::match_flag_type __flags_;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001269 bool __at_first_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001270
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001271 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001272 __state()
1273 : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
1274 __node_(nullptr), __flags_() {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001275};
1276
Howard Hinnantac303862010-07-12 15:51:17 +00001277// __node
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001278
1279template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001280class __node
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001281{
Howard Hinnantac303862010-07-12 15:51:17 +00001282 __node(const __node&);
1283 __node& operator=(const __node&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001284public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001285 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001286
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001287 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001288 __node() {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001289 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001290 virtual ~__node() {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001291
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001292 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001293 virtual void __exec(__state&) const {};
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001294 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001295 virtual void __exec_split(bool, __state&) const {};
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001296};
1297
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001298// __end_state
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001299
1300template <class _CharT>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001301class __end_state
Howard Hinnantac303862010-07-12 15:51:17 +00001302 : public __node<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001303{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001304public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001305 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001306
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001307 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001308 __end_state() {}
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001309
Howard Hinnantac303862010-07-12 15:51:17 +00001310 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001311};
1312
1313template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001314void
1315__end_state<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001316{
Howard Hinnantac303862010-07-12 15:51:17 +00001317 __s.__do_ = __state::__end_state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001318}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001319
1320// __has_one_state
1321
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001322template <class _CharT>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001323class __has_one_state
Howard Hinnantac303862010-07-12 15:51:17 +00001324 : public __node<_CharT>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001325{
Howard Hinnantac303862010-07-12 15:51:17 +00001326 __node<_CharT>* __first_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001327
1328public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001329 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001330 explicit __has_one_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001331 : __first_(__s) {}
1332
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001333 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001334 __node<_CharT>* first() const {return __first_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001335 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001336 __node<_CharT>*& first() {return __first_;}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001337};
1338
1339// __owns_one_state
1340
1341template <class _CharT>
1342class __owns_one_state
1343 : public __has_one_state<_CharT>
1344{
1345 typedef __has_one_state<_CharT> base;
1346
1347public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001348 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001349 explicit __owns_one_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001350 : base(__s) {}
1351
1352 virtual ~__owns_one_state();
1353};
1354
1355template <class _CharT>
1356__owns_one_state<_CharT>::~__owns_one_state()
1357{
1358 delete this->first();
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001359}
1360
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001361// __empty_state
1362
1363template <class _CharT>
1364class __empty_state
1365 : public __owns_one_state<_CharT>
1366{
1367 typedef __owns_one_state<_CharT> base;
1368
1369public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001370 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001371
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001372 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001373 explicit __empty_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001374 : base(__s) {}
1375
Howard Hinnantac303862010-07-12 15:51:17 +00001376 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001377};
1378
1379template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001380void
1381__empty_state<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001382{
Howard Hinnantac303862010-07-12 15:51:17 +00001383 __s.__do_ = __state::__accept_but_not_consume;
1384 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001385}
1386
1387// __empty_non_own_state
1388
1389template <class _CharT>
1390class __empty_non_own_state
1391 : public __has_one_state<_CharT>
1392{
1393 typedef __has_one_state<_CharT> base;
1394
1395public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001396 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001397
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001398 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001399 explicit __empty_non_own_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001400 : base(__s) {}
1401
Howard Hinnantac303862010-07-12 15:51:17 +00001402 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001403};
1404
1405template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001406void
1407__empty_non_own_state<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001408{
Howard Hinnantac303862010-07-12 15:51:17 +00001409 __s.__do_ = __state::__accept_but_not_consume;
1410 __s.__node_ = this->first();
1411}
1412
1413// __repeat_one_loop
1414
1415template <class _CharT>
1416class __repeat_one_loop
1417 : public __has_one_state<_CharT>
1418{
1419 typedef __has_one_state<_CharT> base;
1420
1421public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001422 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantac303862010-07-12 15:51:17 +00001423
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001424 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001425 explicit __repeat_one_loop(__node<_CharT>* __s)
1426 : base(__s) {}
1427
1428 virtual void __exec(__state&) const;
Howard Hinnantac303862010-07-12 15:51:17 +00001429};
1430
1431template <class _CharT>
1432void
1433__repeat_one_loop<_CharT>::__exec(__state& __s) const
1434{
1435 __s.__do_ = __state::__repeat;
1436 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001437}
1438
1439// __owns_two_states
1440
1441template <class _CharT>
1442class __owns_two_states
1443 : public __owns_one_state<_CharT>
1444{
1445 typedef __owns_one_state<_CharT> base;
1446
1447 base* __second_;
1448
1449public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001450 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001451 explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001452 : base(__s1), __second_(__s2) {}
1453
1454 virtual ~__owns_two_states();
1455
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001456 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001457 base* second() const {return __second_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001458 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001459 base*& second() {return __second_;}
1460};
1461
1462template <class _CharT>
1463__owns_two_states<_CharT>::~__owns_two_states()
1464{
1465 delete __second_;
1466}
1467
1468// __loop
1469
1470template <class _CharT>
1471class __loop
1472 : public __owns_two_states<_CharT>
1473{
1474 typedef __owns_two_states<_CharT> base;
1475
1476 size_t __min_;
1477 size_t __max_;
1478 unsigned __loop_id_;
Howard Hinnantac303862010-07-12 15:51:17 +00001479 unsigned __mexp_begin_;
1480 unsigned __mexp_end_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001481 bool __greedy_;
1482
1483public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001484 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001485
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001486 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001487 explicit __loop(unsigned __loop_id,
Howard Hinnantac303862010-07-12 15:51:17 +00001488 __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
1489 unsigned __mexp_begin, unsigned __mexp_end,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001490 bool __greedy = true,
1491 size_t __min = 0,
1492 size_t __max = numeric_limits<size_t>::max())
1493 : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
Howard Hinnantac303862010-07-12 15:51:17 +00001494 __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001495 __greedy_(__greedy) {}
1496
Howard Hinnantac303862010-07-12 15:51:17 +00001497 virtual void __exec(__state& __s) const;
1498 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001499
Howard Hinnantac303862010-07-12 15:51:17 +00001500private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001501 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001502 void __init_repeat(__state& __s) const
1503 {
1504 __s.__loop_data_[__loop_id_].second = __s.__current_;
1505 for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
1506 {
1507 __s.__sub_matches_[__i].first = __s.__last_;
1508 __s.__sub_matches_[__i].second = __s.__last_;
1509 __s.__sub_matches_[__i].matched = false;
1510 }
1511 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001512};
1513
1514template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001515void
1516__loop<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001517{
Howard Hinnantac303862010-07-12 15:51:17 +00001518 if (__s.__do_ == __state::__repeat)
1519 {
1520 bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
1521 bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
1522 if (__do_repeat && __do_alt &&
1523 __s.__loop_data_[__loop_id_].second == __s.__current_)
1524 __do_repeat = false;
1525 if (__do_repeat && __do_alt)
1526 __s.__do_ = __state::__split;
1527 else if (__do_repeat)
1528 {
1529 __s.__do_ = __state::__accept_but_not_consume;
1530 __s.__node_ = this->first();
1531 __init_repeat(__s);
1532 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001533 else
Howard Hinnantac303862010-07-12 15:51:17 +00001534 {
1535 __s.__do_ = __state::__accept_but_not_consume;
1536 __s.__node_ = this->second();
1537 }
1538 }
1539 else
1540 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00001541 __s.__loop_data_[__loop_id_].first = 0;
1542 bool __do_repeat = 0 < __max_;
1543 bool __do_alt = 0 >= __min_;
1544 if (__do_repeat && __do_alt)
Howard Hinnantac303862010-07-12 15:51:17 +00001545 __s.__do_ = __state::__split;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00001546 else if (__do_repeat)
1547 {
1548 __s.__do_ = __state::__accept_but_not_consume;
1549 __s.__node_ = this->first();
1550 __init_repeat(__s);
1551 }
Howard Hinnantac303862010-07-12 15:51:17 +00001552 else
1553 {
1554 __s.__do_ = __state::__accept_but_not_consume;
1555 __s.__node_ = this->second();
1556 }
1557 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001558}
1559
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001560template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001561void
1562__loop<_CharT>::__exec_split(bool __second, __state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001563{
Howard Hinnantac303862010-07-12 15:51:17 +00001564 __s.__do_ = __state::__accept_but_not_consume;
1565 if (__greedy_ != __second)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001566 {
Howard Hinnantac303862010-07-12 15:51:17 +00001567 __s.__node_ = this->first();
1568 __init_repeat(__s);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001569 }
Howard Hinnantac303862010-07-12 15:51:17 +00001570 else
1571 __s.__node_ = this->second();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001572}
1573
Howard Hinnantaa698082010-07-16 19:08:36 +00001574// __alternate
1575
1576template <class _CharT>
1577class __alternate
1578 : public __owns_two_states<_CharT>
1579{
1580 typedef __owns_two_states<_CharT> base;
1581
1582public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001583 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantaa698082010-07-16 19:08:36 +00001584
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001585 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa698082010-07-16 19:08:36 +00001586 explicit __alternate(__owns_one_state<_CharT>* __s1,
1587 __owns_one_state<_CharT>* __s2)
1588 : base(__s1, __s2) {}
1589
1590 virtual void __exec(__state& __s) const;
1591 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnantaa698082010-07-16 19:08:36 +00001592};
1593
1594template <class _CharT>
1595void
1596__alternate<_CharT>::__exec(__state& __s) const
1597{
1598 __s.__do_ = __state::__split;
1599}
1600
1601template <class _CharT>
1602void
1603__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
1604{
1605 __s.__do_ = __state::__accept_but_not_consume;
Howard Hinnant1371b2e2010-07-22 14:12:20 +00001606 if (__second)
Howard Hinnantaa698082010-07-16 19:08:36 +00001607 __s.__node_ = this->second();
Howard Hinnant1371b2e2010-07-22 14:12:20 +00001608 else
1609 __s.__node_ = this->first();
Howard Hinnantaa698082010-07-16 19:08:36 +00001610}
1611
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001612// __begin_marked_subexpression
1613
1614template <class _CharT>
1615class __begin_marked_subexpression
1616 : public __owns_one_state<_CharT>
1617{
1618 typedef __owns_one_state<_CharT> base;
1619
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001620 unsigned __mexp_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001621public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001622 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001623
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001624 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001625 explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001626 : base(__s), __mexp_(__mexp) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001627
Howard Hinnantac303862010-07-12 15:51:17 +00001628 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001629};
1630
1631template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001632void
1633__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001634{
Howard Hinnantac303862010-07-12 15:51:17 +00001635 __s.__do_ = __state::__accept_but_not_consume;
1636 __s.__sub_matches_[__mexp_-1].first = __s.__current_;
1637 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001638}
1639
1640// __end_marked_subexpression
1641
1642template <class _CharT>
1643class __end_marked_subexpression
1644 : public __owns_one_state<_CharT>
1645{
1646 typedef __owns_one_state<_CharT> base;
1647
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001648 unsigned __mexp_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001649public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001650 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001651
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001652 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001653 explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001654 : base(__s), __mexp_(__mexp) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001655
Howard Hinnantac303862010-07-12 15:51:17 +00001656 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001657};
1658
1659template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001660void
1661__end_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001662{
Howard Hinnantac303862010-07-12 15:51:17 +00001663 __s.__do_ = __state::__accept_but_not_consume;
1664 __s.__sub_matches_[__mexp_-1].second = __s.__current_;
1665 __s.__sub_matches_[__mexp_-1].matched = true;
1666 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001667}
1668
Howard Hinnantcba352d2010-07-12 18:16:05 +00001669// __back_ref
1670
1671template <class _CharT>
1672class __back_ref
1673 : public __owns_one_state<_CharT>
1674{
1675 typedef __owns_one_state<_CharT> base;
1676
1677 unsigned __mexp_;
1678public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001679 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcba352d2010-07-12 18:16:05 +00001680
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001681 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcba352d2010-07-12 18:16:05 +00001682 explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
1683 : base(__s), __mexp_(__mexp) {}
1684
1685 virtual void __exec(__state&) const;
Howard Hinnantcba352d2010-07-12 18:16:05 +00001686};
1687
1688template <class _CharT>
1689void
1690__back_ref<_CharT>::__exec(__state& __s) const
1691{
1692 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1693 if (__sm.matched)
1694 {
1695 ptrdiff_t __len = __sm.second - __sm.first;
1696 if (__s.__last_ - __s.__current_ >= __len &&
Howard Hinnant0949eed2011-06-30 21:18:19 +00001697 _VSTD::equal(__sm.first, __sm.second, __s.__current_))
Howard Hinnantcba352d2010-07-12 18:16:05 +00001698 {
1699 __s.__do_ = __state::__accept_but_not_consume;
1700 __s.__current_ += __len;
1701 __s.__node_ = this->first();
1702 }
1703 else
1704 {
1705 __s.__do_ = __state::__reject;
1706 __s.__node_ = nullptr;
1707 }
1708 }
1709 else
1710 {
1711 __s.__do_ = __state::__reject;
1712 __s.__node_ = nullptr;
1713 }
1714}
1715
Howard Hinnante34f17d2010-07-12 19:11:27 +00001716// __back_ref_icase
1717
1718template <class _CharT, class _Traits>
1719class __back_ref_icase
1720 : public __owns_one_state<_CharT>
1721{
1722 typedef __owns_one_state<_CharT> base;
1723
1724 _Traits __traits_;
1725 unsigned __mexp_;
1726public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001727 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001728
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001729 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00001730 explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
1731 __node<_CharT>* __s)
1732 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1733
1734 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001735};
1736
1737template <class _CharT, class _Traits>
1738void
1739__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
1740{
1741 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1742 if (__sm.matched)
1743 {
1744 ptrdiff_t __len = __sm.second - __sm.first;
1745 if (__s.__last_ - __s.__current_ >= __len)
1746 {
1747 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1748 {
1749 if (__traits_.translate_nocase(__sm.first[__i]) !=
1750 __traits_.translate_nocase(__s.__current_[__i]))
1751 goto __not_equal;
1752 }
1753 __s.__do_ = __state::__accept_but_not_consume;
1754 __s.__current_ += __len;
1755 __s.__node_ = this->first();
1756 }
1757 else
1758 {
1759 __s.__do_ = __state::__reject;
1760 __s.__node_ = nullptr;
1761 }
1762 }
1763 else
1764 {
1765__not_equal:
1766 __s.__do_ = __state::__reject;
1767 __s.__node_ = nullptr;
1768 }
1769}
1770
1771// __back_ref_collate
1772
1773template <class _CharT, class _Traits>
1774class __back_ref_collate
1775 : public __owns_one_state<_CharT>
1776{
1777 typedef __owns_one_state<_CharT> base;
1778
1779 _Traits __traits_;
1780 unsigned __mexp_;
1781public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001782 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001783
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001784 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00001785 explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
1786 __node<_CharT>* __s)
1787 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1788
1789 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001790};
1791
1792template <class _CharT, class _Traits>
1793void
1794__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
1795{
1796 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1797 if (__sm.matched)
1798 {
1799 ptrdiff_t __len = __sm.second - __sm.first;
1800 if (__s.__last_ - __s.__current_ >= __len)
1801 {
1802 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1803 {
1804 if (__traits_.translate(__sm.first[__i]) !=
1805 __traits_.translate(__s.__current_[__i]))
1806 goto __not_equal;
1807 }
1808 __s.__do_ = __state::__accept_but_not_consume;
1809 __s.__current_ += __len;
1810 __s.__node_ = this->first();
1811 }
1812 else
1813 {
1814 __s.__do_ = __state::__reject;
1815 __s.__node_ = nullptr;
1816 }
1817 }
1818 else
1819 {
1820__not_equal:
1821 __s.__do_ = __state::__reject;
1822 __s.__node_ = nullptr;
1823 }
1824}
1825
Howard Hinnant17615b02010-07-27 01:25:38 +00001826// __word_boundary
1827
1828template <class _CharT, class _Traits>
1829class __word_boundary
1830 : public __owns_one_state<_CharT>
1831{
1832 typedef __owns_one_state<_CharT> base;
1833
1834 _Traits __traits_;
1835 bool __invert_;
1836public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001837 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant17615b02010-07-27 01:25:38 +00001838
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001839 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00001840 explicit __word_boundary(const _Traits& __traits, bool __invert,
1841 __node<_CharT>* __s)
1842 : base(__s), __traits_(__traits), __invert_(__invert) {}
1843
1844 virtual void __exec(__state&) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00001845};
1846
1847template <class _CharT, class _Traits>
1848void
1849__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
1850{
1851 bool __is_word_b = false;
1852 if (__s.__first_ != __s.__last_)
1853 {
1854 if (__s.__current_ == __s.__last_)
1855 {
1856 if (!(__s.__flags_ & regex_constants::match_not_eow))
1857 {
1858 _CharT __c = __s.__current_[-1];
1859 __is_word_b = __c == '_' ||
1860 __traits_.isctype(__c, ctype_base::alnum);
1861 }
1862 }
Howard Hinnantf3dcca02010-07-29 15:17:28 +00001863 else if (__s.__current_ == __s.__first_ &&
1864 !(__s.__flags_ & regex_constants::match_prev_avail))
Howard Hinnant17615b02010-07-27 01:25:38 +00001865 {
1866 if (!(__s.__flags_ & regex_constants::match_not_bow))
1867 {
1868 _CharT __c = *__s.__current_;
1869 __is_word_b = __c == '_' ||
1870 __traits_.isctype(__c, ctype_base::alnum);
1871 }
1872 }
1873 else
1874 {
1875 _CharT __c1 = __s.__current_[-1];
1876 _CharT __c2 = *__s.__current_;
1877 bool __is_c1_b = __c1 == '_' ||
1878 __traits_.isctype(__c1, ctype_base::alnum);
1879 bool __is_c2_b = __c2 == '_' ||
1880 __traits_.isctype(__c2, ctype_base::alnum);
1881 __is_word_b = __is_c1_b != __is_c2_b;
1882 }
1883 }
1884 if (__is_word_b != __invert_)
1885 {
1886 __s.__do_ = __state::__accept_but_not_consume;
1887 __s.__node_ = this->first();
1888 }
1889 else
1890 {
1891 __s.__do_ = __state::__reject;
1892 __s.__node_ = nullptr;
1893 }
1894}
1895
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001896// __l_anchor
1897
1898template <class _CharT>
1899class __l_anchor
1900 : public __owns_one_state<_CharT>
1901{
1902 typedef __owns_one_state<_CharT> base;
1903
1904public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001905 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001906
1907 _LIBCPP_INLINE_VISIBILITY
1908 __l_anchor(__node<_CharT>* __s)
1909 : base(__s) {}
1910
1911 virtual void __exec(__state&) const;
1912};
1913
1914template <class _CharT>
1915void
1916__l_anchor<_CharT>::__exec(__state& __s) const
1917{
1918 if (__s.__at_first_ && __s.__current_ == __s.__first_)
1919 {
1920 __s.__do_ = __state::__accept_but_not_consume;
1921 __s.__node_ = this->first();
1922 }
1923 else
1924 {
1925 __s.__do_ = __state::__reject;
1926 __s.__node_ = nullptr;
1927 }
1928}
1929
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001930// __r_anchor
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001931
1932template <class _CharT>
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001933class __r_anchor
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001934 : public __owns_one_state<_CharT>
1935{
1936 typedef __owns_one_state<_CharT> base;
1937
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001938public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001939 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001940
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001941 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001942 __r_anchor(__node<_CharT>* __s)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001943 : base(__s) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001944
Howard Hinnantac303862010-07-12 15:51:17 +00001945 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001946};
1947
1948template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001949void
1950__r_anchor<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001951{
Howard Hinnantac303862010-07-12 15:51:17 +00001952 if (__s.__current_ == __s.__last_)
1953 {
1954 __s.__do_ = __state::__accept_but_not_consume;
1955 __s.__node_ = this->first();
1956 }
1957 else
1958 {
1959 __s.__do_ = __state::__reject;
1960 __s.__node_ = nullptr;
1961 }
1962}
1963
1964// __match_any
1965
1966template <class _CharT>
1967class __match_any
1968 : public __owns_one_state<_CharT>
1969{
1970 typedef __owns_one_state<_CharT> base;
1971
1972public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001973 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantac303862010-07-12 15:51:17 +00001974
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001975 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001976 __match_any(__node<_CharT>* __s)
1977 : base(__s) {}
1978
1979 virtual void __exec(__state&) const;
Howard Hinnantac303862010-07-12 15:51:17 +00001980};
1981
1982template <class _CharT>
1983void
1984__match_any<_CharT>::__exec(__state& __s) const
1985{
1986 if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
1987 {
1988 __s.__do_ = __state::__accept_and_consume;
1989 ++__s.__current_;
1990 __s.__node_ = this->first();
1991 }
1992 else
1993 {
1994 __s.__do_ = __state::__reject;
1995 __s.__node_ = nullptr;
1996 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001997}
1998
Howard Hinnant17615b02010-07-27 01:25:38 +00001999// __match_any_but_newline
2000
2001template <class _CharT>
2002class __match_any_but_newline
2003 : public __owns_one_state<_CharT>
2004{
2005 typedef __owns_one_state<_CharT> base;
2006
2007public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002008 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant17615b02010-07-27 01:25:38 +00002009
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002010 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002011 __match_any_but_newline(__node<_CharT>* __s)
2012 : base(__s) {}
2013
2014 virtual void __exec(__state&) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00002015};
2016
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002017// __match_char
2018
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002019template <class _CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002020class __match_char
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002021 : public __owns_one_state<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002022{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002023 typedef __owns_one_state<_CharT> base;
2024
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002025 _CharT __c_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002026
2027 __match_char(const __match_char&);
2028 __match_char& operator=(const __match_char&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002029public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002030 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002031
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002032 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00002033 __match_char(_CharT __c, __node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002034 : base(__s), __c_(__c) {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002035
Howard Hinnantac303862010-07-12 15:51:17 +00002036 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002037};
2038
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002039template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00002040void
2041__match_char<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002042{
Howard Hinnantac303862010-07-12 15:51:17 +00002043 if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2044 {
2045 __s.__do_ = __state::__accept_and_consume;
2046 ++__s.__current_;
2047 __s.__node_ = this->first();
2048 }
2049 else
2050 {
2051 __s.__do_ = __state::__reject;
2052 __s.__node_ = nullptr;
2053 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002054}
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002055
Howard Hinnante34f17d2010-07-12 19:11:27 +00002056// __match_char_icase
2057
2058template <class _CharT, class _Traits>
2059class __match_char_icase
2060 : public __owns_one_state<_CharT>
2061{
2062 typedef __owns_one_state<_CharT> base;
2063
2064 _Traits __traits_;
2065 _CharT __c_;
2066
2067 __match_char_icase(const __match_char_icase&);
2068 __match_char_icase& operator=(const __match_char_icase&);
2069public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002070 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002071
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002072 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002073 __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2074 : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2075
2076 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002077};
2078
2079template <class _CharT, class _Traits>
2080void
2081__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2082{
2083 if (__s.__current_ != __s.__last_ &&
2084 __traits_.translate_nocase(*__s.__current_) == __c_)
2085 {
2086 __s.__do_ = __state::__accept_and_consume;
2087 ++__s.__current_;
2088 __s.__node_ = this->first();
2089 }
2090 else
2091 {
2092 __s.__do_ = __state::__reject;
2093 __s.__node_ = nullptr;
2094 }
2095}
2096
2097// __match_char_collate
2098
2099template <class _CharT, class _Traits>
2100class __match_char_collate
2101 : public __owns_one_state<_CharT>
2102{
2103 typedef __owns_one_state<_CharT> base;
2104
2105 _Traits __traits_;
2106 _CharT __c_;
2107
2108 __match_char_collate(const __match_char_collate&);
2109 __match_char_collate& operator=(const __match_char_collate&);
2110public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002111 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002112
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002113 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002114 __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2115 : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2116
2117 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002118};
2119
2120template <class _CharT, class _Traits>
2121void
2122__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2123{
2124 if (__s.__current_ != __s.__last_ &&
2125 __traits_.translate(*__s.__current_) == __c_)
2126 {
2127 __s.__do_ = __state::__accept_and_consume;
2128 ++__s.__current_;
2129 __s.__node_ = this->first();
2130 }
2131 else
2132 {
2133 __s.__do_ = __state::__reject;
2134 __s.__node_ = nullptr;
2135 }
2136}
2137
Howard Hinnant173968a2010-07-13 21:48:06 +00002138// __bracket_expression
2139
2140template <class _CharT, class _Traits>
2141class __bracket_expression
2142 : public __owns_one_state<_CharT>
2143{
2144 typedef __owns_one_state<_CharT> base;
2145 typedef typename _Traits::string_type string_type;
2146
2147 _Traits __traits_;
2148 vector<_CharT> __chars_;
Howard Hinnant15476f32010-07-28 17:35:27 +00002149 vector<_CharT> __neg_chars_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002150 vector<pair<string_type, string_type> > __ranges_;
2151 vector<pair<_CharT, _CharT> > __digraphs_;
2152 vector<string_type> __equivalences_;
2153 ctype_base::mask __mask_;
Howard Hinnant15476f32010-07-28 17:35:27 +00002154 ctype_base::mask __neg_mask_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002155 bool __negate_;
2156 bool __icase_;
2157 bool __collate_;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002158 bool __might_have_digraph_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002159
2160 __bracket_expression(const __bracket_expression&);
2161 __bracket_expression& operator=(const __bracket_expression&);
2162public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002163 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant173968a2010-07-13 21:48:06 +00002164
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002165 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002166 __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2167 bool __negate, bool __icase, bool __collate)
Howard Hinnant15476f32010-07-28 17:35:27 +00002168 : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2169 __negate_(__negate), __icase_(__icase), __collate_(__collate),
Howard Hinnant68025ed2010-07-14 15:45:11 +00002170 __might_have_digraph_(__traits_.getloc().name() != "C") {}
Howard Hinnant173968a2010-07-13 21:48:06 +00002171
2172 virtual void __exec(__state&) const;
2173
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002174 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002175 bool __negated() const {return __negate_;}
2176
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002177 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002178 void __add_char(_CharT __c)
2179 {
2180 if (__icase_)
2181 __chars_.push_back(__traits_.translate_nocase(__c));
2182 else if (__collate_)
2183 __chars_.push_back(__traits_.translate(__c));
2184 else
2185 __chars_.push_back(__c);
2186 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002187 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002188 void __add_neg_char(_CharT __c)
2189 {
2190 if (__icase_)
2191 __neg_chars_.push_back(__traits_.translate_nocase(__c));
2192 else if (__collate_)
2193 __neg_chars_.push_back(__traits_.translate(__c));
2194 else
2195 __neg_chars_.push_back(__c);
2196 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002197 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002198 void __add_range(string_type __b, string_type __e)
2199 {
2200 if (__collate_)
2201 {
2202 if (__icase_)
2203 {
2204 for (size_t __i = 0; __i < __b.size(); ++__i)
2205 __b[__i] = __traits_.translate_nocase(__b[__i]);
2206 for (size_t __i = 0; __i < __e.size(); ++__i)
2207 __e[__i] = __traits_.translate_nocase(__e[__i]);
2208 }
2209 else
2210 {
2211 for (size_t __i = 0; __i < __b.size(); ++__i)
2212 __b[__i] = __traits_.translate(__b[__i]);
2213 for (size_t __i = 0; __i < __e.size(); ++__i)
2214 __e[__i] = __traits_.translate(__e[__i]);
2215 }
2216 __ranges_.push_back(make_pair(
2217 __traits_.transform(__b.begin(), __b.end()),
2218 __traits_.transform(__e.begin(), __e.end())));
2219 }
2220 else
2221 {
Howard Hinnantd4444702010-08-11 17:04:31 +00002222#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00002223 if (__b.size() != 1 || __e.size() != 1)
2224 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00002225#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00002226 if (__icase_)
2227 {
2228 __b[0] = __traits_.translate_nocase(__b[0]);
2229 __e[0] = __traits_.translate_nocase(__e[0]);
2230 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002231 __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
Howard Hinnant173968a2010-07-13 21:48:06 +00002232 }
2233 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002234 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002235 void __add_digraph(_CharT __c1, _CharT __c2)
2236 {
2237 if (__icase_)
2238 __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
2239 __traits_.translate_nocase(__c2)));
2240 else if (__collate_)
2241 __digraphs_.push_back(make_pair(__traits_.translate(__c1),
2242 __traits_.translate(__c2)));
2243 else
2244 __digraphs_.push_back(make_pair(__c1, __c2));
2245 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002246 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002247 void __add_equivalence(const string_type& __s)
2248 {__equivalences_.push_back(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002249 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002250 void __add_class(ctype_base::mask __mask)
2251 {__mask_ |= __mask;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002252 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002253 void __add_neg_class(ctype_base::mask __mask)
2254 {__neg_mask_ |= __mask;}
Howard Hinnant173968a2010-07-13 21:48:06 +00002255};
2256
2257template <class _CharT, class _Traits>
2258void
2259__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2260{
2261 bool __found = false;
2262 unsigned __consumed = 0;
2263 if (__s.__current_ != __s.__last_)
2264 {
2265 ++__consumed;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002266 if (__might_have_digraph_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002267 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002268 const _CharT* __next = _VSTD::next(__s.__current_);
Howard Hinnant68025ed2010-07-14 15:45:11 +00002269 if (__next != __s.__last_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002270 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002271 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2272 if (__icase_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002273 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002274 __ch2.first = __traits_.translate_nocase(__ch2.first);
2275 __ch2.second = __traits_.translate_nocase(__ch2.second);
2276 }
2277 else if (__collate_)
2278 {
2279 __ch2.first = __traits_.translate(__ch2.first);
2280 __ch2.second = __traits_.translate(__ch2.second);
2281 }
2282 if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2283 {
2284 // __ch2 is a digraph in this locale
2285 ++__consumed;
2286 for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2287 {
2288 if (__ch2 == __digraphs_[__i])
2289 {
2290 __found = true;
2291 goto __exit;
2292 }
2293 }
2294 if (__collate_ && !__ranges_.empty())
2295 {
2296 string_type __s2 = __traits_.transform(&__ch2.first,
2297 &__ch2.first + 2);
2298 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2299 {
2300 if (__ranges_[__i].first <= __s2 &&
2301 __s2 <= __ranges_[__i].second)
2302 {
2303 __found = true;
2304 goto __exit;
2305 }
2306 }
2307 }
2308 if (!__equivalences_.empty())
2309 {
2310 string_type __s2 = __traits_.transform_primary(&__ch2.first,
2311 &__ch2.first + 2);
2312 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2313 {
2314 if (__s2 == __equivalences_[__i])
2315 {
2316 __found = true;
2317 goto __exit;
2318 }
2319 }
2320 }
2321 if (__traits_.isctype(__ch2.first, __mask_) &&
2322 __traits_.isctype(__ch2.second, __mask_))
Howard Hinnant173968a2010-07-13 21:48:06 +00002323 {
2324 __found = true;
2325 goto __exit;
2326 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002327 if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2328 !__traits_.isctype(__ch2.second, __neg_mask_))
2329 {
2330 __found = true;
2331 goto __exit;
2332 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002333 goto __exit;
2334 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002335 }
2336 }
2337 // test *__s.__current_ as not a digraph
2338 _CharT __ch = *__s.__current_;
2339 if (__icase_)
2340 __ch = __traits_.translate_nocase(__ch);
2341 else if (__collate_)
2342 __ch = __traits_.translate(__ch);
2343 for (size_t __i = 0; __i < __chars_.size(); ++__i)
2344 {
2345 if (__ch == __chars_[__i])
2346 {
2347 __found = true;
2348 goto __exit;
2349 }
2350 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002351 if (!__neg_chars_.empty())
2352 {
2353 for (size_t __i = 0; __i < __neg_chars_.size(); ++__i)
2354 {
2355 if (__ch == __neg_chars_[__i])
2356 goto __is_neg_char;
2357 }
2358 __found = true;
2359 goto __exit;
2360 }
2361__is_neg_char:
Howard Hinnant173968a2010-07-13 21:48:06 +00002362 if (!__ranges_.empty())
2363 {
2364 string_type __s2 = __collate_ ?
2365 __traits_.transform(&__ch, &__ch + 1) :
2366 string_type(1, __ch);
2367 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2368 {
2369 if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2370 {
2371 __found = true;
2372 goto __exit;
2373 }
2374 }
2375 }
2376 if (!__equivalences_.empty())
2377 {
2378 string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2379 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2380 {
2381 if (__s2 == __equivalences_[__i])
2382 {
2383 __found = true;
2384 goto __exit;
2385 }
2386 }
2387 }
2388 if (__traits_.isctype(__ch, __mask_))
Howard Hinnant15476f32010-07-28 17:35:27 +00002389 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002390 __found = true;
Howard Hinnant15476f32010-07-28 17:35:27 +00002391 goto __exit;
2392 }
2393 if (__neg_mask_ && !__traits_.isctype(__ch, __neg_mask_))
2394 {
2395 __found = true;
2396 goto __exit;
2397 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002398 }
2399 else
2400 __found = __negate_; // force reject
2401__exit:
2402 if (__found != __negate_)
2403 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002404 __s.__do_ = __state::__accept_and_consume;
2405 __s.__current_ += __consumed;
2406 __s.__node_ = this->first();
2407 }
2408 else
2409 {
2410 __s.__do_ = __state::__reject;
2411 __s.__node_ = nullptr;
2412 }
2413}
2414
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00002415template <class _CharT, class _Traits> class __lookahead;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002416
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002417template <class _CharT, class _Traits = regex_traits<_CharT> >
Howard Hinnant83eade62013-03-06 23:30:19 +00002418class _LIBCPP_TYPE_VIS basic_regex
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002419{
2420public:
2421 // types:
2422 typedef _CharT value_type;
2423 typedef regex_constants::syntax_option_type flag_type;
2424 typedef typename _Traits::locale_type locale_type;
2425
2426private:
2427 _Traits __traits_;
2428 flag_type __flags_;
2429 unsigned __marked_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002430 unsigned __loop_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002431 int __open_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002432 shared_ptr<__empty_state<_CharT> > __start_;
2433 __owns_one_state<_CharT>* __end_;
2434
Howard Hinnant0949eed2011-06-30 21:18:19 +00002435 typedef _VSTD::__state<_CharT> __state;
2436 typedef _VSTD::__node<_CharT> __node;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002437
2438public:
2439 // constants:
Howard Hinnant46623a02012-07-21 01:31:58 +00002440 static const regex_constants::syntax_option_type icase = regex_constants::icase;
2441 static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2442 static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
2443 static const regex_constants::syntax_option_type collate = regex_constants::collate;
2444 static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2445 static const regex_constants::syntax_option_type basic = regex_constants::basic;
2446 static const regex_constants::syntax_option_type extended = regex_constants::extended;
2447 static const regex_constants::syntax_option_type awk = regex_constants::awk;
2448 static const regex_constants::syntax_option_type grep = regex_constants::grep;
2449 static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002450
2451 // construct/copy/destroy:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002452 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002453 basic_regex()
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002454 : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002455 __end_(0)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002456 {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002457 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002458 explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002459 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002460 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002461 {__parse(__p, __p + __traits_.length(__p));}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002462 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002463 basic_regex(const value_type* __p, size_t __len, flag_type __f)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002464 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002465 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002466 {__parse(__p, __p + __len);}
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002467// basic_regex(const basic_regex&) = default;
2468// basic_regex(basic_regex&&) = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002469 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002470 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002471 explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2472 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002473 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002474 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002475 {__parse(__p.begin(), __p.end());}
2476 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002477 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002478 basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2479 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002480 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002481 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002482 {__parse(__first, __last);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002483#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002484 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002485 basic_regex(initializer_list<value_type> __il,
2486 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002487 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002488 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002489 {__parse(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00002490#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002491
Howard Hinnant7026a172010-08-13 18:11:23 +00002492// ~basic_regex() = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002493
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002494// basic_regex& operator=(const basic_regex&) = default;
2495// basic_regex& operator=(basic_regex&&) = default;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002496 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002497 basic_regex& operator=(const value_type* __p)
2498 {return assign(__p);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002499#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002500 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002501 basic_regex& operator=(initializer_list<value_type> __il)
2502 {return assign(__il);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002503#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002504 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002505 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002506 basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2507 {return assign(__p);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002508
2509 // assign:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002510 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002511 basic_regex& assign(const basic_regex& __that)
2512 {return *this = __that;}
Howard Hinnant46623a02012-07-21 01:31:58 +00002513#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2514 _LIBCPP_INLINE_VISIBILITY
2515 basic_regex& assign(basic_regex&& __that) _NOEXCEPT
2516 {return *this = _VSTD::move(__that);}
2517#endif
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002518 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002519 basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2520 {return assign(__p, __p + __traits_.length(__p), __f);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002521 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002522 basic_regex& assign(const value_type* __p, size_t __len, flag_type __f)
2523 {return assign(__p, __p + __len, __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002524 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002525 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002526 basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
Howard Hinnant7026a172010-08-13 18:11:23 +00002527 flag_type __f = regex_constants::ECMAScript)
2528 {return assign(__s.begin(), __s.end(), __f);}
2529
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002530 template <class _InputIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002531 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002532 typename enable_if
2533 <
2534 __is_input_iterator <_InputIterator>::value &&
2535 !__is_forward_iterator<_InputIterator>::value,
2536 basic_regex&
2537 >::type
2538 assign(_InputIterator __first, _InputIterator __last,
2539 flag_type __f = regex_constants::ECMAScript)
2540 {
2541 basic_string<_CharT> __t(__first, __last);
2542 return assign(__t.begin(), __t.end(), __f);
2543 }
2544
2545private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002546 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002547 void __member_init(flag_type __f)
2548 {
2549 __flags_ = __f;
2550 __marked_count_ = 0;
2551 __loop_count_ = 0;
2552 __open_count_ = 0;
2553 __end_ = nullptr;
Howard Hinnant7026a172010-08-13 18:11:23 +00002554 }
2555public:
2556
2557 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002558 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002559 typename enable_if
2560 <
2561 __is_forward_iterator<_ForwardIterator>::value,
2562 basic_regex&
2563 >::type
2564 assign(_ForwardIterator __first, _ForwardIterator __last,
2565 flag_type __f = regex_constants::ECMAScript)
2566 {
2567 __member_init(__f);
2568 __parse(__first, __last);
Argyrios Kyrtzidis1dc6f7a2012-10-13 02:03:45 +00002569 return *this;
Howard Hinnant7026a172010-08-13 18:11:23 +00002570 }
2571
Howard Hinnante3e32912011-08-12 21:56:02 +00002572#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2573
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002574 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002575 basic_regex& assign(initializer_list<value_type> __il,
Howard Hinnant7026a172010-08-13 18:11:23 +00002576 flag_type __f = regex_constants::ECMAScript)
2577 {return assign(__il.begin(), __il.end(), __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002578
Howard Hinnante3e32912011-08-12 21:56:02 +00002579#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2580
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002581 // const operations:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002582 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002583 unsigned mark_count() const {return __marked_count_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002584 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002585 flag_type flags() const {return __flags_;}
2586
2587 // locale:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002588 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002589 locale_type imbue(locale_type __loc)
2590 {
2591 __member_init(ECMAScript);
2592 __start_.reset();
2593 return __traits_.imbue(__loc);
2594 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002595 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002596 locale_type getloc() const {return __traits_.getloc();}
2597
2598 // swap:
Howard Hinnant7026a172010-08-13 18:11:23 +00002599 void swap(basic_regex& __r);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002600
2601private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002602 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002603 unsigned __loop_count() const {return __loop_count_;}
2604
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002605 template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002606 _ForwardIterator
2607 __parse(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002608 template <class _ForwardIterator>
2609 _ForwardIterator
2610 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2611 template <class _ForwardIterator>
2612 _ForwardIterator
2613 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2614 template <class _ForwardIterator>
2615 _ForwardIterator
2616 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2617 template <class _ForwardIterator>
2618 _ForwardIterator
2619 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2620 template <class _ForwardIterator>
2621 _ForwardIterator
2622 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2623 template <class _ForwardIterator>
2624 _ForwardIterator
2625 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2626 template <class _ForwardIterator>
2627 _ForwardIterator
2628 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2629 template <class _ForwardIterator>
2630 _ForwardIterator
2631 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2632 template <class _ForwardIterator>
2633 _ForwardIterator
2634 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2635 template <class _ForwardIterator>
2636 _ForwardIterator
2637 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2638 template <class _ForwardIterator>
2639 _ForwardIterator
2640 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2641 template <class _ForwardIterator>
2642 _ForwardIterator
2643 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2644 template <class _ForwardIterator>
2645 _ForwardIterator
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002646 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002647 __owns_one_state<_CharT>* __s,
2648 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002649 template <class _ForwardIterator>
2650 _ForwardIterator
Howard Hinnantaa698082010-07-16 19:08:36 +00002651 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2652 __owns_one_state<_CharT>* __s,
2653 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002654 template <class _ForwardIterator>
2655 _ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00002656 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2657 template <class _ForwardIterator>
2658 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002659 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2660 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002661 template <class _ForwardIterator>
2662 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002663 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2664 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002665 template <class _ForwardIterator>
2666 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002667 __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2668 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002669 template <class _ForwardIterator>
2670 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002671 __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2672 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002673 template <class _ForwardIterator>
2674 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002675 __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2676 basic_string<_CharT>& __col_sym);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002677 template <class _ForwardIterator>
2678 _ForwardIterator
2679 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002680 template <class _ForwardIterator>
2681 _ForwardIterator
2682 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2683 template <class _ForwardIterator>
2684 _ForwardIterator
2685 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2686 template <class _ForwardIterator>
2687 _ForwardIterator
2688 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2689 template <class _ForwardIterator>
2690 _ForwardIterator
2691 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2692 template <class _ForwardIterator>
2693 _ForwardIterator
2694 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2695 template <class _ForwardIterator>
2696 _ForwardIterator
2697 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002698 template <class _ForwardIterator>
2699 _ForwardIterator
2700 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2701 template <class _ForwardIterator>
2702 _ForwardIterator
2703 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2704 template <class _ForwardIterator>
2705 _ForwardIterator
2706 __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2707 template <class _ForwardIterator>
2708 _ForwardIterator
2709 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2710 template <class _ForwardIterator>
2711 _ForwardIterator
2712 __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2713 template <class _ForwardIterator>
2714 _ForwardIterator
Howard Hinnant17615b02010-07-27 01:25:38 +00002715 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2716 template <class _ForwardIterator>
2717 _ForwardIterator
2718 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2719 template <class _ForwardIterator>
2720 _ForwardIterator
2721 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2722 template <class _ForwardIterator>
2723 _ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00002724 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2725 basic_string<_CharT>* __str = nullptr);
Howard Hinnant17615b02010-07-27 01:25:38 +00002726 template <class _ForwardIterator>
2727 _ForwardIterator
2728 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant856846b2010-07-27 19:53:10 +00002729 template <class _ForwardIterator>
2730 _ForwardIterator
2731 __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2732 template <class _ForwardIterator>
2733 _ForwardIterator
2734 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant15476f32010-07-28 17:35:27 +00002735 template <class _ForwardIterator>
2736 _ForwardIterator
2737 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2738 basic_string<_CharT>& __str,
2739 __bracket_expression<_CharT, _Traits>* __ml);
2740 template <class _ForwardIterator>
2741 _ForwardIterator
2742 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2743 basic_string<_CharT>* __str = nullptr);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002744
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002745 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002746 void __push_l_anchor();
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002747 void __push_r_anchor();
Howard Hinnantac303862010-07-12 15:51:17 +00002748 void __push_match_any();
Howard Hinnant17615b02010-07-27 01:25:38 +00002749 void __push_match_any_but_newline();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002750 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002751 void __push_greedy_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);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002755 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002756 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2757 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2758 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2759 __mexp_begin, __mexp_end, false);}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002760 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
2761 size_t __mexp_begin = 0, size_t __mexp_end = 0,
2762 bool __greedy = true);
Howard Hinnant173968a2010-07-13 21:48:06 +00002763 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002764 void __push_char(value_type __c);
Howard Hinnantcba352d2010-07-12 18:16:05 +00002765 void __push_back_ref(int __i);
Howard Hinnantaa698082010-07-16 19:08:36 +00002766 void __push_alternation(__owns_one_state<_CharT>* __sa,
2767 __owns_one_state<_CharT>* __sb);
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002768 void __push_begin_marked_subexpression();
2769 void __push_end_marked_subexpression(unsigned);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002770 void __push_empty();
Howard Hinnant17615b02010-07-27 01:25:38 +00002771 void __push_word_boundary(bool);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002772 void __push_lookahead(const basic_regex&, bool, unsigned);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002773
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002774 template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002775 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002776 __search(const _CharT* __first, const _CharT* __last,
2777 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002778 regex_constants::match_flag_type __flags) const;
2779
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002780 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002781 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002782 __match_at_start(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 Hinnant17615b02010-07-27 01:25:38 +00002785 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002786 bool
Howard Hinnant17615b02010-07-27 01:25:38 +00002787 __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
2788 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
2792 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002793 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002794 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002795 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002796 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002797 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
2798 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002799 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002800
Howard Hinnant99968442011-11-29 18:15:50 +00002801 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002802 friend
2803 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002804 regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002805 regex_constants::match_flag_type);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002806
Howard Hinnant99968442011-11-29 18:15:50 +00002807 template <class _Ap, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002808 friend
2809 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002810 regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
2811 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002812
Howard Hinnant99968442011-11-29 18:15:50 +00002813 template <class _Bp, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002814 friend
2815 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002816 regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002817 regex_constants::match_flag_type);
2818
Howard Hinnant99968442011-11-29 18:15:50 +00002819 template <class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002820 friend
2821 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002822 regex_search(const _Cp*, const _Cp*,
2823 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002824
Howard Hinnant99968442011-11-29 18:15:50 +00002825 template <class _Cp, class _Ap, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002826 friend
2827 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002828 regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002829 regex_constants::match_flag_type);
2830
Howard Hinnant99968442011-11-29 18:15:50 +00002831 template <class _ST, class _SA, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002832 friend
2833 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002834 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2835 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002836 regex_constants::match_flag_type __flags);
2837
Howard Hinnant99968442011-11-29 18:15:50 +00002838 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002839 friend
2840 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002841 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2842 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
2843 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002844 regex_constants::match_flag_type __flags);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002845
Howard Hinnanta9602d52013-06-29 23:45:43 +00002846 template <class _Iter, class _Ap, class _Cp, class _Tp>
2847 friend
2848 bool
2849 regex_search(__wrap_iter<_Iter> __first,
2850 __wrap_iter<_Iter> __last,
2851 match_results<__wrap_iter<_Iter>, _Ap>& __m,
2852 const basic_regex<_Cp, _Tp>& __e,
2853 regex_constants::match_flag_type __flags);
2854
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002855 template <class, class> friend class __lookahead;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002856};
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002857
2858template <class _CharT, class _Traits>
Howard Hinnant0a69fa12012-12-12 21:14:28 +00002859 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
2860template <class _CharT, class _Traits>
2861 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
2862template <class _CharT, class _Traits>
2863 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
2864template <class _CharT, class _Traits>
2865 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
2866template <class _CharT, class _Traits>
2867 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
2868template <class _CharT, class _Traits>
2869 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
2870template <class _CharT, class _Traits>
2871 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
2872template <class _CharT, class _Traits>
2873 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
2874template <class _CharT, class _Traits>
2875 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
2876template <class _CharT, class _Traits>
2877 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
2878
2879template <class _CharT, class _Traits>
Howard Hinnant7026a172010-08-13 18:11:23 +00002880void
2881basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002882{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002883 using _VSTD::swap;
Howard Hinnant7026a172010-08-13 18:11:23 +00002884 swap(__traits_, __r.__traits_);
2885 swap(__flags_, __r.__flags_);
2886 swap(__marked_count_, __r.__marked_count_);
2887 swap(__loop_count_, __r.__loop_count_);
2888 swap(__open_count_, __r.__open_count_);
2889 swap(__start_, __r.__start_);
2890 swap(__end_, __r.__end_);
Howard Hinnant7026a172010-08-13 18:11:23 +00002891}
2892
2893template <class _CharT, class _Traits>
2894inline _LIBCPP_INLINE_VISIBILITY
2895void
2896swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
2897{
2898 return __x.swap(__y);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002899}
2900
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002901// __lookahead
2902
2903template <class _CharT, class _Traits>
2904class __lookahead
2905 : public __owns_one_state<_CharT>
2906{
2907 typedef __owns_one_state<_CharT> base;
2908
2909 basic_regex<_CharT, _Traits> __exp_;
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002910 unsigned __mexp_;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002911 bool __invert_;
2912
2913 __lookahead(const __lookahead&);
2914 __lookahead& operator=(const __lookahead&);
2915public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002916 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002917
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002918 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002919 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
2920 : base(__s), __exp_(__exp), __invert_(__invert), __mexp_(__mexp) {}
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002921
2922 virtual void __exec(__state&) const;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002923};
2924
2925template <class _CharT, class _Traits>
2926void
2927__lookahead<_CharT, _Traits>::__exec(__state& __s) const
2928{
2929 match_results<const _CharT*> __m;
2930 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
2931 bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002932 __m,
2933 __s.__flags_ | regex_constants::match_continuous,
Howard Hinnante57b7c42013-06-28 19:11:23 +00002934 __s.__at_first_ && __s.__current_ == __s.__first_);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002935 if (__matched != __invert_)
2936 {
2937 __s.__do_ = __state::__accept_but_not_consume;
2938 __s.__node_ = this->first();
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002939 for (unsigned __i = 1; __i < __m.size(); ++__i) {
2940 __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
2941 }
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002942 }
2943 else
2944 {
2945 __s.__do_ = __state::__reject;
2946 __s.__node_ = nullptr;
2947 }
2948}
2949
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002950template <class _CharT, class _Traits>
2951template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002952_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002953basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
2954 _ForwardIterator __last)
2955{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002956 {
Howard Hinnantac303862010-07-12 15:51:17 +00002957 unique_ptr<__node> __h(new __end_state<_CharT>);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002958 __start_.reset(new __empty_state<_CharT>(__h.get()));
2959 __h.release();
2960 __end_ = __start_.get();
2961 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002962 switch (__flags_ & 0x1F0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002963 {
2964 case ECMAScript:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002965 __first = __parse_ecma_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002966 break;
2967 case basic:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002968 __first = __parse_basic_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002969 break;
2970 case extended:
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002971 case awk:
Howard Hinnant15476f32010-07-28 17:35:27 +00002972 __first = __parse_extended_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002973 break;
2974 case grep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002975 __first = __parse_grep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002976 break;
2977 case egrep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002978 __first = __parse_egrep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002979 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00002980#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002981 default:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002982 throw regex_error(regex_constants::__re_err_grammar);
Howard Hinnant324bb032010-08-22 00:02:43 +00002983#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002984 }
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002985 return __first;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002986}
2987
2988template <class _CharT, class _Traits>
2989template <class _ForwardIterator>
2990_ForwardIterator
2991basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
2992 _ForwardIterator __last)
2993{
2994 if (__first != __last)
2995 {
2996 if (*__first == '^')
2997 {
2998 __push_l_anchor();
2999 ++__first;
3000 }
3001 if (__first != __last)
3002 {
3003 __first = __parse_RE_expression(__first, __last);
3004 if (__first != __last)
3005 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003006 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003007 if (__temp == __last && *__first == '$')
3008 {
3009 __push_r_anchor();
3010 ++__first;
3011 }
3012 }
3013 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003014#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003015 if (__first != __last)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003016 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003017#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003018 }
3019 return __first;
3020}
3021
3022template <class _CharT, class _Traits>
3023template <class _ForwardIterator>
3024_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003025basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
3026 _ForwardIterator __last)
3027{
Howard Hinnantaa698082010-07-16 19:08:36 +00003028 __owns_one_state<_CharT>* __sa = __end_;
3029 _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003030#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003031 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003032 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003033#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003034 __first = __temp;
3035 while (__first != __last && *__first == '|')
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003036 {
Howard Hinnantaa698082010-07-16 19:08:36 +00003037 __owns_one_state<_CharT>* __sb = __end_;
3038 __temp = __parse_ERE_branch(++__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003039#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003040 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003041 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003042#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003043 __push_alternation(__sa, __sb);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003044 __first = __temp;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003045 }
3046 return __first;
3047}
3048
3049template <class _CharT, class _Traits>
3050template <class _ForwardIterator>
3051_ForwardIterator
3052basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3053 _ForwardIterator __last)
3054{
3055 _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003056#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003057 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003058 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003059#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003060 do
3061 {
3062 __first = __temp;
3063 __temp = __parse_ERE_expression(__first, __last);
3064 } while (__temp != __first);
3065 return __first;
3066}
3067
3068template <class _CharT, class _Traits>
3069template <class _ForwardIterator>
3070_ForwardIterator
3071basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3072 _ForwardIterator __last)
3073{
Howard Hinnantaa698082010-07-16 19:08:36 +00003074 __owns_one_state<_CharT>* __e = __end_;
3075 unsigned __mexp_begin = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003076 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3077 if (__temp == __first && __temp != __last)
3078 {
3079 switch (*__temp)
3080 {
3081 case '^':
3082 __push_l_anchor();
3083 ++__temp;
3084 break;
3085 case '$':
3086 __push_r_anchor();
3087 ++__temp;
3088 break;
3089 case '(':
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003090 __push_begin_marked_subexpression();
3091 unsigned __temp_count = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003092 ++__open_count_;
3093 __temp = __parse_extended_reg_exp(++__temp, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003094#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003095 if (__temp == __last || *__temp != ')')
3096 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00003097#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003098 __push_end_marked_subexpression(__temp_count);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003099 --__open_count_;
3100 ++__temp;
3101 break;
3102 }
3103 }
3104 if (__temp != __first)
Howard Hinnantaa698082010-07-16 19:08:36 +00003105 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3106 __marked_count_+1);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003107 __first = __temp;
3108 return __first;
3109}
3110
3111template <class _CharT, class _Traits>
3112template <class _ForwardIterator>
3113_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003114basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3115 _ForwardIterator __last)
3116{
3117 while (true)
3118 {
3119 _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3120 if (__temp == __first)
3121 break;
3122 __first = __temp;
3123 }
3124 return __first;
3125}
3126
3127template <class _CharT, class _Traits>
3128template <class _ForwardIterator>
3129_ForwardIterator
3130basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3131 _ForwardIterator __last)
3132{
3133 if (__first != __last)
3134 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003135 __owns_one_state<_CharT>* __e = __end_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003136 unsigned __mexp_begin = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003137 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3138 if (__temp != __first)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003139 __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3140 __mexp_begin+1, __marked_count_+1);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003141 }
3142 return __first;
3143}
3144
3145template <class _CharT, class _Traits>
3146template <class _ForwardIterator>
3147_ForwardIterator
3148basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3149 _ForwardIterator __last)
3150{
3151 _ForwardIterator __temp = __first;
3152 __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3153 if (__temp == __first)
3154 {
3155 __temp = __parse_Back_open_paren(__first, __last);
3156 if (__temp != __first)
3157 {
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003158 __push_begin_marked_subexpression();
3159 unsigned __temp_count = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003160 __first = __parse_RE_expression(__temp, __last);
3161 __temp = __parse_Back_close_paren(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003162#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003163 if (__temp == __first)
3164 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00003165#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003166 __push_end_marked_subexpression(__temp_count);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003167 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003168 }
3169 else
3170 __first = __parse_BACKREF(__first, __last);
3171 }
3172 return __first;
3173}
3174
3175template <class _CharT, class _Traits>
3176template <class _ForwardIterator>
3177_ForwardIterator
3178basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3179 _ForwardIterator __first,
3180 _ForwardIterator __last)
3181{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003182 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003183 if (__temp == __first)
3184 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003185 __temp = __parse_QUOTED_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003186 if (__temp == __first)
3187 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003188 if (__temp != __last && *__temp == '.')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003189 {
3190 __push_match_any();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003191 ++__temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003192 }
3193 else
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003194 __temp = __parse_bracket_expression(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003195 }
3196 }
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003197 __first = __temp;
3198 return __first;
3199}
3200
3201template <class _CharT, class _Traits>
3202template <class _ForwardIterator>
3203_ForwardIterator
3204basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3205 _ForwardIterator __first,
3206 _ForwardIterator __last)
3207{
3208 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3209 if (__temp == __first)
3210 {
3211 __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3212 if (__temp == __first)
3213 {
3214 if (__temp != __last && *__temp == '.')
3215 {
3216 __push_match_any();
3217 ++__temp;
3218 }
3219 else
3220 __temp = __parse_bracket_expression(__first, __last);
3221 }
3222 }
3223 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003224 return __first;
3225}
3226
3227template <class _CharT, class _Traits>
3228template <class _ForwardIterator>
3229_ForwardIterator
3230basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3231 _ForwardIterator __last)
3232{
3233 if (__first != __last)
3234 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003235 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003236 if (__temp != __last)
3237 {
3238 if (*__first == '\\' && *__temp == '(')
3239 __first = ++__temp;
3240 }
3241 }
3242 return __first;
3243}
3244
3245template <class _CharT, class _Traits>
3246template <class _ForwardIterator>
3247_ForwardIterator
3248basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3249 _ForwardIterator __last)
3250{
3251 if (__first != __last)
3252 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003253 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003254 if (__temp != __last)
3255 {
3256 if (*__first == '\\' && *__temp == ')')
3257 __first = ++__temp;
3258 }
3259 }
3260 return __first;
3261}
3262
3263template <class _CharT, class _Traits>
3264template <class _ForwardIterator>
3265_ForwardIterator
3266basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3267 _ForwardIterator __last)
3268{
3269 if (__first != __last)
3270 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003271 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003272 if (__temp != __last)
3273 {
3274 if (*__first == '\\' && *__temp == '{')
3275 __first = ++__temp;
3276 }
3277 }
3278 return __first;
3279}
3280
3281template <class _CharT, class _Traits>
3282template <class _ForwardIterator>
3283_ForwardIterator
3284basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_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)
3291 {
3292 if (*__first == '\\' && *__temp == '}')
3293 __first = ++__temp;
3294 }
3295 }
3296 return __first;
3297}
3298
3299template <class _CharT, class _Traits>
3300template <class _ForwardIterator>
3301_ForwardIterator
3302basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3303 _ForwardIterator __last)
3304{
3305 if (__first != __last)
3306 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003307 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003308 if (__temp != __last)
3309 {
3310 if (*__first == '\\' && '1' <= *__temp && *__temp <= '9')
3311 {
3312 __push_back_ref(*__temp - '0');
3313 __first = ++__temp;
3314 }
3315 }
3316 }
3317 return __first;
3318}
3319
3320template <class _CharT, class _Traits>
3321template <class _ForwardIterator>
3322_ForwardIterator
3323basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3324 _ForwardIterator __last)
3325{
3326 if (__first != __last)
3327 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003328 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003329 if (__temp == __last && *__first == '$')
3330 return __first;
3331 // Not called inside a bracket
3332 if (*__first == '.' || *__first == '\\' || *__first == '[')
3333 return __first;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003334 __push_char(*__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003335 ++__first;
3336 }
3337 return __first;
3338}
3339
3340template <class _CharT, class _Traits>
3341template <class _ForwardIterator>
3342_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003343basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3344 _ForwardIterator __last)
3345{
3346 if (__first != __last)
3347 {
3348 switch (*__first)
3349 {
3350 case '^':
3351 case '.':
3352 case '[':
3353 case '$':
3354 case '(':
3355 case '|':
3356 case '*':
3357 case '+':
3358 case '?':
3359 case '{':
3360 case '\\':
3361 break;
3362 case ')':
3363 if (__open_count_ == 0)
3364 {
3365 __push_char(*__first);
3366 ++__first;
3367 }
3368 break;
3369 default:
3370 __push_char(*__first);
3371 ++__first;
3372 break;
3373 }
3374 }
3375 return __first;
3376}
3377
3378template <class _CharT, class _Traits>
3379template <class _ForwardIterator>
3380_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003381basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3382 _ForwardIterator __last)
3383{
3384 if (__first != __last)
3385 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003386 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003387 if (__temp != __last)
3388 {
3389 if (*__first == '\\')
3390 {
3391 switch (*__temp)
3392 {
3393 case '^':
3394 case '.':
3395 case '*':
3396 case '[':
3397 case '$':
3398 case '\\':
Howard Hinnant0de86b62010-06-25 20:56:08 +00003399 __push_char(*__temp);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003400 __first = ++__temp;
3401 break;
3402 }
3403 }
3404 }
3405 }
3406 return __first;
3407}
3408
3409template <class _CharT, class _Traits>
3410template <class _ForwardIterator>
3411_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003412basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3413 _ForwardIterator __last)
3414{
3415 if (__first != __last)
3416 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003417 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003418 if (__temp != __last)
3419 {
3420 if (*__first == '\\')
3421 {
3422 switch (*__temp)
3423 {
3424 case '^':
3425 case '.':
3426 case '*':
3427 case '[':
3428 case '$':
3429 case '\\':
3430 case '(':
3431 case ')':
3432 case '|':
3433 case '+':
3434 case '?':
3435 case '{':
Howard Hinnantc1ecd972013-06-28 20:31:05 +00003436 case '}':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003437 __push_char(*__temp);
3438 __first = ++__temp;
3439 break;
Howard Hinnant15476f32010-07-28 17:35:27 +00003440 default:
3441 if ((__flags_ & 0x1F0) == awk)
3442 __first = __parse_awk_escape(++__first, __last);
3443 break;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003444 }
3445 }
3446 }
3447 }
3448 return __first;
3449}
3450
3451template <class _CharT, class _Traits>
3452template <class _ForwardIterator>
3453_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003454basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003455 _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003456 __owns_one_state<_CharT>* __s,
3457 unsigned __mexp_begin,
3458 unsigned __mexp_end)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003459{
3460 if (__first != __last)
3461 {
Howard Hinnant0de86b62010-06-25 20:56:08 +00003462 if (*__first == '*')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003463 {
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003464 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003465 ++__first;
3466 }
3467 else
3468 {
3469 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3470 if (__temp != __first)
3471 {
3472 int __min = 0;
3473 __first = __temp;
3474 __temp = __parse_DUP_COUNT(__first, __last, __min);
Howard Hinnantd4444702010-08-11 17:04:31 +00003475#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003476 if (__temp == __first)
3477 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003478#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003479 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003480#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003481 if (__first == __last)
3482 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003483#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003484 if (*__first != ',')
3485 {
3486 __temp = __parse_Back_close_brace(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003487#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003488 if (__temp == __first)
3489 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003490#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcba352d2010-07-12 18:16:05 +00003491 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3492 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003493 __first = __temp;
3494 }
3495 else
3496 {
3497 ++__first; // consume ','
3498 int __max = -1;
3499 __first = __parse_DUP_COUNT(__first, __last, __max);
3500 __temp = __parse_Back_close_brace(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003501#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003502 if (__temp == __first)
3503 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003504#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003505 if (__max == -1)
Howard Hinnantaa698082010-07-16 19:08:36 +00003506 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003507 else
3508 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003509#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003510 if (__max < __min)
3511 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003512#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcba352d2010-07-12 18:16:05 +00003513 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3514 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003515 }
3516 __first = __temp;
3517 }
3518 }
3519 }
3520 }
3521 return __first;
3522}
3523
Howard Hinnant0de86b62010-06-25 20:56:08 +00003524template <class _CharT, class _Traits>
3525template <class _ForwardIterator>
3526_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003527basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantaa698082010-07-16 19:08:36 +00003528 _ForwardIterator __last,
3529 __owns_one_state<_CharT>* __s,
3530 unsigned __mexp_begin,
3531 unsigned __mexp_end)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003532{
3533 if (__first != __last)
3534 {
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003535 unsigned __grammar = __flags_ & 0x1F0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003536 switch (*__first)
3537 {
3538 case '*':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003539 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003540 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003541 {
3542 ++__first;
3543 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3544 }
3545 else
3546 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003547 break;
3548 case '+':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003549 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003550 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003551 {
3552 ++__first;
3553 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3554 }
3555 else
3556 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003557 break;
3558 case '?':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003559 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003560 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003561 {
3562 ++__first;
3563 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3564 }
3565 else
3566 __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003567 break;
3568 case '{':
3569 {
3570 int __min;
Howard Hinnantaa698082010-07-16 19:08:36 +00003571 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
Howard Hinnantd4444702010-08-11 17:04:31 +00003572#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003573 if (__temp == __first)
3574 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003575#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003576 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003577#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003578 if (__first == __last)
3579 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003580#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003581 switch (*__first)
3582 {
3583 case '}':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003584 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003585 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003586 {
3587 ++__first;
3588 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3589 }
3590 else
3591 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003592 break;
3593 case ',':
Howard Hinnantd4444702010-08-11 17:04:31 +00003594 ++__first;
3595#ifndef _LIBCPP_NO_EXCEPTIONS
3596 if (__first == __last)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003597 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003598#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003599 if (*__first == '}')
3600 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003601 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003602 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003603 {
3604 ++__first;
3605 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3606 }
3607 else
3608 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003609 }
3610 else
3611 {
Howard Hinnantaa698082010-07-16 19:08:36 +00003612 int __max = -1;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003613 __temp = __parse_DUP_COUNT(__first, __last, __max);
Howard Hinnantd4444702010-08-11 17:04:31 +00003614#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003615 if (__temp == __first)
3616 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003617#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003618 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003619#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003620 if (__first == __last || *__first != '}')
3621 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003622#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003623 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00003624#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003625 if (__max < __min)
3626 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003627#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003628 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003629 {
3630 ++__first;
3631 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3632 }
3633 else
3634 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003635 }
Howard Hinnantaa698082010-07-16 19:08:36 +00003636 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003637#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003638 default:
3639 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003640#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003641 }
3642 }
3643 break;
3644 }
3645 }
3646 return __first;
3647}
3648
3649template <class _CharT, class _Traits>
3650template <class _ForwardIterator>
3651_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003652basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3653 _ForwardIterator __last)
3654{
3655 if (__first != __last && *__first == '[')
3656 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003657 ++__first;
3658#ifndef _LIBCPP_NO_EXCEPTIONS
3659 if (__first == __last)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003660 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003661#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003662 bool __negate = false;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003663 if (*__first == '^')
3664 {
3665 ++__first;
Howard Hinnant173968a2010-07-13 21:48:06 +00003666 __negate = true;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003667 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003668 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3669 // __ml owned by *this
Howard Hinnantd4444702010-08-11 17:04:31 +00003670#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003671 if (__first == __last)
3672 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003673#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003674 if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']')
Howard Hinnant0de86b62010-06-25 20:56:08 +00003675 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003676 __ml->__add_char(']');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003677 ++__first;
3678 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003679 __first = __parse_follow_list(__first, __last, __ml);
Howard Hinnantd4444702010-08-11 17:04:31 +00003680#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003681 if (__first == __last)
3682 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003683#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003684 if (*__first == '-')
3685 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003686 __ml->__add_char('-');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003687 ++__first;
3688 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003689#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003690 if (__first == __last || *__first != ']')
3691 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003692#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003693 ++__first;
3694 }
3695 return __first;
3696}
3697
3698template <class _CharT, class _Traits>
3699template <class _ForwardIterator>
3700_ForwardIterator
3701basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003702 _ForwardIterator __last,
3703 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003704{
3705 if (__first != __last)
3706 {
3707 while (true)
3708 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003709 _ForwardIterator __temp = __parse_expression_term(__first, __last,
3710 __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003711 if (__temp == __first)
3712 break;
3713 __first = __temp;
3714 }
3715 }
3716 return __first;
3717}
3718
3719template <class _CharT, class _Traits>
3720template <class _ForwardIterator>
3721_ForwardIterator
3722basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003723 _ForwardIterator __last,
3724 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003725{
3726 if (__first != __last && *__first != ']')
3727 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003728 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant173968a2010-07-13 21:48:06 +00003729 basic_string<_CharT> __start_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003730 if (__temp != __last && *__first == '[')
3731 {
3732 if (*__temp == '=')
Howard Hinnant173968a2010-07-13 21:48:06 +00003733 return __parse_equivalence_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003734 else if (*__temp == ':')
Howard Hinnant173968a2010-07-13 21:48:06 +00003735 return __parse_character_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003736 else if (*__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003737 __first = __parse_collating_symbol(++__temp, __last, __start_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003738 }
Howard Hinnant15476f32010-07-28 17:35:27 +00003739 unsigned __grammar = __flags_ & 0x1F0;
3740 if (__start_range.empty())
Howard Hinnant0de86b62010-06-25 20:56:08 +00003741 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003742 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3743 {
3744 if (__grammar == ECMAScript)
3745 __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3746 else
3747 __first = __parse_awk_escape(++__first, __last, &__start_range);
3748 }
3749 else
3750 {
3751 __start_range = *__first;
3752 ++__first;
3753 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003754 }
3755 if (__first != __last && *__first != ']')
3756 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003757 __temp = _VSTD::next(__first);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003758 if (__temp != __last && *__first == '-' && *__temp != ']')
3759 {
3760 // parse a range
Howard Hinnant173968a2010-07-13 21:48:06 +00003761 basic_string<_CharT> __end_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003762 __first = __temp;
3763 ++__temp;
3764 if (__temp != __last && *__first == '[' && *__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003765 __first = __parse_collating_symbol(++__temp, __last, __end_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003766 else
3767 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003768 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3769 {
3770 if (__grammar == ECMAScript)
3771 __first = __parse_class_escape(++__first, __last,
3772 __end_range, __ml);
3773 else
3774 __first = __parse_awk_escape(++__first, __last,
3775 &__end_range);
3776 }
3777 else
3778 {
3779 __end_range = *__first;
3780 ++__first;
3781 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003782 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003783 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
Howard Hinnant0de86b62010-06-25 20:56:08 +00003784 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003785 else
3786 {
3787 if (__start_range.size() == 1)
3788 __ml->__add_char(__start_range[0]);
3789 else
3790 __ml->__add_digraph(__start_range[0], __start_range[1]);
3791 }
3792 }
3793 else
3794 {
3795 if (__start_range.size() == 1)
3796 __ml->__add_char(__start_range[0]);
3797 else
3798 __ml->__add_digraph(__start_range[0], __start_range[1]);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003799 }
3800 }
3801 return __first;
3802}
3803
3804template <class _CharT, class _Traits>
3805template <class _ForwardIterator>
3806_ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00003807basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
3808 _ForwardIterator __last,
3809 basic_string<_CharT>& __str,
3810 __bracket_expression<_CharT, _Traits>* __ml)
3811{
Howard Hinnantd4444702010-08-11 17:04:31 +00003812#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003813 if (__first == __last)
3814 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003815#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003816 switch (*__first)
3817 {
3818 case 0:
3819 __str = *__first;
3820 return ++__first;
3821 case 'b':
3822 __str = _CharT(8);
3823 return ++__first;
3824 case 'd':
3825 __ml->__add_class(ctype_base::digit);
3826 return ++__first;
3827 case 'D':
3828 __ml->__add_neg_class(ctype_base::digit);
3829 return ++__first;
3830 case 's':
3831 __ml->__add_class(ctype_base::space);
3832 return ++__first;
3833 case 'S':
3834 __ml->__add_neg_class(ctype_base::space);
3835 return ++__first;
3836 case 'w':
3837 __ml->__add_class(ctype_base::alnum);
3838 __ml->__add_char('_');
3839 return ++__first;
3840 case 'W':
3841 __ml->__add_neg_class(ctype_base::alnum);
3842 __ml->__add_neg_char('_');
3843 return ++__first;
3844 }
3845 __first = __parse_character_escape(__first, __last, &__str);
3846 return __first;
3847}
3848
3849template <class _CharT, class _Traits>
3850template <class _ForwardIterator>
3851_ForwardIterator
3852basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
3853 _ForwardIterator __last,
3854 basic_string<_CharT>* __str)
3855{
Howard Hinnantd4444702010-08-11 17:04:31 +00003856#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003857 if (__first == __last)
3858 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003859#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003860 switch (*__first)
3861 {
3862 case '\\':
3863 case '"':
3864 case '/':
3865 if (__str)
3866 *__str = *__first;
3867 else
3868 __push_char(*__first);
3869 return ++__first;
3870 case 'a':
3871 if (__str)
3872 *__str = _CharT(7);
3873 else
3874 __push_char(_CharT(7));
3875 return ++__first;
3876 case 'b':
3877 if (__str)
3878 *__str = _CharT(8);
3879 else
3880 __push_char(_CharT(8));
3881 return ++__first;
3882 case 'f':
3883 if (__str)
3884 *__str = _CharT(0xC);
3885 else
3886 __push_char(_CharT(0xC));
3887 return ++__first;
3888 case 'n':
3889 if (__str)
3890 *__str = _CharT(0xA);
3891 else
3892 __push_char(_CharT(0xA));
3893 return ++__first;
3894 case 'r':
3895 if (__str)
3896 *__str = _CharT(0xD);
3897 else
3898 __push_char(_CharT(0xD));
3899 return ++__first;
3900 case 't':
3901 if (__str)
3902 *__str = _CharT(0x9);
3903 else
3904 __push_char(_CharT(0x9));
3905 return ++__first;
3906 case 'v':
3907 if (__str)
3908 *__str = _CharT(0xB);
3909 else
3910 __push_char(_CharT(0xB));
3911 return ++__first;
3912 }
3913 if ('0' <= *__first && *__first <= '7')
3914 {
3915 unsigned __val = *__first - '0';
3916 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3917 {
3918 __val = 8 * __val + *__first - '0';
3919 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
Howard Hinnantdbc8cf02013-07-02 17:43:31 +00003920 __val = 8 * __val + *__first++ - '0';
Howard Hinnant15476f32010-07-28 17:35:27 +00003921 }
3922 if (__str)
3923 *__str = _CharT(__val);
3924 else
3925 __push_char(_CharT(__val));
3926 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003927#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003928 else
3929 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003930#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003931 return __first;
3932}
3933
3934template <class _CharT, class _Traits>
3935template <class _ForwardIterator>
3936_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003937basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003938 _ForwardIterator __last,
3939 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003940{
3941 // Found [=
3942 // This means =] must exist
3943 value_type _Equal_close[2] = {'=', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003944 _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00003945 _Equal_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00003946#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003947 if (__temp == __last)
3948 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003949#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003950 // [__first, __temp) contains all text in [= ... =]
3951 typedef typename _Traits::string_type string_type;
3952 string_type __collate_name =
3953 __traits_.lookup_collatename(__first, __temp);
Howard Hinnantd4444702010-08-11 17:04:31 +00003954#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003955 if (__collate_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003956 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00003957#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003958 string_type __equiv_name =
3959 __traits_.transform_primary(__collate_name.begin(),
3960 __collate_name.end());
3961 if (!__equiv_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003962 __ml->__add_equivalence(__equiv_name);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003963 else
Howard Hinnant173968a2010-07-13 21:48:06 +00003964 {
3965 switch (__collate_name.size())
3966 {
3967 case 1:
3968 __ml->__add_char(__collate_name[0]);
3969 break;
3970 case 2:
3971 __ml->__add_digraph(__collate_name[0], __collate_name[1]);
3972 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003973#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003974 default:
3975 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00003976#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003977 }
3978 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003979 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003980 return __first;
3981}
3982
3983template <class _CharT, class _Traits>
3984template <class _ForwardIterator>
3985_ForwardIterator
3986basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003987 _ForwardIterator __last,
3988 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003989{
3990 // Found [:
3991 // This means :] must exist
3992 value_type _Colon_close[2] = {':', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003993 _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00003994 _Colon_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00003995#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003996 if (__temp == __last)
3997 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003998#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003999 // [__first, __temp) contains all text in [: ... :]
4000 typedef typename _Traits::char_class_type char_class_type;
4001 char_class_type __class_type =
4002 __traits_.lookup_classname(__first, __temp, __flags_ & icase);
Howard Hinnantd4444702010-08-11 17:04:31 +00004003#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004004 if (__class_type == 0)
4005 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00004006#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004007 __ml->__add_class(__class_type);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004008 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004009 return __first;
4010}
4011
4012template <class _CharT, class _Traits>
4013template <class _ForwardIterator>
4014_ForwardIterator
4015basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00004016 _ForwardIterator __last,
4017 basic_string<_CharT>& __col_sym)
Howard Hinnant0de86b62010-06-25 20:56:08 +00004018{
4019 // Found [.
4020 // This means .] must exist
4021 value_type _Dot_close[2] = {'.', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00004022 _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00004023 _Dot_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00004024#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004025 if (__temp == __last)
4026 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00004027#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004028 // [__first, __temp) contains all text in [. ... .]
4029 typedef typename _Traits::string_type string_type;
Howard Hinnant173968a2010-07-13 21:48:06 +00004030 __col_sym = __traits_.lookup_collatename(__first, __temp);
4031 switch (__col_sym.size())
4032 {
4033 case 1:
4034 case 2:
4035 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00004036#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004037 default:
4038 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00004039#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004040 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004041 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004042 return __first;
4043}
4044
4045template <class _CharT, class _Traits>
4046template <class _ForwardIterator>
4047_ForwardIterator
4048basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4049 _ForwardIterator __last,
4050 int& __c)
4051{
4052 if (__first != __last && '0' <= *__first && *__first <= '9')
4053 {
4054 __c = *__first - '0';
4055 for (++__first; __first != __last && '0' <= *__first && *__first <= '9';
4056 ++__first)
4057 {
4058 __c *= 10;
4059 __c += *__first - '0';
4060 }
4061 }
4062 return __first;
4063}
4064
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004065template <class _CharT, class _Traits>
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004066template <class _ForwardIterator>
4067_ForwardIterator
4068basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4069 _ForwardIterator __last)
4070{
4071 __owns_one_state<_CharT>* __sa = __end_;
4072 _ForwardIterator __temp = __parse_alternative(__first, __last);
4073 if (__temp == __first)
4074 __push_empty();
4075 __first = __temp;
4076 while (__first != __last && *__first == '|')
4077 {
4078 __owns_one_state<_CharT>* __sb = __end_;
4079 __temp = __parse_alternative(++__first, __last);
4080 if (__temp == __first)
4081 __push_empty();
4082 __push_alternation(__sa, __sb);
4083 __first = __temp;
4084 }
4085 return __first;
4086}
4087
4088template <class _CharT, class _Traits>
4089template <class _ForwardIterator>
4090_ForwardIterator
4091basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4092 _ForwardIterator __last)
4093{
4094 while (true)
4095 {
4096 _ForwardIterator __temp = __parse_term(__first, __last);
4097 if (__temp == __first)
4098 break;
4099 __first = __temp;
4100 }
4101 return __first;
4102}
4103
4104template <class _CharT, class _Traits>
4105template <class _ForwardIterator>
4106_ForwardIterator
4107basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4108 _ForwardIterator __last)
4109{
4110 _ForwardIterator __temp = __parse_assertion(__first, __last);
4111 if (__temp == __first)
4112 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004113 __owns_one_state<_CharT>* __e = __end_;
4114 unsigned __mexp_begin = __marked_count_;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004115 __temp = __parse_atom(__first, __last);
4116 if (__temp != __first)
Howard Hinnant17615b02010-07-27 01:25:38 +00004117 __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4118 __mexp_begin+1, __marked_count_+1);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004119 }
Howard Hinnant17615b02010-07-27 01:25:38 +00004120 else
4121 __first = __temp;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004122 return __first;
4123}
4124
4125template <class _CharT, class _Traits>
4126template <class _ForwardIterator>
4127_ForwardIterator
4128basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4129 _ForwardIterator __last)
4130{
4131 if (__first != __last)
4132 {
4133 switch (*__first)
4134 {
4135 case '^':
4136 __push_l_anchor();
4137 ++__first;
4138 break;
4139 case '$':
4140 __push_r_anchor();
4141 ++__first;
4142 break;
4143 case '\\':
4144 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004145 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004146 if (__temp != __last)
4147 {
4148 if (*__temp == 'b')
4149 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004150 __push_word_boundary(false);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004151 __first = ++__temp;
4152 }
4153 else if (*__temp == 'B')
4154 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004155 __push_word_boundary(true);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004156 __first = ++__temp;
4157 }
4158 }
4159 }
4160 break;
4161 case '(':
4162 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004163 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004164 if (__temp != __last && *__temp == '?')
4165 {
4166 if (++__temp != __last)
4167 {
4168 switch (*__temp)
4169 {
4170 case '=':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004171 {
4172 basic_regex __exp;
4173 __exp.__flags_ = __flags_;
4174 __temp = __exp.__parse(++__temp, __last);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004175 unsigned __mexp = __exp.__marked_count_;
4176 __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
4177 __marked_count_ += __mexp;
Howard Hinnantd4444702010-08-11 17:04:31 +00004178#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004179 if (__temp == __last || *__temp != ')')
4180 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004181#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004182 __first = ++__temp;
4183 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004184 break;
4185 case '!':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004186 {
4187 basic_regex __exp;
4188 __exp.__flags_ = __flags_;
4189 __temp = __exp.__parse(++__temp, __last);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004190 unsigned __mexp = __exp.__marked_count_;
4191 __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
4192 __marked_count_ += __mexp;
Howard Hinnantd4444702010-08-11 17:04:31 +00004193#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004194 if (__temp == __last || *__temp != ')')
4195 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004196#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004197 __first = ++__temp;
4198 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004199 break;
4200 }
4201 }
4202 }
4203 }
4204 break;
4205 }
4206 }
4207 return __first;
4208}
4209
4210template <class _CharT, class _Traits>
4211template <class _ForwardIterator>
4212_ForwardIterator
4213basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4214 _ForwardIterator __last)
4215{
Howard Hinnant17615b02010-07-27 01:25:38 +00004216 if (__first != __last)
4217 {
4218 switch (*__first)
4219 {
4220 case '.':
4221 __push_match_any_but_newline();
4222 ++__first;
4223 break;
4224 case '\\':
4225 __first = __parse_atom_escape(__first, __last);
4226 break;
4227 case '[':
4228 __first = __parse_bracket_expression(__first, __last);
4229 break;
4230 case '(':
4231 {
Howard Hinnantd4444702010-08-11 17:04:31 +00004232 ++__first;
4233#ifndef _LIBCPP_NO_EXCEPTIONS
4234 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004235 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004236#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0949eed2011-06-30 21:18:19 +00004237 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004238 if (__temp != __last && *__first == '?' && *__temp == ':')
4239 {
4240 ++__open_count_;
4241 __first = __parse_ecma_exp(++__temp, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00004242#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004243 if (__first == __last || *__first != ')')
4244 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004245#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004246 --__open_count_;
4247 ++__first;
4248 }
4249 else
4250 {
4251 __push_begin_marked_subexpression();
4252 unsigned __temp_count = __marked_count_;
4253 ++__open_count_;
4254 __first = __parse_ecma_exp(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00004255#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004256 if (__first == __last || *__first != ')')
4257 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004258#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004259 __push_end_marked_subexpression(__temp_count);
4260 --__open_count_;
4261 ++__first;
4262 }
4263 }
4264 break;
4265 default:
4266 __first = __parse_pattern_character(__first, __last);
4267 break;
4268 }
4269 }
4270 return __first;
4271}
4272
4273template <class _CharT, class _Traits>
4274template <class _ForwardIterator>
4275_ForwardIterator
4276basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4277 _ForwardIterator __last)
4278{
4279 if (__first != __last && *__first == '\\')
4280 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004281 _ForwardIterator __t1 = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004282 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4283 if (__t2 != __t1)
4284 __first = __t2;
4285 else
4286 {
4287 __t2 = __parse_character_class_escape(__t1, __last);
4288 if (__t2 != __t1)
4289 __first = __t2;
4290 else
4291 {
4292 __t2 = __parse_character_escape(__t1, __last);
4293 if (__t2 != __t1)
4294 __first = __t2;
4295 }
4296 }
4297 }
4298 return __first;
4299}
4300
4301template <class _CharT, class _Traits>
4302template <class _ForwardIterator>
4303_ForwardIterator
4304basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4305 _ForwardIterator __last)
4306{
4307 if (__first != __last)
4308 {
4309 if (*__first == '0')
4310 {
4311 __push_char(_CharT());
4312 ++__first;
4313 }
4314 else if ('1' <= *__first && *__first <= '9')
4315 {
4316 unsigned __v = *__first - '0';
4317 for (++__first; '0' <= *__first && *__first <= '9'; ++__first)
4318 __v = 10 * __v + *__first - '0';
Howard Hinnantd4444702010-08-11 17:04:31 +00004319#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004320 if (__v > mark_count())
4321 throw regex_error(regex_constants::error_backref);
Howard Hinnant324bb032010-08-22 00:02:43 +00004322#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004323 __push_back_ref(__v);
4324 }
4325 }
4326 return __first;
4327}
4328
4329template <class _CharT, class _Traits>
4330template <class _ForwardIterator>
4331_ForwardIterator
4332basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4333 _ForwardIterator __last)
4334{
4335 if (__first != __last)
4336 {
4337 __bracket_expression<_CharT, _Traits>* __ml;
4338 switch (*__first)
4339 {
4340 case 'd':
4341 __ml = __start_matching_list(false);
4342 __ml->__add_class(ctype_base::digit);
4343 ++__first;
4344 break;
4345 case 'D':
4346 __ml = __start_matching_list(true);
4347 __ml->__add_class(ctype_base::digit);
4348 ++__first;
4349 break;
4350 case 's':
4351 __ml = __start_matching_list(false);
4352 __ml->__add_class(ctype_base::space);
4353 ++__first;
4354 break;
4355 case 'S':
4356 __ml = __start_matching_list(true);
4357 __ml->__add_class(ctype_base::space);
4358 ++__first;
4359 break;
4360 case 'w':
4361 __ml = __start_matching_list(false);
4362 __ml->__add_class(ctype_base::alnum);
4363 __ml->__add_char('_');
4364 ++__first;
4365 break;
4366 case 'W':
4367 __ml = __start_matching_list(true);
4368 __ml->__add_class(ctype_base::alnum);
4369 __ml->__add_char('_');
4370 ++__first;
4371 break;
4372 }
4373 }
4374 return __first;
4375}
4376
4377template <class _CharT, class _Traits>
4378template <class _ForwardIterator>
4379_ForwardIterator
4380basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
Howard Hinnant15476f32010-07-28 17:35:27 +00004381 _ForwardIterator __last,
4382 basic_string<_CharT>* __str)
Howard Hinnant17615b02010-07-27 01:25:38 +00004383{
4384 if (__first != __last)
4385 {
4386 _ForwardIterator __t;
4387 unsigned __sum = 0;
4388 int __hd;
4389 switch (*__first)
4390 {
4391 case 'f':
Howard Hinnant15476f32010-07-28 17:35:27 +00004392 if (__str)
4393 *__str = _CharT(0xC);
4394 else
4395 __push_char(_CharT(0xC));
Howard Hinnant17615b02010-07-27 01:25:38 +00004396 ++__first;
4397 break;
4398 case 'n':
Howard Hinnant15476f32010-07-28 17:35:27 +00004399 if (__str)
4400 *__str = _CharT(0xA);
4401 else
4402 __push_char(_CharT(0xA));
Howard Hinnant17615b02010-07-27 01:25:38 +00004403 ++__first;
4404 break;
4405 case 'r':
Howard Hinnant15476f32010-07-28 17:35:27 +00004406 if (__str)
4407 *__str = _CharT(0xD);
4408 else
4409 __push_char(_CharT(0xD));
Howard Hinnant17615b02010-07-27 01:25:38 +00004410 ++__first;
4411 break;
4412 case 't':
Howard Hinnant15476f32010-07-28 17:35:27 +00004413 if (__str)
4414 *__str = _CharT(0x9);
4415 else
4416 __push_char(_CharT(0x9));
Howard Hinnant17615b02010-07-27 01:25:38 +00004417 ++__first;
4418 break;
4419 case 'v':
Howard Hinnant15476f32010-07-28 17:35:27 +00004420 if (__str)
4421 *__str = _CharT(0xB);
4422 else
4423 __push_char(_CharT(0xB));
Howard Hinnant17615b02010-07-27 01:25:38 +00004424 ++__first;
4425 break;
4426 case 'c':
Howard Hinnant0949eed2011-06-30 21:18:19 +00004427 if ((__t = _VSTD::next(__first)) != __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004428 {
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004429 if (('A' <= *__t && *__t <= 'Z') ||
4430 ('a' <= *__t && *__t <= 'z'))
Howard Hinnant17615b02010-07-27 01:25:38 +00004431 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004432 if (__str)
4433 *__str = _CharT(*__t % 32);
4434 else
4435 __push_char(_CharT(*__t % 32));
Howard Hinnant17615b02010-07-27 01:25:38 +00004436 __first = ++__t;
4437 }
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004438#ifndef _LIBCPP_NO_EXCEPTIONS
4439 else
4440 throw regex_error(regex_constants::error_escape);
4441#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004442 }
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004443#ifndef _LIBCPP_NO_EXCEPTIONS
4444 else
4445 throw regex_error(regex_constants::error_escape);
4446#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004447 break;
4448 case 'u':
Howard Hinnantd4444702010-08-11 17:04:31 +00004449 ++__first;
4450#ifndef _LIBCPP_NO_EXCEPTIONS
4451 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004452 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004453#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004454 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004455#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004456 if (__hd == -1)
4457 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004458#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004459 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnantd4444702010-08-11 17:04:31 +00004460 ++__first;
4461#ifndef _LIBCPP_NO_EXCEPTIONS
4462 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004463 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004464#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004465 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004466#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004467 if (__hd == -1)
4468 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004469#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004470 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant17615b02010-07-27 01:25:38 +00004471 // drop through
4472 case 'x':
Howard Hinnantd4444702010-08-11 17:04:31 +00004473 ++__first;
4474#ifndef _LIBCPP_NO_EXCEPTIONS
4475 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004476 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004477#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004478 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004479#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004480 if (__hd == -1)
4481 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004482#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004483 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnantd4444702010-08-11 17:04:31 +00004484 ++__first;
4485#ifndef _LIBCPP_NO_EXCEPTIONS
4486 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004487 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004488#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004489 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004490#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004491 if (__hd == -1)
4492 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004493#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004494 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant15476f32010-07-28 17:35:27 +00004495 if (__str)
4496 *__str = _CharT(__sum);
4497 else
4498 __push_char(_CharT(__sum));
Howard Hinnant17615b02010-07-27 01:25:38 +00004499 ++__first;
4500 break;
4501 default:
4502 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4503 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004504 if (__str)
4505 *__str = *__first;
4506 else
4507 __push_char(*__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004508 ++__first;
4509 }
Howard Hinnantd4444702010-08-11 17:04:31 +00004510#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant918f2a82013-06-28 18:57:30 +00004511 else
Howard Hinnant15476f32010-07-28 17:35:27 +00004512 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004513#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004514 break;
4515 }
4516 }
4517 return __first;
4518}
4519
4520template <class _CharT, class _Traits>
4521template <class _ForwardIterator>
4522_ForwardIterator
4523basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4524 _ForwardIterator __last)
4525{
4526 if (__first != __last)
4527 {
4528 switch (*__first)
4529 {
4530 case '^':
4531 case '$':
4532 case '\\':
4533 case '.':
4534 case '*':
4535 case '+':
4536 case '?':
4537 case '(':
4538 case ')':
4539 case '[':
4540 case ']':
4541 case '{':
4542 case '}':
4543 case '|':
4544 break;
4545 default:
4546 __push_char(*__first);
4547 ++__first;
4548 break;
4549 }
4550 }
4551 return __first;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004552}
4553
4554template <class _CharT, class _Traits>
Howard Hinnant856846b2010-07-27 19:53:10 +00004555template <class _ForwardIterator>
4556_ForwardIterator
4557basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4558 _ForwardIterator __last)
4559{
4560 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004561 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004562 if (__t1 != __first)
4563 __parse_basic_reg_exp(__first, __t1);
4564 else
4565 __push_empty();
4566 __first = __t1;
4567 if (__first != __last)
4568 ++__first;
4569 while (__first != __last)
4570 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004571 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004572 __owns_one_state<_CharT>* __sb = __end_;
4573 if (__t1 != __first)
4574 __parse_basic_reg_exp(__first, __t1);
4575 else
4576 __push_empty();
4577 __push_alternation(__sa, __sb);
4578 __first = __t1;
4579 if (__first != __last)
4580 ++__first;
4581 }
4582 return __first;
4583}
4584
4585template <class _CharT, class _Traits>
4586template <class _ForwardIterator>
4587_ForwardIterator
4588basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4589 _ForwardIterator __last)
4590{
4591 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004592 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004593 if (__t1 != __first)
4594 __parse_extended_reg_exp(__first, __t1);
4595 else
4596 __push_empty();
4597 __first = __t1;
4598 if (__first != __last)
4599 ++__first;
4600 while (__first != __last)
4601 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004602 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004603 __owns_one_state<_CharT>* __sb = __end_;
4604 if (__t1 != __first)
4605 __parse_extended_reg_exp(__first, __t1);
4606 else
4607 __push_empty();
4608 __push_alternation(__sa, __sb);
4609 __first = __t1;
4610 if (__first != __last)
4611 ++__first;
4612 }
4613 return __first;
4614}
4615
4616template <class _CharT, class _Traits>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004617void
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004618basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4619 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4620 bool __greedy)
4621{
4622 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4623 __end_->first() = nullptr;
Howard Hinnantac303862010-07-12 15:51:17 +00004624 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4625 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4626 __min, __max));
4627 __s->first() = nullptr;
4628 __e1.release();
4629 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004630 __end_ = __e2->second();
Howard Hinnantac303862010-07-12 15:51:17 +00004631 __s->first() = __e2.release();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004632 ++__loop_count_;
4633}
4634
4635template <class _CharT, class _Traits>
4636void
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004637basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4638{
Howard Hinnant173968a2010-07-13 21:48:06 +00004639 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004640 __end_->first() = new __match_char_icase<_CharT, _Traits>
4641 (__traits_, __c, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004642 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004643 __end_->first() = new __match_char_collate<_CharT, _Traits>
4644 (__traits_, __c, __end_->first());
4645 else
4646 __end_->first() = new __match_char<_CharT>(__c, __end_->first());
Howard Hinnante77aa5e2010-07-08 17:43:58 +00004647 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004648}
4649
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004650template <class _CharT, class _Traits>
4651void
4652basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4653{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004654 if (!(__flags_ & nosubs))
4655 {
4656 __end_->first() =
4657 new __begin_marked_subexpression<_CharT>(++__marked_count_,
4658 __end_->first());
4659 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4660 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004661}
4662
4663template <class _CharT, class _Traits>
4664void
4665basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4666{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004667 if (!(__flags_ & nosubs))
4668 {
4669 __end_->first() =
4670 new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4671 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4672 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004673}
4674
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004675template <class _CharT, class _Traits>
4676void
Howard Hinnant41fb6e12011-03-26 20:02:27 +00004677basic_regex<_CharT, _Traits>::__push_l_anchor()
4678{
4679 __end_->first() = new __l_anchor<_CharT>(__end_->first());
4680 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4681}
4682
4683template <class _CharT, class _Traits>
4684void
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004685basic_regex<_CharT, _Traits>::__push_r_anchor()
4686{
4687 __end_->first() = new __r_anchor<_CharT>(__end_->first());
4688 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4689}
4690
Howard Hinnantac303862010-07-12 15:51:17 +00004691template <class _CharT, class _Traits>
4692void
4693basic_regex<_CharT, _Traits>::__push_match_any()
4694{
4695 __end_->first() = new __match_any<_CharT>(__end_->first());
4696 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4697}
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004698
Howard Hinnantcba352d2010-07-12 18:16:05 +00004699template <class _CharT, class _Traits>
4700void
Howard Hinnant17615b02010-07-27 01:25:38 +00004701basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4702{
4703 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4704 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4705}
4706
4707template <class _CharT, class _Traits>
4708void
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004709basic_regex<_CharT, _Traits>::__push_empty()
4710{
4711 __end_->first() = new __empty_state<_CharT>(__end_->first());
4712 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4713}
4714
4715template <class _CharT, class _Traits>
4716void
Howard Hinnant17615b02010-07-27 01:25:38 +00004717basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4718{
4719 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4720 __end_->first());
4721 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4722}
4723
4724template <class _CharT, class _Traits>
4725void
Howard Hinnantcba352d2010-07-12 18:16:05 +00004726basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4727{
Howard Hinnant173968a2010-07-13 21:48:06 +00004728 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004729 __end_->first() = new __back_ref_icase<_CharT, _Traits>
4730 (__traits_, __i, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004731 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004732 __end_->first() = new __back_ref_collate<_CharT, _Traits>
4733 (__traits_, __i, __end_->first());
4734 else
4735 __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
Howard Hinnantcba352d2010-07-12 18:16:05 +00004736 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4737}
4738
Howard Hinnant173968a2010-07-13 21:48:06 +00004739template <class _CharT, class _Traits>
Howard Hinnantaa698082010-07-16 19:08:36 +00004740void
4741basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4742 __owns_one_state<_CharT>* __ea)
4743{
4744 __sa->first() = new __alternate<_CharT>(
4745 static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4746 static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4747 __ea->first() = nullptr;
4748 __ea->first() = new __empty_state<_CharT>(__end_->first());
4749 __end_->first() = nullptr;
4750 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4751 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4752}
4753
4754template <class _CharT, class _Traits>
Howard Hinnant173968a2010-07-13 21:48:06 +00004755__bracket_expression<_CharT, _Traits>*
4756basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4757{
4758 __bracket_expression<_CharT, _Traits>* __r =
4759 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4760 __negate, __flags_ & icase,
4761 __flags_ & collate);
4762 __end_->first() = __r;
4763 __end_ = __r;
4764 return __r;
4765}
4766
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004767template <class _CharT, class _Traits>
4768void
4769basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004770 bool __invert,
4771 unsigned __mexp)
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004772{
4773 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004774 __end_->first(), __mexp);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004775 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4776}
4777
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00004778typedef basic_regex<char> regex;
4779typedef basic_regex<wchar_t> wregex;
4780
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004781// sub_match
4782
4783template <class _BidirectionalIterator>
Howard Hinnant83eade62013-03-06 23:30:19 +00004784class _LIBCPP_TYPE_VIS sub_match
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004785 : public pair<_BidirectionalIterator, _BidirectionalIterator>
4786{
4787public:
4788 typedef _BidirectionalIterator iterator;
4789 typedef typename iterator_traits<iterator>::value_type value_type;
4790 typedef typename iterator_traits<iterator>::difference_type difference_type;
4791 typedef basic_string<value_type> string_type;
4792
4793 bool matched;
4794
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004795 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +00004796 _LIBCPP_CONSTEXPR sub_match() : matched() {}
Howard Hinnant31aaf552010-12-08 21:07:55 +00004797
4798 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004799 difference_type length() const
Howard Hinnant0949eed2011-06-30 21:18:19 +00004800 {return matched ? _VSTD::distance(this->first, this->second) : 0;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004801 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004802 string_type str() const
4803 {return matched ? string_type(this->first, this->second) : string_type();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004804 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004805 operator string_type() const
4806 {return str();}
4807
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004808 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004809 int compare(const sub_match& __s) const
4810 {return str().compare(__s.str());}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004811 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004812 int compare(const string_type& __s) const
4813 {return str().compare(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004814 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004815 int compare(const value_type* __s) const
4816 {return str().compare(__s);}
4817};
4818
4819typedef sub_match<const char*> csub_match;
4820typedef sub_match<const wchar_t*> wcsub_match;
4821typedef sub_match<string::const_iterator> ssub_match;
4822typedef sub_match<wstring::const_iterator> wssub_match;
4823
4824template <class _BiIter>
4825inline _LIBCPP_INLINE_VISIBILITY
4826bool
4827operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4828{
4829 return __x.compare(__y) == 0;
4830}
4831
4832template <class _BiIter>
4833inline _LIBCPP_INLINE_VISIBILITY
4834bool
4835operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4836{
4837 return !(__x == __y);
4838}
4839
4840template <class _BiIter>
4841inline _LIBCPP_INLINE_VISIBILITY
4842bool
4843operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4844{
4845 return __x.compare(__y) < 0;
4846}
4847
4848template <class _BiIter>
4849inline _LIBCPP_INLINE_VISIBILITY
4850bool
4851operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4852{
4853 return !(__y < __x);
4854}
4855
4856template <class _BiIter>
4857inline _LIBCPP_INLINE_VISIBILITY
4858bool
4859operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4860{
4861 return !(__x < __y);
4862}
4863
4864template <class _BiIter>
4865inline _LIBCPP_INLINE_VISIBILITY
4866bool
4867operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4868{
4869 return __y < __x;
4870}
4871
4872template <class _BiIter, class _ST, class _SA>
4873inline _LIBCPP_INLINE_VISIBILITY
4874bool
4875operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4876 const sub_match<_BiIter>& __y)
4877{
4878 return __y.compare(__x.c_str()) == 0;
4879}
4880
4881template <class _BiIter, class _ST, class _SA>
4882inline _LIBCPP_INLINE_VISIBILITY
4883bool
4884operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4885 const sub_match<_BiIter>& __y)
4886{
4887 return !(__x == __y);
4888}
4889
4890template <class _BiIter, class _ST, class _SA>
4891inline _LIBCPP_INLINE_VISIBILITY
4892bool
4893operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4894 const sub_match<_BiIter>& __y)
4895{
4896 return __y.compare(__x.c_str()) > 0;
4897}
4898
4899template <class _BiIter, class _ST, class _SA>
4900inline _LIBCPP_INLINE_VISIBILITY
4901bool
4902operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4903 const sub_match<_BiIter>& __y)
4904{
4905 return __y < __x;
4906}
4907
4908template <class _BiIter, class _ST, class _SA>
4909inline _LIBCPP_INLINE_VISIBILITY
4910bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4911 const sub_match<_BiIter>& __y)
4912{
4913 return !(__x < __y);
4914}
4915
4916template <class _BiIter, class _ST, class _SA>
4917inline _LIBCPP_INLINE_VISIBILITY
4918bool
4919operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4920 const sub_match<_BiIter>& __y)
4921{
4922 return !(__y < __x);
4923}
4924
4925template <class _BiIter, class _ST, class _SA>
4926inline _LIBCPP_INLINE_VISIBILITY
4927bool
4928operator==(const sub_match<_BiIter>& __x,
4929 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4930{
4931 return __x.compare(__y.c_str()) == 0;
4932}
4933
4934template <class _BiIter, class _ST, class _SA>
4935inline _LIBCPP_INLINE_VISIBILITY
4936bool
4937operator!=(const sub_match<_BiIter>& __x,
4938 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4939{
4940 return !(__x == __y);
4941}
4942
4943template <class _BiIter, class _ST, class _SA>
4944inline _LIBCPP_INLINE_VISIBILITY
4945bool
4946operator<(const sub_match<_BiIter>& __x,
4947 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4948{
4949 return __x.compare(__y.c_str()) < 0;
4950}
4951
4952template <class _BiIter, class _ST, class _SA>
4953inline _LIBCPP_INLINE_VISIBILITY
4954bool operator>(const sub_match<_BiIter>& __x,
4955 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4956{
4957 return __y < __x;
4958}
4959
4960template <class _BiIter, class _ST, class _SA>
4961inline _LIBCPP_INLINE_VISIBILITY
4962bool
4963operator>=(const sub_match<_BiIter>& __x,
4964 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4965{
4966 return !(__x < __y);
4967}
4968
4969template <class _BiIter, class _ST, class _SA>
4970inline _LIBCPP_INLINE_VISIBILITY
4971bool
4972operator<=(const sub_match<_BiIter>& __x,
4973 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4974{
4975 return !(__y < __x);
4976}
4977
4978template <class _BiIter>
4979inline _LIBCPP_INLINE_VISIBILITY
4980bool
4981operator==(typename iterator_traits<_BiIter>::value_type const* __x,
4982 const sub_match<_BiIter>& __y)
4983{
4984 return __y.compare(__x) == 0;
4985}
4986
4987template <class _BiIter>
4988inline _LIBCPP_INLINE_VISIBILITY
4989bool
4990operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
4991 const sub_match<_BiIter>& __y)
4992{
4993 return !(__x == __y);
4994}
4995
4996template <class _BiIter>
4997inline _LIBCPP_INLINE_VISIBILITY
4998bool
4999operator<(typename iterator_traits<_BiIter>::value_type const* __x,
5000 const sub_match<_BiIter>& __y)
5001{
5002 return __y.compare(__x) > 0;
5003}
5004
5005template <class _BiIter>
5006inline _LIBCPP_INLINE_VISIBILITY
5007bool
5008operator>(typename iterator_traits<_BiIter>::value_type const* __x,
5009 const sub_match<_BiIter>& __y)
5010{
5011 return __y < __x;
5012}
5013
5014template <class _BiIter>
5015inline _LIBCPP_INLINE_VISIBILITY
5016bool
5017operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
5018 const sub_match<_BiIter>& __y)
5019{
5020 return !(__x < __y);
5021}
5022
5023template <class _BiIter>
5024inline _LIBCPP_INLINE_VISIBILITY
5025bool
5026operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
5027 const sub_match<_BiIter>& __y)
5028{
5029 return !(__y < __x);
5030}
5031
5032template <class _BiIter>
5033inline _LIBCPP_INLINE_VISIBILITY
5034bool
5035operator==(const sub_match<_BiIter>& __x,
5036 typename iterator_traits<_BiIter>::value_type const* __y)
5037{
5038 return __x.compare(__y) == 0;
5039}
5040
5041template <class _BiIter>
5042inline _LIBCPP_INLINE_VISIBILITY
5043bool
5044operator!=(const sub_match<_BiIter>& __x,
5045 typename iterator_traits<_BiIter>::value_type const* __y)
5046{
5047 return !(__x == __y);
5048}
5049
5050template <class _BiIter>
5051inline _LIBCPP_INLINE_VISIBILITY
5052bool
5053operator<(const sub_match<_BiIter>& __x,
5054 typename iterator_traits<_BiIter>::value_type const* __y)
5055{
5056 return __x.compare(__y) < 0;
5057}
5058
5059template <class _BiIter>
5060inline _LIBCPP_INLINE_VISIBILITY
5061bool
5062operator>(const sub_match<_BiIter>& __x,
5063 typename iterator_traits<_BiIter>::value_type const* __y)
5064{
5065 return __y < __x;
5066}
5067
5068template <class _BiIter>
5069inline _LIBCPP_INLINE_VISIBILITY
5070bool
5071operator>=(const sub_match<_BiIter>& __x,
5072 typename iterator_traits<_BiIter>::value_type const* __y)
5073{
5074 return !(__x < __y);
5075}
5076
5077template <class _BiIter>
5078inline _LIBCPP_INLINE_VISIBILITY
5079bool
5080operator<=(const sub_match<_BiIter>& __x,
5081 typename iterator_traits<_BiIter>::value_type const* __y)
5082{
5083 return !(__y < __x);
5084}
5085
5086template <class _BiIter>
5087inline _LIBCPP_INLINE_VISIBILITY
5088bool
5089operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5090 const sub_match<_BiIter>& __y)
5091{
5092 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5093 return __y.compare(string_type(1, __x)) == 0;
5094}
5095
5096template <class _BiIter>
5097inline _LIBCPP_INLINE_VISIBILITY
5098bool
5099operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5100 const sub_match<_BiIter>& __y)
5101{
5102 return !(__x == __y);
5103}
5104
5105template <class _BiIter>
5106inline _LIBCPP_INLINE_VISIBILITY
5107bool
5108operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5109 const sub_match<_BiIter>& __y)
5110{
5111 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5112 return __y.compare(string_type(1, __x)) > 0;
5113}
5114
5115template <class _BiIter>
5116inline _LIBCPP_INLINE_VISIBILITY
5117bool
5118operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5119 const sub_match<_BiIter>& __y)
5120{
5121 return __y < __x;
5122}
5123
5124template <class _BiIter>
5125inline _LIBCPP_INLINE_VISIBILITY
5126bool
5127operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5128 const sub_match<_BiIter>& __y)
5129{
5130 return !(__x < __y);
5131}
5132
5133template <class _BiIter>
5134inline _LIBCPP_INLINE_VISIBILITY
5135bool
5136operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5137 const sub_match<_BiIter>& __y)
5138{
5139 return !(__y < __x);
5140}
5141
5142template <class _BiIter>
5143inline _LIBCPP_INLINE_VISIBILITY
5144bool
5145operator==(const sub_match<_BiIter>& __x,
5146 typename iterator_traits<_BiIter>::value_type const& __y)
5147{
5148 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5149 return __x.compare(string_type(1, __y)) == 0;
5150}
5151
5152template <class _BiIter>
5153inline _LIBCPP_INLINE_VISIBILITY
5154bool
5155operator!=(const sub_match<_BiIter>& __x,
5156 typename iterator_traits<_BiIter>::value_type const& __y)
5157{
5158 return !(__x == __y);
5159}
5160
5161template <class _BiIter>
5162inline _LIBCPP_INLINE_VISIBILITY
5163bool
5164operator<(const sub_match<_BiIter>& __x,
5165 typename iterator_traits<_BiIter>::value_type const& __y)
5166{
5167 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5168 return __x.compare(string_type(1, __y)) < 0;
5169}
5170
5171template <class _BiIter>
5172inline _LIBCPP_INLINE_VISIBILITY
5173bool
5174operator>(const sub_match<_BiIter>& __x,
5175 typename iterator_traits<_BiIter>::value_type const& __y)
5176{
5177 return __y < __x;
5178}
5179
5180template <class _BiIter>
5181inline _LIBCPP_INLINE_VISIBILITY
5182bool
5183operator>=(const sub_match<_BiIter>& __x,
5184 typename iterator_traits<_BiIter>::value_type const& __y)
5185{
5186 return !(__x < __y);
5187}
5188
5189template <class _BiIter>
5190inline _LIBCPP_INLINE_VISIBILITY
5191bool
5192operator<=(const sub_match<_BiIter>& __x,
5193 typename iterator_traits<_BiIter>::value_type const& __y)
5194{
5195 return !(__y < __x);
5196}
5197
5198template <class _CharT, class _ST, class _BiIter>
5199inline _LIBCPP_INLINE_VISIBILITY
5200basic_ostream<_CharT, _ST>&
5201operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5202{
5203 return __os << __m.str();
5204}
5205
Howard Hinnant17615b02010-07-27 01:25:38 +00005206template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant83eade62013-03-06 23:30:19 +00005207class _LIBCPP_TYPE_VIS match_results
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005208{
5209public:
5210 typedef _Allocator allocator_type;
5211 typedef sub_match<_BidirectionalIterator> value_type;
5212private:
5213 typedef vector<value_type, allocator_type> __container_type;
5214
5215 __container_type __matches_;
5216 value_type __unmatched_;
5217 value_type __prefix_;
5218 value_type __suffix_;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005219 bool __ready_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005220public:
Howard Hinnanta712c722010-08-16 20:21:16 +00005221 _BidirectionalIterator __position_start_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005222 typedef const value_type& const_reference;
5223 typedef const_reference reference;
5224 typedef typename __container_type::const_iterator const_iterator;
5225 typedef const_iterator iterator;
5226 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5227 typedef typename allocator_traits<allocator_type>::size_type size_type;
5228 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5229 typedef basic_string<char_type> string_type;
5230
5231 // construct/copy/destroy:
5232 explicit match_results(const allocator_type& __a = allocator_type());
5233// match_results(const match_results&) = default;
5234// match_results& operator=(const match_results&) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005235// match_results(match_results&& __m) = default;
5236// match_results& operator=(match_results&& __m) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005237// ~match_results() = default;
5238
Howard Hinnant31aaf552010-12-08 21:07:55 +00005239 _LIBCPP_INLINE_VISIBILITY
5240 bool ready() const {return __ready_;}
5241
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005242 // size:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005243 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005244 size_type size() const {return __matches_.size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005245 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005246 size_type max_size() const {return __matches_.max_size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005247 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005248 bool empty() const {return size() == 0;}
5249
5250 // element access:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005251 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005252 difference_type length(size_type __sub = 0) const
5253 {return (*this)[__sub].length();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005254 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005255 difference_type position(size_type __sub = 0) const
Howard Hinnant0949eed2011-06-30 21:18:19 +00005256 {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005257 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005258 string_type str(size_type __sub = 0) const
5259 {return (*this)[__sub].str();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005260 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005261 const_reference operator[](size_type __n) const
5262 {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
5263
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005264 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005265 const_reference prefix() const {return __prefix_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005266 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005267 const_reference suffix() const {return __suffix_;}
5268
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005269 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005270 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005271 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005272 const_iterator end() const {return __matches_.end();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005273 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005274 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005275 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005276 const_iterator cend() const {return __matches_.end();}
5277
5278 // format:
5279 template <class _OutputIter>
5280 _OutputIter
5281 format(_OutputIter __out, const char_type* __fmt_first,
5282 const char_type* __fmt_last,
5283 regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5284 template <class _OutputIter, class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005285 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005286 _OutputIter
5287 format(_OutputIter __out, const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005288 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5289 {return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005290 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005291 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005292 basic_string<char_type, _ST, _SA>
5293 format(const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005294 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5295 {
5296 basic_string<char_type, _ST, _SA> __r;
5297 format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5298 __flags);
5299 return __r;
5300 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005301 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005302 string_type
5303 format(const char_type* __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005304 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5305 {
5306 string_type __r;
5307 format(back_inserter(__r), __fmt,
5308 __fmt + char_traits<char_type>::length(__fmt), __flags);
5309 return __r;
5310 }
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005311
5312 // allocator:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005313 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005314 allocator_type get_allocator() const {return __matches_.get_allocator();}
5315
5316 // swap:
5317 void swap(match_results& __m);
5318
Howard Hinnant99968442011-11-29 18:15:50 +00005319 template <class _Bp, class _Ap>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005320 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005321 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
Howard Hinnant99968442011-11-29 18:15:50 +00005322 const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005323 {
Howard Hinnant99968442011-11-29 18:15:50 +00005324 _Bp __mf = __m.prefix().first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005325 __matches_.resize(__m.size());
5326 for (size_type __i = 0; __i < __matches_.size(); ++__i)
5327 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005328 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5329 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005330 __matches_[__i].matched = __m[__i].matched;
5331 }
5332 __unmatched_.first = __l;
5333 __unmatched_.second = __l;
5334 __unmatched_.matched = false;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005335 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5336 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005337 __prefix_.matched = __m.prefix().matched;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005338 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5339 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005340 __suffix_.matched = __m.suffix().matched;
Howard Hinnanta712c722010-08-16 20:21:16 +00005341 if (!__no_update_pos)
5342 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005343 __ready_ = __m.ready();
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005344 }
5345
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005346private:
5347 void __init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005348 _BidirectionalIterator __f, _BidirectionalIterator __l,
5349 bool __no_update_pos = false);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005350
5351 template <class, class> friend class basic_regex;
5352
Howard Hinnant99968442011-11-29 18:15:50 +00005353 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005354 friend
5355 bool
Howard Hinnant99968442011-11-29 18:15:50 +00005356 regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005357 regex_constants::match_flag_type);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005358
Howard Hinnant99968442011-11-29 18:15:50 +00005359 template <class _Bp, class _Ap>
Howard Hinnant27405f92010-08-14 18:14:02 +00005360 friend
5361 bool
Howard Hinnant99968442011-11-29 18:15:50 +00005362 operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
Howard Hinnant27405f92010-08-14 18:14:02 +00005363
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005364 template <class, class> friend class __lookahead;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005365};
5366
5367template <class _BidirectionalIterator, class _Allocator>
5368match_results<_BidirectionalIterator, _Allocator>::match_results(
5369 const allocator_type& __a)
5370 : __matches_(__a),
5371 __unmatched_(),
5372 __prefix_(),
Howard Hinnanta712c722010-08-16 20:21:16 +00005373 __suffix_(),
Howard Hinnant31aaf552010-12-08 21:07:55 +00005374 __position_start_(),
5375 __ready_(false)
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005376{
5377}
5378
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005379template <class _BidirectionalIterator, class _Allocator>
5380void
5381match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005382 _BidirectionalIterator __f, _BidirectionalIterator __l,
5383 bool __no_update_pos)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005384{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005385 __unmatched_.first = __l;
5386 __unmatched_.second = __l;
5387 __unmatched_.matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005388 __matches_.assign(__s, __unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005389 __prefix_.first = __f;
5390 __prefix_.second = __f;
5391 __prefix_.matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005392 __suffix_ = __unmatched_;
Howard Hinnanta712c722010-08-16 20:21:16 +00005393 if (!__no_update_pos)
5394 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005395 __ready_ = true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005396}
5397
Howard Hinnant27405f92010-08-14 18:14:02 +00005398template <class _BidirectionalIterator, class _Allocator>
5399template <class _OutputIter>
5400_OutputIter
5401match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __out,
5402 const char_type* __fmt_first, const char_type* __fmt_last,
5403 regex_constants::match_flag_type __flags) const
5404{
5405 if (__flags & regex_constants::format_sed)
5406 {
5407 for (; __fmt_first != __fmt_last; ++__fmt_first)
5408 {
5409 if (*__fmt_first == '&')
Howard Hinnant0949eed2011-06-30 21:18:19 +00005410 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
Howard Hinnant27405f92010-08-14 18:14:02 +00005411 __out);
5412 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5413 {
5414 ++__fmt_first;
5415 if ('0' <= *__fmt_first && *__fmt_first <= '9')
5416 {
5417 size_t __i = *__fmt_first - '0';
Howard Hinnant0949eed2011-06-30 21:18:19 +00005418 __out = _VSTD::copy(__matches_[__i].first,
Howard Hinnant27405f92010-08-14 18:14:02 +00005419 __matches_[__i].second, __out);
5420 }
5421 else
5422 {
5423 *__out = *__fmt_first;
5424 ++__out;
5425 }
5426 }
5427 else
5428 {
5429 *__out = *__fmt_first;
5430 ++__out;
5431 }
5432 }
5433 }
5434 else
5435 {
5436 for (; __fmt_first != __fmt_last; ++__fmt_first)
5437 {
5438 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5439 {
5440 switch (__fmt_first[1])
5441 {
5442 case '$':
5443 *__out = *++__fmt_first;
5444 ++__out;
5445 break;
5446 case '&':
5447 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005448 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
Howard Hinnant27405f92010-08-14 18:14:02 +00005449 __out);
5450 break;
5451 case '`':
5452 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005453 __out = _VSTD::copy(__prefix_.first, __prefix_.second, __out);
Howard Hinnant27405f92010-08-14 18:14:02 +00005454 break;
5455 case '\'':
5456 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005457 __out = _VSTD::copy(__suffix_.first, __suffix_.second, __out);
Howard Hinnant27405f92010-08-14 18:14:02 +00005458 break;
5459 default:
5460 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5461 {
5462 ++__fmt_first;
5463 size_t __i = *__fmt_first - '0';
5464 if (__fmt_first + 1 != __fmt_last &&
5465 '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5466 {
5467 ++__fmt_first;
5468 __i = 10 * __i + *__fmt_first - '0';
5469 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005470 __out = _VSTD::copy(__matches_[__i].first,
Howard Hinnant27405f92010-08-14 18:14:02 +00005471 __matches_[__i].second, __out);
5472 }
5473 else
5474 {
5475 *__out = *__fmt_first;
5476 ++__out;
5477 }
5478 break;
5479 }
5480 }
5481 else
5482 {
5483 *__out = *__fmt_first;
5484 ++__out;
5485 }
5486 }
5487 }
5488 return __out;
5489}
5490
5491template <class _BidirectionalIterator, class _Allocator>
5492void
5493match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5494{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005495 using _VSTD::swap;
Howard Hinnant27405f92010-08-14 18:14:02 +00005496 swap(__matches_, __m.__matches_);
5497 swap(__unmatched_, __m.__unmatched_);
5498 swap(__prefix_, __m.__prefix_);
5499 swap(__suffix_, __m.__suffix_);
Howard Hinnanta712c722010-08-16 20:21:16 +00005500 swap(__position_start_, __m.__position_start_);
Howard Hinnant31aaf552010-12-08 21:07:55 +00005501 swap(__ready_, __m.__ready_);
Howard Hinnant27405f92010-08-14 18:14:02 +00005502}
5503
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005504typedef match_results<const char*> cmatch;
5505typedef match_results<const wchar_t*> wcmatch;
5506typedef match_results<string::const_iterator> smatch;
5507typedef match_results<wstring::const_iterator> wsmatch;
5508
5509template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005510bool
5511operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5512 const match_results<_BidirectionalIterator, _Allocator>& __y)
5513{
Howard Hinnant31aaf552010-12-08 21:07:55 +00005514 if (__x.__ready_ != __y.__ready_)
5515 return false;
5516 if (!__x.__ready_)
5517 return true;
Howard Hinnant27405f92010-08-14 18:14:02 +00005518 return __x.__matches_ == __y.__matches_ &&
5519 __x.__prefix_ == __y.__prefix_ &&
Howard Hinnant31aaf552010-12-08 21:07:55 +00005520 __x.__suffix_ == __y.__suffix_;
Howard Hinnant27405f92010-08-14 18:14:02 +00005521}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005522
5523template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005524inline _LIBCPP_INLINE_VISIBILITY
5525bool
5526operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5527 const match_results<_BidirectionalIterator, _Allocator>& __y)
5528{
5529 return !(__x == __y);
5530}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005531
5532template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005533inline _LIBCPP_INLINE_VISIBILITY
5534void
5535swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5536 match_results<_BidirectionalIterator, _Allocator>& __y)
5537{
5538 __x.swap(__y);
5539}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005540
5541// regex_search
5542
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005543template <class _CharT, class _Traits>
Howard Hinnant17615b02010-07-27 01:25:38 +00005544template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005545bool
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005546basic_regex<_CharT, _Traits>::__match_at_start_ecma(
Howard Hinnant17615b02010-07-27 01:25:38 +00005547 const _CharT* __first, const _CharT* __last,
5548 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005549 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005550{
Howard Hinnant17615b02010-07-27 01:25:38 +00005551 vector<__state> __states;
Howard Hinnant17615b02010-07-27 01:25:38 +00005552 __node* __st = __start_.get();
5553 if (__st)
5554 {
5555 __states.push_back(__state());
5556 __states.back().__do_ = 0;
5557 __states.back().__first_ = __first;
5558 __states.back().__current_ = __first;
5559 __states.back().__last_ = __last;
5560 __states.back().__sub_matches_.resize(mark_count());
5561 __states.back().__loop_data_.resize(__loop_count());
5562 __states.back().__node_ = __st;
5563 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005564 __states.back().__at_first_ = __at_first;
Howard Hinnant17615b02010-07-27 01:25:38 +00005565 do
5566 {
5567 __state& __s = __states.back();
5568 if (__s.__node_)
5569 __s.__node_->__exec(__s);
5570 switch (__s.__do_)
5571 {
5572 case __state::__end_state:
5573 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005574 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
Howard Hinnant17615b02010-07-27 01:25:38 +00005575 __m.__matches_[0].matched = true;
5576 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5577 __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5578 return true;
5579 case __state::__accept_and_consume:
5580 case __state::__repeat:
5581 case __state::__accept_but_not_consume:
5582 break;
5583 case __state::__split:
5584 {
5585 __state __snext = __s;
5586 __s.__node_->__exec_split(true, __s);
5587 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005588 __states.push_back(_VSTD::move(__snext));
Howard Hinnant17615b02010-07-27 01:25:38 +00005589 }
5590 break;
5591 case __state::__reject:
5592 __states.pop_back();
5593 break;
5594 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005595#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005596 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005597#endif
Howard Hinnant17615b02010-07-27 01:25:38 +00005598 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00005599
Howard Hinnant17615b02010-07-27 01:25:38 +00005600 }
5601 } while (!__states.empty());
5602 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005603 return false;
5604}
5605
5606template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005607template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005608bool
5609basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5610 const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005611 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005612 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005613{
Howard Hinnantac303862010-07-12 15:51:17 +00005614 deque<__state> __states;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005615 ptrdiff_t __highest_j = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00005616 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005617 __node* __st = __start_.get();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005618 if (__st)
5619 {
Howard Hinnantac303862010-07-12 15:51:17 +00005620 __states.push_back(__state());
Howard Hinnantac303862010-07-12 15:51:17 +00005621 __states.back().__do_ = 0;
5622 __states.back().__first_ = __first;
5623 __states.back().__current_ = __first;
5624 __states.back().__last_ = __last;
5625 __states.back().__loop_data_.resize(__loop_count());
5626 __states.back().__node_ = __st;
5627 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005628 __states.back().__at_first_ = __at_first;
Howard Hinnant68025ed2010-07-14 15:45:11 +00005629 bool __matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005630 do
5631 {
Howard Hinnantac303862010-07-12 15:51:17 +00005632 __state& __s = __states.back();
5633 if (__s.__node_)
5634 __s.__node_->__exec(__s);
5635 switch (__s.__do_)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005636 {
Howard Hinnantac303862010-07-12 15:51:17 +00005637 case __state::__end_state:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005638 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant68025ed2010-07-14 15:45:11 +00005639 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005640 __matched = true;
Howard Hinnant99968442011-11-29 18:15:50 +00005641 if (__highest_j == _Np)
Howard Hinnantac303862010-07-12 15:51:17 +00005642 __states.clear();
5643 else
5644 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005645 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005646 case __state::__consume_input:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005647 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005648 case __state::__accept_and_consume:
Howard Hinnant0949eed2011-06-30 21:18:19 +00005649 __states.push_front(_VSTD::move(__s));
Howard Hinnantac303862010-07-12 15:51:17 +00005650 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005651 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005652 case __state::__repeat:
5653 case __state::__accept_but_not_consume:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005654 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005655 case __state::__split:
5656 {
5657 __state __snext = __s;
5658 __s.__node_->__exec_split(true, __s);
5659 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005660 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005661 }
5662 break;
5663 case __state::__reject:
5664 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005665 break;
5666 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005667#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005668 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005669#endif
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005670 break;
5671 }
Howard Hinnantac303862010-07-12 15:51:17 +00005672 } while (!__states.empty());
Howard Hinnant68025ed2010-07-14 15:45:11 +00005673 if (__matched)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005674 {
5675 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005676 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005677 __m.__matches_[0].matched = true;
5678 return true;
5679 }
5680 }
5681 return false;
5682}
5683
5684template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005685template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005686bool
5687basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005688 const _CharT* __first, const _CharT* __last,
5689 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005690 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005691{
Howard Hinnantac303862010-07-12 15:51:17 +00005692 vector<__state> __states;
Howard Hinnantac303862010-07-12 15:51:17 +00005693 __state __best_state;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005694 ptrdiff_t __j = 0;
5695 ptrdiff_t __highest_j = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00005696 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005697 __node* __st = __start_.get();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005698 if (__st)
5699 {
Howard Hinnantac303862010-07-12 15:51:17 +00005700 __states.push_back(__state());
5701 __states.back().__do_ = 0;
5702 __states.back().__first_ = __first;
5703 __states.back().__current_ = __first;
5704 __states.back().__last_ = __last;
5705 __states.back().__sub_matches_.resize(mark_count());
5706 __states.back().__loop_data_.resize(__loop_count());
5707 __states.back().__node_ = __st;
5708 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005709 __states.back().__at_first_ = __at_first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005710 const _CharT* __current = __first;
Howard Hinnantac303862010-07-12 15:51:17 +00005711 bool __matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005712 do
5713 {
Howard Hinnantac303862010-07-12 15:51:17 +00005714 __state& __s = __states.back();
5715 if (__s.__node_)
5716 __s.__node_->__exec(__s);
5717 switch (__s.__do_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005718 {
Howard Hinnantac303862010-07-12 15:51:17 +00005719 case __state::__end_state:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005720 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005721 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005722 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantac303862010-07-12 15:51:17 +00005723 __best_state = __s;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005724 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005725 __matched = true;
Howard Hinnant99968442011-11-29 18:15:50 +00005726 if (__highest_j == _Np)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005727 __states.clear();
5728 else
5729 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005730 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005731 case __state::__accept_and_consume:
Howard Hinnantcba352d2010-07-12 18:16:05 +00005732 __j += __s.__current_ - __current;
5733 __current = __s.__current_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005734 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005735 case __state::__repeat:
5736 case __state::__accept_but_not_consume:
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005737 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005738 case __state::__split:
5739 {
5740 __state __snext = __s;
5741 __s.__node_->__exec_split(true, __s);
5742 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005743 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005744 }
5745 break;
5746 case __state::__reject:
5747 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005748 break;
5749 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005750#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005751 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005752#endif
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005753 break;
5754 }
Howard Hinnantac303862010-07-12 15:51:17 +00005755 } while (!__states.empty());
5756 if (__matched)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005757 {
5758 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005759 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005760 __m.__matches_[0].matched = true;
Howard Hinnantac303862010-07-12 15:51:17 +00005761 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
5762 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005763 return true;
5764 }
5765 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005766 return false;
5767}
5768
5769template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005770template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005771bool
5772basic_regex<_CharT, _Traits>::__match_at_start(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005773 const _CharT* __first, const _CharT* __last,
5774 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005775 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005776{
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005777 if ((__flags_ & 0x1F0) == ECMAScript)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005778 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005779 if (mark_count() == 0)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005780 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
5781 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005782}
5783
5784template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005785template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005786bool
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005787basic_regex<_CharT, _Traits>::__search(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005788 const _CharT* __first, const _CharT* __last,
5789 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005790 regex_constants::match_flag_type __flags) const
5791{
Howard Hinnanta712c722010-08-16 20:21:16 +00005792 __m.__init(1 + mark_count(), __first, __last,
5793 __flags & regex_constants::__no_update_pos);
Howard Hinnant7670f7d2013-07-09 17:29:09 +00005794 if (__match_at_start(__first, __last, __m, __flags,
5795 !(__flags & regex_constants::__no_update_pos)))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005796 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005797 __m.__prefix_.second = __m[0].first;
5798 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5799 __m.__suffix_.first = __m[0].second;
5800 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5801 return true;
5802 }
Howard Hinnant8daa7332010-07-29 01:15:27 +00005803 if (__first != __last && !(__flags & regex_constants::match_continuous))
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005804 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005805 __flags |= regex_constants::match_prev_avail;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005806 for (++__first; __first != __last; ++__first)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005807 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005808 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005809 if (__match_at_start(__first, __last, __m, __flags, false))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005810 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005811 __m.__prefix_.second = __m[0].first;
5812 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5813 __m.__suffix_.first = __m[0].second;
5814 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5815 return true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005816 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005817 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005818 }
5819 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005820 __m.__matches_.clear();
5821 return false;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005822}
5823
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005824template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005825inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005826bool
5827regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5828 match_results<_BidirectionalIterator, _Allocator>& __m,
5829 const basic_regex<_CharT, _Traits>& __e,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005830 regex_constants::match_flag_type __flags = regex_constants::match_default)
5831{
Howard Hinnante8402082013-07-11 15:32:55 +00005832 int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
5833 basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005834 match_results<const _CharT*> __mc;
Howard Hinnante8402082013-07-11 15:32:55 +00005835 bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005836 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005837 return __r;
5838}
5839
Howard Hinnanta9602d52013-06-29 23:45:43 +00005840template <class _Iter, class _Allocator, class _CharT, class _Traits>
5841inline _LIBCPP_INLINE_VISIBILITY
5842bool
5843regex_search(__wrap_iter<_Iter> __first,
5844 __wrap_iter<_Iter> __last,
5845 match_results<__wrap_iter<_Iter>, _Allocator>& __m,
5846 const basic_regex<_CharT, _Traits>& __e,
5847 regex_constants::match_flag_type __flags = regex_constants::match_default)
5848{
5849 match_results<const _CharT*> __mc;
5850 bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
5851 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
5852 return __r;
5853}
5854
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005855template <class _Allocator, class _CharT, class _Traits>
5856inline _LIBCPP_INLINE_VISIBILITY
5857bool
5858regex_search(const _CharT* __first, const _CharT* __last,
5859 match_results<const _CharT*, _Allocator>& __m,
5860 const basic_regex<_CharT, _Traits>& __e,
5861 regex_constants::match_flag_type __flags = regex_constants::match_default)
5862{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005863 return __e.__search(__first, __last, __m, __flags);
5864}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005865
5866template <class _BidirectionalIterator, class _CharT, class _Traits>
5867inline _LIBCPP_INLINE_VISIBILITY
5868bool
5869regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5870 const basic_regex<_CharT, _Traits>& __e,
5871 regex_constants::match_flag_type __flags = regex_constants::match_default)
5872{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005873 basic_string<_CharT> __s(__first, __last);
5874 match_results<const _CharT*> __mc;
5875 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5876}
5877
5878template <class _CharT, class _Traits>
5879inline _LIBCPP_INLINE_VISIBILITY
5880bool
5881regex_search(const _CharT* __first, const _CharT* __last,
5882 const basic_regex<_CharT, _Traits>& __e,
5883 regex_constants::match_flag_type __flags = regex_constants::match_default)
5884{
5885 match_results<const _CharT*> __mc;
5886 return __e.__search(__first, __last, __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005887}
5888
5889template <class _CharT, class _Allocator, class _Traits>
5890inline _LIBCPP_INLINE_VISIBILITY
5891bool
5892regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5893 const basic_regex<_CharT, _Traits>& __e,
5894 regex_constants::match_flag_type __flags = regex_constants::match_default)
5895{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005896 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005897}
5898
5899template <class _CharT, class _Traits>
5900inline _LIBCPP_INLINE_VISIBILITY
5901bool
5902regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5903 regex_constants::match_flag_type __flags = regex_constants::match_default)
5904{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005905 match_results<const _CharT*> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005906 return _VSTD::regex_search(__str, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005907}
5908
5909template <class _ST, class _SA, class _CharT, class _Traits>
5910inline _LIBCPP_INLINE_VISIBILITY
5911bool
5912regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5913 const basic_regex<_CharT, _Traits>& __e,
5914 regex_constants::match_flag_type __flags = regex_constants::match_default)
5915{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005916 match_results<const _CharT*> __mc;
5917 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005918}
5919
5920template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5921inline _LIBCPP_INLINE_VISIBILITY
5922bool
5923regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5924 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5925 const basic_regex<_CharT, _Traits>& __e,
5926 regex_constants::match_flag_type __flags = regex_constants::match_default)
5927{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005928 match_results<const _CharT*> __mc;
5929 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005930 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005931 return __r;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005932}
5933
5934// regex_match
5935
5936template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
5937bool
5938regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
5939 match_results<_BidirectionalIterator, _Allocator>& __m,
5940 const basic_regex<_CharT, _Traits>& __e,
5941 regex_constants::match_flag_type __flags = regex_constants::match_default)
5942{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005943 bool __r = _VSTD::regex_search(__first, __last, __m, __e,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005944 __flags | regex_constants::match_continuous);
5945 if (__r)
5946 {
5947 __r = !__m.suffix().matched;
5948 if (!__r)
5949 __m.__matches_.clear();
5950 }
5951 return __r;
5952}
5953
5954template <class _BidirectionalIterator, class _CharT, class _Traits>
5955inline _LIBCPP_INLINE_VISIBILITY
5956bool
5957regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
5958 const basic_regex<_CharT, _Traits>& __e,
5959 regex_constants::match_flag_type __flags = regex_constants::match_default)
5960{
5961 match_results<_BidirectionalIterator> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005962 return _VSTD::regex_match(__first, __last, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005963}
5964
5965template <class _CharT, class _Allocator, class _Traits>
5966inline _LIBCPP_INLINE_VISIBILITY
5967bool
5968regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5969 const basic_regex<_CharT, _Traits>& __e,
5970 regex_constants::match_flag_type __flags = regex_constants::match_default)
5971{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005972 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005973}
5974
5975template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5976inline _LIBCPP_INLINE_VISIBILITY
5977bool
5978regex_match(const basic_string<_CharT, _ST, _SA>& __s,
5979 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5980 const basic_regex<_CharT, _Traits>& __e,
5981 regex_constants::match_flag_type __flags = regex_constants::match_default)
5982{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005983 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005984}
5985
5986template <class _CharT, class _Traits>
5987inline _LIBCPP_INLINE_VISIBILITY
5988bool
5989regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5990 regex_constants::match_flag_type __flags = regex_constants::match_default)
5991{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005992 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005993}
5994
5995template <class _ST, class _SA, class _CharT, class _Traits>
5996inline _LIBCPP_INLINE_VISIBILITY
5997bool
5998regex_match(const basic_string<_CharT, _ST, _SA>& __s,
5999 const basic_regex<_CharT, _Traits>& __e,
6000 regex_constants::match_flag_type __flags = regex_constants::match_default)
6001{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006002 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006003}
6004
Howard Hinnanta712c722010-08-16 20:21:16 +00006005// regex_iterator
6006
6007template <class _BidirectionalIterator,
6008 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6009 class _Traits = regex_traits<_CharT> >
Howard Hinnant83eade62013-03-06 23:30:19 +00006010class _LIBCPP_TYPE_VIS regex_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00006011{
6012public:
6013 typedef basic_regex<_CharT, _Traits> regex_type;
6014 typedef match_results<_BidirectionalIterator> value_type;
6015 typedef ptrdiff_t difference_type;
6016 typedef const value_type* pointer;
6017 typedef const value_type& reference;
6018 typedef forward_iterator_tag iterator_category;
6019
6020private:
6021 _BidirectionalIterator __begin_;
6022 _BidirectionalIterator __end_;
6023 const regex_type* __pregex_;
6024 regex_constants::match_flag_type __flags_;
6025 value_type __match_;
6026
6027public:
6028 regex_iterator();
6029 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6030 const regex_type& __re,
6031 regex_constants::match_flag_type __m = regex_constants::match_default);
6032
6033 bool operator==(const regex_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006034 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006035 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
6036
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006037 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006038 reference operator*() const {return __match_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006039 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006040 pointer operator->() const {return &__match_;}
6041
6042 regex_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006043 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006044 regex_iterator operator++(int)
6045 {
6046 regex_iterator __t(*this);
6047 ++(*this);
6048 return __t;
6049 }
6050};
6051
6052template <class _BidirectionalIterator, class _CharT, class _Traits>
6053regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
6054 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
6055{
6056}
6057
6058template <class _BidirectionalIterator, class _CharT, class _Traits>
6059regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6060 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6061 const regex_type& __re, regex_constants::match_flag_type __m)
6062 : __begin_(__a),
6063 __end_(__b),
6064 __pregex_(&__re),
6065 __flags_(__m)
6066{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006067 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
Howard Hinnanta712c722010-08-16 20:21:16 +00006068}
6069
6070template <class _BidirectionalIterator, class _CharT, class _Traits>
6071bool
6072regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6073 operator==(const regex_iterator& __x) const
6074{
6075 if (__match_.empty() && __x.__match_.empty())
6076 return true;
6077 if (__match_.empty() || __x.__match_.empty())
6078 return false;
6079 return __begin_ == __x.__begin_ &&
6080 __end_ == __x.__end_ &&
6081 __pregex_ == __x.__pregex_ &&
6082 __flags_ == __x.__flags_ &&
6083 __match_[0] == __x.__match_[0];
6084}
6085
6086template <class _BidirectionalIterator, class _CharT, class _Traits>
6087regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6088regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6089{
6090 __flags_ |= regex_constants::__no_update_pos;
6091 _BidirectionalIterator __start = __match_[0].second;
Howard Hinnanta9602d52013-06-29 23:45:43 +00006092 if (__match_.empty())
Howard Hinnanta712c722010-08-16 20:21:16 +00006093 {
6094 if (__start == __end_)
6095 {
6096 __match_ = value_type();
6097 return *this;
6098 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00006099 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
Howard Hinnanta712c722010-08-16 20:21:16 +00006100 __flags_ | regex_constants::match_not_null |
6101 regex_constants::match_continuous))
6102 return *this;
6103 else
6104 ++__start;
6105 }
6106 __flags_ |= regex_constants::match_prev_avail;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006107 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
Howard Hinnanta712c722010-08-16 20:21:16 +00006108 __match_ = value_type();
6109 return *this;
6110}
6111
6112typedef regex_iterator<const char*> cregex_iterator;
6113typedef regex_iterator<const wchar_t*> wcregex_iterator;
6114typedef regex_iterator<string::const_iterator> sregex_iterator;
6115typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
6116
6117// regex_token_iterator
6118
6119template <class _BidirectionalIterator,
6120 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6121 class _Traits = regex_traits<_CharT> >
Howard Hinnant83eade62013-03-06 23:30:19 +00006122class _LIBCPP_TYPE_VIS regex_token_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00006123{
6124public:
6125 typedef basic_regex<_CharT, _Traits> regex_type;
6126 typedef sub_match<_BidirectionalIterator> value_type;
6127 typedef ptrdiff_t difference_type;
6128 typedef const value_type* pointer;
6129 typedef const value_type& reference;
6130 typedef forward_iterator_tag iterator_category;
6131
Howard Hinnant262b7792010-08-17 20:42:03 +00006132private:
6133 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6134
6135 _Position __position_;
6136 const value_type* __result_;
6137 value_type __suffix_;
6138 ptrdiff_t _N_;
6139 vector<int> __subs_;
6140
6141public:
Howard Hinnanta712c722010-08-16 20:21:16 +00006142 regex_token_iterator();
6143 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6144 const regex_type& __re, int __submatch = 0,
Howard Hinnant262b7792010-08-17 20:42:03 +00006145 regex_constants::match_flag_type __m =
6146 regex_constants::match_default);
Howard Hinnanta712c722010-08-16 20:21:16 +00006147 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6148 const regex_type& __re, const vector<int>& __submatches,
Howard Hinnant262b7792010-08-17 20:42:03 +00006149 regex_constants::match_flag_type __m =
6150 regex_constants::match_default);
Howard Hinnante3e32912011-08-12 21:56:02 +00006151#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnanta712c722010-08-16 20:21:16 +00006152 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
Howard Hinnant262b7792010-08-17 20:42:03 +00006153 const regex_type& __re,
6154 initializer_list<int> __submatches,
6155 regex_constants::match_flag_type __m =
6156 regex_constants::match_default);
Howard Hinnante3e32912011-08-12 21:56:02 +00006157#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant99968442011-11-29 18:15:50 +00006158 template <size_t _Np>
Howard Hinnant262b7792010-08-17 20:42:03 +00006159 regex_token_iterator(_BidirectionalIterator __a,
6160 _BidirectionalIterator __b,
6161 const regex_type& __re,
Howard Hinnant99968442011-11-29 18:15:50 +00006162 const int (&__submatches)[_Np],
Howard Hinnant262b7792010-08-17 20:42:03 +00006163 regex_constants::match_flag_type __m =
6164 regex_constants::match_default);
Howard Hinnanta712c722010-08-16 20:21:16 +00006165 regex_token_iterator(const regex_token_iterator&);
6166 regex_token_iterator& operator=(const regex_token_iterator&);
6167
Howard Hinnant262b7792010-08-17 20:42:03 +00006168 bool operator==(const regex_token_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006169 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006170 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
Howard Hinnanta712c722010-08-16 20:21:16 +00006171
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006172 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006173 const value_type& operator*() const {return *__result_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006174 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006175 const value_type* operator->() const {return __result_;}
Howard Hinnanta712c722010-08-16 20:21:16 +00006176
6177 regex_token_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006178 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006179 regex_token_iterator operator++(int)
6180 {
6181 regex_token_iterator __t(*this);
6182 ++(*this);
6183 return __t;
6184 }
6185
6186private:
6187 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
Howard Hinnanta712c722010-08-16 20:21:16 +00006188};
6189
Howard Hinnant262b7792010-08-17 20:42:03 +00006190template <class _BidirectionalIterator, class _CharT, class _Traits>
6191regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6192 regex_token_iterator()
6193 : __result_(nullptr),
6194 __suffix_(),
6195 _N_(0)
6196{
6197}
6198
6199template <class _BidirectionalIterator, class _CharT, class _Traits>
6200void
6201regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6202 __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6203{
6204 if (__position_ != _Position())
6205 {
6206 if (__subs_[_N_] == -1)
6207 __result_ = &__position_->prefix();
6208 else
6209 __result_ = &(*__position_)[__subs_[_N_]];
6210 }
6211 else if (__subs_[_N_] == -1)
6212 {
6213 __suffix_.matched = true;
6214 __suffix_.first = __a;
6215 __suffix_.second = __b;
6216 __result_ = &__suffix_;
6217 }
6218 else
6219 __result_ = nullptr;
6220}
6221
6222template <class _BidirectionalIterator, class _CharT, class _Traits>
6223regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6224 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6225 const regex_type& __re, int __submatch,
6226 regex_constants::match_flag_type __m)
6227 : __position_(__a, __b, __re, __m),
6228 _N_(0),
6229 __subs_(1, __submatch)
6230{
6231 __init(__a, __b);
6232}
6233
6234template <class _BidirectionalIterator, class _CharT, class _Traits>
6235regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6236 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6237 const regex_type& __re, const vector<int>& __submatches,
6238 regex_constants::match_flag_type __m)
6239 : __position_(__a, __b, __re, __m),
6240 _N_(0),
6241 __subs_(__submatches)
6242{
6243 __init(__a, __b);
6244}
6245
Howard Hinnante3e32912011-08-12 21:56:02 +00006246#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6247
Howard Hinnant262b7792010-08-17 20:42:03 +00006248template <class _BidirectionalIterator, class _CharT, class _Traits>
6249regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6250 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6251 const regex_type& __re,
6252 initializer_list<int> __submatches,
6253 regex_constants::match_flag_type __m)
6254 : __position_(__a, __b, __re, __m),
6255 _N_(0),
6256 __subs_(__submatches)
6257{
6258 __init(__a, __b);
6259}
6260
Howard Hinnante3e32912011-08-12 21:56:02 +00006261#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6262
Howard Hinnant262b7792010-08-17 20:42:03 +00006263template <class _BidirectionalIterator, class _CharT, class _Traits>
Howard Hinnant99968442011-11-29 18:15:50 +00006264template <size_t _Np>
Howard Hinnant262b7792010-08-17 20:42:03 +00006265regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6266 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6267 const regex_type& __re,
Howard Hinnant99968442011-11-29 18:15:50 +00006268 const int (&__submatches)[_Np],
Howard Hinnant262b7792010-08-17 20:42:03 +00006269 regex_constants::match_flag_type __m)
6270 : __position_(__a, __b, __re, __m),
6271 _N_(0),
Howard Hinnant99968442011-11-29 18:15:50 +00006272 __subs_(__submatches, __submatches + _Np)
Howard Hinnant262b7792010-08-17 20:42:03 +00006273{
6274 __init(__a, __b);
6275}
6276
6277template <class _BidirectionalIterator, class _CharT, class _Traits>
6278regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6279 regex_token_iterator(const regex_token_iterator& __x)
6280 : __position_(__x.__position_),
6281 __result_(__x.__result_),
6282 __suffix_(__x.__suffix_),
6283 _N_(__x._N_),
6284 __subs_(__x.__subs_)
6285{
6286 if (__x.__result_ == &__x.__suffix_)
6287 __result_ == &__suffix_;
6288}
6289
6290template <class _BidirectionalIterator, class _CharT, class _Traits>
6291regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6292regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6293 operator=(const regex_token_iterator& __x)
6294{
6295 if (this != &__x)
6296 {
6297 __position_ = __x.__position_;
6298 if (__x.__result_ == &__x.__suffix_)
6299 __result_ == &__suffix_;
6300 else
6301 __result_ = __x.__result_;
6302 __suffix_ = __x.__suffix_;
6303 _N_ = __x._N_;
6304 __subs_ = __x.__subs_;
6305 }
6306 return *this;
6307}
6308
6309template <class _BidirectionalIterator, class _CharT, class _Traits>
6310bool
6311regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6312 operator==(const regex_token_iterator& __x) const
6313{
6314 if (__result_ == nullptr && __x.__result_ == nullptr)
6315 return true;
6316 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6317 __suffix_ == __x.__suffix_)
6318 return true;
6319 if (__result_ == nullptr || __x.__result_ == nullptr)
6320 return false;
6321 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6322 return false;
6323 return __position_ == __x.__position_ && _N_ == __x._N_ &&
6324 __subs_ == __x.__subs_;
6325}
6326
6327template <class _BidirectionalIterator, class _CharT, class _Traits>
6328regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6329regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6330{
6331 _Position __prev = __position_;
6332 if (__result_ == &__suffix_)
6333 __result_ = nullptr;
6334 else if (_N_ + 1 < __subs_.size())
6335 {
6336 ++_N_;
6337 if (__subs_[_N_] == -1)
6338 __result_ = &__position_->prefix();
6339 else
6340 __result_ = &(*__position_)[__subs_[_N_]];
6341 }
6342 else
6343 {
6344 _N_ = 0;
6345 ++__position_;
6346 if (__position_ != _Position())
6347 {
6348 if (__subs_[_N_] == -1)
6349 __result_ = &__position_->prefix();
6350 else
6351 __result_ = &(*__position_)[__subs_[_N_]];
6352 }
6353 else
6354 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00006355 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
Howard Hinnant262b7792010-08-17 20:42:03 +00006356 && __prev->suffix().length() != 0)
6357 {
6358 __suffix_.matched = true;
6359 __suffix_.first = __prev->suffix().first;
6360 __suffix_.second = __prev->suffix().second;
6361 __result_ = &__suffix_;
6362 }
6363 else
6364 __result_ = nullptr;
6365 }
6366 }
6367 return *this;
6368}
6369
Howard Hinnanta712c722010-08-16 20:21:16 +00006370typedef regex_token_iterator<const char*> cregex_token_iterator;
6371typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
6372typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
6373typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
6374
Howard Hinnanta8d77592010-08-18 00:13:08 +00006375// regex_replace
6376
6377template <class _OutputIterator, class _BidirectionalIterator,
6378 class _Traits, class _CharT>
6379_OutputIterator
6380regex_replace(_OutputIterator __out,
6381 _BidirectionalIterator __first, _BidirectionalIterator __last,
6382 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6383 regex_constants::match_flag_type __flags = regex_constants::match_default)
6384{
6385 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6386 _Iter __i(__first, __last, __e, __flags);
6387 _Iter __eof;
6388 if (__i == __eof)
6389 {
6390 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006391 __out = _VSTD::copy(__first, __last, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006392 }
6393 else
6394 {
6395 sub_match<_BidirectionalIterator> __lm;
6396 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6397 {
6398 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006399 __out = _VSTD::copy(__i->prefix().first, __i->prefix().second, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006400 __out = __i->format(__out, __fmt, __fmt + __len, __flags);
6401 __lm = __i->suffix();
6402 if (__flags & regex_constants::format_first_only)
6403 break;
6404 }
6405 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006406 __out = _VSTD::copy(__lm.first, __lm.second, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006407 }
6408 return __out;
6409}
6410
6411template <class _OutputIterator, class _BidirectionalIterator,
6412 class _Traits, class _CharT, class _ST, class _SA>
6413inline _LIBCPP_INLINE_VISIBILITY
6414_OutputIterator
6415regex_replace(_OutputIterator __out,
6416 _BidirectionalIterator __first, _BidirectionalIterator __last,
6417 const basic_regex<_CharT, _Traits>& __e,
6418 const basic_string<_CharT, _ST, _SA>& __fmt,
6419 regex_constants::match_flag_type __flags = regex_constants::match_default)
6420{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006421 return _VSTD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006422}
6423
6424template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6425 class _FSA>
6426inline _LIBCPP_INLINE_VISIBILITY
6427basic_string<_CharT, _ST, _SA>
6428regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6429 const basic_regex<_CharT, _Traits>& __e,
6430 const basic_string<_CharT, _FST, _FSA>& __fmt,
6431 regex_constants::match_flag_type __flags = regex_constants::match_default)
6432{
6433 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006434 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006435 __fmt.c_str(), __flags);
6436 return __r;
6437}
6438
6439template <class _Traits, class _CharT, class _ST, class _SA>
6440inline _LIBCPP_INLINE_VISIBILITY
6441basic_string<_CharT, _ST, _SA>
6442regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6443 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6444 regex_constants::match_flag_type __flags = regex_constants::match_default)
6445{
6446 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006447 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006448 __fmt, __flags);
6449 return __r;
6450}
6451
6452template <class _Traits, class _CharT, class _ST, class _SA>
6453inline _LIBCPP_INLINE_VISIBILITY
6454basic_string<_CharT>
6455regex_replace(const _CharT* __s,
6456 const basic_regex<_CharT, _Traits>& __e,
6457 const basic_string<_CharT, _ST, _SA>& __fmt,
6458 regex_constants::match_flag_type __flags = regex_constants::match_default)
6459{
6460 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006461 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006462 __s + char_traits<_CharT>::length(__s), __e,
6463 __fmt.c_str(), __flags);
6464 return __r;
6465}
6466
6467template <class _Traits, class _CharT>
6468inline _LIBCPP_INLINE_VISIBILITY
6469basic_string<_CharT>
6470regex_replace(const _CharT* __s,
6471 const basic_regex<_CharT, _Traits>& __e,
6472 const _CharT* __fmt,
6473 regex_constants::match_flag_type __flags = regex_constants::match_default)
6474{
6475 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006476 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006477 __s + char_traits<_CharT>::length(__s), __e,
6478 __fmt, __flags);
6479 return __r;
6480}
6481
Howard Hinnant3257c982010-06-17 00:34:59 +00006482_LIBCPP_END_NAMESPACE_STD
6483
6484#endif // _LIBCPP_REGEX