blob: 8c95145fe0bd0cea376f59503f45f9d1e864f1c0 [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 Hinnant0f678bd2013-08-12 18:38:34 +0000928struct _LIBCPP_TYPE_VIS_ONLY 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
Marshall Clow33ae2332013-10-21 15:43:25 +0000973 {return __regex_traits_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
Marshall Clow33ae2332013-10-21 15:43:25 +00001004 static int __regex_traits_value(unsigned char __ch, int __radix);
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001005 _LIBCPP_INLINE_VISIBILITY
Marshall Clow33ae2332013-10-21 15:43:25 +00001006 int __regex_traits_value(char __ch, int __radix) const
1007 {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
1008 int __regex_traits_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 Hinnant0f678bd2013-08-12 18:38:34 +00001103_LIBCPP_FUNC_VIS string __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
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001164ctype_base::mask _LIBCPP_FUNC_VIS __get_classname(const char* __s, bool __icase);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001165
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
Marshall Clow33ae2332013-10-21 15:43:25 +00001210regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001211{
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
Marshall Clow33ae2332013-10-21 15:43:25 +00001231regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001232{
Marshall Clow33ae2332013-10-21 15:43:25 +00001233 return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001234}
1235
Howard Hinnantac303862010-07-12 15:51:17 +00001236template <class _CharT> class __node;
1237
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001238template <class _BidirectionalIterator> class _LIBCPP_TYPE_VIS_ONLY 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 Hinnant0f678bd2013-08-12 18:38:34 +00001242class _LIBCPP_TYPE_VIS_ONLY 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 Hinnant0f678bd2013-08-12 18:38:34 +00002017template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
2018template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
2019
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002020// __match_char
2021
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002022template <class _CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002023class __match_char
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002024 : public __owns_one_state<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002025{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002026 typedef __owns_one_state<_CharT> base;
2027
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002028 _CharT __c_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002029
2030 __match_char(const __match_char&);
2031 __match_char& operator=(const __match_char&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002032public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002033 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002034
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002035 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00002036 __match_char(_CharT __c, __node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002037 : base(__s), __c_(__c) {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002038
Howard Hinnantac303862010-07-12 15:51:17 +00002039 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002040};
2041
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002042template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00002043void
2044__match_char<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002045{
Howard Hinnantac303862010-07-12 15:51:17 +00002046 if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2047 {
2048 __s.__do_ = __state::__accept_and_consume;
2049 ++__s.__current_;
2050 __s.__node_ = this->first();
2051 }
2052 else
2053 {
2054 __s.__do_ = __state::__reject;
2055 __s.__node_ = nullptr;
2056 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002057}
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002058
Howard Hinnante34f17d2010-07-12 19:11:27 +00002059// __match_char_icase
2060
2061template <class _CharT, class _Traits>
2062class __match_char_icase
2063 : public __owns_one_state<_CharT>
2064{
2065 typedef __owns_one_state<_CharT> base;
2066
2067 _Traits __traits_;
2068 _CharT __c_;
2069
2070 __match_char_icase(const __match_char_icase&);
2071 __match_char_icase& operator=(const __match_char_icase&);
2072public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002073 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002074
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002075 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002076 __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2077 : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2078
2079 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002080};
2081
2082template <class _CharT, class _Traits>
2083void
2084__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2085{
2086 if (__s.__current_ != __s.__last_ &&
2087 __traits_.translate_nocase(*__s.__current_) == __c_)
2088 {
2089 __s.__do_ = __state::__accept_and_consume;
2090 ++__s.__current_;
2091 __s.__node_ = this->first();
2092 }
2093 else
2094 {
2095 __s.__do_ = __state::__reject;
2096 __s.__node_ = nullptr;
2097 }
2098}
2099
2100// __match_char_collate
2101
2102template <class _CharT, class _Traits>
2103class __match_char_collate
2104 : public __owns_one_state<_CharT>
2105{
2106 typedef __owns_one_state<_CharT> base;
2107
2108 _Traits __traits_;
2109 _CharT __c_;
2110
2111 __match_char_collate(const __match_char_collate&);
2112 __match_char_collate& operator=(const __match_char_collate&);
2113public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002114 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002115
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002116 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002117 __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2118 : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2119
2120 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002121};
2122
2123template <class _CharT, class _Traits>
2124void
2125__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2126{
2127 if (__s.__current_ != __s.__last_ &&
2128 __traits_.translate(*__s.__current_) == __c_)
2129 {
2130 __s.__do_ = __state::__accept_and_consume;
2131 ++__s.__current_;
2132 __s.__node_ = this->first();
2133 }
2134 else
2135 {
2136 __s.__do_ = __state::__reject;
2137 __s.__node_ = nullptr;
2138 }
2139}
2140
Howard Hinnant173968a2010-07-13 21:48:06 +00002141// __bracket_expression
2142
2143template <class _CharT, class _Traits>
2144class __bracket_expression
2145 : public __owns_one_state<_CharT>
2146{
2147 typedef __owns_one_state<_CharT> base;
2148 typedef typename _Traits::string_type string_type;
2149
2150 _Traits __traits_;
2151 vector<_CharT> __chars_;
Howard Hinnant15476f32010-07-28 17:35:27 +00002152 vector<_CharT> __neg_chars_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002153 vector<pair<string_type, string_type> > __ranges_;
2154 vector<pair<_CharT, _CharT> > __digraphs_;
2155 vector<string_type> __equivalences_;
2156 ctype_base::mask __mask_;
Howard Hinnant15476f32010-07-28 17:35:27 +00002157 ctype_base::mask __neg_mask_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002158 bool __negate_;
2159 bool __icase_;
2160 bool __collate_;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002161 bool __might_have_digraph_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002162
2163 __bracket_expression(const __bracket_expression&);
2164 __bracket_expression& operator=(const __bracket_expression&);
2165public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002166 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant173968a2010-07-13 21:48:06 +00002167
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002168 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002169 __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2170 bool __negate, bool __icase, bool __collate)
Howard Hinnant15476f32010-07-28 17:35:27 +00002171 : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2172 __negate_(__negate), __icase_(__icase), __collate_(__collate),
Howard Hinnant68025ed2010-07-14 15:45:11 +00002173 __might_have_digraph_(__traits_.getloc().name() != "C") {}
Howard Hinnant173968a2010-07-13 21:48:06 +00002174
2175 virtual void __exec(__state&) const;
2176
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002177 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002178 bool __negated() const {return __negate_;}
2179
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002180 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002181 void __add_char(_CharT __c)
2182 {
2183 if (__icase_)
2184 __chars_.push_back(__traits_.translate_nocase(__c));
2185 else if (__collate_)
2186 __chars_.push_back(__traits_.translate(__c));
2187 else
2188 __chars_.push_back(__c);
2189 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002190 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002191 void __add_neg_char(_CharT __c)
2192 {
2193 if (__icase_)
2194 __neg_chars_.push_back(__traits_.translate_nocase(__c));
2195 else if (__collate_)
2196 __neg_chars_.push_back(__traits_.translate(__c));
2197 else
2198 __neg_chars_.push_back(__c);
2199 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002200 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002201 void __add_range(string_type __b, string_type __e)
2202 {
2203 if (__collate_)
2204 {
2205 if (__icase_)
2206 {
2207 for (size_t __i = 0; __i < __b.size(); ++__i)
2208 __b[__i] = __traits_.translate_nocase(__b[__i]);
2209 for (size_t __i = 0; __i < __e.size(); ++__i)
2210 __e[__i] = __traits_.translate_nocase(__e[__i]);
2211 }
2212 else
2213 {
2214 for (size_t __i = 0; __i < __b.size(); ++__i)
2215 __b[__i] = __traits_.translate(__b[__i]);
2216 for (size_t __i = 0; __i < __e.size(); ++__i)
2217 __e[__i] = __traits_.translate(__e[__i]);
2218 }
2219 __ranges_.push_back(make_pair(
2220 __traits_.transform(__b.begin(), __b.end()),
2221 __traits_.transform(__e.begin(), __e.end())));
2222 }
2223 else
2224 {
Howard Hinnantd4444702010-08-11 17:04:31 +00002225#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00002226 if (__b.size() != 1 || __e.size() != 1)
2227 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00002228#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00002229 if (__icase_)
2230 {
2231 __b[0] = __traits_.translate_nocase(__b[0]);
2232 __e[0] = __traits_.translate_nocase(__e[0]);
2233 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002234 __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
Howard Hinnant173968a2010-07-13 21:48:06 +00002235 }
2236 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002237 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002238 void __add_digraph(_CharT __c1, _CharT __c2)
2239 {
2240 if (__icase_)
2241 __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
2242 __traits_.translate_nocase(__c2)));
2243 else if (__collate_)
2244 __digraphs_.push_back(make_pair(__traits_.translate(__c1),
2245 __traits_.translate(__c2)));
2246 else
2247 __digraphs_.push_back(make_pair(__c1, __c2));
2248 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002249 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002250 void __add_equivalence(const string_type& __s)
2251 {__equivalences_.push_back(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002252 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002253 void __add_class(ctype_base::mask __mask)
2254 {__mask_ |= __mask;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002255 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002256 void __add_neg_class(ctype_base::mask __mask)
2257 {__neg_mask_ |= __mask;}
Howard Hinnant173968a2010-07-13 21:48:06 +00002258};
2259
2260template <class _CharT, class _Traits>
2261void
2262__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2263{
2264 bool __found = false;
2265 unsigned __consumed = 0;
2266 if (__s.__current_ != __s.__last_)
2267 {
2268 ++__consumed;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002269 if (__might_have_digraph_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002270 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002271 const _CharT* __next = _VSTD::next(__s.__current_);
Howard Hinnant68025ed2010-07-14 15:45:11 +00002272 if (__next != __s.__last_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002273 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002274 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2275 if (__icase_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002276 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002277 __ch2.first = __traits_.translate_nocase(__ch2.first);
2278 __ch2.second = __traits_.translate_nocase(__ch2.second);
2279 }
2280 else if (__collate_)
2281 {
2282 __ch2.first = __traits_.translate(__ch2.first);
2283 __ch2.second = __traits_.translate(__ch2.second);
2284 }
2285 if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2286 {
2287 // __ch2 is a digraph in this locale
2288 ++__consumed;
2289 for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2290 {
2291 if (__ch2 == __digraphs_[__i])
2292 {
2293 __found = true;
2294 goto __exit;
2295 }
2296 }
2297 if (__collate_ && !__ranges_.empty())
2298 {
2299 string_type __s2 = __traits_.transform(&__ch2.first,
2300 &__ch2.first + 2);
2301 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2302 {
2303 if (__ranges_[__i].first <= __s2 &&
2304 __s2 <= __ranges_[__i].second)
2305 {
2306 __found = true;
2307 goto __exit;
2308 }
2309 }
2310 }
2311 if (!__equivalences_.empty())
2312 {
2313 string_type __s2 = __traits_.transform_primary(&__ch2.first,
2314 &__ch2.first + 2);
2315 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2316 {
2317 if (__s2 == __equivalences_[__i])
2318 {
2319 __found = true;
2320 goto __exit;
2321 }
2322 }
2323 }
2324 if (__traits_.isctype(__ch2.first, __mask_) &&
2325 __traits_.isctype(__ch2.second, __mask_))
Howard Hinnant173968a2010-07-13 21:48:06 +00002326 {
2327 __found = true;
2328 goto __exit;
2329 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002330 if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2331 !__traits_.isctype(__ch2.second, __neg_mask_))
2332 {
2333 __found = true;
2334 goto __exit;
2335 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002336 goto __exit;
2337 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002338 }
2339 }
2340 // test *__s.__current_ as not a digraph
2341 _CharT __ch = *__s.__current_;
2342 if (__icase_)
2343 __ch = __traits_.translate_nocase(__ch);
2344 else if (__collate_)
2345 __ch = __traits_.translate(__ch);
2346 for (size_t __i = 0; __i < __chars_.size(); ++__i)
2347 {
2348 if (__ch == __chars_[__i])
2349 {
2350 __found = true;
2351 goto __exit;
2352 }
2353 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002354 if (!__neg_chars_.empty())
2355 {
2356 for (size_t __i = 0; __i < __neg_chars_.size(); ++__i)
2357 {
2358 if (__ch == __neg_chars_[__i])
2359 goto __is_neg_char;
2360 }
2361 __found = true;
2362 goto __exit;
2363 }
2364__is_neg_char:
Howard Hinnant173968a2010-07-13 21:48:06 +00002365 if (!__ranges_.empty())
2366 {
2367 string_type __s2 = __collate_ ?
2368 __traits_.transform(&__ch, &__ch + 1) :
2369 string_type(1, __ch);
2370 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2371 {
2372 if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2373 {
2374 __found = true;
2375 goto __exit;
2376 }
2377 }
2378 }
2379 if (!__equivalences_.empty())
2380 {
2381 string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2382 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2383 {
2384 if (__s2 == __equivalences_[__i])
2385 {
2386 __found = true;
2387 goto __exit;
2388 }
2389 }
2390 }
2391 if (__traits_.isctype(__ch, __mask_))
Howard Hinnant15476f32010-07-28 17:35:27 +00002392 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002393 __found = true;
Howard Hinnant15476f32010-07-28 17:35:27 +00002394 goto __exit;
2395 }
2396 if (__neg_mask_ && !__traits_.isctype(__ch, __neg_mask_))
2397 {
2398 __found = true;
2399 goto __exit;
2400 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002401 }
2402 else
2403 __found = __negate_; // force reject
2404__exit:
2405 if (__found != __negate_)
2406 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002407 __s.__do_ = __state::__accept_and_consume;
2408 __s.__current_ += __consumed;
2409 __s.__node_ = this->first();
2410 }
2411 else
2412 {
2413 __s.__do_ = __state::__reject;
2414 __s.__node_ = nullptr;
2415 }
2416}
2417
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00002418template <class _CharT, class _Traits> class __lookahead;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002419
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002420template <class _CharT, class _Traits = regex_traits<_CharT> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +00002421class _LIBCPP_TYPE_VIS_ONLY basic_regex
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002422{
2423public:
2424 // types:
2425 typedef _CharT value_type;
2426 typedef regex_constants::syntax_option_type flag_type;
2427 typedef typename _Traits::locale_type locale_type;
2428
2429private:
2430 _Traits __traits_;
2431 flag_type __flags_;
2432 unsigned __marked_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002433 unsigned __loop_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002434 int __open_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002435 shared_ptr<__empty_state<_CharT> > __start_;
2436 __owns_one_state<_CharT>* __end_;
2437
Howard Hinnant0949eed2011-06-30 21:18:19 +00002438 typedef _VSTD::__state<_CharT> __state;
2439 typedef _VSTD::__node<_CharT> __node;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002440
2441public:
2442 // constants:
Howard Hinnant46623a02012-07-21 01:31:58 +00002443 static const regex_constants::syntax_option_type icase = regex_constants::icase;
2444 static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2445 static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
2446 static const regex_constants::syntax_option_type collate = regex_constants::collate;
2447 static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2448 static const regex_constants::syntax_option_type basic = regex_constants::basic;
2449 static const regex_constants::syntax_option_type extended = regex_constants::extended;
2450 static const regex_constants::syntax_option_type awk = regex_constants::awk;
2451 static const regex_constants::syntax_option_type grep = regex_constants::grep;
2452 static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002453
2454 // construct/copy/destroy:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002455 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002456 basic_regex()
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002457 : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002458 __end_(0)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002459 {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002460 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002461 explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002462 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002463 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002464 {__parse(__p, __p + __traits_.length(__p));}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002465 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002466 basic_regex(const value_type* __p, size_t __len, flag_type __f)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002467 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002468 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002469 {__parse(__p, __p + __len);}
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002470// basic_regex(const basic_regex&) = default;
2471// basic_regex(basic_regex&&) = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002472 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002473 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002474 explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2475 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002476 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002477 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002478 {__parse(__p.begin(), __p.end());}
2479 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002480 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002481 basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2482 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002483 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002484 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002485 {__parse(__first, __last);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002486#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002487 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002488 basic_regex(initializer_list<value_type> __il,
2489 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002490 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002491 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002492 {__parse(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00002493#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002494
Howard Hinnant7026a172010-08-13 18:11:23 +00002495// ~basic_regex() = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002496
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002497// basic_regex& operator=(const basic_regex&) = default;
2498// basic_regex& operator=(basic_regex&&) = default;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002500 basic_regex& operator=(const value_type* __p)
2501 {return assign(__p);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002502#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002503 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002504 basic_regex& operator=(initializer_list<value_type> __il)
2505 {return assign(__il);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002506#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002507 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002508 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002509 basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2510 {return assign(__p);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002511
2512 // assign:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002513 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002514 basic_regex& assign(const basic_regex& __that)
2515 {return *this = __that;}
Howard Hinnant46623a02012-07-21 01:31:58 +00002516#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2517 _LIBCPP_INLINE_VISIBILITY
2518 basic_regex& assign(basic_regex&& __that) _NOEXCEPT
2519 {return *this = _VSTD::move(__that);}
2520#endif
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, flag_type __f = regex_constants::ECMAScript)
2523 {return assign(__p, __p + __traits_.length(__p), __f);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002524 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002525 basic_regex& assign(const value_type* __p, size_t __len, flag_type __f)
2526 {return assign(__p, __p + __len, __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002527 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002528 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002529 basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
Howard Hinnant7026a172010-08-13 18:11:23 +00002530 flag_type __f = regex_constants::ECMAScript)
2531 {return assign(__s.begin(), __s.end(), __f);}
2532
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002533 template <class _InputIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002534 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002535 typename enable_if
2536 <
2537 __is_input_iterator <_InputIterator>::value &&
2538 !__is_forward_iterator<_InputIterator>::value,
2539 basic_regex&
2540 >::type
2541 assign(_InputIterator __first, _InputIterator __last,
2542 flag_type __f = regex_constants::ECMAScript)
2543 {
2544 basic_string<_CharT> __t(__first, __last);
2545 return assign(__t.begin(), __t.end(), __f);
2546 }
2547
2548private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002549 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002550 void __member_init(flag_type __f)
2551 {
2552 __flags_ = __f;
2553 __marked_count_ = 0;
2554 __loop_count_ = 0;
2555 __open_count_ = 0;
2556 __end_ = nullptr;
Howard Hinnant7026a172010-08-13 18:11:23 +00002557 }
2558public:
2559
2560 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002561 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002562 typename enable_if
2563 <
2564 __is_forward_iterator<_ForwardIterator>::value,
2565 basic_regex&
2566 >::type
2567 assign(_ForwardIterator __first, _ForwardIterator __last,
2568 flag_type __f = regex_constants::ECMAScript)
2569 {
2570 __member_init(__f);
2571 __parse(__first, __last);
Argyrios Kyrtzidis1dc6f7a2012-10-13 02:03:45 +00002572 return *this;
Howard Hinnant7026a172010-08-13 18:11:23 +00002573 }
2574
Howard Hinnante3e32912011-08-12 21:56:02 +00002575#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2576
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002577 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002578 basic_regex& assign(initializer_list<value_type> __il,
Howard Hinnant7026a172010-08-13 18:11:23 +00002579 flag_type __f = regex_constants::ECMAScript)
2580 {return assign(__il.begin(), __il.end(), __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002581
Howard Hinnante3e32912011-08-12 21:56:02 +00002582#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2583
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002584 // const operations:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002585 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002586 unsigned mark_count() const {return __marked_count_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002587 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002588 flag_type flags() const {return __flags_;}
2589
2590 // locale:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002591 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002592 locale_type imbue(locale_type __loc)
2593 {
2594 __member_init(ECMAScript);
2595 __start_.reset();
2596 return __traits_.imbue(__loc);
2597 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002598 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002599 locale_type getloc() const {return __traits_.getloc();}
2600
2601 // swap:
Howard Hinnant7026a172010-08-13 18:11:23 +00002602 void swap(basic_regex& __r);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002603
2604private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002605 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002606 unsigned __loop_count() const {return __loop_count_;}
2607
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002608 template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002609 _ForwardIterator
2610 __parse(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002611 template <class _ForwardIterator>
2612 _ForwardIterator
2613 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2614 template <class _ForwardIterator>
2615 _ForwardIterator
2616 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2617 template <class _ForwardIterator>
2618 _ForwardIterator
2619 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2620 template <class _ForwardIterator>
2621 _ForwardIterator
2622 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2623 template <class _ForwardIterator>
2624 _ForwardIterator
2625 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2626 template <class _ForwardIterator>
2627 _ForwardIterator
2628 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2629 template <class _ForwardIterator>
2630 _ForwardIterator
2631 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2632 template <class _ForwardIterator>
2633 _ForwardIterator
2634 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2635 template <class _ForwardIterator>
2636 _ForwardIterator
2637 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2638 template <class _ForwardIterator>
2639 _ForwardIterator
2640 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2641 template <class _ForwardIterator>
2642 _ForwardIterator
2643 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2644 template <class _ForwardIterator>
2645 _ForwardIterator
2646 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2647 template <class _ForwardIterator>
2648 _ForwardIterator
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002649 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002650 __owns_one_state<_CharT>* __s,
2651 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002652 template <class _ForwardIterator>
2653 _ForwardIterator
Howard Hinnantaa698082010-07-16 19:08:36 +00002654 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2655 __owns_one_state<_CharT>* __s,
2656 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002657 template <class _ForwardIterator>
2658 _ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00002659 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2660 template <class _ForwardIterator>
2661 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002662 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2663 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002664 template <class _ForwardIterator>
2665 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002666 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2667 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002668 template <class _ForwardIterator>
2669 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002670 __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2671 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002672 template <class _ForwardIterator>
2673 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002674 __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2675 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002676 template <class _ForwardIterator>
2677 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002678 __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2679 basic_string<_CharT>& __col_sym);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002680 template <class _ForwardIterator>
2681 _ForwardIterator
2682 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002683 template <class _ForwardIterator>
2684 _ForwardIterator
2685 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2686 template <class _ForwardIterator>
2687 _ForwardIterator
2688 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2689 template <class _ForwardIterator>
2690 _ForwardIterator
2691 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2692 template <class _ForwardIterator>
2693 _ForwardIterator
2694 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2695 template <class _ForwardIterator>
2696 _ForwardIterator
2697 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2698 template <class _ForwardIterator>
2699 _ForwardIterator
2700 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002701 template <class _ForwardIterator>
2702 _ForwardIterator
2703 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2704 template <class _ForwardIterator>
2705 _ForwardIterator
2706 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2707 template <class _ForwardIterator>
2708 _ForwardIterator
2709 __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2710 template <class _ForwardIterator>
2711 _ForwardIterator
2712 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2713 template <class _ForwardIterator>
2714 _ForwardIterator
2715 __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2716 template <class _ForwardIterator>
2717 _ForwardIterator
Howard Hinnant17615b02010-07-27 01:25:38 +00002718 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2719 template <class _ForwardIterator>
2720 _ForwardIterator
2721 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2722 template <class _ForwardIterator>
2723 _ForwardIterator
2724 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2725 template <class _ForwardIterator>
2726 _ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00002727 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2728 basic_string<_CharT>* __str = nullptr);
Howard Hinnant17615b02010-07-27 01:25:38 +00002729 template <class _ForwardIterator>
2730 _ForwardIterator
2731 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant856846b2010-07-27 19:53:10 +00002732 template <class _ForwardIterator>
2733 _ForwardIterator
2734 __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2735 template <class _ForwardIterator>
2736 _ForwardIterator
2737 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant15476f32010-07-28 17:35:27 +00002738 template <class _ForwardIterator>
2739 _ForwardIterator
2740 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2741 basic_string<_CharT>& __str,
2742 __bracket_expression<_CharT, _Traits>* __ml);
2743 template <class _ForwardIterator>
2744 _ForwardIterator
2745 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2746 basic_string<_CharT>* __str = nullptr);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002747
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002748 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002749 void __push_l_anchor();
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002750 void __push_r_anchor();
Howard Hinnantac303862010-07-12 15:51:17 +00002751 void __push_match_any();
Howard Hinnant17615b02010-07-27 01:25:38 +00002752 void __push_match_any_but_newline();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002753 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002754 void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2755 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2756 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2757 __mexp_begin, __mexp_end);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002758 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002759 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2760 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2761 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2762 __mexp_begin, __mexp_end, false);}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002763 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
2764 size_t __mexp_begin = 0, size_t __mexp_end = 0,
2765 bool __greedy = true);
Howard Hinnant173968a2010-07-13 21:48:06 +00002766 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002767 void __push_char(value_type __c);
Howard Hinnantcba352d2010-07-12 18:16:05 +00002768 void __push_back_ref(int __i);
Howard Hinnantaa698082010-07-16 19:08:36 +00002769 void __push_alternation(__owns_one_state<_CharT>* __sa,
2770 __owns_one_state<_CharT>* __sb);
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002771 void __push_begin_marked_subexpression();
2772 void __push_end_marked_subexpression(unsigned);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002773 void __push_empty();
Howard Hinnant17615b02010-07-27 01:25:38 +00002774 void __push_word_boundary(bool);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002775 void __push_lookahead(const basic_regex&, bool, unsigned);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002776
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002777 template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002778 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002779 __search(const _CharT* __first, const _CharT* __last,
2780 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002781 regex_constants::match_flag_type __flags) const;
2782
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002783 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002784 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002785 __match_at_start(const _CharT* __first, const _CharT* __last,
2786 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002787 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00002788 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002789 bool
Howard Hinnant17615b02010-07-27 01:25:38 +00002790 __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
2791 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002792 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002793 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002794 bool
2795 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002796 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002797 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002798 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002799 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002800 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
2801 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002802 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002803
Howard Hinnant99968442011-11-29 18:15:50 +00002804 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002805 friend
2806 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002807 regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002808 regex_constants::match_flag_type);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002809
Howard Hinnant99968442011-11-29 18:15:50 +00002810 template <class _Ap, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002811 friend
2812 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002813 regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
2814 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002815
Howard Hinnant99968442011-11-29 18:15:50 +00002816 template <class _Bp, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002817 friend
2818 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002819 regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002820 regex_constants::match_flag_type);
2821
Howard Hinnant99968442011-11-29 18:15:50 +00002822 template <class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002823 friend
2824 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002825 regex_search(const _Cp*, const _Cp*,
2826 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002827
Howard Hinnant99968442011-11-29 18:15:50 +00002828 template <class _Cp, class _Ap, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002829 friend
2830 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002831 regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002832 regex_constants::match_flag_type);
2833
Howard Hinnant99968442011-11-29 18:15:50 +00002834 template <class _ST, class _SA, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002835 friend
2836 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002837 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2838 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002839 regex_constants::match_flag_type __flags);
2840
Howard Hinnant99968442011-11-29 18:15:50 +00002841 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002842 friend
2843 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002844 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2845 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
2846 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002847 regex_constants::match_flag_type __flags);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002848
Howard Hinnanta9602d52013-06-29 23:45:43 +00002849 template <class _Iter, class _Ap, class _Cp, class _Tp>
2850 friend
2851 bool
2852 regex_search(__wrap_iter<_Iter> __first,
2853 __wrap_iter<_Iter> __last,
2854 match_results<__wrap_iter<_Iter>, _Ap>& __m,
2855 const basic_regex<_Cp, _Tp>& __e,
2856 regex_constants::match_flag_type __flags);
2857
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002858 template <class, class> friend class __lookahead;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002859};
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002860
2861template <class _CharT, class _Traits>
Howard Hinnant0a69fa12012-12-12 21:14:28 +00002862 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
2863template <class _CharT, class _Traits>
2864 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
2865template <class _CharT, class _Traits>
2866 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
2867template <class _CharT, class _Traits>
2868 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
2869template <class _CharT, class _Traits>
2870 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
2871template <class _CharT, class _Traits>
2872 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
2873template <class _CharT, class _Traits>
2874 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
2875template <class _CharT, class _Traits>
2876 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
2877template <class _CharT, class _Traits>
2878 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
2879template <class _CharT, class _Traits>
2880 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
2881
2882template <class _CharT, class _Traits>
Howard Hinnant7026a172010-08-13 18:11:23 +00002883void
2884basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002885{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002886 using _VSTD::swap;
Howard Hinnant7026a172010-08-13 18:11:23 +00002887 swap(__traits_, __r.__traits_);
2888 swap(__flags_, __r.__flags_);
2889 swap(__marked_count_, __r.__marked_count_);
2890 swap(__loop_count_, __r.__loop_count_);
2891 swap(__open_count_, __r.__open_count_);
2892 swap(__start_, __r.__start_);
2893 swap(__end_, __r.__end_);
Howard Hinnant7026a172010-08-13 18:11:23 +00002894}
2895
2896template <class _CharT, class _Traits>
2897inline _LIBCPP_INLINE_VISIBILITY
2898void
2899swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
2900{
2901 return __x.swap(__y);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002902}
2903
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002904// __lookahead
2905
2906template <class _CharT, class _Traits>
2907class __lookahead
2908 : public __owns_one_state<_CharT>
2909{
2910 typedef __owns_one_state<_CharT> base;
2911
2912 basic_regex<_CharT, _Traits> __exp_;
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002913 unsigned __mexp_;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002914 bool __invert_;
2915
2916 __lookahead(const __lookahead&);
2917 __lookahead& operator=(const __lookahead&);
2918public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002919 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002920
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002921 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002922 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
2923 : base(__s), __exp_(__exp), __invert_(__invert), __mexp_(__mexp) {}
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002924
2925 virtual void __exec(__state&) const;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002926};
2927
2928template <class _CharT, class _Traits>
2929void
2930__lookahead<_CharT, _Traits>::__exec(__state& __s) const
2931{
2932 match_results<const _CharT*> __m;
2933 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
2934 bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002935 __m,
2936 __s.__flags_ | regex_constants::match_continuous,
Howard Hinnante57b7c42013-06-28 19:11:23 +00002937 __s.__at_first_ && __s.__current_ == __s.__first_);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002938 if (__matched != __invert_)
2939 {
2940 __s.__do_ = __state::__accept_but_not_consume;
2941 __s.__node_ = this->first();
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002942 for (unsigned __i = 1; __i < __m.size(); ++__i) {
2943 __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
2944 }
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002945 }
2946 else
2947 {
2948 __s.__do_ = __state::__reject;
2949 __s.__node_ = nullptr;
2950 }
2951}
2952
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002953template <class _CharT, class _Traits>
2954template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002955_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002956basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
2957 _ForwardIterator __last)
2958{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002959 {
Howard Hinnantac303862010-07-12 15:51:17 +00002960 unique_ptr<__node> __h(new __end_state<_CharT>);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002961 __start_.reset(new __empty_state<_CharT>(__h.get()));
2962 __h.release();
2963 __end_ = __start_.get();
2964 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002965 switch (__flags_ & 0x1F0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002966 {
2967 case ECMAScript:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002968 __first = __parse_ecma_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002969 break;
2970 case basic:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002971 __first = __parse_basic_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002972 break;
2973 case extended:
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002974 case awk:
Howard Hinnant15476f32010-07-28 17:35:27 +00002975 __first = __parse_extended_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002976 break;
2977 case grep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002978 __first = __parse_grep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002979 break;
2980 case egrep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002981 __first = __parse_egrep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002982 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00002983#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002984 default:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002985 throw regex_error(regex_constants::__re_err_grammar);
Howard Hinnant324bb032010-08-22 00:02:43 +00002986#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002987 }
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002988 return __first;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002989}
2990
2991template <class _CharT, class _Traits>
2992template <class _ForwardIterator>
2993_ForwardIterator
2994basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
2995 _ForwardIterator __last)
2996{
2997 if (__first != __last)
2998 {
2999 if (*__first == '^')
3000 {
3001 __push_l_anchor();
3002 ++__first;
3003 }
3004 if (__first != __last)
3005 {
3006 __first = __parse_RE_expression(__first, __last);
3007 if (__first != __last)
3008 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003009 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003010 if (__temp == __last && *__first == '$')
3011 {
3012 __push_r_anchor();
3013 ++__first;
3014 }
3015 }
3016 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003017#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003018 if (__first != __last)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003019 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003020#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003021 }
3022 return __first;
3023}
3024
3025template <class _CharT, class _Traits>
3026template <class _ForwardIterator>
3027_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003028basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
3029 _ForwardIterator __last)
3030{
Howard Hinnantaa698082010-07-16 19:08:36 +00003031 __owns_one_state<_CharT>* __sa = __end_;
3032 _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003033#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003034 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003035 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003036#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003037 __first = __temp;
3038 while (__first != __last && *__first == '|')
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003039 {
Howard Hinnantaa698082010-07-16 19:08:36 +00003040 __owns_one_state<_CharT>* __sb = __end_;
3041 __temp = __parse_ERE_branch(++__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003042#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003043 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003044 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003045#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003046 __push_alternation(__sa, __sb);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003047 __first = __temp;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003048 }
3049 return __first;
3050}
3051
3052template <class _CharT, class _Traits>
3053template <class _ForwardIterator>
3054_ForwardIterator
3055basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3056 _ForwardIterator __last)
3057{
3058 _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003059#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003060 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003061 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003062#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003063 do
3064 {
3065 __first = __temp;
3066 __temp = __parse_ERE_expression(__first, __last);
3067 } while (__temp != __first);
3068 return __first;
3069}
3070
3071template <class _CharT, class _Traits>
3072template <class _ForwardIterator>
3073_ForwardIterator
3074basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3075 _ForwardIterator __last)
3076{
Howard Hinnantaa698082010-07-16 19:08:36 +00003077 __owns_one_state<_CharT>* __e = __end_;
3078 unsigned __mexp_begin = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003079 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3080 if (__temp == __first && __temp != __last)
3081 {
3082 switch (*__temp)
3083 {
3084 case '^':
3085 __push_l_anchor();
3086 ++__temp;
3087 break;
3088 case '$':
3089 __push_r_anchor();
3090 ++__temp;
3091 break;
3092 case '(':
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003093 __push_begin_marked_subexpression();
3094 unsigned __temp_count = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003095 ++__open_count_;
3096 __temp = __parse_extended_reg_exp(++__temp, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003097#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003098 if (__temp == __last || *__temp != ')')
3099 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00003100#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003101 __push_end_marked_subexpression(__temp_count);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003102 --__open_count_;
3103 ++__temp;
3104 break;
3105 }
3106 }
3107 if (__temp != __first)
Howard Hinnantaa698082010-07-16 19:08:36 +00003108 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3109 __marked_count_+1);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003110 __first = __temp;
3111 return __first;
3112}
3113
3114template <class _CharT, class _Traits>
3115template <class _ForwardIterator>
3116_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003117basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3118 _ForwardIterator __last)
3119{
3120 while (true)
3121 {
3122 _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3123 if (__temp == __first)
3124 break;
3125 __first = __temp;
3126 }
3127 return __first;
3128}
3129
3130template <class _CharT, class _Traits>
3131template <class _ForwardIterator>
3132_ForwardIterator
3133basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3134 _ForwardIterator __last)
3135{
3136 if (__first != __last)
3137 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003138 __owns_one_state<_CharT>* __e = __end_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003139 unsigned __mexp_begin = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003140 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3141 if (__temp != __first)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003142 __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3143 __mexp_begin+1, __marked_count_+1);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003144 }
3145 return __first;
3146}
3147
3148template <class _CharT, class _Traits>
3149template <class _ForwardIterator>
3150_ForwardIterator
3151basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3152 _ForwardIterator __last)
3153{
3154 _ForwardIterator __temp = __first;
3155 __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3156 if (__temp == __first)
3157 {
3158 __temp = __parse_Back_open_paren(__first, __last);
3159 if (__temp != __first)
3160 {
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003161 __push_begin_marked_subexpression();
3162 unsigned __temp_count = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003163 __first = __parse_RE_expression(__temp, __last);
3164 __temp = __parse_Back_close_paren(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003165#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003166 if (__temp == __first)
3167 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00003168#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003169 __push_end_marked_subexpression(__temp_count);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003170 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003171 }
3172 else
3173 __first = __parse_BACKREF(__first, __last);
3174 }
3175 return __first;
3176}
3177
3178template <class _CharT, class _Traits>
3179template <class _ForwardIterator>
3180_ForwardIterator
3181basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3182 _ForwardIterator __first,
3183 _ForwardIterator __last)
3184{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003185 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003186 if (__temp == __first)
3187 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003188 __temp = __parse_QUOTED_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003189 if (__temp == __first)
3190 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003191 if (__temp != __last && *__temp == '.')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003192 {
3193 __push_match_any();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003194 ++__temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003195 }
3196 else
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003197 __temp = __parse_bracket_expression(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003198 }
3199 }
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003200 __first = __temp;
3201 return __first;
3202}
3203
3204template <class _CharT, class _Traits>
3205template <class _ForwardIterator>
3206_ForwardIterator
3207basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3208 _ForwardIterator __first,
3209 _ForwardIterator __last)
3210{
3211 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3212 if (__temp == __first)
3213 {
3214 __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3215 if (__temp == __first)
3216 {
3217 if (__temp != __last && *__temp == '.')
3218 {
3219 __push_match_any();
3220 ++__temp;
3221 }
3222 else
3223 __temp = __parse_bracket_expression(__first, __last);
3224 }
3225 }
3226 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003227 return __first;
3228}
3229
3230template <class _CharT, class _Traits>
3231template <class _ForwardIterator>
3232_ForwardIterator
3233basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3234 _ForwardIterator __last)
3235{
3236 if (__first != __last)
3237 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003238 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003239 if (__temp != __last)
3240 {
3241 if (*__first == '\\' && *__temp == '(')
3242 __first = ++__temp;
3243 }
3244 }
3245 return __first;
3246}
3247
3248template <class _CharT, class _Traits>
3249template <class _ForwardIterator>
3250_ForwardIterator
3251basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3252 _ForwardIterator __last)
3253{
3254 if (__first != __last)
3255 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003256 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003257 if (__temp != __last)
3258 {
3259 if (*__first == '\\' && *__temp == ')')
3260 __first = ++__temp;
3261 }
3262 }
3263 return __first;
3264}
3265
3266template <class _CharT, class _Traits>
3267template <class _ForwardIterator>
3268_ForwardIterator
3269basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3270 _ForwardIterator __last)
3271{
3272 if (__first != __last)
3273 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003274 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003275 if (__temp != __last)
3276 {
3277 if (*__first == '\\' && *__temp == '{')
3278 __first = ++__temp;
3279 }
3280 }
3281 return __first;
3282}
3283
3284template <class _CharT, class _Traits>
3285template <class _ForwardIterator>
3286_ForwardIterator
3287basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3288 _ForwardIterator __last)
3289{
3290 if (__first != __last)
3291 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003292 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003293 if (__temp != __last)
3294 {
3295 if (*__first == '\\' && *__temp == '}')
3296 __first = ++__temp;
3297 }
3298 }
3299 return __first;
3300}
3301
3302template <class _CharT, class _Traits>
3303template <class _ForwardIterator>
3304_ForwardIterator
3305basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3306 _ForwardIterator __last)
3307{
3308 if (__first != __last)
3309 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003310 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003311 if (__temp != __last)
3312 {
Marshall Clow97f50f62014-01-18 03:40:03 +00003313 if (*__first == '\\')
3314 {
3315 int __val = __traits_.value(*__temp, 10);
3316 if (__val >= 1 && __val <= 9)
3317 {
3318 __push_back_ref(__val);
3319 __first = ++__temp;
3320 }
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003321 }
3322 }
3323 }
3324 return __first;
3325}
3326
3327template <class _CharT, class _Traits>
3328template <class _ForwardIterator>
3329_ForwardIterator
3330basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3331 _ForwardIterator __last)
3332{
3333 if (__first != __last)
3334 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003335 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003336 if (__temp == __last && *__first == '$')
3337 return __first;
3338 // Not called inside a bracket
3339 if (*__first == '.' || *__first == '\\' || *__first == '[')
3340 return __first;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003341 __push_char(*__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003342 ++__first;
3343 }
3344 return __first;
3345}
3346
3347template <class _CharT, class _Traits>
3348template <class _ForwardIterator>
3349_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003350basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3351 _ForwardIterator __last)
3352{
3353 if (__first != __last)
3354 {
3355 switch (*__first)
3356 {
3357 case '^':
3358 case '.':
3359 case '[':
3360 case '$':
3361 case '(':
3362 case '|':
3363 case '*':
3364 case '+':
3365 case '?':
3366 case '{':
3367 case '\\':
3368 break;
3369 case ')':
3370 if (__open_count_ == 0)
3371 {
3372 __push_char(*__first);
3373 ++__first;
3374 }
3375 break;
3376 default:
3377 __push_char(*__first);
3378 ++__first;
3379 break;
3380 }
3381 }
3382 return __first;
3383}
3384
3385template <class _CharT, class _Traits>
3386template <class _ForwardIterator>
3387_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003388basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3389 _ForwardIterator __last)
3390{
3391 if (__first != __last)
3392 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003393 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003394 if (__temp != __last)
3395 {
3396 if (*__first == '\\')
3397 {
3398 switch (*__temp)
3399 {
3400 case '^':
3401 case '.':
3402 case '*':
3403 case '[':
3404 case '$':
3405 case '\\':
Howard Hinnant0de86b62010-06-25 20:56:08 +00003406 __push_char(*__temp);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003407 __first = ++__temp;
3408 break;
3409 }
3410 }
3411 }
3412 }
3413 return __first;
3414}
3415
3416template <class _CharT, class _Traits>
3417template <class _ForwardIterator>
3418_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003419basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3420 _ForwardIterator __last)
3421{
3422 if (__first != __last)
3423 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003424 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003425 if (__temp != __last)
3426 {
3427 if (*__first == '\\')
3428 {
3429 switch (*__temp)
3430 {
3431 case '^':
3432 case '.':
3433 case '*':
3434 case '[':
3435 case '$':
3436 case '\\':
3437 case '(':
3438 case ')':
3439 case '|':
3440 case '+':
3441 case '?':
3442 case '{':
Howard Hinnantc1ecd972013-06-28 20:31:05 +00003443 case '}':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003444 __push_char(*__temp);
3445 __first = ++__temp;
3446 break;
Howard Hinnant15476f32010-07-28 17:35:27 +00003447 default:
3448 if ((__flags_ & 0x1F0) == awk)
3449 __first = __parse_awk_escape(++__first, __last);
3450 break;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003451 }
3452 }
3453 }
3454 }
3455 return __first;
3456}
3457
3458template <class _CharT, class _Traits>
3459template <class _ForwardIterator>
3460_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003461basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003462 _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003463 __owns_one_state<_CharT>* __s,
3464 unsigned __mexp_begin,
3465 unsigned __mexp_end)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003466{
3467 if (__first != __last)
3468 {
Howard Hinnant0de86b62010-06-25 20:56:08 +00003469 if (*__first == '*')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003470 {
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003471 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003472 ++__first;
3473 }
3474 else
3475 {
3476 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3477 if (__temp != __first)
3478 {
3479 int __min = 0;
3480 __first = __temp;
3481 __temp = __parse_DUP_COUNT(__first, __last, __min);
Howard Hinnantd4444702010-08-11 17:04:31 +00003482#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003483 if (__temp == __first)
3484 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003485#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003486 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003487#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003488 if (__first == __last)
3489 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003490#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003491 if (*__first != ',')
3492 {
3493 __temp = __parse_Back_close_brace(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003494#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003495 if (__temp == __first)
3496 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003497#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcba352d2010-07-12 18:16:05 +00003498 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3499 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003500 __first = __temp;
3501 }
3502 else
3503 {
3504 ++__first; // consume ','
3505 int __max = -1;
3506 __first = __parse_DUP_COUNT(__first, __last, __max);
3507 __temp = __parse_Back_close_brace(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003508#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003509 if (__temp == __first)
3510 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003511#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003512 if (__max == -1)
Howard Hinnantaa698082010-07-16 19:08:36 +00003513 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003514 else
3515 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003516#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003517 if (__max < __min)
3518 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003519#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcba352d2010-07-12 18:16:05 +00003520 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3521 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003522 }
3523 __first = __temp;
3524 }
3525 }
3526 }
3527 }
3528 return __first;
3529}
3530
Howard Hinnant0de86b62010-06-25 20:56:08 +00003531template <class _CharT, class _Traits>
3532template <class _ForwardIterator>
3533_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003534basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantaa698082010-07-16 19:08:36 +00003535 _ForwardIterator __last,
3536 __owns_one_state<_CharT>* __s,
3537 unsigned __mexp_begin,
3538 unsigned __mexp_end)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003539{
3540 if (__first != __last)
3541 {
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003542 unsigned __grammar = __flags_ & 0x1F0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003543 switch (*__first)
3544 {
3545 case '*':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003546 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003547 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003548 {
3549 ++__first;
3550 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3551 }
3552 else
3553 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003554 break;
3555 case '+':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003556 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003557 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003558 {
3559 ++__first;
3560 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3561 }
3562 else
3563 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003564 break;
3565 case '?':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003566 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003567 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003568 {
3569 ++__first;
3570 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3571 }
3572 else
3573 __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003574 break;
3575 case '{':
3576 {
3577 int __min;
Howard Hinnantaa698082010-07-16 19:08:36 +00003578 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
Howard Hinnantd4444702010-08-11 17:04:31 +00003579#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003580 if (__temp == __first)
3581 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003582#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003583 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003584#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003585 if (__first == __last)
3586 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003587#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003588 switch (*__first)
3589 {
3590 case '}':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003591 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003592 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003593 {
3594 ++__first;
3595 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3596 }
3597 else
3598 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003599 break;
3600 case ',':
Howard Hinnantd4444702010-08-11 17:04:31 +00003601 ++__first;
3602#ifndef _LIBCPP_NO_EXCEPTIONS
3603 if (__first == __last)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003604 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003605#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003606 if (*__first == '}')
3607 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003608 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003609 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003610 {
3611 ++__first;
3612 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3613 }
3614 else
3615 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003616 }
3617 else
3618 {
Howard Hinnantaa698082010-07-16 19:08:36 +00003619 int __max = -1;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003620 __temp = __parse_DUP_COUNT(__first, __last, __max);
Howard Hinnantd4444702010-08-11 17:04:31 +00003621#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003622 if (__temp == __first)
3623 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003624#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003625 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003626#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003627 if (__first == __last || *__first != '}')
3628 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003629#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003630 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00003631#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003632 if (__max < __min)
3633 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003634#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003635 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003636 {
3637 ++__first;
3638 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3639 }
3640 else
3641 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003642 }
Howard Hinnantaa698082010-07-16 19:08:36 +00003643 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003644#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003645 default:
3646 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003647#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003648 }
3649 }
3650 break;
3651 }
3652 }
3653 return __first;
3654}
3655
3656template <class _CharT, class _Traits>
3657template <class _ForwardIterator>
3658_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003659basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3660 _ForwardIterator __last)
3661{
3662 if (__first != __last && *__first == '[')
3663 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003664 ++__first;
3665#ifndef _LIBCPP_NO_EXCEPTIONS
3666 if (__first == __last)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003667 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003668#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003669 bool __negate = false;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003670 if (*__first == '^')
3671 {
3672 ++__first;
Howard Hinnant173968a2010-07-13 21:48:06 +00003673 __negate = true;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003674 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003675 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3676 // __ml owned by *this
Howard Hinnantd4444702010-08-11 17:04:31 +00003677#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003678 if (__first == __last)
3679 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003680#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003681 if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']')
Howard Hinnant0de86b62010-06-25 20:56:08 +00003682 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003683 __ml->__add_char(']');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003684 ++__first;
3685 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003686 __first = __parse_follow_list(__first, __last, __ml);
Howard Hinnantd4444702010-08-11 17:04:31 +00003687#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003688 if (__first == __last)
3689 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003690#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003691 if (*__first == '-')
3692 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003693 __ml->__add_char('-');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003694 ++__first;
3695 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003696#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003697 if (__first == __last || *__first != ']')
3698 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003699#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003700 ++__first;
3701 }
3702 return __first;
3703}
3704
3705template <class _CharT, class _Traits>
3706template <class _ForwardIterator>
3707_ForwardIterator
3708basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003709 _ForwardIterator __last,
3710 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003711{
3712 if (__first != __last)
3713 {
3714 while (true)
3715 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003716 _ForwardIterator __temp = __parse_expression_term(__first, __last,
3717 __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003718 if (__temp == __first)
3719 break;
3720 __first = __temp;
3721 }
3722 }
3723 return __first;
3724}
3725
3726template <class _CharT, class _Traits>
3727template <class _ForwardIterator>
3728_ForwardIterator
3729basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003730 _ForwardIterator __last,
3731 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003732{
3733 if (__first != __last && *__first != ']')
3734 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003735 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant173968a2010-07-13 21:48:06 +00003736 basic_string<_CharT> __start_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003737 if (__temp != __last && *__first == '[')
3738 {
3739 if (*__temp == '=')
Howard Hinnant173968a2010-07-13 21:48:06 +00003740 return __parse_equivalence_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003741 else if (*__temp == ':')
Howard Hinnant173968a2010-07-13 21:48:06 +00003742 return __parse_character_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003743 else if (*__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003744 __first = __parse_collating_symbol(++__temp, __last, __start_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003745 }
Howard Hinnant15476f32010-07-28 17:35:27 +00003746 unsigned __grammar = __flags_ & 0x1F0;
3747 if (__start_range.empty())
Howard Hinnant0de86b62010-06-25 20:56:08 +00003748 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003749 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3750 {
3751 if (__grammar == ECMAScript)
3752 __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3753 else
3754 __first = __parse_awk_escape(++__first, __last, &__start_range);
3755 }
3756 else
3757 {
3758 __start_range = *__first;
3759 ++__first;
3760 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003761 }
3762 if (__first != __last && *__first != ']')
3763 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003764 __temp = _VSTD::next(__first);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003765 if (__temp != __last && *__first == '-' && *__temp != ']')
3766 {
3767 // parse a range
Howard Hinnant173968a2010-07-13 21:48:06 +00003768 basic_string<_CharT> __end_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003769 __first = __temp;
3770 ++__temp;
3771 if (__temp != __last && *__first == '[' && *__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003772 __first = __parse_collating_symbol(++__temp, __last, __end_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003773 else
3774 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003775 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3776 {
3777 if (__grammar == ECMAScript)
3778 __first = __parse_class_escape(++__first, __last,
3779 __end_range, __ml);
3780 else
3781 __first = __parse_awk_escape(++__first, __last,
3782 &__end_range);
3783 }
3784 else
3785 {
3786 __end_range = *__first;
3787 ++__first;
3788 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003789 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003790 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
Howard Hinnant0de86b62010-06-25 20:56:08 +00003791 }
Howard Hinnant499cea12013-08-23 17:37:05 +00003792 else if (!__start_range.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003793 {
3794 if (__start_range.size() == 1)
3795 __ml->__add_char(__start_range[0]);
3796 else
3797 __ml->__add_digraph(__start_range[0], __start_range[1]);
3798 }
3799 }
Howard Hinnant499cea12013-08-23 17:37:05 +00003800 else if (!__start_range.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003801 {
3802 if (__start_range.size() == 1)
3803 __ml->__add_char(__start_range[0]);
3804 else
3805 __ml->__add_digraph(__start_range[0], __start_range[1]);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003806 }
3807 }
3808 return __first;
3809}
3810
3811template <class _CharT, class _Traits>
3812template <class _ForwardIterator>
3813_ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00003814basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
3815 _ForwardIterator __last,
3816 basic_string<_CharT>& __str,
3817 __bracket_expression<_CharT, _Traits>* __ml)
3818{
Howard Hinnantd4444702010-08-11 17:04:31 +00003819#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003820 if (__first == __last)
3821 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003822#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003823 switch (*__first)
3824 {
3825 case 0:
3826 __str = *__first;
3827 return ++__first;
3828 case 'b':
3829 __str = _CharT(8);
3830 return ++__first;
3831 case 'd':
3832 __ml->__add_class(ctype_base::digit);
3833 return ++__first;
3834 case 'D':
3835 __ml->__add_neg_class(ctype_base::digit);
3836 return ++__first;
3837 case 's':
3838 __ml->__add_class(ctype_base::space);
3839 return ++__first;
3840 case 'S':
3841 __ml->__add_neg_class(ctype_base::space);
3842 return ++__first;
3843 case 'w':
3844 __ml->__add_class(ctype_base::alnum);
3845 __ml->__add_char('_');
3846 return ++__first;
3847 case 'W':
3848 __ml->__add_neg_class(ctype_base::alnum);
3849 __ml->__add_neg_char('_');
3850 return ++__first;
3851 }
3852 __first = __parse_character_escape(__first, __last, &__str);
3853 return __first;
3854}
3855
3856template <class _CharT, class _Traits>
3857template <class _ForwardIterator>
3858_ForwardIterator
3859basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
3860 _ForwardIterator __last,
3861 basic_string<_CharT>* __str)
3862{
Howard Hinnantd4444702010-08-11 17:04:31 +00003863#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003864 if (__first == __last)
3865 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003866#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003867 switch (*__first)
3868 {
3869 case '\\':
3870 case '"':
3871 case '/':
3872 if (__str)
3873 *__str = *__first;
3874 else
3875 __push_char(*__first);
3876 return ++__first;
3877 case 'a':
3878 if (__str)
3879 *__str = _CharT(7);
3880 else
3881 __push_char(_CharT(7));
3882 return ++__first;
3883 case 'b':
3884 if (__str)
3885 *__str = _CharT(8);
3886 else
3887 __push_char(_CharT(8));
3888 return ++__first;
3889 case 'f':
3890 if (__str)
3891 *__str = _CharT(0xC);
3892 else
3893 __push_char(_CharT(0xC));
3894 return ++__first;
3895 case 'n':
3896 if (__str)
3897 *__str = _CharT(0xA);
3898 else
3899 __push_char(_CharT(0xA));
3900 return ++__first;
3901 case 'r':
3902 if (__str)
3903 *__str = _CharT(0xD);
3904 else
3905 __push_char(_CharT(0xD));
3906 return ++__first;
3907 case 't':
3908 if (__str)
3909 *__str = _CharT(0x9);
3910 else
3911 __push_char(_CharT(0x9));
3912 return ++__first;
3913 case 'v':
3914 if (__str)
3915 *__str = _CharT(0xB);
3916 else
3917 __push_char(_CharT(0xB));
3918 return ++__first;
3919 }
3920 if ('0' <= *__first && *__first <= '7')
3921 {
3922 unsigned __val = *__first - '0';
3923 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3924 {
3925 __val = 8 * __val + *__first - '0';
3926 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
Howard Hinnantdbc8cf02013-07-02 17:43:31 +00003927 __val = 8 * __val + *__first++ - '0';
Howard Hinnant15476f32010-07-28 17:35:27 +00003928 }
3929 if (__str)
3930 *__str = _CharT(__val);
3931 else
3932 __push_char(_CharT(__val));
3933 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003934#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003935 else
3936 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003937#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003938 return __first;
3939}
3940
3941template <class _CharT, class _Traits>
3942template <class _ForwardIterator>
3943_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003944basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003945 _ForwardIterator __last,
3946 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003947{
3948 // Found [=
3949 // This means =] must exist
3950 value_type _Equal_close[2] = {'=', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003951 _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00003952 _Equal_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00003953#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003954 if (__temp == __last)
3955 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003956#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003957 // [__first, __temp) contains all text in [= ... =]
3958 typedef typename _Traits::string_type string_type;
3959 string_type __collate_name =
3960 __traits_.lookup_collatename(__first, __temp);
Howard Hinnantd4444702010-08-11 17:04:31 +00003961#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003962 if (__collate_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003963 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00003964#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003965 string_type __equiv_name =
3966 __traits_.transform_primary(__collate_name.begin(),
3967 __collate_name.end());
3968 if (!__equiv_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003969 __ml->__add_equivalence(__equiv_name);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003970 else
Howard Hinnant173968a2010-07-13 21:48:06 +00003971 {
3972 switch (__collate_name.size())
3973 {
3974 case 1:
3975 __ml->__add_char(__collate_name[0]);
3976 break;
3977 case 2:
3978 __ml->__add_digraph(__collate_name[0], __collate_name[1]);
3979 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003980#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003981 default:
3982 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00003983#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003984 }
3985 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003986 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003987 return __first;
3988}
3989
3990template <class _CharT, class _Traits>
3991template <class _ForwardIterator>
3992_ForwardIterator
3993basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003994 _ForwardIterator __last,
3995 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003996{
3997 // Found [:
3998 // This means :] must exist
3999 value_type _Colon_close[2] = {':', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00004000 _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00004001 _Colon_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00004002#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004003 if (__temp == __last)
4004 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00004005#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004006 // [__first, __temp) contains all text in [: ... :]
4007 typedef typename _Traits::char_class_type char_class_type;
4008 char_class_type __class_type =
4009 __traits_.lookup_classname(__first, __temp, __flags_ & icase);
Howard Hinnantd4444702010-08-11 17:04:31 +00004010#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004011 if (__class_type == 0)
4012 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00004013#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004014 __ml->__add_class(__class_type);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004015 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004016 return __first;
4017}
4018
4019template <class _CharT, class _Traits>
4020template <class _ForwardIterator>
4021_ForwardIterator
4022basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00004023 _ForwardIterator __last,
4024 basic_string<_CharT>& __col_sym)
Howard Hinnant0de86b62010-06-25 20:56:08 +00004025{
4026 // Found [.
4027 // This means .] must exist
4028 value_type _Dot_close[2] = {'.', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00004029 _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00004030 _Dot_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00004031#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004032 if (__temp == __last)
4033 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00004034#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004035 // [__first, __temp) contains all text in [. ... .]
4036 typedef typename _Traits::string_type string_type;
Howard Hinnant173968a2010-07-13 21:48:06 +00004037 __col_sym = __traits_.lookup_collatename(__first, __temp);
4038 switch (__col_sym.size())
4039 {
4040 case 1:
4041 case 2:
4042 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00004043#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004044 default:
4045 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00004046#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004047 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004048 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004049 return __first;
4050}
4051
4052template <class _CharT, class _Traits>
4053template <class _ForwardIterator>
4054_ForwardIterator
4055basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4056 _ForwardIterator __last,
4057 int& __c)
4058{
Marshall Clow97f50f62014-01-18 03:40:03 +00004059 if (__first != __last )
Howard Hinnant0de86b62010-06-25 20:56:08 +00004060 {
Marshall Clow97f50f62014-01-18 03:40:03 +00004061 int __val = __traits_.value(*__first, 10);
4062 if ( __val != -1 )
Howard Hinnant0de86b62010-06-25 20:56:08 +00004063 {
Marshall Clow97f50f62014-01-18 03:40:03 +00004064 __c = __val;
4065 for (++__first;
4066 __first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
4067 ++__first)
4068 {
4069 __c *= 10;
4070 __c += __val;
4071 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00004072 }
4073 }
4074 return __first;
4075}
4076
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004077template <class _CharT, class _Traits>
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004078template <class _ForwardIterator>
4079_ForwardIterator
4080basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4081 _ForwardIterator __last)
4082{
4083 __owns_one_state<_CharT>* __sa = __end_;
4084 _ForwardIterator __temp = __parse_alternative(__first, __last);
4085 if (__temp == __first)
4086 __push_empty();
4087 __first = __temp;
4088 while (__first != __last && *__first == '|')
4089 {
4090 __owns_one_state<_CharT>* __sb = __end_;
4091 __temp = __parse_alternative(++__first, __last);
4092 if (__temp == __first)
4093 __push_empty();
4094 __push_alternation(__sa, __sb);
4095 __first = __temp;
4096 }
4097 return __first;
4098}
4099
4100template <class _CharT, class _Traits>
4101template <class _ForwardIterator>
4102_ForwardIterator
4103basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4104 _ForwardIterator __last)
4105{
4106 while (true)
4107 {
4108 _ForwardIterator __temp = __parse_term(__first, __last);
4109 if (__temp == __first)
4110 break;
4111 __first = __temp;
4112 }
4113 return __first;
4114}
4115
4116template <class _CharT, class _Traits>
4117template <class _ForwardIterator>
4118_ForwardIterator
4119basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4120 _ForwardIterator __last)
4121{
4122 _ForwardIterator __temp = __parse_assertion(__first, __last);
4123 if (__temp == __first)
4124 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004125 __owns_one_state<_CharT>* __e = __end_;
4126 unsigned __mexp_begin = __marked_count_;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004127 __temp = __parse_atom(__first, __last);
4128 if (__temp != __first)
Howard Hinnant17615b02010-07-27 01:25:38 +00004129 __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4130 __mexp_begin+1, __marked_count_+1);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004131 }
Howard Hinnant17615b02010-07-27 01:25:38 +00004132 else
4133 __first = __temp;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004134 return __first;
4135}
4136
4137template <class _CharT, class _Traits>
4138template <class _ForwardIterator>
4139_ForwardIterator
4140basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4141 _ForwardIterator __last)
4142{
4143 if (__first != __last)
4144 {
4145 switch (*__first)
4146 {
4147 case '^':
4148 __push_l_anchor();
4149 ++__first;
4150 break;
4151 case '$':
4152 __push_r_anchor();
4153 ++__first;
4154 break;
4155 case '\\':
4156 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004157 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004158 if (__temp != __last)
4159 {
4160 if (*__temp == 'b')
4161 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004162 __push_word_boundary(false);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004163 __first = ++__temp;
4164 }
4165 else if (*__temp == 'B')
4166 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004167 __push_word_boundary(true);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004168 __first = ++__temp;
4169 }
4170 }
4171 }
4172 break;
4173 case '(':
4174 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004175 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004176 if (__temp != __last && *__temp == '?')
4177 {
4178 if (++__temp != __last)
4179 {
4180 switch (*__temp)
4181 {
4182 case '=':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004183 {
4184 basic_regex __exp;
4185 __exp.__flags_ = __flags_;
4186 __temp = __exp.__parse(++__temp, __last);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004187 unsigned __mexp = __exp.__marked_count_;
4188 __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
4189 __marked_count_ += __mexp;
Howard Hinnantd4444702010-08-11 17:04:31 +00004190#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004191 if (__temp == __last || *__temp != ')')
4192 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004193#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004194 __first = ++__temp;
4195 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004196 break;
4197 case '!':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004198 {
4199 basic_regex __exp;
4200 __exp.__flags_ = __flags_;
4201 __temp = __exp.__parse(++__temp, __last);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004202 unsigned __mexp = __exp.__marked_count_;
4203 __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
4204 __marked_count_ += __mexp;
Howard Hinnantd4444702010-08-11 17:04:31 +00004205#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004206 if (__temp == __last || *__temp != ')')
4207 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004208#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004209 __first = ++__temp;
4210 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004211 break;
4212 }
4213 }
4214 }
4215 }
4216 break;
4217 }
4218 }
4219 return __first;
4220}
4221
4222template <class _CharT, class _Traits>
4223template <class _ForwardIterator>
4224_ForwardIterator
4225basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4226 _ForwardIterator __last)
4227{
Howard Hinnant17615b02010-07-27 01:25:38 +00004228 if (__first != __last)
4229 {
4230 switch (*__first)
4231 {
4232 case '.':
4233 __push_match_any_but_newline();
4234 ++__first;
4235 break;
4236 case '\\':
4237 __first = __parse_atom_escape(__first, __last);
4238 break;
4239 case '[':
4240 __first = __parse_bracket_expression(__first, __last);
4241 break;
4242 case '(':
4243 {
Howard Hinnantd4444702010-08-11 17:04:31 +00004244 ++__first;
4245#ifndef _LIBCPP_NO_EXCEPTIONS
4246 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004247 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004248#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0949eed2011-06-30 21:18:19 +00004249 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004250 if (__temp != __last && *__first == '?' && *__temp == ':')
4251 {
4252 ++__open_count_;
4253 __first = __parse_ecma_exp(++__temp, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00004254#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004255 if (__first == __last || *__first != ')')
4256 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004257#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004258 --__open_count_;
4259 ++__first;
4260 }
4261 else
4262 {
4263 __push_begin_marked_subexpression();
4264 unsigned __temp_count = __marked_count_;
4265 ++__open_count_;
4266 __first = __parse_ecma_exp(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00004267#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004268 if (__first == __last || *__first != ')')
4269 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004270#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004271 __push_end_marked_subexpression(__temp_count);
4272 --__open_count_;
4273 ++__first;
4274 }
4275 }
4276 break;
4277 default:
4278 __first = __parse_pattern_character(__first, __last);
4279 break;
4280 }
4281 }
4282 return __first;
4283}
4284
4285template <class _CharT, class _Traits>
4286template <class _ForwardIterator>
4287_ForwardIterator
4288basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4289 _ForwardIterator __last)
4290{
4291 if (__first != __last && *__first == '\\')
4292 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004293 _ForwardIterator __t1 = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004294 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4295 if (__t2 != __t1)
4296 __first = __t2;
4297 else
4298 {
4299 __t2 = __parse_character_class_escape(__t1, __last);
4300 if (__t2 != __t1)
4301 __first = __t2;
4302 else
4303 {
4304 __t2 = __parse_character_escape(__t1, __last);
4305 if (__t2 != __t1)
4306 __first = __t2;
4307 }
4308 }
4309 }
4310 return __first;
4311}
4312
4313template <class _CharT, class _Traits>
4314template <class _ForwardIterator>
4315_ForwardIterator
4316basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4317 _ForwardIterator __last)
4318{
4319 if (__first != __last)
4320 {
4321 if (*__first == '0')
4322 {
4323 __push_char(_CharT());
4324 ++__first;
4325 }
4326 else if ('1' <= *__first && *__first <= '9')
4327 {
4328 unsigned __v = *__first - '0';
4329 for (++__first; '0' <= *__first && *__first <= '9'; ++__first)
4330 __v = 10 * __v + *__first - '0';
Howard Hinnantd4444702010-08-11 17:04:31 +00004331#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004332 if (__v > mark_count())
4333 throw regex_error(regex_constants::error_backref);
Howard Hinnant324bb032010-08-22 00:02:43 +00004334#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004335 __push_back_ref(__v);
4336 }
4337 }
4338 return __first;
4339}
4340
4341template <class _CharT, class _Traits>
4342template <class _ForwardIterator>
4343_ForwardIterator
4344basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4345 _ForwardIterator __last)
4346{
4347 if (__first != __last)
4348 {
4349 __bracket_expression<_CharT, _Traits>* __ml;
4350 switch (*__first)
4351 {
4352 case 'd':
4353 __ml = __start_matching_list(false);
4354 __ml->__add_class(ctype_base::digit);
4355 ++__first;
4356 break;
4357 case 'D':
4358 __ml = __start_matching_list(true);
4359 __ml->__add_class(ctype_base::digit);
4360 ++__first;
4361 break;
4362 case 's':
4363 __ml = __start_matching_list(false);
4364 __ml->__add_class(ctype_base::space);
4365 ++__first;
4366 break;
4367 case 'S':
4368 __ml = __start_matching_list(true);
4369 __ml->__add_class(ctype_base::space);
4370 ++__first;
4371 break;
4372 case 'w':
4373 __ml = __start_matching_list(false);
4374 __ml->__add_class(ctype_base::alnum);
4375 __ml->__add_char('_');
4376 ++__first;
4377 break;
4378 case 'W':
4379 __ml = __start_matching_list(true);
4380 __ml->__add_class(ctype_base::alnum);
4381 __ml->__add_char('_');
4382 ++__first;
4383 break;
4384 }
4385 }
4386 return __first;
4387}
4388
4389template <class _CharT, class _Traits>
4390template <class _ForwardIterator>
4391_ForwardIterator
4392basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
Howard Hinnant15476f32010-07-28 17:35:27 +00004393 _ForwardIterator __last,
4394 basic_string<_CharT>* __str)
Howard Hinnant17615b02010-07-27 01:25:38 +00004395{
4396 if (__first != __last)
4397 {
4398 _ForwardIterator __t;
4399 unsigned __sum = 0;
4400 int __hd;
4401 switch (*__first)
4402 {
4403 case 'f':
Howard Hinnant15476f32010-07-28 17:35:27 +00004404 if (__str)
4405 *__str = _CharT(0xC);
4406 else
4407 __push_char(_CharT(0xC));
Howard Hinnant17615b02010-07-27 01:25:38 +00004408 ++__first;
4409 break;
4410 case 'n':
Howard Hinnant15476f32010-07-28 17:35:27 +00004411 if (__str)
4412 *__str = _CharT(0xA);
4413 else
4414 __push_char(_CharT(0xA));
Howard Hinnant17615b02010-07-27 01:25:38 +00004415 ++__first;
4416 break;
4417 case 'r':
Howard Hinnant15476f32010-07-28 17:35:27 +00004418 if (__str)
4419 *__str = _CharT(0xD);
4420 else
4421 __push_char(_CharT(0xD));
Howard Hinnant17615b02010-07-27 01:25:38 +00004422 ++__first;
4423 break;
4424 case 't':
Howard Hinnant15476f32010-07-28 17:35:27 +00004425 if (__str)
4426 *__str = _CharT(0x9);
4427 else
4428 __push_char(_CharT(0x9));
Howard Hinnant17615b02010-07-27 01:25:38 +00004429 ++__first;
4430 break;
4431 case 'v':
Howard Hinnant15476f32010-07-28 17:35:27 +00004432 if (__str)
4433 *__str = _CharT(0xB);
4434 else
4435 __push_char(_CharT(0xB));
Howard Hinnant17615b02010-07-27 01:25:38 +00004436 ++__first;
4437 break;
4438 case 'c':
Howard Hinnant0949eed2011-06-30 21:18:19 +00004439 if ((__t = _VSTD::next(__first)) != __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004440 {
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004441 if (('A' <= *__t && *__t <= 'Z') ||
4442 ('a' <= *__t && *__t <= 'z'))
Howard Hinnant17615b02010-07-27 01:25:38 +00004443 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004444 if (__str)
4445 *__str = _CharT(*__t % 32);
4446 else
4447 __push_char(_CharT(*__t % 32));
Howard Hinnant17615b02010-07-27 01:25:38 +00004448 __first = ++__t;
4449 }
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004450#ifndef _LIBCPP_NO_EXCEPTIONS
4451 else
4452 throw regex_error(regex_constants::error_escape);
4453#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004454 }
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004455#ifndef _LIBCPP_NO_EXCEPTIONS
4456 else
4457 throw regex_error(regex_constants::error_escape);
4458#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004459 break;
4460 case 'u':
Howard Hinnantd4444702010-08-11 17:04:31 +00004461 ++__first;
4462#ifndef _LIBCPP_NO_EXCEPTIONS
4463 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004464 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004465#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004466 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004467#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004468 if (__hd == -1)
4469 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004470#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004471 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnantd4444702010-08-11 17:04:31 +00004472 ++__first;
4473#ifndef _LIBCPP_NO_EXCEPTIONS
4474 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004475 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004476#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004477 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004478#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004479 if (__hd == -1)
4480 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004481#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004482 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant17615b02010-07-27 01:25:38 +00004483 // drop through
4484 case 'x':
Howard Hinnantd4444702010-08-11 17:04:31 +00004485 ++__first;
4486#ifndef _LIBCPP_NO_EXCEPTIONS
4487 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004488 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004489#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004490 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004491#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004492 if (__hd == -1)
4493 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004494#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004495 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnantd4444702010-08-11 17:04:31 +00004496 ++__first;
4497#ifndef _LIBCPP_NO_EXCEPTIONS
4498 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004499 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004500#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004501 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004502#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004503 if (__hd == -1)
4504 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004505#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004506 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant15476f32010-07-28 17:35:27 +00004507 if (__str)
4508 *__str = _CharT(__sum);
4509 else
4510 __push_char(_CharT(__sum));
Howard Hinnant17615b02010-07-27 01:25:38 +00004511 ++__first;
4512 break;
4513 default:
4514 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4515 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004516 if (__str)
4517 *__str = *__first;
4518 else
4519 __push_char(*__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004520 ++__first;
4521 }
Howard Hinnantd4444702010-08-11 17:04:31 +00004522#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant918f2a82013-06-28 18:57:30 +00004523 else
Howard Hinnant15476f32010-07-28 17:35:27 +00004524 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004525#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004526 break;
4527 }
4528 }
4529 return __first;
4530}
4531
4532template <class _CharT, class _Traits>
4533template <class _ForwardIterator>
4534_ForwardIterator
4535basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4536 _ForwardIterator __last)
4537{
4538 if (__first != __last)
4539 {
4540 switch (*__first)
4541 {
4542 case '^':
4543 case '$':
4544 case '\\':
4545 case '.':
4546 case '*':
4547 case '+':
4548 case '?':
4549 case '(':
4550 case ')':
4551 case '[':
4552 case ']':
4553 case '{':
4554 case '}':
4555 case '|':
4556 break;
4557 default:
4558 __push_char(*__first);
4559 ++__first;
4560 break;
4561 }
4562 }
4563 return __first;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004564}
4565
4566template <class _CharT, class _Traits>
Howard Hinnant856846b2010-07-27 19:53:10 +00004567template <class _ForwardIterator>
4568_ForwardIterator
4569basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4570 _ForwardIterator __last)
4571{
4572 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004573 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004574 if (__t1 != __first)
4575 __parse_basic_reg_exp(__first, __t1);
4576 else
4577 __push_empty();
4578 __first = __t1;
4579 if (__first != __last)
4580 ++__first;
4581 while (__first != __last)
4582 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004583 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004584 __owns_one_state<_CharT>* __sb = __end_;
4585 if (__t1 != __first)
4586 __parse_basic_reg_exp(__first, __t1);
4587 else
4588 __push_empty();
4589 __push_alternation(__sa, __sb);
4590 __first = __t1;
4591 if (__first != __last)
4592 ++__first;
4593 }
4594 return __first;
4595}
4596
4597template <class _CharT, class _Traits>
4598template <class _ForwardIterator>
4599_ForwardIterator
4600basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4601 _ForwardIterator __last)
4602{
4603 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004604 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004605 if (__t1 != __first)
4606 __parse_extended_reg_exp(__first, __t1);
4607 else
4608 __push_empty();
4609 __first = __t1;
4610 if (__first != __last)
4611 ++__first;
4612 while (__first != __last)
4613 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004614 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004615 __owns_one_state<_CharT>* __sb = __end_;
4616 if (__t1 != __first)
4617 __parse_extended_reg_exp(__first, __t1);
4618 else
4619 __push_empty();
4620 __push_alternation(__sa, __sb);
4621 __first = __t1;
4622 if (__first != __last)
4623 ++__first;
4624 }
4625 return __first;
4626}
4627
4628template <class _CharT, class _Traits>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004629void
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004630basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4631 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4632 bool __greedy)
4633{
4634 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4635 __end_->first() = nullptr;
Howard Hinnantac303862010-07-12 15:51:17 +00004636 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4637 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4638 __min, __max));
4639 __s->first() = nullptr;
4640 __e1.release();
4641 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004642 __end_ = __e2->second();
Howard Hinnantac303862010-07-12 15:51:17 +00004643 __s->first() = __e2.release();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004644 ++__loop_count_;
4645}
4646
4647template <class _CharT, class _Traits>
4648void
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004649basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4650{
Howard Hinnant173968a2010-07-13 21:48:06 +00004651 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004652 __end_->first() = new __match_char_icase<_CharT, _Traits>
4653 (__traits_, __c, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004654 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004655 __end_->first() = new __match_char_collate<_CharT, _Traits>
4656 (__traits_, __c, __end_->first());
4657 else
4658 __end_->first() = new __match_char<_CharT>(__c, __end_->first());
Howard Hinnante77aa5e2010-07-08 17:43:58 +00004659 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004660}
4661
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004662template <class _CharT, class _Traits>
4663void
4664basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4665{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004666 if (!(__flags_ & nosubs))
4667 {
4668 __end_->first() =
4669 new __begin_marked_subexpression<_CharT>(++__marked_count_,
4670 __end_->first());
4671 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4672 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004673}
4674
4675template <class _CharT, class _Traits>
4676void
4677basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4678{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004679 if (!(__flags_ & nosubs))
4680 {
4681 __end_->first() =
4682 new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4683 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4684 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004685}
4686
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004687template <class _CharT, class _Traits>
4688void
Howard Hinnant41fb6e12011-03-26 20:02:27 +00004689basic_regex<_CharT, _Traits>::__push_l_anchor()
4690{
4691 __end_->first() = new __l_anchor<_CharT>(__end_->first());
4692 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4693}
4694
4695template <class _CharT, class _Traits>
4696void
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004697basic_regex<_CharT, _Traits>::__push_r_anchor()
4698{
4699 __end_->first() = new __r_anchor<_CharT>(__end_->first());
4700 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4701}
4702
Howard Hinnantac303862010-07-12 15:51:17 +00004703template <class _CharT, class _Traits>
4704void
4705basic_regex<_CharT, _Traits>::__push_match_any()
4706{
4707 __end_->first() = new __match_any<_CharT>(__end_->first());
4708 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4709}
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004710
Howard Hinnantcba352d2010-07-12 18:16:05 +00004711template <class _CharT, class _Traits>
4712void
Howard Hinnant17615b02010-07-27 01:25:38 +00004713basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4714{
4715 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4716 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4717}
4718
4719template <class _CharT, class _Traits>
4720void
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004721basic_regex<_CharT, _Traits>::__push_empty()
4722{
4723 __end_->first() = new __empty_state<_CharT>(__end_->first());
4724 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4725}
4726
4727template <class _CharT, class _Traits>
4728void
Howard Hinnant17615b02010-07-27 01:25:38 +00004729basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4730{
4731 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4732 __end_->first());
4733 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4734}
4735
4736template <class _CharT, class _Traits>
4737void
Howard Hinnantcba352d2010-07-12 18:16:05 +00004738basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4739{
Howard Hinnant173968a2010-07-13 21:48:06 +00004740 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004741 __end_->first() = new __back_ref_icase<_CharT, _Traits>
4742 (__traits_, __i, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004743 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004744 __end_->first() = new __back_ref_collate<_CharT, _Traits>
4745 (__traits_, __i, __end_->first());
4746 else
4747 __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
Howard Hinnantcba352d2010-07-12 18:16:05 +00004748 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4749}
4750
Howard Hinnant173968a2010-07-13 21:48:06 +00004751template <class _CharT, class _Traits>
Howard Hinnantaa698082010-07-16 19:08:36 +00004752void
4753basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4754 __owns_one_state<_CharT>* __ea)
4755{
4756 __sa->first() = new __alternate<_CharT>(
4757 static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4758 static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4759 __ea->first() = nullptr;
4760 __ea->first() = new __empty_state<_CharT>(__end_->first());
4761 __end_->first() = nullptr;
4762 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4763 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4764}
4765
4766template <class _CharT, class _Traits>
Howard Hinnant173968a2010-07-13 21:48:06 +00004767__bracket_expression<_CharT, _Traits>*
4768basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4769{
4770 __bracket_expression<_CharT, _Traits>* __r =
4771 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4772 __negate, __flags_ & icase,
4773 __flags_ & collate);
4774 __end_->first() = __r;
4775 __end_ = __r;
4776 return __r;
4777}
4778
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004779template <class _CharT, class _Traits>
4780void
4781basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004782 bool __invert,
4783 unsigned __mexp)
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004784{
4785 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004786 __end_->first(), __mexp);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004787 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4788}
4789
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00004790typedef basic_regex<char> regex;
4791typedef basic_regex<wchar_t> wregex;
4792
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004793// sub_match
4794
4795template <class _BidirectionalIterator>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004796class _LIBCPP_TYPE_VIS_ONLY sub_match
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004797 : public pair<_BidirectionalIterator, _BidirectionalIterator>
4798{
4799public:
4800 typedef _BidirectionalIterator iterator;
4801 typedef typename iterator_traits<iterator>::value_type value_type;
4802 typedef typename iterator_traits<iterator>::difference_type difference_type;
4803 typedef basic_string<value_type> string_type;
4804
4805 bool matched;
4806
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004807 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +00004808 _LIBCPP_CONSTEXPR sub_match() : matched() {}
Howard Hinnant31aaf552010-12-08 21:07:55 +00004809
4810 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004811 difference_type length() const
Howard Hinnant0949eed2011-06-30 21:18:19 +00004812 {return matched ? _VSTD::distance(this->first, this->second) : 0;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004813 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004814 string_type str() const
4815 {return matched ? string_type(this->first, this->second) : string_type();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004816 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004817 operator string_type() const
4818 {return str();}
4819
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004820 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004821 int compare(const sub_match& __s) const
4822 {return str().compare(__s.str());}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004823 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004824 int compare(const string_type& __s) const
4825 {return str().compare(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004826 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004827 int compare(const value_type* __s) const
4828 {return str().compare(__s);}
4829};
4830
4831typedef sub_match<const char*> csub_match;
4832typedef sub_match<const wchar_t*> wcsub_match;
4833typedef sub_match<string::const_iterator> ssub_match;
4834typedef sub_match<wstring::const_iterator> wssub_match;
4835
4836template <class _BiIter>
4837inline _LIBCPP_INLINE_VISIBILITY
4838bool
4839operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4840{
4841 return __x.compare(__y) == 0;
4842}
4843
4844template <class _BiIter>
4845inline _LIBCPP_INLINE_VISIBILITY
4846bool
4847operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4848{
4849 return !(__x == __y);
4850}
4851
4852template <class _BiIter>
4853inline _LIBCPP_INLINE_VISIBILITY
4854bool
4855operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4856{
4857 return __x.compare(__y) < 0;
4858}
4859
4860template <class _BiIter>
4861inline _LIBCPP_INLINE_VISIBILITY
4862bool
4863operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4864{
4865 return !(__y < __x);
4866}
4867
4868template <class _BiIter>
4869inline _LIBCPP_INLINE_VISIBILITY
4870bool
4871operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4872{
4873 return !(__x < __y);
4874}
4875
4876template <class _BiIter>
4877inline _LIBCPP_INLINE_VISIBILITY
4878bool
4879operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4880{
4881 return __y < __x;
4882}
4883
4884template <class _BiIter, class _ST, class _SA>
4885inline _LIBCPP_INLINE_VISIBILITY
4886bool
4887operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4888 const sub_match<_BiIter>& __y)
4889{
4890 return __y.compare(__x.c_str()) == 0;
4891}
4892
4893template <class _BiIter, class _ST, class _SA>
4894inline _LIBCPP_INLINE_VISIBILITY
4895bool
4896operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4897 const sub_match<_BiIter>& __y)
4898{
4899 return !(__x == __y);
4900}
4901
4902template <class _BiIter, class _ST, class _SA>
4903inline _LIBCPP_INLINE_VISIBILITY
4904bool
4905operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4906 const sub_match<_BiIter>& __y)
4907{
4908 return __y.compare(__x.c_str()) > 0;
4909}
4910
4911template <class _BiIter, class _ST, class _SA>
4912inline _LIBCPP_INLINE_VISIBILITY
4913bool
4914operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4915 const sub_match<_BiIter>& __y)
4916{
4917 return __y < __x;
4918}
4919
4920template <class _BiIter, class _ST, class _SA>
4921inline _LIBCPP_INLINE_VISIBILITY
4922bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4923 const sub_match<_BiIter>& __y)
4924{
4925 return !(__x < __y);
4926}
4927
4928template <class _BiIter, class _ST, class _SA>
4929inline _LIBCPP_INLINE_VISIBILITY
4930bool
4931operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4932 const sub_match<_BiIter>& __y)
4933{
4934 return !(__y < __x);
4935}
4936
4937template <class _BiIter, class _ST, class _SA>
4938inline _LIBCPP_INLINE_VISIBILITY
4939bool
4940operator==(const sub_match<_BiIter>& __x,
4941 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4942{
4943 return __x.compare(__y.c_str()) == 0;
4944}
4945
4946template <class _BiIter, class _ST, class _SA>
4947inline _LIBCPP_INLINE_VISIBILITY
4948bool
4949operator!=(const sub_match<_BiIter>& __x,
4950 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4951{
4952 return !(__x == __y);
4953}
4954
4955template <class _BiIter, class _ST, class _SA>
4956inline _LIBCPP_INLINE_VISIBILITY
4957bool
4958operator<(const sub_match<_BiIter>& __x,
4959 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4960{
4961 return __x.compare(__y.c_str()) < 0;
4962}
4963
4964template <class _BiIter, class _ST, class _SA>
4965inline _LIBCPP_INLINE_VISIBILITY
4966bool operator>(const sub_match<_BiIter>& __x,
4967 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4968{
4969 return __y < __x;
4970}
4971
4972template <class _BiIter, class _ST, class _SA>
4973inline _LIBCPP_INLINE_VISIBILITY
4974bool
4975operator>=(const sub_match<_BiIter>& __x,
4976 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4977{
4978 return !(__x < __y);
4979}
4980
4981template <class _BiIter, class _ST, class _SA>
4982inline _LIBCPP_INLINE_VISIBILITY
4983bool
4984operator<=(const sub_match<_BiIter>& __x,
4985 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4986{
4987 return !(__y < __x);
4988}
4989
4990template <class _BiIter>
4991inline _LIBCPP_INLINE_VISIBILITY
4992bool
4993operator==(typename iterator_traits<_BiIter>::value_type const* __x,
4994 const sub_match<_BiIter>& __y)
4995{
4996 return __y.compare(__x) == 0;
4997}
4998
4999template <class _BiIter>
5000inline _LIBCPP_INLINE_VISIBILITY
5001bool
5002operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
5003 const sub_match<_BiIter>& __y)
5004{
5005 return !(__x == __y);
5006}
5007
5008template <class _BiIter>
5009inline _LIBCPP_INLINE_VISIBILITY
5010bool
5011operator<(typename iterator_traits<_BiIter>::value_type const* __x,
5012 const sub_match<_BiIter>& __y)
5013{
5014 return __y.compare(__x) > 0;
5015}
5016
5017template <class _BiIter>
5018inline _LIBCPP_INLINE_VISIBILITY
5019bool
5020operator>(typename iterator_traits<_BiIter>::value_type const* __x,
5021 const sub_match<_BiIter>& __y)
5022{
5023 return __y < __x;
5024}
5025
5026template <class _BiIter>
5027inline _LIBCPP_INLINE_VISIBILITY
5028bool
5029operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
5030 const sub_match<_BiIter>& __y)
5031{
5032 return !(__x < __y);
5033}
5034
5035template <class _BiIter>
5036inline _LIBCPP_INLINE_VISIBILITY
5037bool
5038operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
5039 const sub_match<_BiIter>& __y)
5040{
5041 return !(__y < __x);
5042}
5043
5044template <class _BiIter>
5045inline _LIBCPP_INLINE_VISIBILITY
5046bool
5047operator==(const sub_match<_BiIter>& __x,
5048 typename iterator_traits<_BiIter>::value_type const* __y)
5049{
5050 return __x.compare(__y) == 0;
5051}
5052
5053template <class _BiIter>
5054inline _LIBCPP_INLINE_VISIBILITY
5055bool
5056operator!=(const sub_match<_BiIter>& __x,
5057 typename iterator_traits<_BiIter>::value_type const* __y)
5058{
5059 return !(__x == __y);
5060}
5061
5062template <class _BiIter>
5063inline _LIBCPP_INLINE_VISIBILITY
5064bool
5065operator<(const sub_match<_BiIter>& __x,
5066 typename iterator_traits<_BiIter>::value_type const* __y)
5067{
5068 return __x.compare(__y) < 0;
5069}
5070
5071template <class _BiIter>
5072inline _LIBCPP_INLINE_VISIBILITY
5073bool
5074operator>(const sub_match<_BiIter>& __x,
5075 typename iterator_traits<_BiIter>::value_type const* __y)
5076{
5077 return __y < __x;
5078}
5079
5080template <class _BiIter>
5081inline _LIBCPP_INLINE_VISIBILITY
5082bool
5083operator>=(const sub_match<_BiIter>& __x,
5084 typename iterator_traits<_BiIter>::value_type const* __y)
5085{
5086 return !(__x < __y);
5087}
5088
5089template <class _BiIter>
5090inline _LIBCPP_INLINE_VISIBILITY
5091bool
5092operator<=(const sub_match<_BiIter>& __x,
5093 typename iterator_traits<_BiIter>::value_type const* __y)
5094{
5095 return !(__y < __x);
5096}
5097
5098template <class _BiIter>
5099inline _LIBCPP_INLINE_VISIBILITY
5100bool
5101operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5102 const sub_match<_BiIter>& __y)
5103{
5104 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5105 return __y.compare(string_type(1, __x)) == 0;
5106}
5107
5108template <class _BiIter>
5109inline _LIBCPP_INLINE_VISIBILITY
5110bool
5111operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5112 const sub_match<_BiIter>& __y)
5113{
5114 return !(__x == __y);
5115}
5116
5117template <class _BiIter>
5118inline _LIBCPP_INLINE_VISIBILITY
5119bool
5120operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5121 const sub_match<_BiIter>& __y)
5122{
5123 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5124 return __y.compare(string_type(1, __x)) > 0;
5125}
5126
5127template <class _BiIter>
5128inline _LIBCPP_INLINE_VISIBILITY
5129bool
5130operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5131 const sub_match<_BiIter>& __y)
5132{
5133 return __y < __x;
5134}
5135
5136template <class _BiIter>
5137inline _LIBCPP_INLINE_VISIBILITY
5138bool
5139operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5140 const sub_match<_BiIter>& __y)
5141{
5142 return !(__x < __y);
5143}
5144
5145template <class _BiIter>
5146inline _LIBCPP_INLINE_VISIBILITY
5147bool
5148operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5149 const sub_match<_BiIter>& __y)
5150{
5151 return !(__y < __x);
5152}
5153
5154template <class _BiIter>
5155inline _LIBCPP_INLINE_VISIBILITY
5156bool
5157operator==(const sub_match<_BiIter>& __x,
5158 typename iterator_traits<_BiIter>::value_type const& __y)
5159{
5160 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5161 return __x.compare(string_type(1, __y)) == 0;
5162}
5163
5164template <class _BiIter>
5165inline _LIBCPP_INLINE_VISIBILITY
5166bool
5167operator!=(const sub_match<_BiIter>& __x,
5168 typename iterator_traits<_BiIter>::value_type const& __y)
5169{
5170 return !(__x == __y);
5171}
5172
5173template <class _BiIter>
5174inline _LIBCPP_INLINE_VISIBILITY
5175bool
5176operator<(const sub_match<_BiIter>& __x,
5177 typename iterator_traits<_BiIter>::value_type const& __y)
5178{
5179 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5180 return __x.compare(string_type(1, __y)) < 0;
5181}
5182
5183template <class _BiIter>
5184inline _LIBCPP_INLINE_VISIBILITY
5185bool
5186operator>(const sub_match<_BiIter>& __x,
5187 typename iterator_traits<_BiIter>::value_type const& __y)
5188{
5189 return __y < __x;
5190}
5191
5192template <class _BiIter>
5193inline _LIBCPP_INLINE_VISIBILITY
5194bool
5195operator>=(const sub_match<_BiIter>& __x,
5196 typename iterator_traits<_BiIter>::value_type const& __y)
5197{
5198 return !(__x < __y);
5199}
5200
5201template <class _BiIter>
5202inline _LIBCPP_INLINE_VISIBILITY
5203bool
5204operator<=(const sub_match<_BiIter>& __x,
5205 typename iterator_traits<_BiIter>::value_type const& __y)
5206{
5207 return !(__y < __x);
5208}
5209
5210template <class _CharT, class _ST, class _BiIter>
5211inline _LIBCPP_INLINE_VISIBILITY
5212basic_ostream<_CharT, _ST>&
5213operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5214{
5215 return __os << __m.str();
5216}
5217
Howard Hinnant17615b02010-07-27 01:25:38 +00005218template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00005219class _LIBCPP_TYPE_VIS_ONLY match_results
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005220{
5221public:
5222 typedef _Allocator allocator_type;
5223 typedef sub_match<_BidirectionalIterator> value_type;
5224private:
5225 typedef vector<value_type, allocator_type> __container_type;
5226
5227 __container_type __matches_;
5228 value_type __unmatched_;
5229 value_type __prefix_;
5230 value_type __suffix_;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005231 bool __ready_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005232public:
Howard Hinnanta712c722010-08-16 20:21:16 +00005233 _BidirectionalIterator __position_start_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005234 typedef const value_type& const_reference;
5235 typedef const_reference reference;
5236 typedef typename __container_type::const_iterator const_iterator;
5237 typedef const_iterator iterator;
5238 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5239 typedef typename allocator_traits<allocator_type>::size_type size_type;
5240 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5241 typedef basic_string<char_type> string_type;
5242
5243 // construct/copy/destroy:
5244 explicit match_results(const allocator_type& __a = allocator_type());
5245// match_results(const match_results&) = default;
5246// match_results& operator=(const match_results&) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005247// match_results(match_results&& __m) = default;
5248// match_results& operator=(match_results&& __m) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005249// ~match_results() = default;
5250
Howard Hinnant31aaf552010-12-08 21:07:55 +00005251 _LIBCPP_INLINE_VISIBILITY
5252 bool ready() const {return __ready_;}
5253
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005254 // size:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005255 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005256 size_type size() const {return __matches_.size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005257 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005258 size_type max_size() const {return __matches_.max_size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005259 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005260 bool empty() const {return size() == 0;}
5261
5262 // element access:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005263 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005264 difference_type length(size_type __sub = 0) const
5265 {return (*this)[__sub].length();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005266 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005267 difference_type position(size_type __sub = 0) const
Howard Hinnant0949eed2011-06-30 21:18:19 +00005268 {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005269 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005270 string_type str(size_type __sub = 0) const
5271 {return (*this)[__sub].str();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005272 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005273 const_reference operator[](size_type __n) const
5274 {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
5275
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005276 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005277 const_reference prefix() const {return __prefix_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005278 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005279 const_reference suffix() const {return __suffix_;}
5280
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005281 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005282 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005283 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005284 const_iterator end() const {return __matches_.end();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005285 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005286 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005287 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005288 const_iterator cend() const {return __matches_.end();}
5289
5290 // format:
5291 template <class _OutputIter>
5292 _OutputIter
5293 format(_OutputIter __out, const char_type* __fmt_first,
5294 const char_type* __fmt_last,
5295 regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5296 template <class _OutputIter, class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005297 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005298 _OutputIter
5299 format(_OutputIter __out, const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005300 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5301 {return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005302 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005303 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005304 basic_string<char_type, _ST, _SA>
5305 format(const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005306 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5307 {
5308 basic_string<char_type, _ST, _SA> __r;
5309 format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5310 __flags);
5311 return __r;
5312 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005313 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005314 string_type
5315 format(const char_type* __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005316 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5317 {
5318 string_type __r;
5319 format(back_inserter(__r), __fmt,
5320 __fmt + char_traits<char_type>::length(__fmt), __flags);
5321 return __r;
5322 }
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005323
5324 // allocator:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005325 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005326 allocator_type get_allocator() const {return __matches_.get_allocator();}
5327
5328 // swap:
5329 void swap(match_results& __m);
5330
Howard Hinnant99968442011-11-29 18:15:50 +00005331 template <class _Bp, class _Ap>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005332 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005333 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
Howard Hinnant99968442011-11-29 18:15:50 +00005334 const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005335 {
Howard Hinnant99968442011-11-29 18:15:50 +00005336 _Bp __mf = __m.prefix().first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005337 __matches_.resize(__m.size());
5338 for (size_type __i = 0; __i < __matches_.size(); ++__i)
5339 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005340 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5341 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005342 __matches_[__i].matched = __m[__i].matched;
5343 }
5344 __unmatched_.first = __l;
5345 __unmatched_.second = __l;
5346 __unmatched_.matched = false;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005347 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5348 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005349 __prefix_.matched = __m.prefix().matched;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005350 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5351 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005352 __suffix_.matched = __m.suffix().matched;
Howard Hinnanta712c722010-08-16 20:21:16 +00005353 if (!__no_update_pos)
5354 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005355 __ready_ = __m.ready();
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005356 }
5357
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005358private:
5359 void __init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005360 _BidirectionalIterator __f, _BidirectionalIterator __l,
5361 bool __no_update_pos = false);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005362
5363 template <class, class> friend class basic_regex;
5364
Howard Hinnant99968442011-11-29 18:15:50 +00005365 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005366 friend
5367 bool
Howard Hinnant99968442011-11-29 18:15:50 +00005368 regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005369 regex_constants::match_flag_type);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005370
Howard Hinnant99968442011-11-29 18:15:50 +00005371 template <class _Bp, class _Ap>
Howard Hinnant27405f92010-08-14 18:14:02 +00005372 friend
5373 bool
Howard Hinnant99968442011-11-29 18:15:50 +00005374 operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
Howard Hinnant27405f92010-08-14 18:14:02 +00005375
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005376 template <class, class> friend class __lookahead;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005377};
5378
5379template <class _BidirectionalIterator, class _Allocator>
5380match_results<_BidirectionalIterator, _Allocator>::match_results(
5381 const allocator_type& __a)
5382 : __matches_(__a),
5383 __unmatched_(),
5384 __prefix_(),
Howard Hinnanta712c722010-08-16 20:21:16 +00005385 __suffix_(),
Howard Hinnant31aaf552010-12-08 21:07:55 +00005386 __position_start_(),
5387 __ready_(false)
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005388{
5389}
5390
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005391template <class _BidirectionalIterator, class _Allocator>
5392void
5393match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005394 _BidirectionalIterator __f, _BidirectionalIterator __l,
5395 bool __no_update_pos)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005396{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005397 __unmatched_.first = __l;
5398 __unmatched_.second = __l;
5399 __unmatched_.matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005400 __matches_.assign(__s, __unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005401 __prefix_.first = __f;
5402 __prefix_.second = __f;
5403 __prefix_.matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005404 __suffix_ = __unmatched_;
Howard Hinnanta712c722010-08-16 20:21:16 +00005405 if (!__no_update_pos)
5406 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005407 __ready_ = true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005408}
5409
Howard Hinnant27405f92010-08-14 18:14:02 +00005410template <class _BidirectionalIterator, class _Allocator>
5411template <class _OutputIter>
5412_OutputIter
5413match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __out,
5414 const char_type* __fmt_first, const char_type* __fmt_last,
5415 regex_constants::match_flag_type __flags) const
5416{
5417 if (__flags & regex_constants::format_sed)
5418 {
5419 for (; __fmt_first != __fmt_last; ++__fmt_first)
5420 {
5421 if (*__fmt_first == '&')
Howard Hinnant0949eed2011-06-30 21:18:19 +00005422 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
Howard Hinnant27405f92010-08-14 18:14:02 +00005423 __out);
5424 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5425 {
5426 ++__fmt_first;
5427 if ('0' <= *__fmt_first && *__fmt_first <= '9')
5428 {
5429 size_t __i = *__fmt_first - '0';
Howard Hinnant0949eed2011-06-30 21:18:19 +00005430 __out = _VSTD::copy(__matches_[__i].first,
Howard Hinnant27405f92010-08-14 18:14:02 +00005431 __matches_[__i].second, __out);
5432 }
5433 else
5434 {
5435 *__out = *__fmt_first;
5436 ++__out;
5437 }
5438 }
5439 else
5440 {
5441 *__out = *__fmt_first;
5442 ++__out;
5443 }
5444 }
5445 }
5446 else
5447 {
5448 for (; __fmt_first != __fmt_last; ++__fmt_first)
5449 {
5450 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5451 {
5452 switch (__fmt_first[1])
5453 {
5454 case '$':
5455 *__out = *++__fmt_first;
5456 ++__out;
5457 break;
5458 case '&':
5459 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005460 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
Howard Hinnant27405f92010-08-14 18:14:02 +00005461 __out);
5462 break;
5463 case '`':
5464 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005465 __out = _VSTD::copy(__prefix_.first, __prefix_.second, __out);
Howard Hinnant27405f92010-08-14 18:14:02 +00005466 break;
5467 case '\'':
5468 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005469 __out = _VSTD::copy(__suffix_.first, __suffix_.second, __out);
Howard Hinnant27405f92010-08-14 18:14:02 +00005470 break;
5471 default:
5472 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5473 {
5474 ++__fmt_first;
5475 size_t __i = *__fmt_first - '0';
5476 if (__fmt_first + 1 != __fmt_last &&
5477 '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5478 {
5479 ++__fmt_first;
5480 __i = 10 * __i + *__fmt_first - '0';
5481 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005482 __out = _VSTD::copy(__matches_[__i].first,
Howard Hinnant27405f92010-08-14 18:14:02 +00005483 __matches_[__i].second, __out);
5484 }
5485 else
5486 {
5487 *__out = *__fmt_first;
5488 ++__out;
5489 }
5490 break;
5491 }
5492 }
5493 else
5494 {
5495 *__out = *__fmt_first;
5496 ++__out;
5497 }
5498 }
5499 }
5500 return __out;
5501}
5502
5503template <class _BidirectionalIterator, class _Allocator>
5504void
5505match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5506{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005507 using _VSTD::swap;
Howard Hinnant27405f92010-08-14 18:14:02 +00005508 swap(__matches_, __m.__matches_);
5509 swap(__unmatched_, __m.__unmatched_);
5510 swap(__prefix_, __m.__prefix_);
5511 swap(__suffix_, __m.__suffix_);
Howard Hinnanta712c722010-08-16 20:21:16 +00005512 swap(__position_start_, __m.__position_start_);
Howard Hinnant31aaf552010-12-08 21:07:55 +00005513 swap(__ready_, __m.__ready_);
Howard Hinnant27405f92010-08-14 18:14:02 +00005514}
5515
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005516typedef match_results<const char*> cmatch;
5517typedef match_results<const wchar_t*> wcmatch;
5518typedef match_results<string::const_iterator> smatch;
5519typedef match_results<wstring::const_iterator> wsmatch;
5520
5521template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005522bool
5523operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5524 const match_results<_BidirectionalIterator, _Allocator>& __y)
5525{
Howard Hinnant31aaf552010-12-08 21:07:55 +00005526 if (__x.__ready_ != __y.__ready_)
5527 return false;
5528 if (!__x.__ready_)
5529 return true;
Howard Hinnant27405f92010-08-14 18:14:02 +00005530 return __x.__matches_ == __y.__matches_ &&
5531 __x.__prefix_ == __y.__prefix_ &&
Howard Hinnant31aaf552010-12-08 21:07:55 +00005532 __x.__suffix_ == __y.__suffix_;
Howard Hinnant27405f92010-08-14 18:14:02 +00005533}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005534
5535template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005536inline _LIBCPP_INLINE_VISIBILITY
5537bool
5538operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5539 const match_results<_BidirectionalIterator, _Allocator>& __y)
5540{
5541 return !(__x == __y);
5542}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005543
5544template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005545inline _LIBCPP_INLINE_VISIBILITY
5546void
5547swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5548 match_results<_BidirectionalIterator, _Allocator>& __y)
5549{
5550 __x.swap(__y);
5551}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005552
5553// regex_search
5554
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005555template <class _CharT, class _Traits>
Howard Hinnant17615b02010-07-27 01:25:38 +00005556template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005557bool
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005558basic_regex<_CharT, _Traits>::__match_at_start_ecma(
Howard Hinnant17615b02010-07-27 01:25:38 +00005559 const _CharT* __first, const _CharT* __last,
5560 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005561 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005562{
Howard Hinnant17615b02010-07-27 01:25:38 +00005563 vector<__state> __states;
Howard Hinnant17615b02010-07-27 01:25:38 +00005564 __node* __st = __start_.get();
5565 if (__st)
5566 {
5567 __states.push_back(__state());
5568 __states.back().__do_ = 0;
5569 __states.back().__first_ = __first;
5570 __states.back().__current_ = __first;
5571 __states.back().__last_ = __last;
5572 __states.back().__sub_matches_.resize(mark_count());
5573 __states.back().__loop_data_.resize(__loop_count());
5574 __states.back().__node_ = __st;
5575 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005576 __states.back().__at_first_ = __at_first;
Howard Hinnant17615b02010-07-27 01:25:38 +00005577 do
5578 {
5579 __state& __s = __states.back();
5580 if (__s.__node_)
5581 __s.__node_->__exec(__s);
5582 switch (__s.__do_)
5583 {
5584 case __state::__end_state:
5585 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005586 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
Howard Hinnant17615b02010-07-27 01:25:38 +00005587 __m.__matches_[0].matched = true;
5588 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5589 __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5590 return true;
5591 case __state::__accept_and_consume:
5592 case __state::__repeat:
5593 case __state::__accept_but_not_consume:
5594 break;
5595 case __state::__split:
5596 {
5597 __state __snext = __s;
5598 __s.__node_->__exec_split(true, __s);
5599 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005600 __states.push_back(_VSTD::move(__snext));
Howard Hinnant17615b02010-07-27 01:25:38 +00005601 }
5602 break;
5603 case __state::__reject:
5604 __states.pop_back();
5605 break;
5606 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005607#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005608 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005609#endif
Howard Hinnant17615b02010-07-27 01:25:38 +00005610 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00005611
Howard Hinnant17615b02010-07-27 01:25:38 +00005612 }
5613 } while (!__states.empty());
5614 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005615 return false;
5616}
5617
5618template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005619template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005620bool
5621basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5622 const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005623 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005624 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005625{
Howard Hinnantac303862010-07-12 15:51:17 +00005626 deque<__state> __states;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005627 ptrdiff_t __highest_j = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00005628 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005629 __node* __st = __start_.get();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005630 if (__st)
5631 {
Howard Hinnantac303862010-07-12 15:51:17 +00005632 __states.push_back(__state());
Howard Hinnantac303862010-07-12 15:51:17 +00005633 __states.back().__do_ = 0;
5634 __states.back().__first_ = __first;
5635 __states.back().__current_ = __first;
5636 __states.back().__last_ = __last;
5637 __states.back().__loop_data_.resize(__loop_count());
5638 __states.back().__node_ = __st;
5639 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005640 __states.back().__at_first_ = __at_first;
Howard Hinnant68025ed2010-07-14 15:45:11 +00005641 bool __matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005642 do
5643 {
Howard Hinnantac303862010-07-12 15:51:17 +00005644 __state& __s = __states.back();
5645 if (__s.__node_)
5646 __s.__node_->__exec(__s);
5647 switch (__s.__do_)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005648 {
Howard Hinnantac303862010-07-12 15:51:17 +00005649 case __state::__end_state:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005650 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant68025ed2010-07-14 15:45:11 +00005651 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005652 __matched = true;
Howard Hinnant99968442011-11-29 18:15:50 +00005653 if (__highest_j == _Np)
Howard Hinnantac303862010-07-12 15:51:17 +00005654 __states.clear();
5655 else
5656 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005657 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005658 case __state::__consume_input:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005659 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005660 case __state::__accept_and_consume:
Howard Hinnant0949eed2011-06-30 21:18:19 +00005661 __states.push_front(_VSTD::move(__s));
Howard Hinnantac303862010-07-12 15:51:17 +00005662 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005663 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005664 case __state::__repeat:
5665 case __state::__accept_but_not_consume:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005666 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005667 case __state::__split:
5668 {
5669 __state __snext = __s;
5670 __s.__node_->__exec_split(true, __s);
5671 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005672 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005673 }
5674 break;
5675 case __state::__reject:
5676 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005677 break;
5678 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005679#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005680 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005681#endif
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005682 break;
5683 }
Howard Hinnantac303862010-07-12 15:51:17 +00005684 } while (!__states.empty());
Howard Hinnant68025ed2010-07-14 15:45:11 +00005685 if (__matched)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005686 {
5687 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005688 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005689 __m.__matches_[0].matched = true;
5690 return true;
5691 }
5692 }
5693 return false;
5694}
5695
5696template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005697template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005698bool
5699basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005700 const _CharT* __first, const _CharT* __last,
5701 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005702 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005703{
Howard Hinnantac303862010-07-12 15:51:17 +00005704 vector<__state> __states;
Howard Hinnantac303862010-07-12 15:51:17 +00005705 __state __best_state;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005706 ptrdiff_t __j = 0;
5707 ptrdiff_t __highest_j = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00005708 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005709 __node* __st = __start_.get();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005710 if (__st)
5711 {
Howard Hinnantac303862010-07-12 15:51:17 +00005712 __states.push_back(__state());
5713 __states.back().__do_ = 0;
5714 __states.back().__first_ = __first;
5715 __states.back().__current_ = __first;
5716 __states.back().__last_ = __last;
5717 __states.back().__sub_matches_.resize(mark_count());
5718 __states.back().__loop_data_.resize(__loop_count());
5719 __states.back().__node_ = __st;
5720 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005721 __states.back().__at_first_ = __at_first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005722 const _CharT* __current = __first;
Howard Hinnantac303862010-07-12 15:51:17 +00005723 bool __matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005724 do
5725 {
Howard Hinnantac303862010-07-12 15:51:17 +00005726 __state& __s = __states.back();
5727 if (__s.__node_)
5728 __s.__node_->__exec(__s);
5729 switch (__s.__do_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005730 {
Howard Hinnantac303862010-07-12 15:51:17 +00005731 case __state::__end_state:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005732 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005733 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005734 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantac303862010-07-12 15:51:17 +00005735 __best_state = __s;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005736 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005737 __matched = true;
Howard Hinnant99968442011-11-29 18:15:50 +00005738 if (__highest_j == _Np)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005739 __states.clear();
5740 else
5741 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005742 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005743 case __state::__accept_and_consume:
Howard Hinnantcba352d2010-07-12 18:16:05 +00005744 __j += __s.__current_ - __current;
5745 __current = __s.__current_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005746 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005747 case __state::__repeat:
5748 case __state::__accept_but_not_consume:
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005749 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005750 case __state::__split:
5751 {
5752 __state __snext = __s;
5753 __s.__node_->__exec_split(true, __s);
5754 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005755 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005756 }
5757 break;
5758 case __state::__reject:
5759 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005760 break;
5761 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005762#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005763 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005764#endif
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005765 break;
5766 }
Howard Hinnantac303862010-07-12 15:51:17 +00005767 } while (!__states.empty());
5768 if (__matched)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005769 {
5770 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005771 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005772 __m.__matches_[0].matched = true;
Howard Hinnantac303862010-07-12 15:51:17 +00005773 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
5774 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005775 return true;
5776 }
5777 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005778 return false;
5779}
5780
5781template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005782template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005783bool
5784basic_regex<_CharT, _Traits>::__match_at_start(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005785 const _CharT* __first, const _CharT* __last,
5786 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005787 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005788{
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005789 if ((__flags_ & 0x1F0) == ECMAScript)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005790 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005791 if (mark_count() == 0)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005792 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
5793 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005794}
5795
5796template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005797template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005798bool
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005799basic_regex<_CharT, _Traits>::__search(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005800 const _CharT* __first, const _CharT* __last,
5801 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005802 regex_constants::match_flag_type __flags) const
5803{
Howard Hinnanta712c722010-08-16 20:21:16 +00005804 __m.__init(1 + mark_count(), __first, __last,
5805 __flags & regex_constants::__no_update_pos);
Howard Hinnant7670f7d2013-07-09 17:29:09 +00005806 if (__match_at_start(__first, __last, __m, __flags,
5807 !(__flags & regex_constants::__no_update_pos)))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005808 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005809 __m.__prefix_.second = __m[0].first;
5810 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5811 __m.__suffix_.first = __m[0].second;
5812 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5813 return true;
5814 }
Howard Hinnant8daa7332010-07-29 01:15:27 +00005815 if (__first != __last && !(__flags & regex_constants::match_continuous))
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005816 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005817 __flags |= regex_constants::match_prev_avail;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005818 for (++__first; __first != __last; ++__first)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005819 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005820 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005821 if (__match_at_start(__first, __last, __m, __flags, false))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005822 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005823 __m.__prefix_.second = __m[0].first;
5824 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5825 __m.__suffix_.first = __m[0].second;
5826 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5827 return true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005828 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005829 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005830 }
5831 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005832 __m.__matches_.clear();
5833 return false;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005834}
5835
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005836template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005837inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005838bool
5839regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5840 match_results<_BidirectionalIterator, _Allocator>& __m,
5841 const basic_regex<_CharT, _Traits>& __e,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005842 regex_constants::match_flag_type __flags = regex_constants::match_default)
5843{
Howard Hinnante8402082013-07-11 15:32:55 +00005844 int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
5845 basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005846 match_results<const _CharT*> __mc;
Howard Hinnante8402082013-07-11 15:32:55 +00005847 bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005848 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005849 return __r;
5850}
5851
Howard Hinnanta9602d52013-06-29 23:45:43 +00005852template <class _Iter, class _Allocator, class _CharT, class _Traits>
5853inline _LIBCPP_INLINE_VISIBILITY
5854bool
5855regex_search(__wrap_iter<_Iter> __first,
5856 __wrap_iter<_Iter> __last,
5857 match_results<__wrap_iter<_Iter>, _Allocator>& __m,
5858 const basic_regex<_CharT, _Traits>& __e,
5859 regex_constants::match_flag_type __flags = regex_constants::match_default)
5860{
5861 match_results<const _CharT*> __mc;
5862 bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
5863 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
5864 return __r;
5865}
5866
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005867template <class _Allocator, class _CharT, class _Traits>
5868inline _LIBCPP_INLINE_VISIBILITY
5869bool
5870regex_search(const _CharT* __first, const _CharT* __last,
5871 match_results<const _CharT*, _Allocator>& __m,
5872 const basic_regex<_CharT, _Traits>& __e,
5873 regex_constants::match_flag_type __flags = regex_constants::match_default)
5874{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005875 return __e.__search(__first, __last, __m, __flags);
5876}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005877
5878template <class _BidirectionalIterator, class _CharT, class _Traits>
5879inline _LIBCPP_INLINE_VISIBILITY
5880bool
5881regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5882 const basic_regex<_CharT, _Traits>& __e,
5883 regex_constants::match_flag_type __flags = regex_constants::match_default)
5884{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005885 basic_string<_CharT> __s(__first, __last);
5886 match_results<const _CharT*> __mc;
5887 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5888}
5889
5890template <class _CharT, class _Traits>
5891inline _LIBCPP_INLINE_VISIBILITY
5892bool
5893regex_search(const _CharT* __first, const _CharT* __last,
5894 const basic_regex<_CharT, _Traits>& __e,
5895 regex_constants::match_flag_type __flags = regex_constants::match_default)
5896{
5897 match_results<const _CharT*> __mc;
5898 return __e.__search(__first, __last, __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005899}
5900
5901template <class _CharT, class _Allocator, class _Traits>
5902inline _LIBCPP_INLINE_VISIBILITY
5903bool
5904regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5905 const basic_regex<_CharT, _Traits>& __e,
5906 regex_constants::match_flag_type __flags = regex_constants::match_default)
5907{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005908 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005909}
5910
5911template <class _CharT, class _Traits>
5912inline _LIBCPP_INLINE_VISIBILITY
5913bool
5914regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5915 regex_constants::match_flag_type __flags = regex_constants::match_default)
5916{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005917 match_results<const _CharT*> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005918 return _VSTD::regex_search(__str, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005919}
5920
5921template <class _ST, class _SA, class _CharT, class _Traits>
5922inline _LIBCPP_INLINE_VISIBILITY
5923bool
5924regex_search(const basic_string<_CharT, _ST, _SA>& __s,
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 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005930}
5931
5932template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5933inline _LIBCPP_INLINE_VISIBILITY
5934bool
5935regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5936 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5937 const basic_regex<_CharT, _Traits>& __e,
5938 regex_constants::match_flag_type __flags = regex_constants::match_default)
5939{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005940 match_results<const _CharT*> __mc;
5941 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005942 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005943 return __r;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005944}
5945
5946// regex_match
5947
5948template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
5949bool
5950regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
5951 match_results<_BidirectionalIterator, _Allocator>& __m,
5952 const basic_regex<_CharT, _Traits>& __e,
5953 regex_constants::match_flag_type __flags = regex_constants::match_default)
5954{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005955 bool __r = _VSTD::regex_search(__first, __last, __m, __e,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005956 __flags | regex_constants::match_continuous);
5957 if (__r)
5958 {
5959 __r = !__m.suffix().matched;
5960 if (!__r)
5961 __m.__matches_.clear();
5962 }
5963 return __r;
5964}
5965
5966template <class _BidirectionalIterator, class _CharT, class _Traits>
5967inline _LIBCPP_INLINE_VISIBILITY
5968bool
5969regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
5970 const basic_regex<_CharT, _Traits>& __e,
5971 regex_constants::match_flag_type __flags = regex_constants::match_default)
5972{
5973 match_results<_BidirectionalIterator> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005974 return _VSTD::regex_match(__first, __last, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005975}
5976
5977template <class _CharT, class _Allocator, class _Traits>
5978inline _LIBCPP_INLINE_VISIBILITY
5979bool
5980regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5981 const basic_regex<_CharT, _Traits>& __e,
5982 regex_constants::match_flag_type __flags = regex_constants::match_default)
5983{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005984 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005985}
5986
5987template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5988inline _LIBCPP_INLINE_VISIBILITY
5989bool
5990regex_match(const basic_string<_CharT, _ST, _SA>& __s,
5991 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5992 const basic_regex<_CharT, _Traits>& __e,
5993 regex_constants::match_flag_type __flags = regex_constants::match_default)
5994{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005995 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005996}
5997
5998template <class _CharT, class _Traits>
5999inline _LIBCPP_INLINE_VISIBILITY
6000bool
6001regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6002 regex_constants::match_flag_type __flags = regex_constants::match_default)
6003{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006004 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006005}
6006
6007template <class _ST, class _SA, class _CharT, class _Traits>
6008inline _LIBCPP_INLINE_VISIBILITY
6009bool
6010regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6011 const basic_regex<_CharT, _Traits>& __e,
6012 regex_constants::match_flag_type __flags = regex_constants::match_default)
6013{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006014 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006015}
6016
Howard Hinnanta712c722010-08-16 20:21:16 +00006017// regex_iterator
6018
6019template <class _BidirectionalIterator,
6020 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6021 class _Traits = regex_traits<_CharT> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +00006022class _LIBCPP_TYPE_VIS_ONLY regex_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00006023{
6024public:
6025 typedef basic_regex<_CharT, _Traits> regex_type;
6026 typedef match_results<_BidirectionalIterator> value_type;
6027 typedef ptrdiff_t difference_type;
6028 typedef const value_type* pointer;
6029 typedef const value_type& reference;
6030 typedef forward_iterator_tag iterator_category;
6031
6032private:
6033 _BidirectionalIterator __begin_;
6034 _BidirectionalIterator __end_;
6035 const regex_type* __pregex_;
6036 regex_constants::match_flag_type __flags_;
6037 value_type __match_;
6038
6039public:
6040 regex_iterator();
6041 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6042 const regex_type& __re,
6043 regex_constants::match_flag_type __m = regex_constants::match_default);
6044
6045 bool operator==(const regex_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006046 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006047 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
6048
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006049 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006050 reference operator*() const {return __match_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006051 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006052 pointer operator->() const {return &__match_;}
6053
6054 regex_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006055 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006056 regex_iterator operator++(int)
6057 {
6058 regex_iterator __t(*this);
6059 ++(*this);
6060 return __t;
6061 }
6062};
6063
6064template <class _BidirectionalIterator, class _CharT, class _Traits>
6065regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
6066 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
6067{
6068}
6069
6070template <class _BidirectionalIterator, class _CharT, class _Traits>
6071regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6072 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6073 const regex_type& __re, regex_constants::match_flag_type __m)
6074 : __begin_(__a),
6075 __end_(__b),
6076 __pregex_(&__re),
6077 __flags_(__m)
6078{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006079 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
Howard Hinnanta712c722010-08-16 20:21:16 +00006080}
6081
6082template <class _BidirectionalIterator, class _CharT, class _Traits>
6083bool
6084regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6085 operator==(const regex_iterator& __x) const
6086{
6087 if (__match_.empty() && __x.__match_.empty())
6088 return true;
6089 if (__match_.empty() || __x.__match_.empty())
6090 return false;
6091 return __begin_ == __x.__begin_ &&
6092 __end_ == __x.__end_ &&
6093 __pregex_ == __x.__pregex_ &&
6094 __flags_ == __x.__flags_ &&
6095 __match_[0] == __x.__match_[0];
6096}
6097
6098template <class _BidirectionalIterator, class _CharT, class _Traits>
6099regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6100regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6101{
6102 __flags_ |= regex_constants::__no_update_pos;
6103 _BidirectionalIterator __start = __match_[0].second;
Howard Hinnanta9602d52013-06-29 23:45:43 +00006104 if (__match_.empty())
Howard Hinnanta712c722010-08-16 20:21:16 +00006105 {
6106 if (__start == __end_)
6107 {
6108 __match_ = value_type();
6109 return *this;
6110 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00006111 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
Howard Hinnanta712c722010-08-16 20:21:16 +00006112 __flags_ | regex_constants::match_not_null |
6113 regex_constants::match_continuous))
6114 return *this;
6115 else
6116 ++__start;
6117 }
6118 __flags_ |= regex_constants::match_prev_avail;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006119 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
Howard Hinnanta712c722010-08-16 20:21:16 +00006120 __match_ = value_type();
6121 return *this;
6122}
6123
6124typedef regex_iterator<const char*> cregex_iterator;
6125typedef regex_iterator<const wchar_t*> wcregex_iterator;
6126typedef regex_iterator<string::const_iterator> sregex_iterator;
6127typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
6128
6129// regex_token_iterator
6130
6131template <class _BidirectionalIterator,
6132 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6133 class _Traits = regex_traits<_CharT> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +00006134class _LIBCPP_TYPE_VIS_ONLY regex_token_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00006135{
6136public:
6137 typedef basic_regex<_CharT, _Traits> regex_type;
6138 typedef sub_match<_BidirectionalIterator> value_type;
6139 typedef ptrdiff_t difference_type;
6140 typedef const value_type* pointer;
6141 typedef const value_type& reference;
6142 typedef forward_iterator_tag iterator_category;
6143
Howard Hinnant262b7792010-08-17 20:42:03 +00006144private:
6145 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6146
6147 _Position __position_;
6148 const value_type* __result_;
6149 value_type __suffix_;
6150 ptrdiff_t _N_;
6151 vector<int> __subs_;
6152
6153public:
Howard Hinnanta712c722010-08-16 20:21:16 +00006154 regex_token_iterator();
6155 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6156 const regex_type& __re, int __submatch = 0,
Howard Hinnant262b7792010-08-17 20:42:03 +00006157 regex_constants::match_flag_type __m =
6158 regex_constants::match_default);
Howard Hinnanta712c722010-08-16 20:21:16 +00006159 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6160 const regex_type& __re, const vector<int>& __submatches,
Howard Hinnant262b7792010-08-17 20:42:03 +00006161 regex_constants::match_flag_type __m =
6162 regex_constants::match_default);
Howard Hinnante3e32912011-08-12 21:56:02 +00006163#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnanta712c722010-08-16 20:21:16 +00006164 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
Howard Hinnant262b7792010-08-17 20:42:03 +00006165 const regex_type& __re,
6166 initializer_list<int> __submatches,
6167 regex_constants::match_flag_type __m =
6168 regex_constants::match_default);
Howard Hinnante3e32912011-08-12 21:56:02 +00006169#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant99968442011-11-29 18:15:50 +00006170 template <size_t _Np>
Howard Hinnant262b7792010-08-17 20:42:03 +00006171 regex_token_iterator(_BidirectionalIterator __a,
6172 _BidirectionalIterator __b,
6173 const regex_type& __re,
Howard Hinnant99968442011-11-29 18:15:50 +00006174 const int (&__submatches)[_Np],
Howard Hinnant262b7792010-08-17 20:42:03 +00006175 regex_constants::match_flag_type __m =
6176 regex_constants::match_default);
Howard Hinnanta712c722010-08-16 20:21:16 +00006177 regex_token_iterator(const regex_token_iterator&);
6178 regex_token_iterator& operator=(const regex_token_iterator&);
6179
Howard Hinnant262b7792010-08-17 20:42:03 +00006180 bool operator==(const regex_token_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006181 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006182 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
Howard Hinnanta712c722010-08-16 20:21:16 +00006183
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006184 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006185 const value_type& operator*() const {return *__result_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006186 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006187 const value_type* operator->() const {return __result_;}
Howard Hinnanta712c722010-08-16 20:21:16 +00006188
6189 regex_token_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006190 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006191 regex_token_iterator operator++(int)
6192 {
6193 regex_token_iterator __t(*this);
6194 ++(*this);
6195 return __t;
6196 }
6197
6198private:
6199 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006200 void __establish_result () {
6201 if (__subs_[_N_] == -1)
6202 __result_ = &__position_->prefix();
6203 else
6204 __result_ = &(*__position_)[__subs_[_N_]];
6205 }
Howard Hinnanta712c722010-08-16 20:21:16 +00006206};
6207
Howard Hinnant262b7792010-08-17 20:42:03 +00006208template <class _BidirectionalIterator, class _CharT, class _Traits>
6209regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6210 regex_token_iterator()
6211 : __result_(nullptr),
6212 __suffix_(),
6213 _N_(0)
6214{
6215}
6216
6217template <class _BidirectionalIterator, class _CharT, class _Traits>
6218void
6219regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6220 __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6221{
6222 if (__position_ != _Position())
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006223 __establish_result ();
Howard Hinnant262b7792010-08-17 20:42:03 +00006224 else if (__subs_[_N_] == -1)
6225 {
6226 __suffix_.matched = true;
6227 __suffix_.first = __a;
6228 __suffix_.second = __b;
6229 __result_ = &__suffix_;
6230 }
6231 else
6232 __result_ = nullptr;
6233}
6234
6235template <class _BidirectionalIterator, class _CharT, class _Traits>
6236regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6237 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6238 const regex_type& __re, int __submatch,
6239 regex_constants::match_flag_type __m)
6240 : __position_(__a, __b, __re, __m),
6241 _N_(0),
6242 __subs_(1, __submatch)
6243{
6244 __init(__a, __b);
6245}
6246
6247template <class _BidirectionalIterator, class _CharT, class _Traits>
6248regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6249 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6250 const regex_type& __re, const vector<int>& __submatches,
6251 regex_constants::match_flag_type __m)
6252 : __position_(__a, __b, __re, __m),
6253 _N_(0),
6254 __subs_(__submatches)
6255{
6256 __init(__a, __b);
6257}
6258
Howard Hinnante3e32912011-08-12 21:56:02 +00006259#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6260
Howard Hinnant262b7792010-08-17 20:42:03 +00006261template <class _BidirectionalIterator, class _CharT, class _Traits>
6262regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6263 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6264 const regex_type& __re,
6265 initializer_list<int> __submatches,
6266 regex_constants::match_flag_type __m)
6267 : __position_(__a, __b, __re, __m),
6268 _N_(0),
6269 __subs_(__submatches)
6270{
6271 __init(__a, __b);
6272}
6273
Howard Hinnante3e32912011-08-12 21:56:02 +00006274#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6275
Howard Hinnant262b7792010-08-17 20:42:03 +00006276template <class _BidirectionalIterator, class _CharT, class _Traits>
Howard Hinnant99968442011-11-29 18:15:50 +00006277template <size_t _Np>
Howard Hinnant262b7792010-08-17 20:42:03 +00006278regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6279 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6280 const regex_type& __re,
Howard Hinnant99968442011-11-29 18:15:50 +00006281 const int (&__submatches)[_Np],
Howard Hinnant262b7792010-08-17 20:42:03 +00006282 regex_constants::match_flag_type __m)
6283 : __position_(__a, __b, __re, __m),
6284 _N_(0),
Howard Hinnant99968442011-11-29 18:15:50 +00006285 __subs_(__submatches, __submatches + _Np)
Howard Hinnant262b7792010-08-17 20:42:03 +00006286{
6287 __init(__a, __b);
6288}
6289
6290template <class _BidirectionalIterator, class _CharT, class _Traits>
6291regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6292 regex_token_iterator(const regex_token_iterator& __x)
6293 : __position_(__x.__position_),
6294 __result_(__x.__result_),
6295 __suffix_(__x.__suffix_),
6296 _N_(__x._N_),
6297 __subs_(__x.__subs_)
6298{
6299 if (__x.__result_ == &__x.__suffix_)
Marshall Clow72fe0ae2014-01-13 17:47:08 +00006300 __result_ = &__suffix_;
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006301 else if ( __result_ != nullptr )
6302 __establish_result ();
Howard Hinnant262b7792010-08-17 20:42:03 +00006303}
6304
6305template <class _BidirectionalIterator, class _CharT, class _Traits>
6306regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6307regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6308 operator=(const regex_token_iterator& __x)
6309{
6310 if (this != &__x)
6311 {
6312 __position_ = __x.__position_;
6313 if (__x.__result_ == &__x.__suffix_)
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006314 __result_ = &__suffix_;
Howard Hinnant262b7792010-08-17 20:42:03 +00006315 else
6316 __result_ = __x.__result_;
6317 __suffix_ = __x.__suffix_;
6318 _N_ = __x._N_;
6319 __subs_ = __x.__subs_;
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006320
6321 if ( __result_ != nullptr && __result_ != &__suffix_ )
6322 __establish_result();
Howard Hinnant262b7792010-08-17 20:42:03 +00006323 }
6324 return *this;
6325}
6326
6327template <class _BidirectionalIterator, class _CharT, class _Traits>
6328bool
6329regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6330 operator==(const regex_token_iterator& __x) const
6331{
6332 if (__result_ == nullptr && __x.__result_ == nullptr)
6333 return true;
6334 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6335 __suffix_ == __x.__suffix_)
6336 return true;
6337 if (__result_ == nullptr || __x.__result_ == nullptr)
6338 return false;
6339 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6340 return false;
6341 return __position_ == __x.__position_ && _N_ == __x._N_ &&
6342 __subs_ == __x.__subs_;
6343}
6344
6345template <class _BidirectionalIterator, class _CharT, class _Traits>
6346regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6347regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6348{
6349 _Position __prev = __position_;
6350 if (__result_ == &__suffix_)
6351 __result_ = nullptr;
6352 else if (_N_ + 1 < __subs_.size())
6353 {
6354 ++_N_;
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006355 __establish_result();
Howard Hinnant262b7792010-08-17 20:42:03 +00006356 }
6357 else
6358 {
6359 _N_ = 0;
6360 ++__position_;
6361 if (__position_ != _Position())
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006362 __establish_result();
Howard Hinnant262b7792010-08-17 20:42:03 +00006363 else
6364 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00006365 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
Howard Hinnant262b7792010-08-17 20:42:03 +00006366 && __prev->suffix().length() != 0)
6367 {
6368 __suffix_.matched = true;
6369 __suffix_.first = __prev->suffix().first;
6370 __suffix_.second = __prev->suffix().second;
6371 __result_ = &__suffix_;
6372 }
6373 else
6374 __result_ = nullptr;
6375 }
6376 }
6377 return *this;
6378}
6379
Howard Hinnanta712c722010-08-16 20:21:16 +00006380typedef regex_token_iterator<const char*> cregex_token_iterator;
6381typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
6382typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
6383typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
6384
Howard Hinnanta8d77592010-08-18 00:13:08 +00006385// regex_replace
6386
6387template <class _OutputIterator, class _BidirectionalIterator,
6388 class _Traits, class _CharT>
6389_OutputIterator
6390regex_replace(_OutputIterator __out,
6391 _BidirectionalIterator __first, _BidirectionalIterator __last,
6392 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6393 regex_constants::match_flag_type __flags = regex_constants::match_default)
6394{
6395 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6396 _Iter __i(__first, __last, __e, __flags);
6397 _Iter __eof;
6398 if (__i == __eof)
6399 {
6400 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006401 __out = _VSTD::copy(__first, __last, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006402 }
6403 else
6404 {
6405 sub_match<_BidirectionalIterator> __lm;
6406 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6407 {
6408 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006409 __out = _VSTD::copy(__i->prefix().first, __i->prefix().second, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006410 __out = __i->format(__out, __fmt, __fmt + __len, __flags);
6411 __lm = __i->suffix();
6412 if (__flags & regex_constants::format_first_only)
6413 break;
6414 }
6415 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006416 __out = _VSTD::copy(__lm.first, __lm.second, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006417 }
6418 return __out;
6419}
6420
6421template <class _OutputIterator, class _BidirectionalIterator,
6422 class _Traits, class _CharT, class _ST, class _SA>
6423inline _LIBCPP_INLINE_VISIBILITY
6424_OutputIterator
6425regex_replace(_OutputIterator __out,
6426 _BidirectionalIterator __first, _BidirectionalIterator __last,
6427 const basic_regex<_CharT, _Traits>& __e,
6428 const basic_string<_CharT, _ST, _SA>& __fmt,
6429 regex_constants::match_flag_type __flags = regex_constants::match_default)
6430{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006431 return _VSTD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006432}
6433
6434template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6435 class _FSA>
6436inline _LIBCPP_INLINE_VISIBILITY
6437basic_string<_CharT, _ST, _SA>
6438regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6439 const basic_regex<_CharT, _Traits>& __e,
6440 const basic_string<_CharT, _FST, _FSA>& __fmt,
6441 regex_constants::match_flag_type __flags = regex_constants::match_default)
6442{
6443 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006444 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006445 __fmt.c_str(), __flags);
6446 return __r;
6447}
6448
6449template <class _Traits, class _CharT, class _ST, class _SA>
6450inline _LIBCPP_INLINE_VISIBILITY
6451basic_string<_CharT, _ST, _SA>
6452regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6453 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6454 regex_constants::match_flag_type __flags = regex_constants::match_default)
6455{
6456 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006457 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006458 __fmt, __flags);
6459 return __r;
6460}
6461
6462template <class _Traits, class _CharT, class _ST, class _SA>
6463inline _LIBCPP_INLINE_VISIBILITY
6464basic_string<_CharT>
6465regex_replace(const _CharT* __s,
6466 const basic_regex<_CharT, _Traits>& __e,
6467 const basic_string<_CharT, _ST, _SA>& __fmt,
6468 regex_constants::match_flag_type __flags = regex_constants::match_default)
6469{
6470 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006471 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006472 __s + char_traits<_CharT>::length(__s), __e,
6473 __fmt.c_str(), __flags);
6474 return __r;
6475}
6476
6477template <class _Traits, class _CharT>
6478inline _LIBCPP_INLINE_VISIBILITY
6479basic_string<_CharT>
6480regex_replace(const _CharT* __s,
6481 const basic_regex<_CharT, _Traits>& __e,
6482 const _CharT* __fmt,
6483 regex_constants::match_flag_type __flags = regex_constants::match_default)
6484{
6485 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006486 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006487 __s + char_traits<_CharT>::length(__s), __e,
6488 __fmt, __flags);
6489 return __r;
6490}
6491
Howard Hinnant3257c982010-06-17 00:34:59 +00006492_LIBCPP_END_NAMESPACE_STD
6493
6494#endif // _LIBCPP_REGEX