blob: 698278c6014d2ca415b1e95454c7f1438c935e04 [file] [log] [blame]
Howard Hinnant3257c982010-06-17 00:34:59 +00001// -*- C++ -*-
2//===--------------------------- regex ------------------------------------===//
3//
4// The LLVM Compiler Infrastructure
5//
Howard Hinnantb64f8b02010-11-16 22:09:02 +00006// This file is dual licensed under the MIT and the University of Illinois Open
7// Source Licenses. See LICENSE.TXT for details.
Howard Hinnant3257c982010-06-17 00:34:59 +00008//
9//===----------------------------------------------------------------------===//
10
11#ifndef _LIBCPP_REGEX
12#define _LIBCPP_REGEX
13
14/*
15 regex synopsis
16
17#include <initializer_list>
18
19namespace std
20{
21
22namespace regex_constants
23{
24
25emum syntax_option_type
26{
27 icase = unspecified,
28 nosubs = unspecified,
29 optimize = unspecified,
30 collate = unspecified,
31 ECMAScript = unspecified,
32 basic = unspecified,
33 extended = unspecified,
34 awk = unspecified,
35 grep = unspecified,
36 egrep = unspecified
37};
38
39constexpr syntax_option_type operator~(syntax_option_type f);
40constexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs);
41constexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs);
42
43enum match_flag_type
44{
45 match_default = 0,
46 match_not_bol = unspecified,
47 match_not_eol = unspecified,
48 match_not_bow = unspecified,
49 match_not_eow = unspecified,
50 match_any = unspecified,
51 match_not_null = unspecified,
52 match_continuous = unspecified,
53 match_prev_avail = unspecified,
54 format_default = 0,
55 format_sed = unspecified,
56 format_no_copy = unspecified,
57 format_first_only = unspecified
58};
59
60constexpr match_flag_type operator~(match_flag_type f);
61constexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs);
62constexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs);
63
64enum error_type
65{
66 error_collate = unspecified,
67 error_ctype = unspecified,
68 error_escape = unspecified,
69 error_backref = unspecified,
70 error_brack = unspecified,
71 error_paren = unspecified,
72 error_brace = unspecified,
73 error_badbrace = unspecified,
74 error_range = unspecified,
75 error_space = unspecified,
76 error_badrepeat = unspecified,
77 error_complexity = unspecified,
78 error_stack = unspecified
79};
80
81} // regex_constants
82
83class regex_error
84 : public runtime_error
85{
86public:
87 explicit regex_error(regex_constants::error_type ecode);
88 regex_constants::error_type code() const;
89};
90
91template <class charT>
92struct regex_traits
93{
94public:
95 typedef charT char_type;
96 typedef basic_string<char_type> string_type;
97 typedef locale locale_type;
98 typedef /bitmask_type/ char_class_type;
99
100 regex_traits();
101
102 static size_t length(const char_type* p);
103 charT translate(charT c) const;
104 charT translate_nocase(charT c) const;
105 template <class ForwardIterator>
106 string_type
107 transform(ForwardIterator first, ForwardIterator last) const;
108 template <class ForwardIterator>
109 string_type
110 transform_primary( ForwardIterator first, ForwardIterator last) const;
111 template <class ForwardIterator>
112 string_type
113 lookup_collatename(ForwardIterator first, ForwardIterator last) const;
114 template <class ForwardIterator>
115 char_class_type
116 lookup_classname(ForwardIterator first, ForwardIterator last,
117 bool icase = false) const;
118 bool isctype(charT c, char_class_type f) const;
119 int value(charT ch, int radix) const;
120 locale_type imbue(locale_type l);
121 locale_type getloc()const;
122};
123
124template <class charT, class traits = regex_traits<charT>>
125class basic_regex
126{
127public:
128 // types:
129 typedef charT value_type;
130 typedef regex_constants::syntax_option_type flag_type;
131 typedef typename traits::locale_type locale_type;
132
133 // constants:
134 static constexpr regex_constants::syntax_option_type icase = regex_constants::icase;
135 static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
136 static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize;
137 static constexpr regex_constants::syntax_option_type collate = regex_constants::collate;
138 static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
139 static constexpr regex_constants::syntax_option_type basic = regex_constants::basic;
140 static constexpr regex_constants::syntax_option_type extended = regex_constants::extended;
141 static constexpr regex_constants::syntax_option_type awk = regex_constants::awk;
142 static constexpr regex_constants::syntax_option_type grep = regex_constants::grep;
143 static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep;
144
145 // construct/copy/destroy:
146 basic_regex();
147 explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
148 basic_regex(const charT* p, size_t len, flag_type f);
149 basic_regex(const basic_regex&);
Howard Hinnant46623a02012-07-21 01:31:58 +0000150 basic_regex(basic_regex&&) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000151 template <class ST, class SA>
152 explicit basic_regex(const basic_string<charT, ST, SA>& p,
153 flag_type f = regex_constants::ECMAScript);
154 template <class ForwardIterator>
155 basic_regex(ForwardIterator first, ForwardIterator last,
156 flag_type f = regex_constants::ECMAScript);
157 basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
158
159 ~basic_regex();
160
161 basic_regex& operator=(const basic_regex&);
Howard Hinnant46623a02012-07-21 01:31:58 +0000162 basic_regex& operator=(basic_regex&&) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000163 basic_regex& operator=(const charT* ptr);
164 basic_regex& operator=(initializer_list<charT> il);
165 template <class ST, class SA>
166 basic_regex& operator=(const basic_string<charT, ST, SA>& p);
167
168 // assign:
169 basic_regex& assign(const basic_regex& that);
Howard Hinnant46623a02012-07-21 01:31:58 +0000170 basic_regex& assign(basic_regex&& that) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000171 basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);
172 basic_regex& assign(const charT* p, size_t len, flag_type f);
173 template <class string_traits, class A>
174 basic_regex& assign(const basic_string<charT, string_traits, A>& s,
175 flag_type f = regex_constants::ECMAScript);
176 template <class InputIterator>
177 basic_regex& assign(InputIterator first, InputIterator last,
178 flag_type f = regex_constants::ECMAScript);
179 basic_regex& assign(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
180
181 // const operations:
182 unsigned mark_count() const;
183 flag_type flags() const;
184
185 // locale:
186 locale_type imbue(locale_type loc);
187 locale_type getloc() const;
188
189 // swap:
190 void swap(basic_regex&);
191};
192
193typedef basic_regex<char> regex;
194typedef basic_regex<wchar_t> wregex;
195
196template <class charT, class traits>
197 void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
198
199template <class BidirectionalIterator>
200class sub_match
201 : public pair<BidirectionalIterator, BidirectionalIterator>
202{
203public:
204 typedef typename iterator_traits<BidirectionalIterator>::value_type value_type;
205 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
206 typedef BidirectionalIterator iterator;
207 typedef basic_string<value_type> string_type;
208
209 bool matched;
210
Howard Hinnant31aaf552010-12-08 21:07:55 +0000211 constexpr sub_match();
212
Howard Hinnant3257c982010-06-17 00:34:59 +0000213 difference_type length() const;
214 operator string_type() const;
215 string_type str() const;
216
217 int compare(const sub_match& s) const;
218 int compare(const string_type& s) const;
219 int compare(const value_type* s) const;
220};
221
222typedef sub_match<const char*> csub_match;
223typedef sub_match<const wchar_t*> wcsub_match;
224typedef sub_match<string::const_iterator> ssub_match;
225typedef sub_match<wstring::const_iterator> wssub_match;
226
227template <class BiIter>
228 bool
229 operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
230
231template <class BiIter>
232 bool
233 operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
234
235template <class BiIter>
236 bool
237 operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
238
239template <class BiIter>
240 bool
241 operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
242
243template <class BiIter>
244 bool
245 operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
246
247template <class BiIter>
248 bool
249 operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
250
251template <class BiIter, class ST, class SA>
252 bool
253 operator==(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
254 const sub_match<BiIter>& rhs);
255
256template <class BiIter, class ST, class SA>
257 bool
258 operator!=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
259 const sub_match<BiIter>& rhs);
260
261template <class BiIter, class ST, class SA>
262 bool
263 operator<(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
264 const sub_match<BiIter>& rhs);
265
266template <class BiIter, class ST, class SA>
267 bool
268 operator>(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
269 const sub_match<BiIter>& rhs);
270
271template <class BiIter, class ST, class SA>
272 bool operator>=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
273 const sub_match<BiIter>& rhs);
274
275template <class BiIter, class ST, class SA>
276 bool
277 operator<=(const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& lhs,
278 const sub_match<BiIter>& rhs);
279
280template <class BiIter, class ST, class SA>
281 bool
282 operator==(const sub_match<BiIter>& lhs,
283 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
284
285template <class BiIter, class ST, class SA>
286 bool
287 operator!=(const sub_match<BiIter>& lhs,
288 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
289
290template <class BiIter, class ST, class SA>
291 bool
292 operator<(const sub_match<BiIter>& lhs,
293 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
294
295template <class BiIter, class ST, class SA>
296 bool operator>(const sub_match<BiIter>& lhs,
297 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
298
299template <class BiIter, class ST, class SA>
300 bool
301 operator>=(const sub_match<BiIter>& lhs,
302 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
303
304template <class BiIter, class ST, class SA>
305 bool
306 operator<=(const sub_match<BiIter>& lhs,
307 const basic_string<typename iterator_traits<BiIter>::value_type, ST, SA>& rhs);
308
309template <class BiIter>
310 bool
311 operator==(typename iterator_traits<BiIter>::value_type const* lhs,
312 const sub_match<BiIter>& rhs);
313
314template <class BiIter>
315 bool
316 operator!=(typename iterator_traits<BiIter>::value_type const* lhs,
317 const sub_match<BiIter>& rhs);
318
319template <class BiIter>
320 bool
321 operator<(typename iterator_traits<BiIter>::value_type const* lhs,
322 const sub_match<BiIter>& rhs);
323
324template <class BiIter>
325 bool
326 operator>(typename iterator_traits<BiIter>::value_type const* lhs,
327 const sub_match<BiIter>& rhs);
328
329template <class BiIter>
330 bool
331 operator>=(typename iterator_traits<BiIter>::value_type const* lhs,
332 const sub_match<BiIter>& rhs);
333
334template <class BiIter>
335 bool
336 operator<=(typename iterator_traits<BiIter>::value_type const* lhs,
337 const sub_match<BiIter>& rhs);
338
339template <class BiIter>
340 bool
341 operator==(const sub_match<BiIter>& lhs,
342 typename iterator_traits<BiIter>::value_type const* rhs);
343
344template <class BiIter>
345 bool
346 operator!=(const sub_match<BiIter>& lhs,
347 typename iterator_traits<BiIter>::value_type const* rhs);
348
349template <class BiIter>
350 bool
351 operator<(const sub_match<BiIter>& lhs,
352 typename iterator_traits<BiIter>::value_type const* rhs);
353
354template <class BiIter>
355 bool
356 operator>(const sub_match<BiIter>& lhs,
357 typename iterator_traits<BiIter>::value_type const* rhs);
358
359template <class BiIter>
360 bool
361 operator>=(const sub_match<BiIter>& lhs,
362 typename iterator_traits<BiIter>::value_type const* rhs);
363
364template <class BiIter>
365 bool
366 operator<=(const sub_match<BiIter>& lhs,
367 typename iterator_traits<BiIter>::value_type const* rhs);
368
369template <class BiIter>
370 bool
371 operator==(typename iterator_traits<BiIter>::value_type const& lhs,
372 const sub_match<BiIter>& rhs);
373
374template <class BiIter>
375 bool
376 operator!=(typename iterator_traits<BiIter>::value_type const& lhs,
377 const sub_match<BiIter>& rhs);
378
379template <class BiIter>
380 bool
381 operator<(typename iterator_traits<BiIter>::value_type const& lhs,
382 const sub_match<BiIter>& rhs);
383
384template <class BiIter>
385 bool
386 operator>(typename iterator_traits<BiIter>::value_type const& lhs,
387 const sub_match<BiIter>& rhs);
388
389template <class BiIter>
390 bool
391 operator>=(typename iterator_traits<BiIter>::value_type const& lhs,
392 const sub_match<BiIter>& rhs);
393
394template <class BiIter>
395 bool
396 operator<=(typename iterator_traits<BiIter>::value_type const& lhs,
397 const sub_match<BiIter>& rhs);
398
399template <class BiIter>
400 bool
401 operator==(const sub_match<BiIter>& lhs,
402 typename iterator_traits<BiIter>::value_type const& rhs);
403
404template <class BiIter>
405 bool
406 operator!=(const sub_match<BiIter>& lhs,
407 typename iterator_traits<BiIter>::value_type const& rhs);
408
409template <class BiIter>
410 bool
411 operator<(const sub_match<BiIter>& lhs,
412 typename iterator_traits<BiIter>::value_type const& rhs);
413
414template <class BiIter>
415 bool
416 operator>(const sub_match<BiIter>& lhs,
417 typename iterator_traits<BiIter>::value_type const& rhs);
418
419template <class BiIter>
420 bool
421 operator>=(const sub_match<BiIter>& lhs,
422 typename iterator_traits<BiIter>::value_type const& rhs);
423
424template <class BiIter>
425 bool
426 operator<=(const sub_match<BiIter>& lhs,
427 typename iterator_traits<BiIter>::value_type const& rhs);
428
429template <class charT, class ST, class BiIter>
430 basic_ostream<charT, ST>&
431 operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
432
433template <class BidirectionalIterator,
434 class Allocator = allocator<sub_match<BidirectionalIterator>>>
435class match_results
436{
437public:
438 typedef sub_match<BidirectionalIterator> value_type;
439 typedef const value_type& const_reference;
Marshall Clow103af342014-02-26 01:56:31 +0000440 typedef value_type& reference;
Howard Hinnant3257c982010-06-17 00:34:59 +0000441 typedef /implementation-defined/ const_iterator;
442 typedef const_iterator iterator;
443 typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
444 typedef typename allocator_traits<Allocator>::size_type size_type;
445 typedef Allocator allocator_type;
446 typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
447 typedef basic_string<char_type> string_type;
448
449 // construct/copy/destroy:
450 explicit match_results(const Allocator& a = Allocator());
451 match_results(const match_results& m);
Howard Hinnant46623a02012-07-21 01:31:58 +0000452 match_results(match_results&& m) noexcept;
Howard Hinnant3257c982010-06-17 00:34:59 +0000453 match_results& operator=(const match_results& m);
454 match_results& operator=(match_results&& m);
455 ~match_results();
456
Howard Hinnant31aaf552010-12-08 21:07:55 +0000457 bool ready() const;
458
Howard Hinnant3257c982010-06-17 00:34:59 +0000459 // size:
460 size_type size() const;
461 size_type max_size() const;
462 bool empty() const;
463
464 // element access:
465 difference_type length(size_type sub = 0) const;
466 difference_type position(size_type sub = 0) const;
467 string_type str(size_type sub = 0) const;
468 const_reference operator[](size_type n) const;
469
470 const_reference prefix() const;
471 const_reference suffix() const;
472
473 const_iterator begin() const;
474 const_iterator end() const;
475 const_iterator cbegin() const;
476 const_iterator cend() const;
477
478 // format:
479 template <class OutputIter>
480 OutputIter
481 format(OutputIter out, const char_type* fmt_first,
482 const char_type* fmt_last,
483 regex_constants::match_flag_type flags = regex_constants::format_default) const;
484 template <class OutputIter, class ST, class SA>
485 OutputIter
486 format(OutputIter out, const basic_string<char_type, ST, SA>& fmt,
487 regex_constants::match_flag_type flags = regex_constants::format_default) const;
488 template <class ST, class SA>
489 basic_string<char_type, ST, SA>
490 format(const basic_string<char_type, ST, SA>& fmt,
491 regex_constants::match_flag_type flags = regex_constants::format_default) const;
492 string_type
493 format(const char_type* fmt,
494 regex_constants::match_flag_type flags = regex_constants::format_default) const;
495
496 // allocator:
497 allocator_type get_allocator() const;
498
499 // swap:
500 void swap(match_results& that);
501};
502
503typedef match_results<const char*> cmatch;
504typedef match_results<const wchar_t*> wcmatch;
505typedef match_results<string::const_iterator> smatch;
506typedef match_results<wstring::const_iterator> wsmatch;
507
508template <class BidirectionalIterator, class Allocator>
509 bool
510 operator==(const match_results<BidirectionalIterator, Allocator>& m1,
511 const match_results<BidirectionalIterator, Allocator>& m2);
512
513template <class BidirectionalIterator, class Allocator>
514 bool
515 operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
516 const match_results<BidirectionalIterator, Allocator>& m2);
517
518template <class BidirectionalIterator, class Allocator>
519 void
520 swap(match_results<BidirectionalIterator, Allocator>& m1,
521 match_results<BidirectionalIterator, Allocator>& m2);
522
523template <class BidirectionalIterator, class Allocator, class charT, class traits>
524 bool
525 regex_match(BidirectionalIterator first, BidirectionalIterator last,
526 match_results<BidirectionalIterator, Allocator>& m,
527 const basic_regex<charT, traits>& e,
528 regex_constants::match_flag_type flags = regex_constants::match_default);
529
530template <class BidirectionalIterator, class charT, class traits>
531 bool
532 regex_match(BidirectionalIterator first, BidirectionalIterator last,
533 const basic_regex<charT, traits>& e,
534 regex_constants::match_flag_type flags = regex_constants::match_default);
535
536template <class charT, class Allocator, class traits>
537 bool
538 regex_match(const charT* str, match_results<const charT*, Allocator>& m,
539 const basic_regex<charT, traits>& e,
540 regex_constants::match_flag_type flags = regex_constants::match_default);
541
542template <class ST, class SA, class Allocator, class charT, class traits>
543 bool
544 regex_match(const basic_string<charT, ST, SA>& s,
545 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
546 const basic_regex<charT, traits>& e,
547 regex_constants::match_flag_type flags = regex_constants::match_default);
548
Marshall Clowe0f86722014-02-19 21:21:11 +0000549template <class ST, class SA, class Allocator, class charT, class traits>
550 bool
551 regex_match(const basic_string<charT, ST, SA>&& s,
552 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
553 const basic_regex<charT, traits>& e,
554 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
555
Howard Hinnant3257c982010-06-17 00:34:59 +0000556template <class charT, class traits>
557 bool
558 regex_match(const charT* str, const basic_regex<charT, traits>& e,
559 regex_constants::match_flag_type flags = regex_constants::match_default);
560
561template <class ST, class SA, class charT, class traits>
562 bool
563 regex_match(const basic_string<charT, ST, SA>& s,
564 const basic_regex<charT, traits>& e,
565 regex_constants::match_flag_type flags = regex_constants::match_default);
566
567template <class BidirectionalIterator, class Allocator, class charT, class traits>
568 bool
569 regex_search(BidirectionalIterator first, BidirectionalIterator last,
570 match_results<BidirectionalIterator, Allocator>& m,
571 const basic_regex<charT, traits>& e,
572 regex_constants::match_flag_type flags = regex_constants::match_default);
573
574template <class BidirectionalIterator, class charT, class traits>
575 bool
576 regex_search(BidirectionalIterator first, BidirectionalIterator last,
577 const basic_regex<charT, traits>& e,
578 regex_constants::match_flag_type flags = regex_constants::match_default);
579
580template <class charT, class Allocator, class traits>
581 bool
582 regex_search(const charT* str, match_results<const charT*, Allocator>& m,
583 const basic_regex<charT, traits>& e,
584 regex_constants::match_flag_type flags = regex_constants::match_default);
585
586template <class charT, class traits>
587 bool
588 regex_search(const charT* str, const basic_regex<charT, traits>& e,
589 regex_constants::match_flag_type flags = regex_constants::match_default);
590
591template <class ST, class SA, class charT, class traits>
592 bool
593 regex_search(const basic_string<charT, ST, SA>& s,
594 const basic_regex<charT, traits>& e,
595 regex_constants::match_flag_type flags = regex_constants::match_default);
596
597template <class ST, class SA, class Allocator, class charT, class traits>
598 bool
599 regex_search(const basic_string<charT, ST, SA>& s,
600 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
601 const basic_regex<charT, traits>& e,
602 regex_constants::match_flag_type flags = regex_constants::match_default);
603
Marshall Clowe0f86722014-02-19 21:21:11 +0000604template <class ST, class SA, class Allocator, class charT, class traits>
605 bool
606 regex_search(const basic_string<charT, ST, SA>&& s,
607 match_results<typename basic_string<charT, ST, SA>::const_iterator, Allocator>& m,
608 const basic_regex<charT, traits>& e,
609 regex_constants::match_flag_type flags = regex_constants::match_default) = delete; // C++14
610
Howard Hinnant3257c982010-06-17 00:34:59 +0000611template <class OutputIterator, class BidirectionalIterator,
612 class traits, class charT, class ST, class SA>
613 OutputIterator
614 regex_replace(OutputIterator out,
615 BidirectionalIterator first, BidirectionalIterator last,
616 const basic_regex<charT, traits>& e,
617 const basic_string<charT, ST, SA>& fmt,
618 regex_constants::match_flag_type flags = regex_constants::match_default);
619
620template <class OutputIterator, class BidirectionalIterator,
621 class traits, class charT>
622 OutputIterator
623 regex_replace(OutputIterator out,
624 BidirectionalIterator first, BidirectionalIterator last,
625 const basic_regex<charT, traits>& e, const charT* fmt,
626 regex_constants::match_flag_type flags = regex_constants::match_default);
627
628template <class traits, class charT, class ST, class SA, class FST, class FSA>>
629 basic_string<charT, ST, SA>
630 regex_replace(const basic_string<charT, ST, SA>& s,
631 const basic_regex<charT, traits>& e,
632 const basic_string<charT, FST, FSA>& fmt,
633 regex_constants::match_flag_type flags = regex_constants::match_default);
634
635template <class traits, class charT, class ST, class SA>
636 basic_string<charT, ST, SA>
637 regex_replace(const basic_string<charT, ST, SA>& s,
638 const basic_regex<charT, traits>& e, const charT* fmt,
639 regex_constants::match_flag_type flags = regex_constants::match_default);
640
641template <class traits, class charT, class ST, class SA>
642 basic_string<charT>
643 regex_replace(const charT* s,
644 const basic_regex<charT, traits>& e,
645 const basic_string<charT, ST, SA>& fmt,
646 regex_constants::match_flag_type flags = regex_constants::match_default);
647
648template <class traits, class charT>
649 basic_string<charT>
650 regex_replace(const charT* s,
651 const basic_regex<charT, traits>& e,
652 const charT* fmt,
653 regex_constants::match_flag_type flags = regex_constants::match_default);
654
655template <class BidirectionalIterator,
656 class charT = typename iterator_traits< BidirectionalIterator>::value_type,
657 class traits = regex_traits<charT>>
658class regex_iterator
659{
660public:
661 typedef basic_regex<charT, traits> regex_type;
662 typedef match_results<BidirectionalIterator> value_type;
663 typedef ptrdiff_t difference_type;
664 typedef const value_type* pointer;
665 typedef const value_type& reference;
666 typedef forward_iterator_tag iterator_category;
667
668 regex_iterator();
669 regex_iterator(BidirectionalIterator a, BidirectionalIterator b,
670 const regex_type& re,
671 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +0000672 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
673 const regex_type&& __re,
674 regex_constants::match_flag_type __m
675 = regex_constants::match_default) = delete; // C++14
Howard Hinnant3257c982010-06-17 00:34:59 +0000676 regex_iterator(const regex_iterator&);
677 regex_iterator& operator=(const regex_iterator&);
678
679 bool operator==(const regex_iterator&) const;
680 bool operator!=(const regex_iterator&) const;
681
682 const value_type& operator*() const;
683 const value_type* operator->() const;
684
685 regex_iterator& operator++();
686 regex_iterator operator++(int);
687};
688
689typedef regex_iterator<const char*> cregex_iterator;
690typedef regex_iterator<const wchar_t*> wcregex_iterator;
691typedef regex_iterator<string::const_iterator> sregex_iterator;
692typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
693
694template <class BidirectionalIterator,
695 class charT = typename iterator_traits< BidirectionalIterator>::value_type,
696 class traits = regex_traits<charT>>
697class regex_token_iterator
698{
699public:
700 typedef basic_regex<charT, traits> regex_type;
701 typedef sub_match<BidirectionalIterator> value_type;
702 typedef ptrdiff_t difference_type;
703 typedef const value_type* pointer;
704 typedef const value_type& reference;
705 typedef forward_iterator_tag iterator_category;
706
707 regex_token_iterator();
708 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
709 const regex_type& re, int submatch = 0,
710 regex_constants::match_flag_type m = regex_constants::match_default);
711 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Marshall Clowe0f86722014-02-19 21:21:11 +0000712 const regex_type&& re, int submatch = 0,
713 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
714 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Howard Hinnant3257c982010-06-17 00:34:59 +0000715 const regex_type& re, const vector<int>& submatches,
716 regex_constants::match_flag_type m = regex_constants::match_default);
717 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Marshall Clowe0f86722014-02-19 21:21:11 +0000718 const regex_type&& re, const vector<int>& submatches,
719 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
720 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
Howard Hinnant3257c982010-06-17 00:34:59 +0000721 const regex_type& re, initializer_list<int> submatches,
722 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +0000723 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
724 const regex_type&& re, initializer_list<int> submatches,
725 regex_constants::match_flag_type m = regex_constants::match_default) = delete; // C++14
Howard Hinnant3257c982010-06-17 00:34:59 +0000726 template <size_t N>
727 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
728 const regex_type& re, const int (&submatches)[N],
729 regex_constants::match_flag_type m = regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +0000730 template <size_t N>
731 regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b,
732 const regex_type& re, const int (&submatches)[N],
733 regex_constants::match_flag_type m = regex_constants::match_default) = delete // C++14;
Howard Hinnant3257c982010-06-17 00:34:59 +0000734 regex_token_iterator(const regex_token_iterator&);
735 regex_token_iterator& operator=(const regex_token_iterator&);
736
737 bool operator==(const regex_token_iterator&) const;
738 bool operator!=(const regex_token_iterator&) const;
739
740 const value_type& operator*() const;
741 const value_type* operator->() const;
742
743 regex_token_iterator& operator++();
744 regex_token_iterator operator++(int);
745};
746
747typedef regex_token_iterator<const char*> cregex_token_iterator;
748typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
749typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
750typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
751
752} // std
753*/
754
755#include <__config>
756#include <stdexcept>
757#include <__locale>
Howard Hinnant8c2c18d2010-06-24 21:28:00 +0000758#include <initializer_list>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +0000759#include <utility>
760#include <iterator>
761#include <string>
Howard Hinnant7e9d84b2010-06-30 00:21:42 +0000762#include <memory>
763#include <vector>
Howard Hinnantac303862010-07-12 15:51:17 +0000764#include <deque>
Howard Hinnant3257c982010-06-17 00:34:59 +0000765
Howard Hinnant66c6f972011-11-29 16:45:27 +0000766#include <__undef_min_max>
767
Howard Hinnant08e17472011-10-17 20:05:10 +0000768#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
Howard Hinnant3257c982010-06-17 00:34:59 +0000769#pragma GCC system_header
Howard Hinnant08e17472011-10-17 20:05:10 +0000770#endif
Howard Hinnant3257c982010-06-17 00:34:59 +0000771
772_LIBCPP_BEGIN_NAMESPACE_STD
773
774namespace regex_constants
775{
776
777// syntax_option_type
778
779enum syntax_option_type
780{
781 icase = 1 << 0,
782 nosubs = 1 << 1,
783 optimize = 1 << 2,
784 collate = 1 << 3,
Howard Hinnantad2a7ab2010-07-27 17:24:17 +0000785 ECMAScript = 0,
786 basic = 1 << 4,
787 extended = 1 << 5,
788 awk = 1 << 6,
789 grep = 1 << 7,
790 egrep = 1 << 8
Howard Hinnant3257c982010-06-17 00:34:59 +0000791};
792
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000793inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000794_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000795syntax_option_type
796operator~(syntax_option_type __x)
797{
Marshall Clow04bd79b2013-03-22 02:13:55 +0000798 return syntax_option_type(~int(__x) & 0x1FF);
Howard Hinnant3257c982010-06-17 00:34:59 +0000799}
800
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000801inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000802_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000803syntax_option_type
804operator&(syntax_option_type __x, syntax_option_type __y)
805{
806 return syntax_option_type(int(__x) & int(__y));
807}
808
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000809inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000810_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000811syntax_option_type
812operator|(syntax_option_type __x, syntax_option_type __y)
813{
814 return syntax_option_type(int(__x) | int(__y));
815}
816
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000817inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000818_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000819syntax_option_type
820operator^(syntax_option_type __x, syntax_option_type __y)
821{
822 return syntax_option_type(int(__x) ^ int(__y));
823}
824
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000825inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000826syntax_option_type&
827operator&=(syntax_option_type& __x, syntax_option_type __y)
828{
829 __x = __x & __y;
830 return __x;
831}
832
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000833inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000834syntax_option_type&
835operator|=(syntax_option_type& __x, syntax_option_type __y)
836{
837 __x = __x | __y;
838 return __x;
839}
840
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000841inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000842syntax_option_type&
843operator^=(syntax_option_type& __x, syntax_option_type __y)
844{
845 __x = __x ^ __y;
846 return __x;
847}
848
849// match_flag_type
850
851enum match_flag_type
852{
853 match_default = 0,
854 match_not_bol = 1 << 0,
855 match_not_eol = 1 << 1,
856 match_not_bow = 1 << 2,
857 match_not_eow = 1 << 3,
858 match_any = 1 << 4,
859 match_not_null = 1 << 5,
860 match_continuous = 1 << 6,
861 match_prev_avail = 1 << 7,
862 format_default = 0,
863 format_sed = 1 << 8,
864 format_no_copy = 1 << 9,
Howard Hinnanta712c722010-08-16 20:21:16 +0000865 format_first_only = 1 << 10,
866 __no_update_pos = 1 << 11
Howard Hinnant3257c982010-06-17 00:34:59 +0000867};
868
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000869inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000870_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000871match_flag_type
872operator~(match_flag_type __x)
873{
Marshall Clow04bd79b2013-03-22 02:13:55 +0000874 return match_flag_type(~int(__x) & 0x0FFF);
Howard Hinnant3257c982010-06-17 00:34:59 +0000875}
876
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000877inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000878_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000879match_flag_type
880operator&(match_flag_type __x, match_flag_type __y)
881{
882 return match_flag_type(int(__x) & int(__y));
883}
884
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000885inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000886_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000887match_flag_type
888operator|(match_flag_type __x, match_flag_type __y)
889{
890 return match_flag_type(int(__x) | int(__y));
891}
892
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000893inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +0000894_LIBCPP_CONSTEXPR
Howard Hinnant3257c982010-06-17 00:34:59 +0000895match_flag_type
896operator^(match_flag_type __x, match_flag_type __y)
897{
898 return match_flag_type(int(__x) ^ int(__y));
899}
900
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000901inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000902match_flag_type&
903operator&=(match_flag_type& __x, match_flag_type __y)
904{
905 __x = __x & __y;
906 return __x;
907}
908
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000909inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000910match_flag_type&
911operator|=(match_flag_type& __x, match_flag_type __y)
912{
913 __x = __x | __y;
914 return __x;
915}
916
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000917inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000918match_flag_type&
919operator^=(match_flag_type& __x, match_flag_type __y)
920{
921 __x = __x ^ __y;
922 return __x;
923}
924
925enum error_type
926{
927 error_collate = 1,
928 error_ctype,
929 error_escape,
930 error_backref,
931 error_brack,
932 error_paren,
933 error_brace,
934 error_badbrace,
935 error_range,
936 error_space,
937 error_badrepeat,
938 error_complexity,
Howard Hinnant8c2c18d2010-06-24 21:28:00 +0000939 error_stack,
Howard Hinnantad2a7ab2010-07-27 17:24:17 +0000940 __re_err_grammar,
941 __re_err_empty,
942 __re_err_unknown
Howard Hinnant3257c982010-06-17 00:34:59 +0000943};
944
945} // regex_constants
946
947class _LIBCPP_EXCEPTION_ABI regex_error
948 : public runtime_error
949{
950 regex_constants::error_type __code_;
951public:
952 explicit regex_error(regex_constants::error_type __ecode);
953 virtual ~regex_error() throw();
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000954 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000955 regex_constants::error_type code() const {return __code_;}
956};
957
958template <class _CharT>
Howard Hinnant0f678bd2013-08-12 18:38:34 +0000959struct _LIBCPP_TYPE_VIS_ONLY regex_traits
Howard Hinnant3257c982010-06-17 00:34:59 +0000960{
961public:
962 typedef _CharT char_type;
963 typedef basic_string<char_type> string_type;
964 typedef locale locale_type;
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000965 typedef ctype_base::mask char_class_type;
Howard Hinnant3257c982010-06-17 00:34:59 +0000966
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000967 static const char_class_type __regex_word = 0x80;
Howard Hinnant3257c982010-06-17 00:34:59 +0000968private:
969 locale __loc_;
970 const ctype<char_type>* __ct_;
971 const collate<char_type>* __col_;
972
973public:
974 regex_traits();
975
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000976 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000977 static size_t length(const char_type* __p)
978 {return char_traits<char_type>::length(__p);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000979 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000980 char_type translate(char_type __c) const {return __c;}
981 char_type translate_nocase(char_type __c) const;
982 template <class _ForwardIterator>
983 string_type
984 transform(_ForwardIterator __f, _ForwardIterator __l) const;
985 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000986 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000987 string_type
988 transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
989 {return __transform_primary(__f, __l, char_type());}
990 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000991 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000992 string_type
993 lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
994 {return __lookup_collatename(__f, __l, char_type());}
995 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +0000996 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +0000997 char_class_type
998 lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
Howard Hinnantf409d2f2010-06-21 21:01:43 +0000999 bool __icase = false) const
1000 {return __lookup_classname(__f, __l, __icase, char_type());}
1001 bool isctype(char_type __c, char_class_type __m) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001002 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001003 int value(char_type __ch, int __radix) const
Marshall Clow33ae2332013-10-21 15:43:25 +00001004 {return __regex_traits_value(__ch, __radix);}
Howard Hinnant3257c982010-06-17 00:34:59 +00001005 locale_type imbue(locale_type __l);
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001006 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant3257c982010-06-17 00:34:59 +00001007 locale_type getloc()const {return __loc_;}
1008
1009private:
1010 void __init();
1011
1012 template <class _ForwardIterator>
1013 string_type
1014 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
1015 template <class _ForwardIterator>
1016 string_type
1017 __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
1018
1019 template <class _ForwardIterator>
1020 string_type
1021 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
1022 template <class _ForwardIterator>
1023 string_type
1024 __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001025
1026 template <class _ForwardIterator>
1027 char_class_type
1028 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1029 bool __icase, char) const;
1030 template <class _ForwardIterator>
1031 char_class_type
1032 __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1033 bool __icase, wchar_t) const;
1034
Marshall Clow33ae2332013-10-21 15:43:25 +00001035 static int __regex_traits_value(unsigned char __ch, int __radix);
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001036 _LIBCPP_INLINE_VISIBILITY
Marshall Clow33ae2332013-10-21 15:43:25 +00001037 int __regex_traits_value(char __ch, int __radix) const
1038 {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
1039 int __regex_traits_value(wchar_t __ch, int __radix) const;
Howard Hinnant3257c982010-06-17 00:34:59 +00001040};
1041
1042template <class _CharT>
Howard Hinnant23fb9722013-03-07 19:38:08 +00001043const typename regex_traits<_CharT>::char_class_type
1044regex_traits<_CharT>::__regex_word;
1045
1046template <class _CharT>
Howard Hinnant3257c982010-06-17 00:34:59 +00001047regex_traits<_CharT>::regex_traits()
1048{
1049 __init();
1050}
1051
1052template <class _CharT>
1053typename regex_traits<_CharT>::char_type
1054regex_traits<_CharT>::translate_nocase(char_type __c) const
1055{
1056 return __ct_->tolower(__c);
1057}
1058
1059template <class _CharT>
1060template <class _ForwardIterator>
1061typename regex_traits<_CharT>::string_type
1062regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
1063{
1064 string_type __s(__f, __l);
1065 return __col_->transform(__s.data(), __s.data() + __s.size());
1066}
1067
1068template <class _CharT>
1069void
1070regex_traits<_CharT>::__init()
1071{
1072 __ct_ = &use_facet<ctype<char_type> >(__loc_);
1073 __col_ = &use_facet<collate<char_type> >(__loc_);
1074}
1075
1076template <class _CharT>
1077typename regex_traits<_CharT>::locale_type
1078regex_traits<_CharT>::imbue(locale_type __l)
1079{
1080 locale __r = __loc_;
1081 __loc_ = __l;
1082 __init();
1083 return __r;
1084}
1085
1086// transform_primary is very FreeBSD-specific
1087
1088template <class _CharT>
1089template <class _ForwardIterator>
1090typename regex_traits<_CharT>::string_type
1091regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1092 _ForwardIterator __l, char) const
1093{
1094 const string_type __s(__f, __l);
1095 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1096 switch (__d.size())
1097 {
1098 case 1:
1099 break;
1100 case 12:
1101 __d[11] = __d[3];
1102 break;
1103 default:
1104 __d.clear();
1105 break;
1106 }
1107 return __d;
1108}
1109
1110template <class _CharT>
1111template <class _ForwardIterator>
1112typename regex_traits<_CharT>::string_type
1113regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1114 _ForwardIterator __l, wchar_t) const
1115{
1116 const string_type __s(__f, __l);
1117 string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1118 switch (__d.size())
1119 {
1120 case 1:
1121 break;
1122 case 3:
1123 __d[2] = __d[0];
1124 break;
1125 default:
1126 __d.clear();
1127 break;
1128 }
1129 return __d;
1130}
1131
1132// lookup_collatename is very FreeBSD-specific
1133
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001134_LIBCPP_FUNC_VIS string __get_collation_name(const char* __s);
Howard Hinnant3257c982010-06-17 00:34:59 +00001135
1136template <class _CharT>
1137template <class _ForwardIterator>
1138typename regex_traits<_CharT>::string_type
1139regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1140 _ForwardIterator __l, char) const
1141{
1142 string_type __s(__f, __l);
1143 string_type __r;
1144 if (!__s.empty())
1145 {
1146 __r = __get_collation_name(__s.c_str());
1147 if (__r.empty() && __s.size() <= 2)
1148 {
1149 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1150 if (__r.size() == 1 || __r.size() == 12)
1151 __r = __s;
1152 else
1153 __r.clear();
1154 }
1155 }
1156 return __r;
1157}
1158
1159template <class _CharT>
1160template <class _ForwardIterator>
1161typename regex_traits<_CharT>::string_type
1162regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1163 _ForwardIterator __l, wchar_t) const
1164{
1165 string_type __s(__f, __l);
1166 string __n;
1167 __n.reserve(__s.size());
1168 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1169 __i != __e; ++__i)
1170 {
1171 if (static_cast<unsigned>(*__i) >= 127)
1172 return string_type();
1173 __n.push_back(char(*__i));
1174 }
1175 string_type __r;
1176 if (!__s.empty())
1177 {
1178 __n = __get_collation_name(__n.c_str());
1179 if (!__n.empty())
1180 __r.assign(__n.begin(), __n.end());
1181 else if (__s.size() <= 2)
1182 {
1183 __r = __col_->transform(__s.data(), __s.data() + __s.size());
1184 if (__r.size() == 1 || __r.size() == 3)
1185 __r = __s;
1186 else
1187 __r.clear();
1188 }
1189 }
1190 return __r;
1191}
1192
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001193// lookup_classname
1194
Dan Albert17573862014-07-29 19:23:39 +00001195regex_traits<char>::char_class_type _LIBCPP_FUNC_VIS
1196__get_classname(const char* __s, bool __icase);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001197
1198template <class _CharT>
1199template <class _ForwardIterator>
1200typename regex_traits<_CharT>::char_class_type
1201regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1202 _ForwardIterator __l,
1203 bool __icase, char) const
1204{
1205 string_type __s(__f, __l);
1206 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1207 return __get_classname(__s.c_str(), __icase);
1208}
1209
1210template <class _CharT>
1211template <class _ForwardIterator>
1212typename regex_traits<_CharT>::char_class_type
1213regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1214 _ForwardIterator __l,
1215 bool __icase, wchar_t) const
1216{
1217 string_type __s(__f, __l);
1218 __ct_->tolower(&__s[0], &__s[0] + __s.size());
1219 string __n;
1220 __n.reserve(__s.size());
1221 for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1222 __i != __e; ++__i)
1223 {
1224 if (static_cast<unsigned>(*__i) >= 127)
1225 return char_class_type();
1226 __n.push_back(char(*__i));
1227 }
1228 return __get_classname(__n.c_str(), __icase);
1229}
1230
1231template <class _CharT>
1232bool
1233regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
1234{
1235 if (__ct_->is(__m, __c))
1236 return true;
1237 return (__c == '_' && (__m & __regex_word));
1238}
1239
1240template <class _CharT>
1241int
Marshall Clow33ae2332013-10-21 15:43:25 +00001242regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001243{
1244 if ((__ch & 0xF8u) == 0x30) // '0' <= __ch && __ch <= '7'
1245 return __ch - '0';
1246 if (__radix != 8)
1247 {
1248 if ((__ch & 0xFEu) == 0x38) // '8' <= __ch && __ch <= '9'
1249 return __ch - '0';
1250 if (__radix == 16)
1251 {
1252 __ch |= 0x20; // tolower
1253 if ('a' <= __ch && __ch <= 'f')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00001254 return __ch - ('a' - 10);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001255 }
1256 }
1257 return -1;
1258}
1259
1260template <class _CharT>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001261inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001262int
Marshall Clow33ae2332013-10-21 15:43:25 +00001263regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001264{
Marshall Clow33ae2332013-10-21 15:43:25 +00001265 return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
Howard Hinnantf409d2f2010-06-21 21:01:43 +00001266}
1267
Howard Hinnantac303862010-07-12 15:51:17 +00001268template <class _CharT> class __node;
1269
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001270template <class _BidirectionalIterator> class _LIBCPP_TYPE_VIS_ONLY sub_match;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001271
Howard Hinnant17615b02010-07-27 01:25:38 +00001272template <class _BidirectionalIterator,
1273 class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
Howard Hinnant0f678bd2013-08-12 18:38:34 +00001274class _LIBCPP_TYPE_VIS_ONLY match_results;
Howard Hinnant17615b02010-07-27 01:25:38 +00001275
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001276template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001277struct __state
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001278{
1279 enum
1280 {
1281 __end_state = -1000,
1282 __consume_input, // -999
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001283 __begin_marked_expr, // -998
1284 __end_marked_expr, // -997
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001285 __pop_state, // -996
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001286 __accept_and_consume, // -995
1287 __accept_but_not_consume, // -994
1288 __reject, // -993
Howard Hinnantac303862010-07-12 15:51:17 +00001289 __split,
1290 __repeat
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001291 };
1292
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001293 int __do_;
Howard Hinnantac303862010-07-12 15:51:17 +00001294 const _CharT* __first_;
1295 const _CharT* __current_;
1296 const _CharT* __last_;
1297 vector<sub_match<const _CharT*> > __sub_matches_;
1298 vector<pair<size_t, const _CharT*> > __loop_data_;
1299 const __node<_CharT>* __node_;
1300 regex_constants::match_flag_type __flags_;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001301 bool __at_first_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001302
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001303 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001304 __state()
1305 : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
1306 __node_(nullptr), __flags_() {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001307};
1308
Howard Hinnantac303862010-07-12 15:51:17 +00001309// __node
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001310
1311template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001312class __node
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001313{
Howard Hinnantac303862010-07-12 15:51:17 +00001314 __node(const __node&);
1315 __node& operator=(const __node&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001316public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001317 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001318
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001319 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001320 __node() {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001321 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001322 virtual ~__node() {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001323
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001324 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001325 virtual void __exec(__state&) const {};
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001326 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001327 virtual void __exec_split(bool, __state&) const {};
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001328};
1329
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001330// __end_state
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001331
1332template <class _CharT>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001333class __end_state
Howard Hinnantac303862010-07-12 15:51:17 +00001334 : public __node<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001335{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001336public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001337 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001338
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001339 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001340 __end_state() {}
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001341
Howard Hinnantac303862010-07-12 15:51:17 +00001342 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00001343};
1344
1345template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001346void
1347__end_state<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001348{
Howard Hinnantac303862010-07-12 15:51:17 +00001349 __s.__do_ = __state::__end_state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001350}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001351
1352// __has_one_state
1353
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00001354template <class _CharT>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001355class __has_one_state
Howard Hinnantac303862010-07-12 15:51:17 +00001356 : public __node<_CharT>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001357{
Howard Hinnantac303862010-07-12 15:51:17 +00001358 __node<_CharT>* __first_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001359
1360public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001361 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001362 explicit __has_one_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001363 : __first_(__s) {}
1364
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001365 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001366 __node<_CharT>* first() const {return __first_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001367 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001368 __node<_CharT>*& first() {return __first_;}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001369};
1370
1371// __owns_one_state
1372
1373template <class _CharT>
1374class __owns_one_state
1375 : public __has_one_state<_CharT>
1376{
1377 typedef __has_one_state<_CharT> base;
1378
1379public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001380 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001381 explicit __owns_one_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001382 : base(__s) {}
1383
1384 virtual ~__owns_one_state();
1385};
1386
1387template <class _CharT>
1388__owns_one_state<_CharT>::~__owns_one_state()
1389{
1390 delete this->first();
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00001391}
1392
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001393// __empty_state
1394
1395template <class _CharT>
1396class __empty_state
1397 : public __owns_one_state<_CharT>
1398{
1399 typedef __owns_one_state<_CharT> base;
1400
1401public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001402 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001403
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001404 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001405 explicit __empty_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001406 : base(__s) {}
1407
Howard Hinnantac303862010-07-12 15:51:17 +00001408 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001409};
1410
1411template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001412void
1413__empty_state<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001414{
Howard Hinnantac303862010-07-12 15:51:17 +00001415 __s.__do_ = __state::__accept_but_not_consume;
1416 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001417}
1418
1419// __empty_non_own_state
1420
1421template <class _CharT>
1422class __empty_non_own_state
1423 : public __has_one_state<_CharT>
1424{
1425 typedef __has_one_state<_CharT> base;
1426
1427public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001428 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001429
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001430 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001431 explicit __empty_non_own_state(__node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001432 : base(__s) {}
1433
Howard Hinnantac303862010-07-12 15:51:17 +00001434 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001435};
1436
1437template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001438void
1439__empty_non_own_state<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001440{
Howard Hinnantac303862010-07-12 15:51:17 +00001441 __s.__do_ = __state::__accept_but_not_consume;
1442 __s.__node_ = this->first();
1443}
1444
1445// __repeat_one_loop
1446
1447template <class _CharT>
1448class __repeat_one_loop
1449 : public __has_one_state<_CharT>
1450{
1451 typedef __has_one_state<_CharT> base;
1452
1453public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001454 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantac303862010-07-12 15:51:17 +00001455
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001456 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001457 explicit __repeat_one_loop(__node<_CharT>* __s)
1458 : base(__s) {}
1459
1460 virtual void __exec(__state&) const;
Howard Hinnantac303862010-07-12 15:51:17 +00001461};
1462
1463template <class _CharT>
1464void
1465__repeat_one_loop<_CharT>::__exec(__state& __s) const
1466{
1467 __s.__do_ = __state::__repeat;
1468 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001469}
1470
1471// __owns_two_states
1472
1473template <class _CharT>
1474class __owns_two_states
1475 : public __owns_one_state<_CharT>
1476{
1477 typedef __owns_one_state<_CharT> base;
1478
1479 base* __second_;
1480
1481public:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001482 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001483 explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001484 : base(__s1), __second_(__s2) {}
1485
1486 virtual ~__owns_two_states();
1487
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001488 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001489 base* second() const {return __second_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001490 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001491 base*& second() {return __second_;}
1492};
1493
1494template <class _CharT>
1495__owns_two_states<_CharT>::~__owns_two_states()
1496{
1497 delete __second_;
1498}
1499
1500// __loop
1501
1502template <class _CharT>
1503class __loop
1504 : public __owns_two_states<_CharT>
1505{
1506 typedef __owns_two_states<_CharT> base;
1507
1508 size_t __min_;
1509 size_t __max_;
1510 unsigned __loop_id_;
Howard Hinnantac303862010-07-12 15:51:17 +00001511 unsigned __mexp_begin_;
1512 unsigned __mexp_end_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001513 bool __greedy_;
1514
1515public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001516 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001517
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001518 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001519 explicit __loop(unsigned __loop_id,
Howard Hinnantac303862010-07-12 15:51:17 +00001520 __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
1521 unsigned __mexp_begin, unsigned __mexp_end,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001522 bool __greedy = true,
1523 size_t __min = 0,
1524 size_t __max = numeric_limits<size_t>::max())
1525 : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
Howard Hinnantac303862010-07-12 15:51:17 +00001526 __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001527 __greedy_(__greedy) {}
1528
Howard Hinnantac303862010-07-12 15:51:17 +00001529 virtual void __exec(__state& __s) const;
1530 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001531
Howard Hinnantac303862010-07-12 15:51:17 +00001532private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001533 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001534 void __init_repeat(__state& __s) const
1535 {
1536 __s.__loop_data_[__loop_id_].second = __s.__current_;
1537 for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
1538 {
1539 __s.__sub_matches_[__i].first = __s.__last_;
1540 __s.__sub_matches_[__i].second = __s.__last_;
1541 __s.__sub_matches_[__i].matched = false;
1542 }
1543 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001544};
1545
1546template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001547void
1548__loop<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001549{
Howard Hinnantac303862010-07-12 15:51:17 +00001550 if (__s.__do_ == __state::__repeat)
1551 {
1552 bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
1553 bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
1554 if (__do_repeat && __do_alt &&
1555 __s.__loop_data_[__loop_id_].second == __s.__current_)
1556 __do_repeat = false;
1557 if (__do_repeat && __do_alt)
1558 __s.__do_ = __state::__split;
1559 else if (__do_repeat)
1560 {
1561 __s.__do_ = __state::__accept_but_not_consume;
1562 __s.__node_ = this->first();
1563 __init_repeat(__s);
1564 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001565 else
Howard Hinnantac303862010-07-12 15:51:17 +00001566 {
1567 __s.__do_ = __state::__accept_but_not_consume;
1568 __s.__node_ = this->second();
1569 }
1570 }
1571 else
1572 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00001573 __s.__loop_data_[__loop_id_].first = 0;
1574 bool __do_repeat = 0 < __max_;
1575 bool __do_alt = 0 >= __min_;
1576 if (__do_repeat && __do_alt)
Howard Hinnantac303862010-07-12 15:51:17 +00001577 __s.__do_ = __state::__split;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00001578 else if (__do_repeat)
1579 {
1580 __s.__do_ = __state::__accept_but_not_consume;
1581 __s.__node_ = this->first();
1582 __init_repeat(__s);
1583 }
Howard Hinnantac303862010-07-12 15:51:17 +00001584 else
1585 {
1586 __s.__do_ = __state::__accept_but_not_consume;
1587 __s.__node_ = this->second();
1588 }
1589 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001590}
1591
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001592template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001593void
1594__loop<_CharT>::__exec_split(bool __second, __state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001595{
Howard Hinnantac303862010-07-12 15:51:17 +00001596 __s.__do_ = __state::__accept_but_not_consume;
1597 if (__greedy_ != __second)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001598 {
Howard Hinnantac303862010-07-12 15:51:17 +00001599 __s.__node_ = this->first();
1600 __init_repeat(__s);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001601 }
Howard Hinnantac303862010-07-12 15:51:17 +00001602 else
1603 __s.__node_ = this->second();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001604}
1605
Howard Hinnantaa698082010-07-16 19:08:36 +00001606// __alternate
1607
1608template <class _CharT>
1609class __alternate
1610 : public __owns_two_states<_CharT>
1611{
1612 typedef __owns_two_states<_CharT> base;
1613
1614public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001615 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantaa698082010-07-16 19:08:36 +00001616
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001617 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantaa698082010-07-16 19:08:36 +00001618 explicit __alternate(__owns_one_state<_CharT>* __s1,
1619 __owns_one_state<_CharT>* __s2)
1620 : base(__s1, __s2) {}
1621
1622 virtual void __exec(__state& __s) const;
1623 virtual void __exec_split(bool __second, __state& __s) const;
Howard Hinnantaa698082010-07-16 19:08:36 +00001624};
1625
1626template <class _CharT>
1627void
1628__alternate<_CharT>::__exec(__state& __s) const
1629{
1630 __s.__do_ = __state::__split;
1631}
1632
1633template <class _CharT>
1634void
1635__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
1636{
1637 __s.__do_ = __state::__accept_but_not_consume;
Howard Hinnant1371b2e2010-07-22 14:12:20 +00001638 if (__second)
Howard Hinnantaa698082010-07-16 19:08:36 +00001639 __s.__node_ = this->second();
Howard Hinnant1371b2e2010-07-22 14:12:20 +00001640 else
1641 __s.__node_ = this->first();
Howard Hinnantaa698082010-07-16 19:08:36 +00001642}
1643
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001644// __begin_marked_subexpression
1645
1646template <class _CharT>
1647class __begin_marked_subexpression
1648 : public __owns_one_state<_CharT>
1649{
1650 typedef __owns_one_state<_CharT> base;
1651
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001652 unsigned __mexp_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001653public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001654 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001655
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001656 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001657 explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001658 : base(__s), __mexp_(__mexp) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001659
Howard Hinnantac303862010-07-12 15:51:17 +00001660 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001661};
1662
1663template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001664void
1665__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001666{
Howard Hinnantac303862010-07-12 15:51:17 +00001667 __s.__do_ = __state::__accept_but_not_consume;
1668 __s.__sub_matches_[__mexp_-1].first = __s.__current_;
1669 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001670}
1671
1672// __end_marked_subexpression
1673
1674template <class _CharT>
1675class __end_marked_subexpression
1676 : public __owns_one_state<_CharT>
1677{
1678 typedef __owns_one_state<_CharT> base;
1679
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001680 unsigned __mexp_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001681public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001682 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001683
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001684 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001685 explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00001686 : base(__s), __mexp_(__mexp) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001687
Howard Hinnantac303862010-07-12 15:51:17 +00001688 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001689};
1690
1691template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001692void
1693__end_marked_subexpression<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001694{
Howard Hinnantac303862010-07-12 15:51:17 +00001695 __s.__do_ = __state::__accept_but_not_consume;
1696 __s.__sub_matches_[__mexp_-1].second = __s.__current_;
1697 __s.__sub_matches_[__mexp_-1].matched = true;
1698 __s.__node_ = this->first();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001699}
1700
Howard Hinnantcba352d2010-07-12 18:16:05 +00001701// __back_ref
1702
1703template <class _CharT>
1704class __back_ref
1705 : public __owns_one_state<_CharT>
1706{
1707 typedef __owns_one_state<_CharT> base;
1708
1709 unsigned __mexp_;
1710public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001711 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantcba352d2010-07-12 18:16:05 +00001712
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001713 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcba352d2010-07-12 18:16:05 +00001714 explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
1715 : base(__s), __mexp_(__mexp) {}
1716
1717 virtual void __exec(__state&) const;
Howard Hinnantcba352d2010-07-12 18:16:05 +00001718};
1719
1720template <class _CharT>
1721void
1722__back_ref<_CharT>::__exec(__state& __s) const
1723{
1724 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1725 if (__sm.matched)
1726 {
1727 ptrdiff_t __len = __sm.second - __sm.first;
1728 if (__s.__last_ - __s.__current_ >= __len &&
Howard Hinnant0949eed2011-06-30 21:18:19 +00001729 _VSTD::equal(__sm.first, __sm.second, __s.__current_))
Howard Hinnantcba352d2010-07-12 18:16:05 +00001730 {
1731 __s.__do_ = __state::__accept_but_not_consume;
1732 __s.__current_ += __len;
1733 __s.__node_ = this->first();
1734 }
1735 else
1736 {
1737 __s.__do_ = __state::__reject;
1738 __s.__node_ = nullptr;
1739 }
1740 }
1741 else
1742 {
1743 __s.__do_ = __state::__reject;
1744 __s.__node_ = nullptr;
1745 }
1746}
1747
Howard Hinnante34f17d2010-07-12 19:11:27 +00001748// __back_ref_icase
1749
1750template <class _CharT, class _Traits>
1751class __back_ref_icase
1752 : public __owns_one_state<_CharT>
1753{
1754 typedef __owns_one_state<_CharT> base;
1755
1756 _Traits __traits_;
1757 unsigned __mexp_;
1758public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001759 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001760
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001761 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00001762 explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
1763 __node<_CharT>* __s)
1764 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1765
1766 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001767};
1768
1769template <class _CharT, class _Traits>
1770void
1771__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
1772{
1773 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1774 if (__sm.matched)
1775 {
1776 ptrdiff_t __len = __sm.second - __sm.first;
1777 if (__s.__last_ - __s.__current_ >= __len)
1778 {
1779 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1780 {
1781 if (__traits_.translate_nocase(__sm.first[__i]) !=
1782 __traits_.translate_nocase(__s.__current_[__i]))
1783 goto __not_equal;
1784 }
1785 __s.__do_ = __state::__accept_but_not_consume;
1786 __s.__current_ += __len;
1787 __s.__node_ = this->first();
1788 }
1789 else
1790 {
1791 __s.__do_ = __state::__reject;
1792 __s.__node_ = nullptr;
1793 }
1794 }
1795 else
1796 {
1797__not_equal:
1798 __s.__do_ = __state::__reject;
1799 __s.__node_ = nullptr;
1800 }
1801}
1802
1803// __back_ref_collate
1804
1805template <class _CharT, class _Traits>
1806class __back_ref_collate
1807 : public __owns_one_state<_CharT>
1808{
1809 typedef __owns_one_state<_CharT> base;
1810
1811 _Traits __traits_;
1812 unsigned __mexp_;
1813public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001814 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001815
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001816 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00001817 explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
1818 __node<_CharT>* __s)
1819 : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1820
1821 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00001822};
1823
1824template <class _CharT, class _Traits>
1825void
1826__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
1827{
1828 sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1829 if (__sm.matched)
1830 {
1831 ptrdiff_t __len = __sm.second - __sm.first;
1832 if (__s.__last_ - __s.__current_ >= __len)
1833 {
1834 for (ptrdiff_t __i = 0; __i < __len; ++__i)
1835 {
1836 if (__traits_.translate(__sm.first[__i]) !=
1837 __traits_.translate(__s.__current_[__i]))
1838 goto __not_equal;
1839 }
1840 __s.__do_ = __state::__accept_but_not_consume;
1841 __s.__current_ += __len;
1842 __s.__node_ = this->first();
1843 }
1844 else
1845 {
1846 __s.__do_ = __state::__reject;
1847 __s.__node_ = nullptr;
1848 }
1849 }
1850 else
1851 {
1852__not_equal:
1853 __s.__do_ = __state::__reject;
1854 __s.__node_ = nullptr;
1855 }
1856}
1857
Howard Hinnant17615b02010-07-27 01:25:38 +00001858// __word_boundary
1859
1860template <class _CharT, class _Traits>
1861class __word_boundary
1862 : public __owns_one_state<_CharT>
1863{
1864 typedef __owns_one_state<_CharT> base;
1865
1866 _Traits __traits_;
1867 bool __invert_;
1868public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001869 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant17615b02010-07-27 01:25:38 +00001870
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001871 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00001872 explicit __word_boundary(const _Traits& __traits, bool __invert,
1873 __node<_CharT>* __s)
1874 : base(__s), __traits_(__traits), __invert_(__invert) {}
1875
1876 virtual void __exec(__state&) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00001877};
1878
1879template <class _CharT, class _Traits>
1880void
1881__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
1882{
1883 bool __is_word_b = false;
1884 if (__s.__first_ != __s.__last_)
1885 {
1886 if (__s.__current_ == __s.__last_)
1887 {
1888 if (!(__s.__flags_ & regex_constants::match_not_eow))
1889 {
1890 _CharT __c = __s.__current_[-1];
1891 __is_word_b = __c == '_' ||
1892 __traits_.isctype(__c, ctype_base::alnum);
1893 }
1894 }
Howard Hinnantf3dcca02010-07-29 15:17:28 +00001895 else if (__s.__current_ == __s.__first_ &&
1896 !(__s.__flags_ & regex_constants::match_prev_avail))
Howard Hinnant17615b02010-07-27 01:25:38 +00001897 {
1898 if (!(__s.__flags_ & regex_constants::match_not_bow))
1899 {
1900 _CharT __c = *__s.__current_;
1901 __is_word_b = __c == '_' ||
1902 __traits_.isctype(__c, ctype_base::alnum);
1903 }
1904 }
1905 else
1906 {
1907 _CharT __c1 = __s.__current_[-1];
1908 _CharT __c2 = *__s.__current_;
1909 bool __is_c1_b = __c1 == '_' ||
1910 __traits_.isctype(__c1, ctype_base::alnum);
1911 bool __is_c2_b = __c2 == '_' ||
1912 __traits_.isctype(__c2, ctype_base::alnum);
1913 __is_word_b = __is_c1_b != __is_c2_b;
1914 }
1915 }
1916 if (__is_word_b != __invert_)
1917 {
1918 __s.__do_ = __state::__accept_but_not_consume;
1919 __s.__node_ = this->first();
1920 }
1921 else
1922 {
1923 __s.__do_ = __state::__reject;
1924 __s.__node_ = nullptr;
1925 }
1926}
1927
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001928// __l_anchor
1929
1930template <class _CharT>
1931class __l_anchor
1932 : public __owns_one_state<_CharT>
1933{
1934 typedef __owns_one_state<_CharT> base;
1935
1936public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001937 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001938
1939 _LIBCPP_INLINE_VISIBILITY
1940 __l_anchor(__node<_CharT>* __s)
1941 : base(__s) {}
1942
1943 virtual void __exec(__state&) const;
1944};
1945
1946template <class _CharT>
1947void
1948__l_anchor<_CharT>::__exec(__state& __s) const
1949{
Marshall Clow64befb52015-03-19 17:05:59 +00001950 if (__s.__at_first_ && __s.__current_ == __s.__first_ &&
1951 !(__s.__flags_ & regex_constants::match_not_bol))
Howard Hinnant41fb6e12011-03-26 20:02:27 +00001952 {
1953 __s.__do_ = __state::__accept_but_not_consume;
1954 __s.__node_ = this->first();
1955 }
1956 else
1957 {
1958 __s.__do_ = __state::__reject;
1959 __s.__node_ = nullptr;
1960 }
1961}
1962
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001963// __r_anchor
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001964
1965template <class _CharT>
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001966class __r_anchor
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001967 : public __owns_one_state<_CharT>
1968{
1969 typedef __owns_one_state<_CharT> base;
1970
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001971public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00001972 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001973
Howard Hinnantaef07cb2010-09-23 15:13:20 +00001974 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00001975 __r_anchor(__node<_CharT>* __s)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00001976 : base(__s) {}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001977
Howard Hinnantac303862010-07-12 15:51:17 +00001978 virtual void __exec(__state&) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001979};
1980
1981template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00001982void
1983__r_anchor<_CharT>::__exec(__state& __s) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00001984{
Marshall Clow64befb52015-03-19 17:05:59 +00001985 if (__s.__current_ == __s.__last_ &&
1986 !(__s.__flags_ & regex_constants::match_not_eol))
Howard Hinnantac303862010-07-12 15:51:17 +00001987 {
1988 __s.__do_ = __state::__accept_but_not_consume;
1989 __s.__node_ = this->first();
1990 }
1991 else
1992 {
1993 __s.__do_ = __state::__reject;
1994 __s.__node_ = nullptr;
1995 }
1996}
1997
1998// __match_any
1999
2000template <class _CharT>
2001class __match_any
2002 : public __owns_one_state<_CharT>
2003{
2004 typedef __owns_one_state<_CharT> base;
2005
2006public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002007 typedef _VSTD::__state<_CharT> __state;
Howard Hinnantac303862010-07-12 15:51:17 +00002008
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002009 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00002010 __match_any(__node<_CharT>* __s)
2011 : base(__s) {}
2012
2013 virtual void __exec(__state&) const;
Howard Hinnantac303862010-07-12 15:51:17 +00002014};
2015
2016template <class _CharT>
2017void
2018__match_any<_CharT>::__exec(__state& __s) const
2019{
2020 if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
2021 {
2022 __s.__do_ = __state::__accept_and_consume;
2023 ++__s.__current_;
2024 __s.__node_ = this->first();
2025 }
2026 else
2027 {
2028 __s.__do_ = __state::__reject;
2029 __s.__node_ = nullptr;
2030 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002031}
2032
Howard Hinnant17615b02010-07-27 01:25:38 +00002033// __match_any_but_newline
2034
2035template <class _CharT>
2036class __match_any_but_newline
2037 : public __owns_one_state<_CharT>
2038{
2039 typedef __owns_one_state<_CharT> base;
2040
2041public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002042 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant17615b02010-07-27 01:25:38 +00002043
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002044 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002045 __match_any_but_newline(__node<_CharT>* __s)
2046 : base(__s) {}
2047
2048 virtual void __exec(__state&) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00002049};
2050
Howard Hinnant0f678bd2013-08-12 18:38:34 +00002051template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
2052template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
2053
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002054// __match_char
2055
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002056template <class _CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002057class __match_char
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002058 : public __owns_one_state<_CharT>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002059{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002060 typedef __owns_one_state<_CharT> base;
2061
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002062 _CharT __c_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002063
2064 __match_char(const __match_char&);
2065 __match_char& operator=(const __match_char&);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002066public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002067 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002068
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002069 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantac303862010-07-12 15:51:17 +00002070 __match_char(_CharT __c, __node<_CharT>* __s)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002071 : base(__s), __c_(__c) {}
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002072
Howard Hinnantac303862010-07-12 15:51:17 +00002073 virtual void __exec(__state&) const;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002074};
2075
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002076template <class _CharT>
Howard Hinnantac303862010-07-12 15:51:17 +00002077void
2078__match_char<_CharT>::__exec(__state& __s) const
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002079{
Howard Hinnantac303862010-07-12 15:51:17 +00002080 if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2081 {
2082 __s.__do_ = __state::__accept_and_consume;
2083 ++__s.__current_;
2084 __s.__node_ = this->first();
2085 }
2086 else
2087 {
2088 __s.__do_ = __state::__reject;
2089 __s.__node_ = nullptr;
2090 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002091}
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002092
Howard Hinnante34f17d2010-07-12 19:11:27 +00002093// __match_char_icase
2094
2095template <class _CharT, class _Traits>
2096class __match_char_icase
2097 : public __owns_one_state<_CharT>
2098{
2099 typedef __owns_one_state<_CharT> base;
2100
2101 _Traits __traits_;
2102 _CharT __c_;
2103
2104 __match_char_icase(const __match_char_icase&);
2105 __match_char_icase& operator=(const __match_char_icase&);
2106public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002107 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002108
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002109 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002110 __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2111 : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2112
2113 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002114};
2115
2116template <class _CharT, class _Traits>
2117void
2118__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2119{
2120 if (__s.__current_ != __s.__last_ &&
2121 __traits_.translate_nocase(*__s.__current_) == __c_)
2122 {
2123 __s.__do_ = __state::__accept_and_consume;
2124 ++__s.__current_;
2125 __s.__node_ = this->first();
2126 }
2127 else
2128 {
2129 __s.__do_ = __state::__reject;
2130 __s.__node_ = nullptr;
2131 }
2132}
2133
2134// __match_char_collate
2135
2136template <class _CharT, class _Traits>
2137class __match_char_collate
2138 : public __owns_one_state<_CharT>
2139{
2140 typedef __owns_one_state<_CharT> base;
2141
2142 _Traits __traits_;
2143 _CharT __c_;
2144
2145 __match_char_collate(const __match_char_collate&);
2146 __match_char_collate& operator=(const __match_char_collate&);
2147public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002148 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002149
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002150 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante34f17d2010-07-12 19:11:27 +00002151 __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2152 : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2153
2154 virtual void __exec(__state&) const;
Howard Hinnante34f17d2010-07-12 19:11:27 +00002155};
2156
2157template <class _CharT, class _Traits>
2158void
2159__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2160{
2161 if (__s.__current_ != __s.__last_ &&
2162 __traits_.translate(*__s.__current_) == __c_)
2163 {
2164 __s.__do_ = __state::__accept_and_consume;
2165 ++__s.__current_;
2166 __s.__node_ = this->first();
2167 }
2168 else
2169 {
2170 __s.__do_ = __state::__reject;
2171 __s.__node_ = nullptr;
2172 }
2173}
2174
Howard Hinnant173968a2010-07-13 21:48:06 +00002175// __bracket_expression
2176
2177template <class _CharT, class _Traits>
2178class __bracket_expression
2179 : public __owns_one_state<_CharT>
2180{
2181 typedef __owns_one_state<_CharT> base;
2182 typedef typename _Traits::string_type string_type;
2183
2184 _Traits __traits_;
2185 vector<_CharT> __chars_;
Howard Hinnant15476f32010-07-28 17:35:27 +00002186 vector<_CharT> __neg_chars_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002187 vector<pair<string_type, string_type> > __ranges_;
2188 vector<pair<_CharT, _CharT> > __digraphs_;
2189 vector<string_type> __equivalences_;
Dan Albert17573862014-07-29 19:23:39 +00002190 typename regex_traits<_CharT>::char_class_type __mask_;
2191 typename regex_traits<_CharT>::char_class_type __neg_mask_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002192 bool __negate_;
2193 bool __icase_;
2194 bool __collate_;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002195 bool __might_have_digraph_;
Howard Hinnant173968a2010-07-13 21:48:06 +00002196
2197 __bracket_expression(const __bracket_expression&);
2198 __bracket_expression& operator=(const __bracket_expression&);
2199public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002200 typedef _VSTD::__state<_CharT> __state;
Howard Hinnant173968a2010-07-13 21:48:06 +00002201
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002202 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002203 __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2204 bool __negate, bool __icase, bool __collate)
Howard Hinnant15476f32010-07-28 17:35:27 +00002205 : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2206 __negate_(__negate), __icase_(__icase), __collate_(__collate),
Howard Hinnant68025ed2010-07-14 15:45:11 +00002207 __might_have_digraph_(__traits_.getloc().name() != "C") {}
Howard Hinnant173968a2010-07-13 21:48:06 +00002208
2209 virtual void __exec(__state&) const;
2210
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002211 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002212 bool __negated() const {return __negate_;}
2213
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002214 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002215 void __add_char(_CharT __c)
2216 {
2217 if (__icase_)
2218 __chars_.push_back(__traits_.translate_nocase(__c));
2219 else if (__collate_)
2220 __chars_.push_back(__traits_.translate(__c));
2221 else
2222 __chars_.push_back(__c);
2223 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002224 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant15476f32010-07-28 17:35:27 +00002225 void __add_neg_char(_CharT __c)
2226 {
2227 if (__icase_)
2228 __neg_chars_.push_back(__traits_.translate_nocase(__c));
2229 else if (__collate_)
2230 __neg_chars_.push_back(__traits_.translate(__c));
2231 else
2232 __neg_chars_.push_back(__c);
2233 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002234 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002235 void __add_range(string_type __b, string_type __e)
2236 {
2237 if (__collate_)
2238 {
2239 if (__icase_)
2240 {
2241 for (size_t __i = 0; __i < __b.size(); ++__i)
2242 __b[__i] = __traits_.translate_nocase(__b[__i]);
2243 for (size_t __i = 0; __i < __e.size(); ++__i)
2244 __e[__i] = __traits_.translate_nocase(__e[__i]);
2245 }
2246 else
2247 {
2248 for (size_t __i = 0; __i < __b.size(); ++__i)
2249 __b[__i] = __traits_.translate(__b[__i]);
2250 for (size_t __i = 0; __i < __e.size(); ++__i)
2251 __e[__i] = __traits_.translate(__e[__i]);
2252 }
2253 __ranges_.push_back(make_pair(
2254 __traits_.transform(__b.begin(), __b.end()),
2255 __traits_.transform(__e.begin(), __e.end())));
2256 }
2257 else
2258 {
Howard Hinnantd4444702010-08-11 17:04:31 +00002259#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00002260 if (__b.size() != 1 || __e.size() != 1)
2261 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00002262#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00002263 if (__icase_)
2264 {
2265 __b[0] = __traits_.translate_nocase(__b[0]);
2266 __e[0] = __traits_.translate_nocase(__e[0]);
2267 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00002268 __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
Howard Hinnant173968a2010-07-13 21:48:06 +00002269 }
2270 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002271 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002272 void __add_digraph(_CharT __c1, _CharT __c2)
2273 {
2274 if (__icase_)
2275 __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
2276 __traits_.translate_nocase(__c2)));
2277 else if (__collate_)
2278 __digraphs_.push_back(make_pair(__traits_.translate(__c1),
2279 __traits_.translate(__c2)));
2280 else
2281 __digraphs_.push_back(make_pair(__c1, __c2));
2282 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002283 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant173968a2010-07-13 21:48:06 +00002284 void __add_equivalence(const string_type& __s)
2285 {__equivalences_.push_back(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002286 _LIBCPP_INLINE_VISIBILITY
Dan Albert17573862014-07-29 19:23:39 +00002287 void __add_class(typename regex_traits<_CharT>::char_class_type __mask)
Howard Hinnant173968a2010-07-13 21:48:06 +00002288 {__mask_ |= __mask;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002289 _LIBCPP_INLINE_VISIBILITY
Dan Albert17573862014-07-29 19:23:39 +00002290 void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask)
Howard Hinnant15476f32010-07-28 17:35:27 +00002291 {__neg_mask_ |= __mask;}
Howard Hinnant173968a2010-07-13 21:48:06 +00002292};
2293
2294template <class _CharT, class _Traits>
2295void
2296__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2297{
2298 bool __found = false;
2299 unsigned __consumed = 0;
2300 if (__s.__current_ != __s.__last_)
2301 {
2302 ++__consumed;
Howard Hinnant68025ed2010-07-14 15:45:11 +00002303 if (__might_have_digraph_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002304 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00002305 const _CharT* __next = _VSTD::next(__s.__current_);
Howard Hinnant68025ed2010-07-14 15:45:11 +00002306 if (__next != __s.__last_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002307 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002308 pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2309 if (__icase_)
Howard Hinnant173968a2010-07-13 21:48:06 +00002310 {
Howard Hinnant68025ed2010-07-14 15:45:11 +00002311 __ch2.first = __traits_.translate_nocase(__ch2.first);
2312 __ch2.second = __traits_.translate_nocase(__ch2.second);
2313 }
2314 else if (__collate_)
2315 {
2316 __ch2.first = __traits_.translate(__ch2.first);
2317 __ch2.second = __traits_.translate(__ch2.second);
2318 }
2319 if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2320 {
2321 // __ch2 is a digraph in this locale
2322 ++__consumed;
2323 for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2324 {
2325 if (__ch2 == __digraphs_[__i])
2326 {
2327 __found = true;
2328 goto __exit;
2329 }
2330 }
2331 if (__collate_ && !__ranges_.empty())
2332 {
2333 string_type __s2 = __traits_.transform(&__ch2.first,
2334 &__ch2.first + 2);
2335 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2336 {
2337 if (__ranges_[__i].first <= __s2 &&
2338 __s2 <= __ranges_[__i].second)
2339 {
2340 __found = true;
2341 goto __exit;
2342 }
2343 }
2344 }
2345 if (!__equivalences_.empty())
2346 {
2347 string_type __s2 = __traits_.transform_primary(&__ch2.first,
2348 &__ch2.first + 2);
2349 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2350 {
2351 if (__s2 == __equivalences_[__i])
2352 {
2353 __found = true;
2354 goto __exit;
2355 }
2356 }
2357 }
2358 if (__traits_.isctype(__ch2.first, __mask_) &&
2359 __traits_.isctype(__ch2.second, __mask_))
Howard Hinnant173968a2010-07-13 21:48:06 +00002360 {
2361 __found = true;
2362 goto __exit;
2363 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002364 if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2365 !__traits_.isctype(__ch2.second, __neg_mask_))
2366 {
2367 __found = true;
2368 goto __exit;
2369 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002370 goto __exit;
2371 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002372 }
2373 }
2374 // test *__s.__current_ as not a digraph
2375 _CharT __ch = *__s.__current_;
2376 if (__icase_)
2377 __ch = __traits_.translate_nocase(__ch);
2378 else if (__collate_)
2379 __ch = __traits_.translate(__ch);
2380 for (size_t __i = 0; __i < __chars_.size(); ++__i)
2381 {
2382 if (__ch == __chars_[__i])
2383 {
2384 __found = true;
2385 goto __exit;
2386 }
2387 }
Howard Hinnant15476f32010-07-28 17:35:27 +00002388 if (!__neg_chars_.empty())
2389 {
2390 for (size_t __i = 0; __i < __neg_chars_.size(); ++__i)
2391 {
2392 if (__ch == __neg_chars_[__i])
2393 goto __is_neg_char;
2394 }
2395 __found = true;
2396 goto __exit;
2397 }
2398__is_neg_char:
Howard Hinnant173968a2010-07-13 21:48:06 +00002399 if (!__ranges_.empty())
2400 {
2401 string_type __s2 = __collate_ ?
2402 __traits_.transform(&__ch, &__ch + 1) :
2403 string_type(1, __ch);
2404 for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2405 {
2406 if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2407 {
2408 __found = true;
2409 goto __exit;
2410 }
2411 }
2412 }
2413 if (!__equivalences_.empty())
2414 {
2415 string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2416 for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2417 {
2418 if (__s2 == __equivalences_[__i])
2419 {
2420 __found = true;
2421 goto __exit;
2422 }
2423 }
2424 }
2425 if (__traits_.isctype(__ch, __mask_))
Howard Hinnant15476f32010-07-28 17:35:27 +00002426 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002427 __found = true;
Howard Hinnant15476f32010-07-28 17:35:27 +00002428 goto __exit;
2429 }
2430 if (__neg_mask_ && !__traits_.isctype(__ch, __neg_mask_))
2431 {
2432 __found = true;
2433 goto __exit;
2434 }
Howard Hinnant173968a2010-07-13 21:48:06 +00002435 }
2436 else
2437 __found = __negate_; // force reject
2438__exit:
2439 if (__found != __negate_)
2440 {
Howard Hinnant173968a2010-07-13 21:48:06 +00002441 __s.__do_ = __state::__accept_and_consume;
2442 __s.__current_ += __consumed;
2443 __s.__node_ = this->first();
2444 }
2445 else
2446 {
2447 __s.__do_ = __state::__reject;
2448 __s.__node_ = nullptr;
2449 }
2450}
2451
Howard Hinnant2b1b2d42011-06-14 19:58:17 +00002452template <class _CharT, class _Traits> class __lookahead;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002453
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002454template <class _CharT, class _Traits = regex_traits<_CharT> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +00002455class _LIBCPP_TYPE_VIS_ONLY basic_regex
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002456{
2457public:
2458 // types:
2459 typedef _CharT value_type;
2460 typedef regex_constants::syntax_option_type flag_type;
2461 typedef typename _Traits::locale_type locale_type;
2462
2463private:
2464 _Traits __traits_;
2465 flag_type __flags_;
2466 unsigned __marked_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002467 unsigned __loop_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002468 int __open_count_;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002469 shared_ptr<__empty_state<_CharT> > __start_;
2470 __owns_one_state<_CharT>* __end_;
2471
Howard Hinnant0949eed2011-06-30 21:18:19 +00002472 typedef _VSTD::__state<_CharT> __state;
2473 typedef _VSTD::__node<_CharT> __node;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002474
2475public:
2476 // constants:
Howard Hinnant46623a02012-07-21 01:31:58 +00002477 static const regex_constants::syntax_option_type icase = regex_constants::icase;
2478 static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2479 static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
2480 static const regex_constants::syntax_option_type collate = regex_constants::collate;
2481 static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2482 static const regex_constants::syntax_option_type basic = regex_constants::basic;
2483 static const regex_constants::syntax_option_type extended = regex_constants::extended;
2484 static const regex_constants::syntax_option_type awk = regex_constants::awk;
2485 static const regex_constants::syntax_option_type grep = regex_constants::grep;
2486 static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002487
2488 // construct/copy/destroy:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002489 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002490 basic_regex()
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002491 : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002492 __end_(0)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002493 {}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002494 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002495 explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002496 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002497 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002498 {__parse(__p, __p + __traits_.length(__p));}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002499 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002500 basic_regex(const value_type* __p, size_t __len, flag_type __f)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002501 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002502 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002503 {__parse(__p, __p + __len);}
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002504// basic_regex(const basic_regex&) = default;
2505// basic_regex(basic_regex&&) = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002506 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002507 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002508 explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2509 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002510 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002511 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002512 {__parse(__p.begin(), __p.end());}
2513 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002514 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002515 basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2516 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002517 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002518 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002519 {__parse(__first, __last);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002520#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002521 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002522 basic_regex(initializer_list<value_type> __il,
2523 flag_type __f = regex_constants::ECMAScript)
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002524 : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002525 __end_(0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002526 {__parse(__il.begin(), __il.end());}
Howard Hinnante3e32912011-08-12 21:56:02 +00002527#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002528
Howard Hinnant7026a172010-08-13 18:11:23 +00002529// ~basic_regex() = default;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002530
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002531// basic_regex& operator=(const basic_regex&) = default;
2532// basic_regex& operator=(basic_regex&&) = default;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002533 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002534 basic_regex& operator=(const value_type* __p)
2535 {return assign(__p);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002536#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002537 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002538 basic_regex& operator=(initializer_list<value_type> __il)
2539 {return assign(__il);}
Howard Hinnante3e32912011-08-12 21:56:02 +00002540#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002541 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002542 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002543 basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2544 {return assign(__p);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002545
2546 // assign:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002547 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002548 basic_regex& assign(const basic_regex& __that)
2549 {return *this = __that;}
Howard Hinnant46623a02012-07-21 01:31:58 +00002550#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2551 _LIBCPP_INLINE_VISIBILITY
2552 basic_regex& assign(basic_regex&& __that) _NOEXCEPT
2553 {return *this = _VSTD::move(__that);}
2554#endif
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002555 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002556 basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2557 {return assign(__p, __p + __traits_.length(__p), __f);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002558 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002559 basic_regex& assign(const value_type* __p, size_t __len, flag_type __f)
2560 {return assign(__p, __p + __len, __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002561 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002562 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002563 basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
Howard Hinnant7026a172010-08-13 18:11:23 +00002564 flag_type __f = regex_constants::ECMAScript)
2565 {return assign(__s.begin(), __s.end(), __f);}
2566
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002567 template <class _InputIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002568 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002569 typename enable_if
2570 <
2571 __is_input_iterator <_InputIterator>::value &&
2572 !__is_forward_iterator<_InputIterator>::value,
2573 basic_regex&
2574 >::type
2575 assign(_InputIterator __first, _InputIterator __last,
2576 flag_type __f = regex_constants::ECMAScript)
2577 {
2578 basic_string<_CharT> __t(__first, __last);
2579 return assign(__t.begin(), __t.end(), __f);
2580 }
2581
2582private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002583 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002584 void __member_init(flag_type __f)
2585 {
2586 __flags_ = __f;
2587 __marked_count_ = 0;
2588 __loop_count_ = 0;
2589 __open_count_ = 0;
2590 __end_ = nullptr;
Howard Hinnant7026a172010-08-13 18:11:23 +00002591 }
2592public:
2593
2594 template <class _ForwardIterator>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002595 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002596 typename enable_if
2597 <
2598 __is_forward_iterator<_ForwardIterator>::value,
2599 basic_regex&
2600 >::type
2601 assign(_ForwardIterator __first, _ForwardIterator __last,
2602 flag_type __f = regex_constants::ECMAScript)
2603 {
Marshall Clow083e0112015-01-13 16:49:52 +00002604 return assign(basic_regex(__first, __last, __f));
Howard Hinnant7026a172010-08-13 18:11:23 +00002605 }
2606
Howard Hinnante3e32912011-08-12 21:56:02 +00002607#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2608
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002609 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002610 basic_regex& assign(initializer_list<value_type> __il,
Howard Hinnant7026a172010-08-13 18:11:23 +00002611 flag_type __f = regex_constants::ECMAScript)
2612 {return assign(__il.begin(), __il.end(), __f);}
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002613
Howard Hinnante3e32912011-08-12 21:56:02 +00002614#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2615
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002616 // const operations:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002617 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002618 unsigned mark_count() const {return __marked_count_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002619 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002620 flag_type flags() const {return __flags_;}
2621
2622 // locale:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002623 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7026a172010-08-13 18:11:23 +00002624 locale_type imbue(locale_type __loc)
2625 {
2626 __member_init(ECMAScript);
2627 __start_.reset();
2628 return __traits_.imbue(__loc);
2629 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002630 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002631 locale_type getloc() const {return __traits_.getloc();}
2632
2633 // swap:
Howard Hinnant7026a172010-08-13 18:11:23 +00002634 void swap(basic_regex& __r);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002635
2636private:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002637 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002638 unsigned __loop_count() const {return __loop_count_;}
2639
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002640 template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002641 _ForwardIterator
2642 __parse(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002643 template <class _ForwardIterator>
2644 _ForwardIterator
2645 __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2646 template <class _ForwardIterator>
2647 _ForwardIterator
2648 __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2649 template <class _ForwardIterator>
2650 _ForwardIterator
2651 __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2652 template <class _ForwardIterator>
2653 _ForwardIterator
2654 __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2655 template <class _ForwardIterator>
2656 _ForwardIterator
2657 __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2658 template <class _ForwardIterator>
2659 _ForwardIterator
2660 __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2661 template <class _ForwardIterator>
2662 _ForwardIterator
2663 __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2664 template <class _ForwardIterator>
2665 _ForwardIterator
2666 __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2667 template <class _ForwardIterator>
2668 _ForwardIterator
2669 __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2670 template <class _ForwardIterator>
2671 _ForwardIterator
2672 __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2673 template <class _ForwardIterator>
2674 _ForwardIterator
2675 __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2676 template <class _ForwardIterator>
2677 _ForwardIterator
2678 __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2679 template <class _ForwardIterator>
2680 _ForwardIterator
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002681 __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002682 __owns_one_state<_CharT>* __s,
2683 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002684 template <class _ForwardIterator>
2685 _ForwardIterator
Howard Hinnantaa698082010-07-16 19:08:36 +00002686 __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2687 __owns_one_state<_CharT>* __s,
2688 unsigned __mexp_begin, unsigned __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002689 template <class _ForwardIterator>
2690 _ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00002691 __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2692 template <class _ForwardIterator>
2693 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002694 __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2695 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002696 template <class _ForwardIterator>
2697 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002698 __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2699 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002700 template <class _ForwardIterator>
2701 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002702 __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2703 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002704 template <class _ForwardIterator>
2705 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002706 __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2707 __bracket_expression<_CharT, _Traits>* __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002708 template <class _ForwardIterator>
2709 _ForwardIterator
Howard Hinnant173968a2010-07-13 21:48:06 +00002710 __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2711 basic_string<_CharT>& __col_sym);
Howard Hinnant0de86b62010-06-25 20:56:08 +00002712 template <class _ForwardIterator>
2713 _ForwardIterator
2714 __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002715 template <class _ForwardIterator>
2716 _ForwardIterator
2717 __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2718 template <class _ForwardIterator>
2719 _ForwardIterator
2720 __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2721 template <class _ForwardIterator>
2722 _ForwardIterator
2723 __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2724 template <class _ForwardIterator>
2725 _ForwardIterator
2726 __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2727 template <class _ForwardIterator>
2728 _ForwardIterator
2729 __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2730 template <class _ForwardIterator>
2731 _ForwardIterator
2732 __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002733 template <class _ForwardIterator>
2734 _ForwardIterator
2735 __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2736 template <class _ForwardIterator>
2737 _ForwardIterator
2738 __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2739 template <class _ForwardIterator>
2740 _ForwardIterator
2741 __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2742 template <class _ForwardIterator>
2743 _ForwardIterator
2744 __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2745 template <class _ForwardIterator>
2746 _ForwardIterator
2747 __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2748 template <class _ForwardIterator>
2749 _ForwardIterator
Howard Hinnant17615b02010-07-27 01:25:38 +00002750 __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2751 template <class _ForwardIterator>
2752 _ForwardIterator
2753 __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2754 template <class _ForwardIterator>
2755 _ForwardIterator
2756 __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2757 template <class _ForwardIterator>
2758 _ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00002759 __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2760 basic_string<_CharT>* __str = nullptr);
Howard Hinnant17615b02010-07-27 01:25:38 +00002761 template <class _ForwardIterator>
2762 _ForwardIterator
2763 __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant856846b2010-07-27 19:53:10 +00002764 template <class _ForwardIterator>
2765 _ForwardIterator
2766 __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2767 template <class _ForwardIterator>
2768 _ForwardIterator
2769 __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
Howard Hinnant15476f32010-07-28 17:35:27 +00002770 template <class _ForwardIterator>
2771 _ForwardIterator
2772 __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2773 basic_string<_CharT>& __str,
2774 __bracket_expression<_CharT, _Traits>* __ml);
2775 template <class _ForwardIterator>
2776 _ForwardIterator
2777 __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2778 basic_string<_CharT>* __str = nullptr);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002779
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002780 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002781 void __push_l_anchor();
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00002782 void __push_r_anchor();
Howard Hinnantac303862010-07-12 15:51:17 +00002783 void __push_match_any();
Howard Hinnant17615b02010-07-27 01:25:38 +00002784 void __push_match_any_but_newline();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002785 _LIBCPP_INLINE_VISIBILITY
Howard Hinnante77aa5e2010-07-08 17:43:58 +00002786 void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2787 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2788 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2789 __mexp_begin, __mexp_end);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002790 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant17615b02010-07-27 01:25:38 +00002791 void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2792 unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2793 {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2794 __mexp_begin, __mexp_end, false);}
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002795 void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
2796 size_t __mexp_begin = 0, size_t __mexp_end = 0,
2797 bool __greedy = true);
Howard Hinnant173968a2010-07-13 21:48:06 +00002798 __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00002799 void __push_char(value_type __c);
Howard Hinnantcba352d2010-07-12 18:16:05 +00002800 void __push_back_ref(int __i);
Howard Hinnantaa698082010-07-16 19:08:36 +00002801 void __push_alternation(__owns_one_state<_CharT>* __sa,
2802 __owns_one_state<_CharT>* __sb);
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00002803 void __push_begin_marked_subexpression();
2804 void __push_end_marked_subexpression(unsigned);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00002805 void __push_empty();
Howard Hinnant17615b02010-07-27 01:25:38 +00002806 void __push_word_boundary(bool);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002807 void __push_lookahead(const basic_regex&, bool, unsigned);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002808
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002809 template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002810 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002811 __search(const _CharT* __first, const _CharT* __last,
2812 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002813 regex_constants::match_flag_type __flags) const;
2814
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002815 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002816 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002817 __match_at_start(const _CharT* __first, const _CharT* __last,
2818 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002819 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant17615b02010-07-27 01:25:38 +00002820 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002821 bool
Howard Hinnant17615b02010-07-27 01:25:38 +00002822 __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
2823 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002824 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002825 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002826 bool
2827 __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002828 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002829 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002830 template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002831 bool
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002832 __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
2833 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002834 regex_constants::match_flag_type __flags, bool) const;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002835
Howard Hinnant99968442011-11-29 18:15:50 +00002836 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002837 friend
2838 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002839 regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00002840 regex_constants::match_flag_type);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002841
Howard Hinnant99968442011-11-29 18:15:50 +00002842 template <class _Ap, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002843 friend
2844 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002845 regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
2846 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002847
Howard Hinnant99968442011-11-29 18:15:50 +00002848 template <class _Bp, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002849 friend
2850 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002851 regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002852 regex_constants::match_flag_type);
2853
Howard Hinnant99968442011-11-29 18:15:50 +00002854 template <class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002855 friend
2856 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002857 regex_search(const _Cp*, const _Cp*,
2858 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002859
Howard Hinnant99968442011-11-29 18:15:50 +00002860 template <class _Cp, class _Ap, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002861 friend
2862 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002863 regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002864 regex_constants::match_flag_type);
2865
Howard Hinnant99968442011-11-29 18:15:50 +00002866 template <class _ST, class _SA, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002867 friend
2868 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002869 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2870 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002871 regex_constants::match_flag_type __flags);
2872
Howard Hinnant99968442011-11-29 18:15:50 +00002873 template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002874 friend
2875 bool
Howard Hinnant99968442011-11-29 18:15:50 +00002876 regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2877 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
2878 const basic_regex<_Cp, _Tp>& __e,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00002879 regex_constants::match_flag_type __flags);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002880
Howard Hinnanta9602d52013-06-29 23:45:43 +00002881 template <class _Iter, class _Ap, class _Cp, class _Tp>
2882 friend
2883 bool
2884 regex_search(__wrap_iter<_Iter> __first,
2885 __wrap_iter<_Iter> __last,
2886 match_results<__wrap_iter<_Iter>, _Ap>& __m,
2887 const basic_regex<_Cp, _Tp>& __e,
2888 regex_constants::match_flag_type __flags);
2889
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002890 template <class, class> friend class __lookahead;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002891};
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002892
2893template <class _CharT, class _Traits>
Howard Hinnant0a69fa12012-12-12 21:14:28 +00002894 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
2895template <class _CharT, class _Traits>
2896 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
2897template <class _CharT, class _Traits>
2898 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
2899template <class _CharT, class _Traits>
2900 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
2901template <class _CharT, class _Traits>
2902 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
2903template <class _CharT, class _Traits>
2904 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
2905template <class _CharT, class _Traits>
2906 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
2907template <class _CharT, class _Traits>
2908 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
2909template <class _CharT, class _Traits>
2910 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
2911template <class _CharT, class _Traits>
2912 const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
2913
2914template <class _CharT, class _Traits>
Howard Hinnant7026a172010-08-13 18:11:23 +00002915void
2916basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002917{
Howard Hinnant0949eed2011-06-30 21:18:19 +00002918 using _VSTD::swap;
Howard Hinnant7026a172010-08-13 18:11:23 +00002919 swap(__traits_, __r.__traits_);
2920 swap(__flags_, __r.__flags_);
2921 swap(__marked_count_, __r.__marked_count_);
2922 swap(__loop_count_, __r.__loop_count_);
2923 swap(__open_count_, __r.__open_count_);
2924 swap(__start_, __r.__start_);
2925 swap(__end_, __r.__end_);
Howard Hinnant7026a172010-08-13 18:11:23 +00002926}
2927
2928template <class _CharT, class _Traits>
2929inline _LIBCPP_INLINE_VISIBILITY
2930void
2931swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
2932{
2933 return __x.swap(__y);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002934}
2935
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002936// __lookahead
2937
2938template <class _CharT, class _Traits>
2939class __lookahead
2940 : public __owns_one_state<_CharT>
2941{
2942 typedef __owns_one_state<_CharT> base;
2943
2944 basic_regex<_CharT, _Traits> __exp_;
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002945 unsigned __mexp_;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002946 bool __invert_;
2947
2948 __lookahead(const __lookahead&);
2949 __lookahead& operator=(const __lookahead&);
2950public:
Howard Hinnant0949eed2011-06-30 21:18:19 +00002951 typedef _VSTD::__state<_CharT> __state;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002952
Howard Hinnantaef07cb2010-09-23 15:13:20 +00002953 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002954 __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
Eric Fiselier7cc71062015-07-22 01:29:41 +00002955 : base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {}
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002956
2957 virtual void __exec(__state&) const;
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002958};
2959
2960template <class _CharT, class _Traits>
2961void
2962__lookahead<_CharT, _Traits>::__exec(__state& __s) const
2963{
2964 match_results<const _CharT*> __m;
2965 __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
2966 bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00002967 __m,
2968 __s.__flags_ | regex_constants::match_continuous,
Howard Hinnante57b7c42013-06-28 19:11:23 +00002969 __s.__at_first_ && __s.__current_ == __s.__first_);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002970 if (__matched != __invert_)
2971 {
2972 __s.__do_ = __state::__accept_but_not_consume;
2973 __s.__node_ = this->first();
Howard Hinnantcd59acc2013-07-23 16:18:04 +00002974 for (unsigned __i = 1; __i < __m.size(); ++__i) {
2975 __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
2976 }
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002977 }
2978 else
2979 {
2980 __s.__do_ = __state::__reject;
2981 __s.__node_ = nullptr;
2982 }
2983}
2984
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002985template <class _CharT, class _Traits>
2986template <class _ForwardIterator>
Howard Hinnante9de5ff2010-07-27 22:20:32 +00002987_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002988basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
2989 _ForwardIterator __last)
2990{
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002991 {
Howard Hinnantac303862010-07-12 15:51:17 +00002992 unique_ptr<__node> __h(new __end_state<_CharT>);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00002993 __start_.reset(new __empty_state<_CharT>(__h.get()));
2994 __h.release();
2995 __end_ = __start_.get();
2996 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00002997 switch (__flags_ & 0x1F0)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00002998 {
2999 case ECMAScript:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003000 __first = __parse_ecma_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003001 break;
3002 case basic:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003003 __first = __parse_basic_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003004 break;
3005 case extended:
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003006 case awk:
Howard Hinnant15476f32010-07-28 17:35:27 +00003007 __first = __parse_extended_reg_exp(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003008 break;
3009 case grep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003010 __first = __parse_grep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003011 break;
3012 case egrep:
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003013 __first = __parse_egrep(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003014 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003015#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003016 default:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003017 throw regex_error(regex_constants::__re_err_grammar);
Howard Hinnant324bb032010-08-22 00:02:43 +00003018#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003019 }
Howard Hinnante9de5ff2010-07-27 22:20:32 +00003020 return __first;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003021}
3022
3023template <class _CharT, class _Traits>
3024template <class _ForwardIterator>
3025_ForwardIterator
3026basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
3027 _ForwardIterator __last)
3028{
3029 if (__first != __last)
3030 {
3031 if (*__first == '^')
3032 {
3033 __push_l_anchor();
3034 ++__first;
3035 }
3036 if (__first != __last)
3037 {
3038 __first = __parse_RE_expression(__first, __last);
3039 if (__first != __last)
3040 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003041 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003042 if (__temp == __last && *__first == '$')
3043 {
3044 __push_r_anchor();
3045 ++__first;
3046 }
3047 }
3048 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003049#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003050 if (__first != __last)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003051 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003052#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003053 }
3054 return __first;
3055}
3056
3057template <class _CharT, class _Traits>
3058template <class _ForwardIterator>
3059_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003060basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
3061 _ForwardIterator __last)
3062{
Howard Hinnantaa698082010-07-16 19:08:36 +00003063 __owns_one_state<_CharT>* __sa = __end_;
3064 _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003065#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003066 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003067 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003068#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003069 __first = __temp;
3070 while (__first != __last && *__first == '|')
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003071 {
Howard Hinnantaa698082010-07-16 19:08:36 +00003072 __owns_one_state<_CharT>* __sb = __end_;
3073 __temp = __parse_ERE_branch(++__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003074#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003075 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003076 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003077#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantaa698082010-07-16 19:08:36 +00003078 __push_alternation(__sa, __sb);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003079 __first = __temp;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003080 }
3081 return __first;
3082}
3083
3084template <class _CharT, class _Traits>
3085template <class _ForwardIterator>
3086_ForwardIterator
3087basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3088 _ForwardIterator __last)
3089{
3090 _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003091#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003092 if (__temp == __first)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00003093 throw regex_error(regex_constants::__re_err_empty);
Howard Hinnant324bb032010-08-22 00:02:43 +00003094#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003095 do
3096 {
3097 __first = __temp;
3098 __temp = __parse_ERE_expression(__first, __last);
3099 } while (__temp != __first);
3100 return __first;
3101}
3102
3103template <class _CharT, class _Traits>
3104template <class _ForwardIterator>
3105_ForwardIterator
3106basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3107 _ForwardIterator __last)
3108{
Howard Hinnantaa698082010-07-16 19:08:36 +00003109 __owns_one_state<_CharT>* __e = __end_;
3110 unsigned __mexp_begin = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003111 _ForwardIterator __temp = __parse_one_char_or_coll_elem_ERE(__first, __last);
3112 if (__temp == __first && __temp != __last)
3113 {
3114 switch (*__temp)
3115 {
3116 case '^':
3117 __push_l_anchor();
3118 ++__temp;
3119 break;
3120 case '$':
3121 __push_r_anchor();
3122 ++__temp;
3123 break;
3124 case '(':
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003125 __push_begin_marked_subexpression();
3126 unsigned __temp_count = __marked_count_;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003127 ++__open_count_;
3128 __temp = __parse_extended_reg_exp(++__temp, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003129#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003130 if (__temp == __last || *__temp != ')')
3131 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00003132#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003133 __push_end_marked_subexpression(__temp_count);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003134 --__open_count_;
3135 ++__temp;
3136 break;
3137 }
3138 }
3139 if (__temp != __first)
Howard Hinnantaa698082010-07-16 19:08:36 +00003140 __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3141 __marked_count_+1);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003142 __first = __temp;
3143 return __first;
3144}
3145
3146template <class _CharT, class _Traits>
3147template <class _ForwardIterator>
3148_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003149basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3150 _ForwardIterator __last)
3151{
3152 while (true)
3153 {
3154 _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3155 if (__temp == __first)
3156 break;
3157 __first = __temp;
3158 }
3159 return __first;
3160}
3161
3162template <class _CharT, class _Traits>
3163template <class _ForwardIterator>
3164_ForwardIterator
3165basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3166 _ForwardIterator __last)
3167{
3168 if (__first != __last)
3169 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003170 __owns_one_state<_CharT>* __e = __end_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003171 unsigned __mexp_begin = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003172 _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3173 if (__temp != __first)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003174 __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3175 __mexp_begin+1, __marked_count_+1);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003176 }
3177 return __first;
3178}
3179
3180template <class _CharT, class _Traits>
3181template <class _ForwardIterator>
3182_ForwardIterator
3183basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3184 _ForwardIterator __last)
3185{
3186 _ForwardIterator __temp = __first;
3187 __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3188 if (__temp == __first)
3189 {
3190 __temp = __parse_Back_open_paren(__first, __last);
3191 if (__temp != __first)
3192 {
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003193 __push_begin_marked_subexpression();
3194 unsigned __temp_count = __marked_count_;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003195 __first = __parse_RE_expression(__temp, __last);
3196 __temp = __parse_Back_close_paren(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003197#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003198 if (__temp == __first)
3199 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00003200#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00003201 __push_end_marked_subexpression(__temp_count);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003202 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003203 }
3204 else
3205 __first = __parse_BACKREF(__first, __last);
3206 }
3207 return __first;
3208}
3209
3210template <class _CharT, class _Traits>
3211template <class _ForwardIterator>
3212_ForwardIterator
3213basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3214 _ForwardIterator __first,
3215 _ForwardIterator __last)
3216{
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003217 _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003218 if (__temp == __first)
3219 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003220 __temp = __parse_QUOTED_CHAR(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003221 if (__temp == __first)
3222 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003223 if (__temp != __last && *__temp == '.')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003224 {
3225 __push_match_any();
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003226 ++__temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003227 }
3228 else
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003229 __temp = __parse_bracket_expression(__first, __last);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003230 }
3231 }
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003232 __first = __temp;
3233 return __first;
3234}
3235
3236template <class _CharT, class _Traits>
3237template <class _ForwardIterator>
3238_ForwardIterator
3239basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3240 _ForwardIterator __first,
3241 _ForwardIterator __last)
3242{
3243 _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3244 if (__temp == __first)
3245 {
3246 __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3247 if (__temp == __first)
3248 {
3249 if (__temp != __last && *__temp == '.')
3250 {
3251 __push_match_any();
3252 ++__temp;
3253 }
3254 else
3255 __temp = __parse_bracket_expression(__first, __last);
3256 }
3257 }
3258 __first = __temp;
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003259 return __first;
3260}
3261
3262template <class _CharT, class _Traits>
3263template <class _ForwardIterator>
3264_ForwardIterator
3265basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3266 _ForwardIterator __last)
3267{
3268 if (__first != __last)
3269 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003270 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003271 if (__temp != __last)
3272 {
3273 if (*__first == '\\' && *__temp == '(')
3274 __first = ++__temp;
3275 }
3276 }
3277 return __first;
3278}
3279
3280template <class _CharT, class _Traits>
3281template <class _ForwardIterator>
3282_ForwardIterator
3283basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3284 _ForwardIterator __last)
3285{
3286 if (__first != __last)
3287 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003288 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003289 if (__temp != __last)
3290 {
3291 if (*__first == '\\' && *__temp == ')')
3292 __first = ++__temp;
3293 }
3294 }
3295 return __first;
3296}
3297
3298template <class _CharT, class _Traits>
3299template <class _ForwardIterator>
3300_ForwardIterator
3301basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3302 _ForwardIterator __last)
3303{
3304 if (__first != __last)
3305 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003306 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003307 if (__temp != __last)
3308 {
3309 if (*__first == '\\' && *__temp == '{')
3310 __first = ++__temp;
3311 }
3312 }
3313 return __first;
3314}
3315
3316template <class _CharT, class _Traits>
3317template <class _ForwardIterator>
3318_ForwardIterator
3319basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3320 _ForwardIterator __last)
3321{
3322 if (__first != __last)
3323 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003324 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003325 if (__temp != __last)
3326 {
3327 if (*__first == '\\' && *__temp == '}')
3328 __first = ++__temp;
3329 }
3330 }
3331 return __first;
3332}
3333
3334template <class _CharT, class _Traits>
3335template <class _ForwardIterator>
3336_ForwardIterator
3337basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3338 _ForwardIterator __last)
3339{
3340 if (__first != __last)
3341 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003342 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003343 if (__temp != __last)
3344 {
Marshall Clow97f50f62014-01-18 03:40:03 +00003345 if (*__first == '\\')
3346 {
3347 int __val = __traits_.value(*__temp, 10);
3348 if (__val >= 1 && __val <= 9)
3349 {
3350 __push_back_ref(__val);
3351 __first = ++__temp;
3352 }
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003353 }
3354 }
3355 }
3356 return __first;
3357}
3358
3359template <class _CharT, class _Traits>
3360template <class _ForwardIterator>
3361_ForwardIterator
3362basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3363 _ForwardIterator __last)
3364{
3365 if (__first != __last)
3366 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003367 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003368 if (__temp == __last && *__first == '$')
3369 return __first;
3370 // Not called inside a bracket
3371 if (*__first == '.' || *__first == '\\' || *__first == '[')
3372 return __first;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003373 __push_char(*__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003374 ++__first;
3375 }
3376 return __first;
3377}
3378
3379template <class _CharT, class _Traits>
3380template <class _ForwardIterator>
3381_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003382basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3383 _ForwardIterator __last)
3384{
3385 if (__first != __last)
3386 {
3387 switch (*__first)
3388 {
3389 case '^':
3390 case '.':
3391 case '[':
3392 case '$':
3393 case '(':
3394 case '|':
3395 case '*':
3396 case '+':
3397 case '?':
3398 case '{':
3399 case '\\':
3400 break;
3401 case ')':
3402 if (__open_count_ == 0)
3403 {
3404 __push_char(*__first);
3405 ++__first;
3406 }
3407 break;
3408 default:
3409 __push_char(*__first);
3410 ++__first;
3411 break;
3412 }
3413 }
3414 return __first;
3415}
3416
3417template <class _CharT, class _Traits>
3418template <class _ForwardIterator>
3419_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003420basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3421 _ForwardIterator __last)
3422{
3423 if (__first != __last)
3424 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003425 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003426 if (__temp != __last)
3427 {
3428 if (*__first == '\\')
3429 {
3430 switch (*__temp)
3431 {
3432 case '^':
3433 case '.':
3434 case '*':
3435 case '[':
3436 case '$':
3437 case '\\':
Howard Hinnant0de86b62010-06-25 20:56:08 +00003438 __push_char(*__temp);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003439 __first = ++__temp;
3440 break;
3441 }
3442 }
3443 }
3444 }
3445 return __first;
3446}
3447
3448template <class _CharT, class _Traits>
3449template <class _ForwardIterator>
3450_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003451basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3452 _ForwardIterator __last)
3453{
3454 if (__first != __last)
3455 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003456 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003457 if (__temp != __last)
3458 {
3459 if (*__first == '\\')
3460 {
3461 switch (*__temp)
3462 {
3463 case '^':
3464 case '.':
3465 case '*':
3466 case '[':
3467 case '$':
3468 case '\\':
3469 case '(':
3470 case ')':
3471 case '|':
3472 case '+':
3473 case '?':
3474 case '{':
Howard Hinnantc1ecd972013-06-28 20:31:05 +00003475 case '}':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003476 __push_char(*__temp);
3477 __first = ++__temp;
3478 break;
Howard Hinnant15476f32010-07-28 17:35:27 +00003479 default:
3480 if ((__flags_ & 0x1F0) == awk)
3481 __first = __parse_awk_escape(++__first, __last);
3482 break;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003483 }
3484 }
3485 }
3486 }
3487 return __first;
3488}
3489
3490template <class _CharT, class _Traits>
3491template <class _ForwardIterator>
3492_ForwardIterator
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003493basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantf8ce4592010-07-07 19:14:52 +00003494 _ForwardIterator __last,
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003495 __owns_one_state<_CharT>* __s,
3496 unsigned __mexp_begin,
3497 unsigned __mexp_end)
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003498{
3499 if (__first != __last)
3500 {
Howard Hinnant0de86b62010-06-25 20:56:08 +00003501 if (*__first == '*')
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003502 {
Howard Hinnante77aa5e2010-07-08 17:43:58 +00003503 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003504 ++__first;
3505 }
3506 else
3507 {
3508 _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3509 if (__temp != __first)
3510 {
3511 int __min = 0;
3512 __first = __temp;
3513 __temp = __parse_DUP_COUNT(__first, __last, __min);
Howard Hinnantd4444702010-08-11 17:04:31 +00003514#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003515 if (__temp == __first)
3516 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003517#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003518 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003519#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003520 if (__first == __last)
3521 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003522#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003523 if (*__first != ',')
3524 {
3525 __temp = __parse_Back_close_brace(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003526#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003527 if (__temp == __first)
3528 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003529#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcba352d2010-07-12 18:16:05 +00003530 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3531 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003532 __first = __temp;
3533 }
3534 else
3535 {
3536 ++__first; // consume ','
3537 int __max = -1;
3538 __first = __parse_DUP_COUNT(__first, __last, __max);
3539 __temp = __parse_Back_close_brace(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00003540#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003541 if (__temp == __first)
3542 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003543#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003544 if (__max == -1)
Howard Hinnantaa698082010-07-16 19:08:36 +00003545 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003546 else
3547 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003548#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003549 if (__max < __min)
3550 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003551#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcba352d2010-07-12 18:16:05 +00003552 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3553 true);
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00003554 }
3555 __first = __temp;
3556 }
3557 }
3558 }
3559 }
3560 return __first;
3561}
3562
Howard Hinnant0de86b62010-06-25 20:56:08 +00003563template <class _CharT, class _Traits>
3564template <class _ForwardIterator>
3565_ForwardIterator
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003566basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
Howard Hinnantaa698082010-07-16 19:08:36 +00003567 _ForwardIterator __last,
3568 __owns_one_state<_CharT>* __s,
3569 unsigned __mexp_begin,
3570 unsigned __mexp_end)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003571{
3572 if (__first != __last)
3573 {
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003574 unsigned __grammar = __flags_ & 0x1F0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003575 switch (*__first)
3576 {
3577 case '*':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003578 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003579 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003580 {
3581 ++__first;
3582 __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3583 }
3584 else
3585 __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003586 break;
3587 case '+':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003588 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003589 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003590 {
3591 ++__first;
3592 __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3593 }
3594 else
3595 __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003596 break;
3597 case '?':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003598 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003599 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003600 {
3601 ++__first;
3602 __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3603 }
3604 else
3605 __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003606 break;
3607 case '{':
3608 {
3609 int __min;
Howard Hinnantaa698082010-07-16 19:08:36 +00003610 _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
Howard Hinnantd4444702010-08-11 17:04:31 +00003611#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003612 if (__temp == __first)
3613 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003614#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003615 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003616#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003617 if (__first == __last)
3618 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003619#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003620 switch (*__first)
3621 {
3622 case '}':
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003623 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003624 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003625 {
3626 ++__first;
3627 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3628 }
3629 else
3630 __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003631 break;
3632 case ',':
Howard Hinnantd4444702010-08-11 17:04:31 +00003633 ++__first;
3634#ifndef _LIBCPP_NO_EXCEPTIONS
3635 if (__first == __last)
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003636 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003637#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003638 if (*__first == '}')
3639 {
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003640 ++__first;
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003641 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003642 {
3643 ++__first;
3644 __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3645 }
3646 else
3647 __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003648 }
3649 else
3650 {
Howard Hinnantaa698082010-07-16 19:08:36 +00003651 int __max = -1;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003652 __temp = __parse_DUP_COUNT(__first, __last, __max);
Howard Hinnantd4444702010-08-11 17:04:31 +00003653#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003654 if (__temp == __first)
3655 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003656#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003657 __first = __temp;
Howard Hinnantd4444702010-08-11 17:04:31 +00003658#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003659 if (__first == __last || *__first != '}')
3660 throw regex_error(regex_constants::error_brace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003661#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003662 ++__first;
Howard Hinnantd4444702010-08-11 17:04:31 +00003663#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003664 if (__max < __min)
3665 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003666#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnanta0d045b2010-07-29 00:36:00 +00003667 if (__grammar == ECMAScript && __first != __last && *__first == '?')
Howard Hinnant17615b02010-07-27 01:25:38 +00003668 {
3669 ++__first;
3670 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3671 }
3672 else
3673 __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003674 }
Howard Hinnantaa698082010-07-16 19:08:36 +00003675 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00003676#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003677 default:
3678 throw regex_error(regex_constants::error_badbrace);
Howard Hinnant324bb032010-08-22 00:02:43 +00003679#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00003680 }
3681 }
3682 break;
3683 }
3684 }
3685 return __first;
3686}
3687
3688template <class _CharT, class _Traits>
3689template <class _ForwardIterator>
3690_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003691basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3692 _ForwardIterator __last)
3693{
3694 if (__first != __last && *__first == '[')
3695 {
Howard Hinnantd4444702010-08-11 17:04:31 +00003696 ++__first;
3697#ifndef _LIBCPP_NO_EXCEPTIONS
3698 if (__first == __last)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003699 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003700#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00003701 bool __negate = false;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003702 if (*__first == '^')
3703 {
3704 ++__first;
Howard Hinnant173968a2010-07-13 21:48:06 +00003705 __negate = true;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003706 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003707 __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3708 // __ml owned by *this
Howard Hinnantd4444702010-08-11 17:04:31 +00003709#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003710 if (__first == __last)
3711 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003712#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003713 if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']')
Howard Hinnant0de86b62010-06-25 20:56:08 +00003714 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003715 __ml->__add_char(']');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003716 ++__first;
3717 }
Howard Hinnant173968a2010-07-13 21:48:06 +00003718 __first = __parse_follow_list(__first, __last, __ml);
Howard Hinnantd4444702010-08-11 17:04:31 +00003719#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003720 if (__first == __last)
3721 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003722#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003723 if (*__first == '-')
3724 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003725 __ml->__add_char('-');
Howard Hinnant0de86b62010-06-25 20:56:08 +00003726 ++__first;
3727 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003728#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003729 if (__first == __last || *__first != ']')
3730 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003731#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003732 ++__first;
3733 }
3734 return __first;
3735}
3736
3737template <class _CharT, class _Traits>
3738template <class _ForwardIterator>
3739_ForwardIterator
3740basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003741 _ForwardIterator __last,
3742 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003743{
3744 if (__first != __last)
3745 {
3746 while (true)
3747 {
Howard Hinnant173968a2010-07-13 21:48:06 +00003748 _ForwardIterator __temp = __parse_expression_term(__first, __last,
3749 __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003750 if (__temp == __first)
3751 break;
3752 __first = __temp;
3753 }
3754 }
3755 return __first;
3756}
3757
3758template <class _CharT, class _Traits>
3759template <class _ForwardIterator>
3760_ForwardIterator
3761basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003762 _ForwardIterator __last,
3763 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003764{
3765 if (__first != __last && *__first != ']')
3766 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003767 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant173968a2010-07-13 21:48:06 +00003768 basic_string<_CharT> __start_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003769 if (__temp != __last && *__first == '[')
3770 {
3771 if (*__temp == '=')
Howard Hinnant173968a2010-07-13 21:48:06 +00003772 return __parse_equivalence_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003773 else if (*__temp == ':')
Howard Hinnant173968a2010-07-13 21:48:06 +00003774 return __parse_character_class(++__temp, __last, __ml);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003775 else if (*__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003776 __first = __parse_collating_symbol(++__temp, __last, __start_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003777 }
Howard Hinnant15476f32010-07-28 17:35:27 +00003778 unsigned __grammar = __flags_ & 0x1F0;
3779 if (__start_range.empty())
Howard Hinnant0de86b62010-06-25 20:56:08 +00003780 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003781 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3782 {
3783 if (__grammar == ECMAScript)
3784 __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3785 else
3786 __first = __parse_awk_escape(++__first, __last, &__start_range);
3787 }
3788 else
3789 {
3790 __start_range = *__first;
3791 ++__first;
3792 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003793 }
3794 if (__first != __last && *__first != ']')
3795 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00003796 __temp = _VSTD::next(__first);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003797 if (__temp != __last && *__first == '-' && *__temp != ']')
3798 {
3799 // parse a range
Howard Hinnant173968a2010-07-13 21:48:06 +00003800 basic_string<_CharT> __end_range;
Howard Hinnant0de86b62010-06-25 20:56:08 +00003801 __first = __temp;
3802 ++__temp;
3803 if (__temp != __last && *__first == '[' && *__temp == '.')
Howard Hinnant173968a2010-07-13 21:48:06 +00003804 __first = __parse_collating_symbol(++__temp, __last, __end_range);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003805 else
3806 {
Howard Hinnant15476f32010-07-28 17:35:27 +00003807 if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3808 {
3809 if (__grammar == ECMAScript)
3810 __first = __parse_class_escape(++__first, __last,
3811 __end_range, __ml);
3812 else
3813 __first = __parse_awk_escape(++__first, __last,
3814 &__end_range);
3815 }
3816 else
3817 {
3818 __end_range = *__first;
3819 ++__first;
3820 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00003821 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00003822 __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
Howard Hinnant0de86b62010-06-25 20:56:08 +00003823 }
Howard Hinnant499cea12013-08-23 17:37:05 +00003824 else if (!__start_range.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003825 {
3826 if (__start_range.size() == 1)
3827 __ml->__add_char(__start_range[0]);
3828 else
3829 __ml->__add_digraph(__start_range[0], __start_range[1]);
3830 }
3831 }
Howard Hinnant499cea12013-08-23 17:37:05 +00003832 else if (!__start_range.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003833 {
3834 if (__start_range.size() == 1)
3835 __ml->__add_char(__start_range[0]);
3836 else
3837 __ml->__add_digraph(__start_range[0], __start_range[1]);
Howard Hinnant0de86b62010-06-25 20:56:08 +00003838 }
3839 }
3840 return __first;
3841}
3842
3843template <class _CharT, class _Traits>
3844template <class _ForwardIterator>
3845_ForwardIterator
Howard Hinnant15476f32010-07-28 17:35:27 +00003846basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
3847 _ForwardIterator __last,
3848 basic_string<_CharT>& __str,
3849 __bracket_expression<_CharT, _Traits>* __ml)
3850{
Howard Hinnantd4444702010-08-11 17:04:31 +00003851#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003852 if (__first == __last)
3853 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003854#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003855 switch (*__first)
3856 {
3857 case 0:
3858 __str = *__first;
3859 return ++__first;
3860 case 'b':
3861 __str = _CharT(8);
3862 return ++__first;
3863 case 'd':
3864 __ml->__add_class(ctype_base::digit);
3865 return ++__first;
3866 case 'D':
3867 __ml->__add_neg_class(ctype_base::digit);
3868 return ++__first;
3869 case 's':
3870 __ml->__add_class(ctype_base::space);
3871 return ++__first;
3872 case 'S':
3873 __ml->__add_neg_class(ctype_base::space);
3874 return ++__first;
3875 case 'w':
3876 __ml->__add_class(ctype_base::alnum);
3877 __ml->__add_char('_');
3878 return ++__first;
3879 case 'W':
3880 __ml->__add_neg_class(ctype_base::alnum);
3881 __ml->__add_neg_char('_');
3882 return ++__first;
3883 }
3884 __first = __parse_character_escape(__first, __last, &__str);
3885 return __first;
3886}
3887
3888template <class _CharT, class _Traits>
3889template <class _ForwardIterator>
3890_ForwardIterator
3891basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
3892 _ForwardIterator __last,
3893 basic_string<_CharT>* __str)
3894{
Howard Hinnantd4444702010-08-11 17:04:31 +00003895#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003896 if (__first == __last)
3897 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003898#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003899 switch (*__first)
3900 {
3901 case '\\':
3902 case '"':
3903 case '/':
3904 if (__str)
3905 *__str = *__first;
3906 else
3907 __push_char(*__first);
3908 return ++__first;
3909 case 'a':
3910 if (__str)
3911 *__str = _CharT(7);
3912 else
3913 __push_char(_CharT(7));
3914 return ++__first;
3915 case 'b':
3916 if (__str)
3917 *__str = _CharT(8);
3918 else
3919 __push_char(_CharT(8));
3920 return ++__first;
3921 case 'f':
3922 if (__str)
3923 *__str = _CharT(0xC);
3924 else
3925 __push_char(_CharT(0xC));
3926 return ++__first;
3927 case 'n':
3928 if (__str)
3929 *__str = _CharT(0xA);
3930 else
3931 __push_char(_CharT(0xA));
3932 return ++__first;
3933 case 'r':
3934 if (__str)
3935 *__str = _CharT(0xD);
3936 else
3937 __push_char(_CharT(0xD));
3938 return ++__first;
3939 case 't':
3940 if (__str)
3941 *__str = _CharT(0x9);
3942 else
3943 __push_char(_CharT(0x9));
3944 return ++__first;
3945 case 'v':
3946 if (__str)
3947 *__str = _CharT(0xB);
3948 else
3949 __push_char(_CharT(0xB));
3950 return ++__first;
3951 }
3952 if ('0' <= *__first && *__first <= '7')
3953 {
3954 unsigned __val = *__first - '0';
3955 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3956 {
3957 __val = 8 * __val + *__first - '0';
3958 if (++__first != __last && ('0' <= *__first && *__first <= '7'))
Howard Hinnantdbc8cf02013-07-02 17:43:31 +00003959 __val = 8 * __val + *__first++ - '0';
Howard Hinnant15476f32010-07-28 17:35:27 +00003960 }
3961 if (__str)
3962 *__str = _CharT(__val);
3963 else
3964 __push_char(_CharT(__val));
3965 }
Howard Hinnantd4444702010-08-11 17:04:31 +00003966#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003967 else
3968 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00003969#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant15476f32010-07-28 17:35:27 +00003970 return __first;
3971}
3972
3973template <class _CharT, class _Traits>
3974template <class _ForwardIterator>
3975_ForwardIterator
Howard Hinnant0de86b62010-06-25 20:56:08 +00003976basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00003977 _ForwardIterator __last,
3978 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00003979{
3980 // Found [=
3981 // This means =] must exist
3982 value_type _Equal_close[2] = {'=', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00003983 _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00003984 _Equal_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00003985#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003986 if (__temp == __last)
3987 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00003988#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003989 // [__first, __temp) contains all text in [= ... =]
3990 typedef typename _Traits::string_type string_type;
3991 string_type __collate_name =
3992 __traits_.lookup_collatename(__first, __temp);
Howard Hinnantd4444702010-08-11 17:04:31 +00003993#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003994 if (__collate_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00003995 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00003996#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00003997 string_type __equiv_name =
3998 __traits_.transform_primary(__collate_name.begin(),
3999 __collate_name.end());
4000 if (!__equiv_name.empty())
Howard Hinnant173968a2010-07-13 21:48:06 +00004001 __ml->__add_equivalence(__equiv_name);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004002 else
Howard Hinnant173968a2010-07-13 21:48:06 +00004003 {
4004 switch (__collate_name.size())
4005 {
4006 case 1:
4007 __ml->__add_char(__collate_name[0]);
4008 break;
4009 case 2:
4010 __ml->__add_digraph(__collate_name[0], __collate_name[1]);
4011 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00004012#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004013 default:
4014 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00004015#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004016 }
4017 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004018 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004019 return __first;
4020}
4021
4022template <class _CharT, class _Traits>
4023template <class _ForwardIterator>
4024_ForwardIterator
4025basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00004026 _ForwardIterator __last,
4027 __bracket_expression<_CharT, _Traits>* __ml)
Howard Hinnant0de86b62010-06-25 20:56:08 +00004028{
4029 // Found [:
4030 // This means :] must exist
4031 value_type _Colon_close[2] = {':', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00004032 _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00004033 _Colon_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00004034#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004035 if (__temp == __last)
4036 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00004037#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004038 // [__first, __temp) contains all text in [: ... :]
4039 typedef typename _Traits::char_class_type char_class_type;
4040 char_class_type __class_type =
4041 __traits_.lookup_classname(__first, __temp, __flags_ & icase);
Howard Hinnantd4444702010-08-11 17:04:31 +00004042#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004043 if (__class_type == 0)
4044 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00004045#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004046 __ml->__add_class(__class_type);
Howard Hinnant0949eed2011-06-30 21:18:19 +00004047 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004048 return __first;
4049}
4050
4051template <class _CharT, class _Traits>
4052template <class _ForwardIterator>
4053_ForwardIterator
4054basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
Howard Hinnant173968a2010-07-13 21:48:06 +00004055 _ForwardIterator __last,
4056 basic_string<_CharT>& __col_sym)
Howard Hinnant0de86b62010-06-25 20:56:08 +00004057{
4058 // Found [.
4059 // This means .] must exist
4060 value_type _Dot_close[2] = {'.', ']'};
Howard Hinnant0949eed2011-06-30 21:18:19 +00004061 _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
Howard Hinnant0de86b62010-06-25 20:56:08 +00004062 _Dot_close+2);
Howard Hinnantd4444702010-08-11 17:04:31 +00004063#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004064 if (__temp == __last)
4065 throw regex_error(regex_constants::error_brack);
Howard Hinnant324bb032010-08-22 00:02:43 +00004066#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0de86b62010-06-25 20:56:08 +00004067 // [__first, __temp) contains all text in [. ... .]
Howard Hinnant173968a2010-07-13 21:48:06 +00004068 __col_sym = __traits_.lookup_collatename(__first, __temp);
4069 switch (__col_sym.size())
4070 {
4071 case 1:
4072 case 2:
4073 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00004074#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004075 default:
4076 throw regex_error(regex_constants::error_collate);
Howard Hinnant324bb032010-08-22 00:02:43 +00004077#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant173968a2010-07-13 21:48:06 +00004078 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00004079 __first = _VSTD::next(__temp, 2);
Howard Hinnant0de86b62010-06-25 20:56:08 +00004080 return __first;
4081}
4082
4083template <class _CharT, class _Traits>
4084template <class _ForwardIterator>
4085_ForwardIterator
4086basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4087 _ForwardIterator __last,
4088 int& __c)
4089{
Marshall Clow97f50f62014-01-18 03:40:03 +00004090 if (__first != __last )
Howard Hinnant0de86b62010-06-25 20:56:08 +00004091 {
Marshall Clow97f50f62014-01-18 03:40:03 +00004092 int __val = __traits_.value(*__first, 10);
4093 if ( __val != -1 )
Howard Hinnant0de86b62010-06-25 20:56:08 +00004094 {
Marshall Clow97f50f62014-01-18 03:40:03 +00004095 __c = __val;
4096 for (++__first;
4097 __first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
4098 ++__first)
4099 {
4100 __c *= 10;
4101 __c += __val;
4102 }
Howard Hinnant0de86b62010-06-25 20:56:08 +00004103 }
4104 }
4105 return __first;
4106}
4107
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004108template <class _CharT, class _Traits>
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004109template <class _ForwardIterator>
4110_ForwardIterator
4111basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4112 _ForwardIterator __last)
4113{
4114 __owns_one_state<_CharT>* __sa = __end_;
4115 _ForwardIterator __temp = __parse_alternative(__first, __last);
4116 if (__temp == __first)
4117 __push_empty();
4118 __first = __temp;
4119 while (__first != __last && *__first == '|')
4120 {
4121 __owns_one_state<_CharT>* __sb = __end_;
4122 __temp = __parse_alternative(++__first, __last);
4123 if (__temp == __first)
4124 __push_empty();
4125 __push_alternation(__sa, __sb);
4126 __first = __temp;
4127 }
4128 return __first;
4129}
4130
4131template <class _CharT, class _Traits>
4132template <class _ForwardIterator>
4133_ForwardIterator
4134basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4135 _ForwardIterator __last)
4136{
4137 while (true)
4138 {
4139 _ForwardIterator __temp = __parse_term(__first, __last);
4140 if (__temp == __first)
4141 break;
4142 __first = __temp;
4143 }
4144 return __first;
4145}
4146
4147template <class _CharT, class _Traits>
4148template <class _ForwardIterator>
4149_ForwardIterator
4150basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4151 _ForwardIterator __last)
4152{
4153 _ForwardIterator __temp = __parse_assertion(__first, __last);
4154 if (__temp == __first)
4155 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004156 __owns_one_state<_CharT>* __e = __end_;
4157 unsigned __mexp_begin = __marked_count_;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004158 __temp = __parse_atom(__first, __last);
4159 if (__temp != __first)
Howard Hinnant17615b02010-07-27 01:25:38 +00004160 __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4161 __mexp_begin+1, __marked_count_+1);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004162 }
Howard Hinnant17615b02010-07-27 01:25:38 +00004163 else
4164 __first = __temp;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004165 return __first;
4166}
4167
4168template <class _CharT, class _Traits>
4169template <class _ForwardIterator>
4170_ForwardIterator
4171basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4172 _ForwardIterator __last)
4173{
4174 if (__first != __last)
4175 {
4176 switch (*__first)
4177 {
4178 case '^':
4179 __push_l_anchor();
4180 ++__first;
4181 break;
4182 case '$':
4183 __push_r_anchor();
4184 ++__first;
4185 break;
4186 case '\\':
4187 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004188 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004189 if (__temp != __last)
4190 {
4191 if (*__temp == 'b')
4192 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004193 __push_word_boundary(false);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004194 __first = ++__temp;
4195 }
4196 else if (*__temp == 'B')
4197 {
Howard Hinnant17615b02010-07-27 01:25:38 +00004198 __push_word_boundary(true);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004199 __first = ++__temp;
4200 }
4201 }
4202 }
4203 break;
4204 case '(':
4205 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004206 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004207 if (__temp != __last && *__temp == '?')
4208 {
4209 if (++__temp != __last)
4210 {
4211 switch (*__temp)
4212 {
4213 case '=':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004214 {
4215 basic_regex __exp;
4216 __exp.__flags_ = __flags_;
4217 __temp = __exp.__parse(++__temp, __last);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004218 unsigned __mexp = __exp.__marked_count_;
4219 __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
4220 __marked_count_ += __mexp;
Howard Hinnantd4444702010-08-11 17:04:31 +00004221#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004222 if (__temp == __last || *__temp != ')')
4223 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004224#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004225 __first = ++__temp;
4226 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004227 break;
4228 case '!':
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004229 {
4230 basic_regex __exp;
4231 __exp.__flags_ = __flags_;
4232 __temp = __exp.__parse(++__temp, __last);
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004233 unsigned __mexp = __exp.__marked_count_;
4234 __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
4235 __marked_count_ += __mexp;
Howard Hinnantd4444702010-08-11 17:04:31 +00004236#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004237 if (__temp == __last || *__temp != ')')
4238 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004239#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004240 __first = ++__temp;
4241 }
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004242 break;
4243 }
4244 }
4245 }
4246 }
4247 break;
4248 }
4249 }
4250 return __first;
4251}
4252
4253template <class _CharT, class _Traits>
4254template <class _ForwardIterator>
4255_ForwardIterator
4256basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4257 _ForwardIterator __last)
4258{
Howard Hinnant17615b02010-07-27 01:25:38 +00004259 if (__first != __last)
4260 {
4261 switch (*__first)
4262 {
4263 case '.':
4264 __push_match_any_but_newline();
4265 ++__first;
4266 break;
4267 case '\\':
4268 __first = __parse_atom_escape(__first, __last);
4269 break;
4270 case '[':
4271 __first = __parse_bracket_expression(__first, __last);
4272 break;
4273 case '(':
4274 {
Howard Hinnantd4444702010-08-11 17:04:31 +00004275 ++__first;
4276#ifndef _LIBCPP_NO_EXCEPTIONS
4277 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004278 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004279#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant0949eed2011-06-30 21:18:19 +00004280 _ForwardIterator __temp = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004281 if (__temp != __last && *__first == '?' && *__temp == ':')
4282 {
4283 ++__open_count_;
4284 __first = __parse_ecma_exp(++__temp, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00004285#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004286 if (__first == __last || *__first != ')')
4287 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004288#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004289 --__open_count_;
4290 ++__first;
4291 }
4292 else
4293 {
4294 __push_begin_marked_subexpression();
4295 unsigned __temp_count = __marked_count_;
4296 ++__open_count_;
4297 __first = __parse_ecma_exp(__first, __last);
Howard Hinnantd4444702010-08-11 17:04:31 +00004298#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004299 if (__first == __last || *__first != ')')
4300 throw regex_error(regex_constants::error_paren);
Howard Hinnant324bb032010-08-22 00:02:43 +00004301#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004302 __push_end_marked_subexpression(__temp_count);
4303 --__open_count_;
4304 ++__first;
4305 }
4306 }
4307 break;
Marshall Clow568bd022015-07-23 18:27:51 +00004308 case '*':
4309 case '+':
4310 case '?':
4311 case '{':
4312#ifndef _LIBCPP_NO_EXCEPTIONS
4313 throw regex_error(regex_constants::error_badrepeat);
4314#endif
4315 break;
Howard Hinnant17615b02010-07-27 01:25:38 +00004316 default:
4317 __first = __parse_pattern_character(__first, __last);
4318 break;
4319 }
4320 }
4321 return __first;
4322}
4323
4324template <class _CharT, class _Traits>
4325template <class _ForwardIterator>
4326_ForwardIterator
4327basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4328 _ForwardIterator __last)
4329{
4330 if (__first != __last && *__first == '\\')
4331 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004332 _ForwardIterator __t1 = _VSTD::next(__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004333 _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4334 if (__t2 != __t1)
4335 __first = __t2;
4336 else
4337 {
4338 __t2 = __parse_character_class_escape(__t1, __last);
4339 if (__t2 != __t1)
4340 __first = __t2;
4341 else
4342 {
4343 __t2 = __parse_character_escape(__t1, __last);
4344 if (__t2 != __t1)
4345 __first = __t2;
4346 }
4347 }
4348 }
4349 return __first;
4350}
4351
4352template <class _CharT, class _Traits>
4353template <class _ForwardIterator>
4354_ForwardIterator
4355basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4356 _ForwardIterator __last)
4357{
4358 if (__first != __last)
4359 {
4360 if (*__first == '0')
4361 {
4362 __push_char(_CharT());
4363 ++__first;
4364 }
4365 else if ('1' <= *__first && *__first <= '9')
4366 {
4367 unsigned __v = *__first - '0';
4368 for (++__first; '0' <= *__first && *__first <= '9'; ++__first)
4369 __v = 10 * __v + *__first - '0';
Howard Hinnantd4444702010-08-11 17:04:31 +00004370#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004371 if (__v > mark_count())
4372 throw regex_error(regex_constants::error_backref);
Howard Hinnant324bb032010-08-22 00:02:43 +00004373#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004374 __push_back_ref(__v);
4375 }
4376 }
4377 return __first;
4378}
4379
4380template <class _CharT, class _Traits>
4381template <class _ForwardIterator>
4382_ForwardIterator
4383basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4384 _ForwardIterator __last)
4385{
4386 if (__first != __last)
4387 {
4388 __bracket_expression<_CharT, _Traits>* __ml;
4389 switch (*__first)
4390 {
4391 case 'd':
4392 __ml = __start_matching_list(false);
4393 __ml->__add_class(ctype_base::digit);
4394 ++__first;
4395 break;
4396 case 'D':
4397 __ml = __start_matching_list(true);
4398 __ml->__add_class(ctype_base::digit);
4399 ++__first;
4400 break;
4401 case 's':
4402 __ml = __start_matching_list(false);
4403 __ml->__add_class(ctype_base::space);
4404 ++__first;
4405 break;
4406 case 'S':
4407 __ml = __start_matching_list(true);
4408 __ml->__add_class(ctype_base::space);
4409 ++__first;
4410 break;
4411 case 'w':
4412 __ml = __start_matching_list(false);
4413 __ml->__add_class(ctype_base::alnum);
4414 __ml->__add_char('_');
4415 ++__first;
4416 break;
4417 case 'W':
4418 __ml = __start_matching_list(true);
4419 __ml->__add_class(ctype_base::alnum);
4420 __ml->__add_char('_');
4421 ++__first;
4422 break;
4423 }
4424 }
4425 return __first;
4426}
4427
4428template <class _CharT, class _Traits>
4429template <class _ForwardIterator>
4430_ForwardIterator
4431basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
Howard Hinnant15476f32010-07-28 17:35:27 +00004432 _ForwardIterator __last,
4433 basic_string<_CharT>* __str)
Howard Hinnant17615b02010-07-27 01:25:38 +00004434{
4435 if (__first != __last)
4436 {
4437 _ForwardIterator __t;
4438 unsigned __sum = 0;
4439 int __hd;
4440 switch (*__first)
4441 {
4442 case 'f':
Howard Hinnant15476f32010-07-28 17:35:27 +00004443 if (__str)
4444 *__str = _CharT(0xC);
4445 else
4446 __push_char(_CharT(0xC));
Howard Hinnant17615b02010-07-27 01:25:38 +00004447 ++__first;
4448 break;
4449 case 'n':
Howard Hinnant15476f32010-07-28 17:35:27 +00004450 if (__str)
4451 *__str = _CharT(0xA);
4452 else
4453 __push_char(_CharT(0xA));
Howard Hinnant17615b02010-07-27 01:25:38 +00004454 ++__first;
4455 break;
4456 case 'r':
Howard Hinnant15476f32010-07-28 17:35:27 +00004457 if (__str)
4458 *__str = _CharT(0xD);
4459 else
4460 __push_char(_CharT(0xD));
Howard Hinnant17615b02010-07-27 01:25:38 +00004461 ++__first;
4462 break;
4463 case 't':
Howard Hinnant15476f32010-07-28 17:35:27 +00004464 if (__str)
4465 *__str = _CharT(0x9);
4466 else
4467 __push_char(_CharT(0x9));
Howard Hinnant17615b02010-07-27 01:25:38 +00004468 ++__first;
4469 break;
4470 case 'v':
Howard Hinnant15476f32010-07-28 17:35:27 +00004471 if (__str)
4472 *__str = _CharT(0xB);
4473 else
4474 __push_char(_CharT(0xB));
Howard Hinnant17615b02010-07-27 01:25:38 +00004475 ++__first;
4476 break;
4477 case 'c':
Howard Hinnant0949eed2011-06-30 21:18:19 +00004478 if ((__t = _VSTD::next(__first)) != __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004479 {
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004480 if (('A' <= *__t && *__t <= 'Z') ||
4481 ('a' <= *__t && *__t <= 'z'))
Howard Hinnant17615b02010-07-27 01:25:38 +00004482 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004483 if (__str)
4484 *__str = _CharT(*__t % 32);
4485 else
4486 __push_char(_CharT(*__t % 32));
Howard Hinnant17615b02010-07-27 01:25:38 +00004487 __first = ++__t;
4488 }
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004489#ifndef _LIBCPP_NO_EXCEPTIONS
4490 else
4491 throw regex_error(regex_constants::error_escape);
4492#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004493 }
Howard Hinnant1e1d0512013-07-15 18:21:11 +00004494#ifndef _LIBCPP_NO_EXCEPTIONS
4495 else
4496 throw regex_error(regex_constants::error_escape);
4497#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004498 break;
4499 case 'u':
Howard Hinnantd4444702010-08-11 17:04:31 +00004500 ++__first;
4501#ifndef _LIBCPP_NO_EXCEPTIONS
4502 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004503 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004504#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004505 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004506#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004507 if (__hd == -1)
4508 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004509#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004510 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnantd4444702010-08-11 17:04:31 +00004511 ++__first;
4512#ifndef _LIBCPP_NO_EXCEPTIONS
4513 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004514 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004515#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004516 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004517#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004518 if (__hd == -1)
4519 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004520#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004521 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant17615b02010-07-27 01:25:38 +00004522 // drop through
4523 case 'x':
Howard Hinnantd4444702010-08-11 17:04:31 +00004524 ++__first;
4525#ifndef _LIBCPP_NO_EXCEPTIONS
4526 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004527 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004528#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004529 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004530#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004531 if (__hd == -1)
4532 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004533#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004534 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnantd4444702010-08-11 17:04:31 +00004535 ++__first;
4536#ifndef _LIBCPP_NO_EXCEPTIONS
4537 if (__first == __last)
Howard Hinnant17615b02010-07-27 01:25:38 +00004538 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004539#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004540 __hd = __traits_.value(*__first, 16);
Howard Hinnantd4444702010-08-11 17:04:31 +00004541#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004542 if (__hd == -1)
4543 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004544#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnantec3773c2011-12-01 20:21:04 +00004545 __sum = 16 * __sum + static_cast<unsigned>(__hd);
Howard Hinnant15476f32010-07-28 17:35:27 +00004546 if (__str)
4547 *__str = _CharT(__sum);
4548 else
4549 __push_char(_CharT(__sum));
Howard Hinnant17615b02010-07-27 01:25:38 +00004550 ++__first;
4551 break;
Marshall Clow6b7e6922014-05-21 16:29:50 +00004552 case '0':
4553 if (__str)
4554 *__str = _CharT(0);
4555 else
4556 __push_char(_CharT(0));
4557 ++__first;
4558 break;
Howard Hinnant17615b02010-07-27 01:25:38 +00004559 default:
4560 if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4561 {
Howard Hinnant15476f32010-07-28 17:35:27 +00004562 if (__str)
4563 *__str = *__first;
4564 else
4565 __push_char(*__first);
Howard Hinnant17615b02010-07-27 01:25:38 +00004566 ++__first;
4567 }
Howard Hinnantd4444702010-08-11 17:04:31 +00004568#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnant918f2a82013-06-28 18:57:30 +00004569 else
Howard Hinnant15476f32010-07-28 17:35:27 +00004570 throw regex_error(regex_constants::error_escape);
Howard Hinnant324bb032010-08-22 00:02:43 +00004571#endif // _LIBCPP_NO_EXCEPTIONS
Howard Hinnant17615b02010-07-27 01:25:38 +00004572 break;
4573 }
4574 }
4575 return __first;
4576}
4577
4578template <class _CharT, class _Traits>
4579template <class _ForwardIterator>
4580_ForwardIterator
4581basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4582 _ForwardIterator __last)
4583{
4584 if (__first != __last)
4585 {
4586 switch (*__first)
4587 {
4588 case '^':
4589 case '$':
4590 case '\\':
4591 case '.':
4592 case '*':
4593 case '+':
4594 case '?':
4595 case '(':
4596 case ')':
4597 case '[':
4598 case ']':
4599 case '{':
4600 case '}':
4601 case '|':
4602 break;
4603 default:
4604 __push_char(*__first);
4605 ++__first;
4606 break;
4607 }
4608 }
4609 return __first;
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004610}
4611
4612template <class _CharT, class _Traits>
Howard Hinnant856846b2010-07-27 19:53:10 +00004613template <class _ForwardIterator>
4614_ForwardIterator
4615basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4616 _ForwardIterator __last)
4617{
4618 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004619 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004620 if (__t1 != __first)
4621 __parse_basic_reg_exp(__first, __t1);
4622 else
4623 __push_empty();
4624 __first = __t1;
4625 if (__first != __last)
4626 ++__first;
4627 while (__first != __last)
4628 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004629 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004630 __owns_one_state<_CharT>* __sb = __end_;
4631 if (__t1 != __first)
4632 __parse_basic_reg_exp(__first, __t1);
4633 else
4634 __push_empty();
4635 __push_alternation(__sa, __sb);
4636 __first = __t1;
4637 if (__first != __last)
4638 ++__first;
4639 }
4640 return __first;
4641}
4642
4643template <class _CharT, class _Traits>
4644template <class _ForwardIterator>
4645_ForwardIterator
4646basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4647 _ForwardIterator __last)
4648{
4649 __owns_one_state<_CharT>* __sa = __end_;
Howard Hinnant0949eed2011-06-30 21:18:19 +00004650 _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004651 if (__t1 != __first)
4652 __parse_extended_reg_exp(__first, __t1);
4653 else
4654 __push_empty();
4655 __first = __t1;
4656 if (__first != __last)
4657 ++__first;
4658 while (__first != __last)
4659 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00004660 __t1 = _VSTD::find(__first, __last, _CharT('\n'));
Howard Hinnant856846b2010-07-27 19:53:10 +00004661 __owns_one_state<_CharT>* __sb = __end_;
4662 if (__t1 != __first)
4663 __parse_extended_reg_exp(__first, __t1);
4664 else
4665 __push_empty();
4666 __push_alternation(__sa, __sb);
4667 __first = __t1;
4668 if (__first != __last)
4669 ++__first;
4670 }
4671 return __first;
4672}
4673
4674template <class _CharT, class _Traits>
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004675void
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004676basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4677 __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4678 bool __greedy)
4679{
4680 unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4681 __end_->first() = nullptr;
Howard Hinnantac303862010-07-12 15:51:17 +00004682 unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4683 __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4684 __min, __max));
4685 __s->first() = nullptr;
4686 __e1.release();
4687 __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004688 __end_ = __e2->second();
Howard Hinnantac303862010-07-12 15:51:17 +00004689 __s->first() = __e2.release();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00004690 ++__loop_count_;
4691}
4692
4693template <class _CharT, class _Traits>
4694void
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004695basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4696{
Howard Hinnant173968a2010-07-13 21:48:06 +00004697 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004698 __end_->first() = new __match_char_icase<_CharT, _Traits>
4699 (__traits_, __c, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004700 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004701 __end_->first() = new __match_char_collate<_CharT, _Traits>
4702 (__traits_, __c, __end_->first());
4703 else
4704 __end_->first() = new __match_char<_CharT>(__c, __end_->first());
Howard Hinnante77aa5e2010-07-08 17:43:58 +00004705 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004706}
4707
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004708template <class _CharT, class _Traits>
4709void
4710basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4711{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004712 if (!(__flags_ & nosubs))
4713 {
4714 __end_->first() =
4715 new __begin_marked_subexpression<_CharT>(++__marked_count_,
4716 __end_->first());
4717 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4718 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004719}
4720
4721template <class _CharT, class _Traits>
4722void
4723basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4724{
Howard Hinnant68025ed2010-07-14 15:45:11 +00004725 if (!(__flags_ & nosubs))
4726 {
4727 __end_->first() =
4728 new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4729 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4730 }
Howard Hinnant0dca5fc2010-06-30 20:30:19 +00004731}
4732
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004733template <class _CharT, class _Traits>
4734void
Howard Hinnant41fb6e12011-03-26 20:02:27 +00004735basic_regex<_CharT, _Traits>::__push_l_anchor()
4736{
4737 __end_->first() = new __l_anchor<_CharT>(__end_->first());
4738 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4739}
4740
4741template <class _CharT, class _Traits>
4742void
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004743basic_regex<_CharT, _Traits>::__push_r_anchor()
4744{
4745 __end_->first() = new __r_anchor<_CharT>(__end_->first());
4746 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4747}
4748
Howard Hinnantac303862010-07-12 15:51:17 +00004749template <class _CharT, class _Traits>
4750void
4751basic_regex<_CharT, _Traits>::__push_match_any()
4752{
4753 __end_->first() = new __match_any<_CharT>(__end_->first());
4754 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4755}
Howard Hinnant37f9f9c2010-07-09 00:15:26 +00004756
Howard Hinnantcba352d2010-07-12 18:16:05 +00004757template <class _CharT, class _Traits>
4758void
Howard Hinnant17615b02010-07-27 01:25:38 +00004759basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4760{
4761 __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4762 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4763}
4764
4765template <class _CharT, class _Traits>
4766void
Howard Hinnant2ade7c22010-07-22 17:53:24 +00004767basic_regex<_CharT, _Traits>::__push_empty()
4768{
4769 __end_->first() = new __empty_state<_CharT>(__end_->first());
4770 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4771}
4772
4773template <class _CharT, class _Traits>
4774void
Howard Hinnant17615b02010-07-27 01:25:38 +00004775basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4776{
4777 __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4778 __end_->first());
4779 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4780}
4781
4782template <class _CharT, class _Traits>
4783void
Howard Hinnantcba352d2010-07-12 18:16:05 +00004784basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4785{
Howard Hinnant173968a2010-07-13 21:48:06 +00004786 if (flags() & icase)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004787 __end_->first() = new __back_ref_icase<_CharT, _Traits>
4788 (__traits_, __i, __end_->first());
Howard Hinnant173968a2010-07-13 21:48:06 +00004789 else if (flags() & collate)
Howard Hinnante34f17d2010-07-12 19:11:27 +00004790 __end_->first() = new __back_ref_collate<_CharT, _Traits>
4791 (__traits_, __i, __end_->first());
4792 else
4793 __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
Howard Hinnantcba352d2010-07-12 18:16:05 +00004794 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4795}
4796
Howard Hinnant173968a2010-07-13 21:48:06 +00004797template <class _CharT, class _Traits>
Howard Hinnantaa698082010-07-16 19:08:36 +00004798void
4799basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4800 __owns_one_state<_CharT>* __ea)
4801{
4802 __sa->first() = new __alternate<_CharT>(
4803 static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4804 static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4805 __ea->first() = nullptr;
4806 __ea->first() = new __empty_state<_CharT>(__end_->first());
4807 __end_->first() = nullptr;
4808 __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4809 __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4810}
4811
4812template <class _CharT, class _Traits>
Howard Hinnant173968a2010-07-13 21:48:06 +00004813__bracket_expression<_CharT, _Traits>*
4814basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4815{
4816 __bracket_expression<_CharT, _Traits>* __r =
4817 new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4818 __negate, __flags_ & icase,
4819 __flags_ & collate);
4820 __end_->first() = __r;
4821 __end_ = __r;
4822 return __r;
4823}
4824
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004825template <class _CharT, class _Traits>
4826void
4827basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004828 bool __invert,
4829 unsigned __mexp)
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004830{
4831 __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
Howard Hinnantcd59acc2013-07-23 16:18:04 +00004832 __end_->first(), __mexp);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00004833 __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4834}
4835
Howard Hinnant8c2c18d2010-06-24 21:28:00 +00004836typedef basic_regex<char> regex;
4837typedef basic_regex<wchar_t> wregex;
4838
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004839// sub_match
4840
4841template <class _BidirectionalIterator>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00004842class _LIBCPP_TYPE_VIS_ONLY sub_match
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004843 : public pair<_BidirectionalIterator, _BidirectionalIterator>
4844{
4845public:
4846 typedef _BidirectionalIterator iterator;
4847 typedef typename iterator_traits<iterator>::value_type value_type;
4848 typedef typename iterator_traits<iterator>::difference_type difference_type;
4849 typedef basic_string<value_type> string_type;
4850
4851 bool matched;
4852
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004853 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant46623a02012-07-21 01:31:58 +00004854 _LIBCPP_CONSTEXPR sub_match() : matched() {}
Howard Hinnant31aaf552010-12-08 21:07:55 +00004855
4856 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004857 difference_type length() const
Howard Hinnant0949eed2011-06-30 21:18:19 +00004858 {return matched ? _VSTD::distance(this->first, this->second) : 0;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004859 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004860 string_type str() const
4861 {return matched ? string_type(this->first, this->second) : string_type();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004862 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004863 operator string_type() const
4864 {return str();}
4865
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004866 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004867 int compare(const sub_match& __s) const
4868 {return str().compare(__s.str());}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004869 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004870 int compare(const string_type& __s) const
4871 {return str().compare(__s);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00004872 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004873 int compare(const value_type* __s) const
4874 {return str().compare(__s);}
4875};
4876
4877typedef sub_match<const char*> csub_match;
4878typedef sub_match<const wchar_t*> wcsub_match;
4879typedef sub_match<string::const_iterator> ssub_match;
4880typedef sub_match<wstring::const_iterator> wssub_match;
4881
4882template <class _BiIter>
4883inline _LIBCPP_INLINE_VISIBILITY
4884bool
4885operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4886{
4887 return __x.compare(__y) == 0;
4888}
4889
4890template <class _BiIter>
4891inline _LIBCPP_INLINE_VISIBILITY
4892bool
4893operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4894{
4895 return !(__x == __y);
4896}
4897
4898template <class _BiIter>
4899inline _LIBCPP_INLINE_VISIBILITY
4900bool
4901operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4902{
4903 return __x.compare(__y) < 0;
4904}
4905
4906template <class _BiIter>
4907inline _LIBCPP_INLINE_VISIBILITY
4908bool
4909operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4910{
4911 return !(__y < __x);
4912}
4913
4914template <class _BiIter>
4915inline _LIBCPP_INLINE_VISIBILITY
4916bool
4917operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4918{
4919 return !(__x < __y);
4920}
4921
4922template <class _BiIter>
4923inline _LIBCPP_INLINE_VISIBILITY
4924bool
4925operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4926{
4927 return __y < __x;
4928}
4929
4930template <class _BiIter, class _ST, class _SA>
4931inline _LIBCPP_INLINE_VISIBILITY
4932bool
4933operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4934 const sub_match<_BiIter>& __y)
4935{
Marshall Clowe3e70542014-12-15 23:57:56 +00004936 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004937}
4938
4939template <class _BiIter, class _ST, class _SA>
4940inline _LIBCPP_INLINE_VISIBILITY
4941bool
4942operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4943 const sub_match<_BiIter>& __y)
4944{
4945 return !(__x == __y);
4946}
4947
4948template <class _BiIter, class _ST, class _SA>
4949inline _LIBCPP_INLINE_VISIBILITY
4950bool
4951operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4952 const sub_match<_BiIter>& __y)
4953{
Marshall Clowe3e70542014-12-15 23:57:56 +00004954 return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004955}
4956
4957template <class _BiIter, class _ST, class _SA>
4958inline _LIBCPP_INLINE_VISIBILITY
4959bool
4960operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4961 const sub_match<_BiIter>& __y)
4962{
4963 return __y < __x;
4964}
4965
4966template <class _BiIter, class _ST, class _SA>
4967inline _LIBCPP_INLINE_VISIBILITY
4968bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4969 const sub_match<_BiIter>& __y)
4970{
4971 return !(__x < __y);
4972}
4973
4974template <class _BiIter, class _ST, class _SA>
4975inline _LIBCPP_INLINE_VISIBILITY
4976bool
4977operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4978 const sub_match<_BiIter>& __y)
4979{
4980 return !(__y < __x);
4981}
4982
4983template <class _BiIter, class _ST, class _SA>
4984inline _LIBCPP_INLINE_VISIBILITY
4985bool
4986operator==(const sub_match<_BiIter>& __x,
4987 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4988{
Marshall Clowe3e70542014-12-15 23:57:56 +00004989 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00004990}
4991
4992template <class _BiIter, class _ST, class _SA>
4993inline _LIBCPP_INLINE_VISIBILITY
4994bool
4995operator!=(const sub_match<_BiIter>& __x,
4996 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4997{
4998 return !(__x == __y);
4999}
5000
5001template <class _BiIter, class _ST, class _SA>
5002inline _LIBCPP_INLINE_VISIBILITY
5003bool
5004operator<(const sub_match<_BiIter>& __x,
5005 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5006{
Marshall Clowe3e70542014-12-15 23:57:56 +00005007 return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
Howard Hinnantcd85b9e2010-06-29 18:37:43 +00005008}
5009
5010template <class _BiIter, class _ST, class _SA>
5011inline _LIBCPP_INLINE_VISIBILITY
5012bool operator>(const sub_match<_BiIter>& __x,
5013 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5014{
5015 return __y < __x;
5016}
5017
5018template <class _BiIter, class _ST, class _SA>
5019inline _LIBCPP_INLINE_VISIBILITY
5020bool
5021operator>=(const sub_match<_BiIter>& __x,
5022 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5023{
5024 return !(__x < __y);
5025}
5026
5027template <class _BiIter, class _ST, class _SA>
5028inline _LIBCPP_INLINE_VISIBILITY
5029bool
5030operator<=(const sub_match<_BiIter>& __x,
5031 const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
5032{
5033 return !(__y < __x);
5034}
5035
5036template <class _BiIter>
5037inline _LIBCPP_INLINE_VISIBILITY
5038bool
5039operator==(typename iterator_traits<_BiIter>::value_type const* __x,
5040 const sub_match<_BiIter>& __y)
5041{
5042 return __y.compare(__x) == 0;
5043}
5044
5045template <class _BiIter>
5046inline _LIBCPP_INLINE_VISIBILITY
5047bool
5048operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
5049 const sub_match<_BiIter>& __y)
5050{
5051 return !(__x == __y);
5052}
5053
5054template <class _BiIter>
5055inline _LIBCPP_INLINE_VISIBILITY
5056bool
5057operator<(typename iterator_traits<_BiIter>::value_type const* __x,
5058 const sub_match<_BiIter>& __y)
5059{
5060 return __y.compare(__x) > 0;
5061}
5062
5063template <class _BiIter>
5064inline _LIBCPP_INLINE_VISIBILITY
5065bool
5066operator>(typename iterator_traits<_BiIter>::value_type const* __x,
5067 const sub_match<_BiIter>& __y)
5068{
5069 return __y < __x;
5070}
5071
5072template <class _BiIter>
5073inline _LIBCPP_INLINE_VISIBILITY
5074bool
5075operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
5076 const sub_match<_BiIter>& __y)
5077{
5078 return !(__x < __y);
5079}
5080
5081template <class _BiIter>
5082inline _LIBCPP_INLINE_VISIBILITY
5083bool
5084operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
5085 const sub_match<_BiIter>& __y)
5086{
5087 return !(__y < __x);
5088}
5089
5090template <class _BiIter>
5091inline _LIBCPP_INLINE_VISIBILITY
5092bool
5093operator==(const sub_match<_BiIter>& __x,
5094 typename iterator_traits<_BiIter>::value_type const* __y)
5095{
5096 return __x.compare(__y) == 0;
5097}
5098
5099template <class _BiIter>
5100inline _LIBCPP_INLINE_VISIBILITY
5101bool
5102operator!=(const sub_match<_BiIter>& __x,
5103 typename iterator_traits<_BiIter>::value_type const* __y)
5104{
5105 return !(__x == __y);
5106}
5107
5108template <class _BiIter>
5109inline _LIBCPP_INLINE_VISIBILITY
5110bool
5111operator<(const sub_match<_BiIter>& __x,
5112 typename iterator_traits<_BiIter>::value_type const* __y)
5113{
5114 return __x.compare(__y) < 0;
5115}
5116
5117template <class _BiIter>
5118inline _LIBCPP_INLINE_VISIBILITY
5119bool
5120operator>(const sub_match<_BiIter>& __x,
5121 typename iterator_traits<_BiIter>::value_type const* __y)
5122{
5123 return __y < __x;
5124}
5125
5126template <class _BiIter>
5127inline _LIBCPP_INLINE_VISIBILITY
5128bool
5129operator>=(const sub_match<_BiIter>& __x,
5130 typename iterator_traits<_BiIter>::value_type const* __y)
5131{
5132 return !(__x < __y);
5133}
5134
5135template <class _BiIter>
5136inline _LIBCPP_INLINE_VISIBILITY
5137bool
5138operator<=(const sub_match<_BiIter>& __x,
5139 typename iterator_traits<_BiIter>::value_type const* __y)
5140{
5141 return !(__y < __x);
5142}
5143
5144template <class _BiIter>
5145inline _LIBCPP_INLINE_VISIBILITY
5146bool
5147operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5148 const sub_match<_BiIter>& __y)
5149{
5150 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5151 return __y.compare(string_type(1, __x)) == 0;
5152}
5153
5154template <class _BiIter>
5155inline _LIBCPP_INLINE_VISIBILITY
5156bool
5157operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5158 const sub_match<_BiIter>& __y)
5159{
5160 return !(__x == __y);
5161}
5162
5163template <class _BiIter>
5164inline _LIBCPP_INLINE_VISIBILITY
5165bool
5166operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5167 const sub_match<_BiIter>& __y)
5168{
5169 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5170 return __y.compare(string_type(1, __x)) > 0;
5171}
5172
5173template <class _BiIter>
5174inline _LIBCPP_INLINE_VISIBILITY
5175bool
5176operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5177 const sub_match<_BiIter>& __y)
5178{
5179 return __y < __x;
5180}
5181
5182template <class _BiIter>
5183inline _LIBCPP_INLINE_VISIBILITY
5184bool
5185operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5186 const sub_match<_BiIter>& __y)
5187{
5188 return !(__x < __y);
5189}
5190
5191template <class _BiIter>
5192inline _LIBCPP_INLINE_VISIBILITY
5193bool
5194operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5195 const sub_match<_BiIter>& __y)
5196{
5197 return !(__y < __x);
5198}
5199
5200template <class _BiIter>
5201inline _LIBCPP_INLINE_VISIBILITY
5202bool
5203operator==(const sub_match<_BiIter>& __x,
5204 typename iterator_traits<_BiIter>::value_type const& __y)
5205{
5206 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5207 return __x.compare(string_type(1, __y)) == 0;
5208}
5209
5210template <class _BiIter>
5211inline _LIBCPP_INLINE_VISIBILITY
5212bool
5213operator!=(const sub_match<_BiIter>& __x,
5214 typename iterator_traits<_BiIter>::value_type const& __y)
5215{
5216 return !(__x == __y);
5217}
5218
5219template <class _BiIter>
5220inline _LIBCPP_INLINE_VISIBILITY
5221bool
5222operator<(const sub_match<_BiIter>& __x,
5223 typename iterator_traits<_BiIter>::value_type const& __y)
5224{
5225 typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5226 return __x.compare(string_type(1, __y)) < 0;
5227}
5228
5229template <class _BiIter>
5230inline _LIBCPP_INLINE_VISIBILITY
5231bool
5232operator>(const sub_match<_BiIter>& __x,
5233 typename iterator_traits<_BiIter>::value_type const& __y)
5234{
5235 return __y < __x;
5236}
5237
5238template <class _BiIter>
5239inline _LIBCPP_INLINE_VISIBILITY
5240bool
5241operator>=(const sub_match<_BiIter>& __x,
5242 typename iterator_traits<_BiIter>::value_type const& __y)
5243{
5244 return !(__x < __y);
5245}
5246
5247template <class _BiIter>
5248inline _LIBCPP_INLINE_VISIBILITY
5249bool
5250operator<=(const sub_match<_BiIter>& __x,
5251 typename iterator_traits<_BiIter>::value_type const& __y)
5252{
5253 return !(__y < __x);
5254}
5255
5256template <class _CharT, class _ST, class _BiIter>
5257inline _LIBCPP_INLINE_VISIBILITY
5258basic_ostream<_CharT, _ST>&
5259operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5260{
5261 return __os << __m.str();
5262}
5263
Howard Hinnant17615b02010-07-27 01:25:38 +00005264template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant0f678bd2013-08-12 18:38:34 +00005265class _LIBCPP_TYPE_VIS_ONLY match_results
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005266{
5267public:
5268 typedef _Allocator allocator_type;
5269 typedef sub_match<_BidirectionalIterator> value_type;
5270private:
5271 typedef vector<value_type, allocator_type> __container_type;
5272
5273 __container_type __matches_;
5274 value_type __unmatched_;
5275 value_type __prefix_;
5276 value_type __suffix_;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005277 bool __ready_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005278public:
Howard Hinnanta712c722010-08-16 20:21:16 +00005279 _BidirectionalIterator __position_start_;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005280 typedef const value_type& const_reference;
Marshall Clow103af342014-02-26 01:56:31 +00005281 typedef value_type& reference;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005282 typedef typename __container_type::const_iterator const_iterator;
5283 typedef const_iterator iterator;
5284 typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5285 typedef typename allocator_traits<allocator_type>::size_type size_type;
5286 typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5287 typedef basic_string<char_type> string_type;
5288
5289 // construct/copy/destroy:
5290 explicit match_results(const allocator_type& __a = allocator_type());
5291// match_results(const match_results&) = default;
5292// match_results& operator=(const match_results&) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005293// match_results(match_results&& __m) = default;
5294// match_results& operator=(match_results&& __m) = default;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005295// ~match_results() = default;
5296
Howard Hinnant31aaf552010-12-08 21:07:55 +00005297 _LIBCPP_INLINE_VISIBILITY
5298 bool ready() const {return __ready_;}
5299
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005300 // size:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005301 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005302 size_type size() const {return __matches_.size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005303 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005304 size_type max_size() const {return __matches_.max_size();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005305 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005306 bool empty() const {return size() == 0;}
5307
5308 // element access:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005309 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005310 difference_type length(size_type __sub = 0) const
5311 {return (*this)[__sub].length();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005312 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005313 difference_type position(size_type __sub = 0) const
Howard Hinnant0949eed2011-06-30 21:18:19 +00005314 {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005315 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005316 string_type str(size_type __sub = 0) const
5317 {return (*this)[__sub].str();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005318 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005319 const_reference operator[](size_type __n) const
5320 {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
5321
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005322 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005323 const_reference prefix() const {return __prefix_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005324 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005325 const_reference suffix() const {return __suffix_;}
5326
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005327 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005328 const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005329 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005330 const_iterator end() const {return __matches_.end();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005331 _LIBCPP_INLINE_VISIBILITY
Howard Hinnantc6fe8ca2011-10-08 14:36:16 +00005332 const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005333 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005334 const_iterator cend() const {return __matches_.end();}
5335
5336 // format:
5337 template <class _OutputIter>
5338 _OutputIter
5339 format(_OutputIter __out, const char_type* __fmt_first,
5340 const char_type* __fmt_last,
5341 regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5342 template <class _OutputIter, class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005343 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005344 _OutputIter
5345 format(_OutputIter __out, const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005346 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5347 {return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005348 template <class _ST, class _SA>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005349 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005350 basic_string<char_type, _ST, _SA>
5351 format(const basic_string<char_type, _ST, _SA>& __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005352 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5353 {
5354 basic_string<char_type, _ST, _SA> __r;
5355 format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5356 __flags);
5357 return __r;
5358 }
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005359 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005360 string_type
5361 format(const char_type* __fmt,
Howard Hinnant27405f92010-08-14 18:14:02 +00005362 regex_constants::match_flag_type __flags = regex_constants::format_default) const
5363 {
5364 string_type __r;
5365 format(back_inserter(__r), __fmt,
5366 __fmt + char_traits<char_type>::length(__fmt), __flags);
5367 return __r;
5368 }
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005369
5370 // allocator:
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005371 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005372 allocator_type get_allocator() const {return __matches_.get_allocator();}
5373
5374 // swap:
5375 void swap(match_results& __m);
5376
Howard Hinnant99968442011-11-29 18:15:50 +00005377 template <class _Bp, class _Ap>
Howard Hinnantaef07cb2010-09-23 15:13:20 +00005378 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005379 void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
Howard Hinnant99968442011-11-29 18:15:50 +00005380 const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005381 {
Howard Hinnant99968442011-11-29 18:15:50 +00005382 _Bp __mf = __m.prefix().first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005383 __matches_.resize(__m.size());
5384 for (size_type __i = 0; __i < __matches_.size(); ++__i)
5385 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00005386 __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5387 __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005388 __matches_[__i].matched = __m[__i].matched;
5389 }
5390 __unmatched_.first = __l;
5391 __unmatched_.second = __l;
5392 __unmatched_.matched = false;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005393 __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5394 __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005395 __prefix_.matched = __m.prefix().matched;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005396 __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5397 __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005398 __suffix_.matched = __m.suffix().matched;
Howard Hinnanta712c722010-08-16 20:21:16 +00005399 if (!__no_update_pos)
5400 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005401 __ready_ = __m.ready();
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005402 }
5403
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005404private:
5405 void __init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005406 _BidirectionalIterator __f, _BidirectionalIterator __l,
5407 bool __no_update_pos = false);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005408
5409 template <class, class> friend class basic_regex;
5410
Howard Hinnant99968442011-11-29 18:15:50 +00005411 template <class _Bp, class _Ap, class _Cp, class _Tp>
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005412 friend
5413 bool
Howard Hinnant99968442011-11-29 18:15:50 +00005414 regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005415 regex_constants::match_flag_type);
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005416
Howard Hinnant99968442011-11-29 18:15:50 +00005417 template <class _Bp, class _Ap>
Howard Hinnant27405f92010-08-14 18:14:02 +00005418 friend
5419 bool
Howard Hinnant99968442011-11-29 18:15:50 +00005420 operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
Howard Hinnant27405f92010-08-14 18:14:02 +00005421
Howard Hinnante9de5ff2010-07-27 22:20:32 +00005422 template <class, class> friend class __lookahead;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005423};
5424
5425template <class _BidirectionalIterator, class _Allocator>
5426match_results<_BidirectionalIterator, _Allocator>::match_results(
5427 const allocator_type& __a)
5428 : __matches_(__a),
5429 __unmatched_(),
5430 __prefix_(),
Howard Hinnanta712c722010-08-16 20:21:16 +00005431 __suffix_(),
Eric Fiselier7cc71062015-07-22 01:29:41 +00005432 __ready_(false),
5433 __position_start_()
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005434{
5435}
5436
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005437template <class _BidirectionalIterator, class _Allocator>
5438void
5439match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
Howard Hinnanta712c722010-08-16 20:21:16 +00005440 _BidirectionalIterator __f, _BidirectionalIterator __l,
5441 bool __no_update_pos)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005442{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005443 __unmatched_.first = __l;
5444 __unmatched_.second = __l;
5445 __unmatched_.matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005446 __matches_.assign(__s, __unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005447 __prefix_.first = __f;
5448 __prefix_.second = __f;
5449 __prefix_.matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005450 __suffix_ = __unmatched_;
Howard Hinnanta712c722010-08-16 20:21:16 +00005451 if (!__no_update_pos)
5452 __position_start_ = __prefix_.first;
Howard Hinnant31aaf552010-12-08 21:07:55 +00005453 __ready_ = true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005454}
5455
Howard Hinnant27405f92010-08-14 18:14:02 +00005456template <class _BidirectionalIterator, class _Allocator>
5457template <class _OutputIter>
5458_OutputIter
5459match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __out,
5460 const char_type* __fmt_first, const char_type* __fmt_last,
5461 regex_constants::match_flag_type __flags) const
5462{
5463 if (__flags & regex_constants::format_sed)
5464 {
5465 for (; __fmt_first != __fmt_last; ++__fmt_first)
5466 {
5467 if (*__fmt_first == '&')
Howard Hinnant0949eed2011-06-30 21:18:19 +00005468 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
Howard Hinnant27405f92010-08-14 18:14:02 +00005469 __out);
5470 else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5471 {
5472 ++__fmt_first;
5473 if ('0' <= *__fmt_first && *__fmt_first <= '9')
5474 {
5475 size_t __i = *__fmt_first - '0';
Howard Hinnant0949eed2011-06-30 21:18:19 +00005476 __out = _VSTD::copy(__matches_[__i].first,
Howard Hinnant27405f92010-08-14 18:14:02 +00005477 __matches_[__i].second, __out);
5478 }
5479 else
5480 {
5481 *__out = *__fmt_first;
5482 ++__out;
5483 }
5484 }
5485 else
5486 {
5487 *__out = *__fmt_first;
5488 ++__out;
5489 }
5490 }
5491 }
5492 else
5493 {
5494 for (; __fmt_first != __fmt_last; ++__fmt_first)
5495 {
5496 if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5497 {
5498 switch (__fmt_first[1])
5499 {
5500 case '$':
5501 *__out = *++__fmt_first;
5502 ++__out;
5503 break;
5504 case '&':
5505 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005506 __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
Howard Hinnant27405f92010-08-14 18:14:02 +00005507 __out);
5508 break;
5509 case '`':
5510 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005511 __out = _VSTD::copy(__prefix_.first, __prefix_.second, __out);
Howard Hinnant27405f92010-08-14 18:14:02 +00005512 break;
5513 case '\'':
5514 ++__fmt_first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005515 __out = _VSTD::copy(__suffix_.first, __suffix_.second, __out);
Howard Hinnant27405f92010-08-14 18:14:02 +00005516 break;
5517 default:
5518 if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5519 {
5520 ++__fmt_first;
5521 size_t __i = *__fmt_first - '0';
5522 if (__fmt_first + 1 != __fmt_last &&
5523 '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5524 {
5525 ++__fmt_first;
5526 __i = 10 * __i + *__fmt_first - '0';
5527 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00005528 __out = _VSTD::copy(__matches_[__i].first,
Howard Hinnant27405f92010-08-14 18:14:02 +00005529 __matches_[__i].second, __out);
5530 }
5531 else
5532 {
5533 *__out = *__fmt_first;
5534 ++__out;
5535 }
5536 break;
5537 }
5538 }
5539 else
5540 {
5541 *__out = *__fmt_first;
5542 ++__out;
5543 }
5544 }
5545 }
5546 return __out;
5547}
5548
5549template <class _BidirectionalIterator, class _Allocator>
5550void
5551match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5552{
Howard Hinnant0949eed2011-06-30 21:18:19 +00005553 using _VSTD::swap;
Howard Hinnant27405f92010-08-14 18:14:02 +00005554 swap(__matches_, __m.__matches_);
5555 swap(__unmatched_, __m.__unmatched_);
5556 swap(__prefix_, __m.__prefix_);
5557 swap(__suffix_, __m.__suffix_);
Howard Hinnanta712c722010-08-16 20:21:16 +00005558 swap(__position_start_, __m.__position_start_);
Howard Hinnant31aaf552010-12-08 21:07:55 +00005559 swap(__ready_, __m.__ready_);
Howard Hinnant27405f92010-08-14 18:14:02 +00005560}
5561
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005562typedef match_results<const char*> cmatch;
5563typedef match_results<const wchar_t*> wcmatch;
5564typedef match_results<string::const_iterator> smatch;
5565typedef match_results<wstring::const_iterator> wsmatch;
5566
5567template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005568bool
5569operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5570 const match_results<_BidirectionalIterator, _Allocator>& __y)
5571{
Howard Hinnant31aaf552010-12-08 21:07:55 +00005572 if (__x.__ready_ != __y.__ready_)
5573 return false;
5574 if (!__x.__ready_)
5575 return true;
Howard Hinnant27405f92010-08-14 18:14:02 +00005576 return __x.__matches_ == __y.__matches_ &&
5577 __x.__prefix_ == __y.__prefix_ &&
Howard Hinnant31aaf552010-12-08 21:07:55 +00005578 __x.__suffix_ == __y.__suffix_;
Howard Hinnant27405f92010-08-14 18:14:02 +00005579}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005580
5581template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005582inline _LIBCPP_INLINE_VISIBILITY
5583bool
5584operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5585 const match_results<_BidirectionalIterator, _Allocator>& __y)
5586{
5587 return !(__x == __y);
5588}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005589
5590template <class _BidirectionalIterator, class _Allocator>
Howard Hinnant27405f92010-08-14 18:14:02 +00005591inline _LIBCPP_INLINE_VISIBILITY
5592void
5593swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5594 match_results<_BidirectionalIterator, _Allocator>& __y)
5595{
5596 __x.swap(__y);
5597}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005598
5599// regex_search
5600
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005601template <class _CharT, class _Traits>
Howard Hinnant17615b02010-07-27 01:25:38 +00005602template <class _Allocator>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005603bool
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005604basic_regex<_CharT, _Traits>::__match_at_start_ecma(
Howard Hinnant17615b02010-07-27 01:25:38 +00005605 const _CharT* __first, const _CharT* __last,
5606 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005607 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005608{
Howard Hinnant17615b02010-07-27 01:25:38 +00005609 vector<__state> __states;
Howard Hinnant17615b02010-07-27 01:25:38 +00005610 __node* __st = __start_.get();
5611 if (__st)
5612 {
Marshall Clow5e56c302015-01-28 22:22:35 +00005613 sub_match<const _CharT*> __unmatched;
5614 __unmatched.first = __last;
5615 __unmatched.second = __last;
5616 __unmatched.matched = false;
5617
Howard Hinnant17615b02010-07-27 01:25:38 +00005618 __states.push_back(__state());
5619 __states.back().__do_ = 0;
5620 __states.back().__first_ = __first;
5621 __states.back().__current_ = __first;
5622 __states.back().__last_ = __last;
Marshall Clow5e56c302015-01-28 22:22:35 +00005623 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
Howard Hinnant17615b02010-07-27 01:25:38 +00005624 __states.back().__loop_data_.resize(__loop_count());
5625 __states.back().__node_ = __st;
5626 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005627 __states.back().__at_first_ = __at_first;
Howard Hinnant17615b02010-07-27 01:25:38 +00005628 do
5629 {
5630 __state& __s = __states.back();
5631 if (__s.__node_)
5632 __s.__node_->__exec(__s);
5633 switch (__s.__do_)
5634 {
5635 case __state::__end_state:
5636 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005637 __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
Howard Hinnant17615b02010-07-27 01:25:38 +00005638 __m.__matches_[0].matched = true;
5639 for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5640 __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5641 return true;
5642 case __state::__accept_and_consume:
5643 case __state::__repeat:
5644 case __state::__accept_but_not_consume:
5645 break;
5646 case __state::__split:
5647 {
5648 __state __snext = __s;
5649 __s.__node_->__exec_split(true, __s);
5650 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005651 __states.push_back(_VSTD::move(__snext));
Howard Hinnant17615b02010-07-27 01:25:38 +00005652 }
5653 break;
5654 case __state::__reject:
5655 __states.pop_back();
5656 break;
5657 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005658#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005659 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005660#endif
Howard Hinnant17615b02010-07-27 01:25:38 +00005661 break;
Howard Hinnantd4444702010-08-11 17:04:31 +00005662
Howard Hinnant17615b02010-07-27 01:25:38 +00005663 }
5664 } while (!__states.empty());
5665 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005666 return false;
5667}
5668
5669template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005670template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005671bool
5672basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5673 const _CharT* __first, const _CharT* __last,
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005674 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005675 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005676{
Howard Hinnantac303862010-07-12 15:51:17 +00005677 deque<__state> __states;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005678 ptrdiff_t __highest_j = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00005679 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005680 __node* __st = __start_.get();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005681 if (__st)
5682 {
Howard Hinnantac303862010-07-12 15:51:17 +00005683 __states.push_back(__state());
Howard Hinnantac303862010-07-12 15:51:17 +00005684 __states.back().__do_ = 0;
5685 __states.back().__first_ = __first;
5686 __states.back().__current_ = __first;
5687 __states.back().__last_ = __last;
5688 __states.back().__loop_data_.resize(__loop_count());
5689 __states.back().__node_ = __st;
5690 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005691 __states.back().__at_first_ = __at_first;
Howard Hinnant68025ed2010-07-14 15:45:11 +00005692 bool __matched = false;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005693 do
5694 {
Howard Hinnantac303862010-07-12 15:51:17 +00005695 __state& __s = __states.back();
5696 if (__s.__node_)
5697 __s.__node_->__exec(__s);
5698 switch (__s.__do_)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005699 {
Howard Hinnantac303862010-07-12 15:51:17 +00005700 case __state::__end_state:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005701 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnant68025ed2010-07-14 15:45:11 +00005702 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005703 __matched = true;
Howard Hinnant99968442011-11-29 18:15:50 +00005704 if (__highest_j == _Np)
Howard Hinnantac303862010-07-12 15:51:17 +00005705 __states.clear();
5706 else
5707 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005708 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005709 case __state::__consume_input:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005710 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005711 case __state::__accept_and_consume:
Howard Hinnant0949eed2011-06-30 21:18:19 +00005712 __states.push_front(_VSTD::move(__s));
Howard Hinnantac303862010-07-12 15:51:17 +00005713 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005714 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005715 case __state::__repeat:
5716 case __state::__accept_but_not_consume:
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005717 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005718 case __state::__split:
5719 {
5720 __state __snext = __s;
5721 __s.__node_->__exec_split(true, __s);
5722 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005723 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005724 }
5725 break;
5726 case __state::__reject:
5727 __states.pop_back();
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005728 break;
5729 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005730#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005731 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005732#endif
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005733 break;
5734 }
Howard Hinnantac303862010-07-12 15:51:17 +00005735 } while (!__states.empty());
Howard Hinnant68025ed2010-07-14 15:45:11 +00005736 if (__matched)
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005737 {
5738 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005739 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005740 __m.__matches_[0].matched = true;
5741 return true;
5742 }
5743 }
5744 return false;
5745}
5746
5747template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005748template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005749bool
5750basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005751 const _CharT* __first, const _CharT* __last,
5752 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005753 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005754{
Howard Hinnantac303862010-07-12 15:51:17 +00005755 vector<__state> __states;
Howard Hinnantac303862010-07-12 15:51:17 +00005756 __state __best_state;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005757 ptrdiff_t __j = 0;
5758 ptrdiff_t __highest_j = 0;
Howard Hinnant99968442011-11-29 18:15:50 +00005759 ptrdiff_t _Np = _VSTD::distance(__first, __last);
Howard Hinnantac303862010-07-12 15:51:17 +00005760 __node* __st = __start_.get();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005761 if (__st)
5762 {
Marshall Clow5e56c302015-01-28 22:22:35 +00005763 sub_match<const _CharT*> __unmatched;
5764 __unmatched.first = __last;
5765 __unmatched.second = __last;
5766 __unmatched.matched = false;
5767
Howard Hinnantac303862010-07-12 15:51:17 +00005768 __states.push_back(__state());
5769 __states.back().__do_ = 0;
5770 __states.back().__first_ = __first;
5771 __states.back().__current_ = __first;
5772 __states.back().__last_ = __last;
Marshall Clow5e56c302015-01-28 22:22:35 +00005773 __states.back().__sub_matches_.resize(mark_count(), __unmatched);
Howard Hinnantac303862010-07-12 15:51:17 +00005774 __states.back().__loop_data_.resize(__loop_count());
5775 __states.back().__node_ = __st;
5776 __states.back().__flags_ = __flags;
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005777 __states.back().__at_first_ = __at_first;
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005778 const _CharT* __current = __first;
Howard Hinnantac303862010-07-12 15:51:17 +00005779 bool __matched = false;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005780 do
5781 {
Howard Hinnantac303862010-07-12 15:51:17 +00005782 __state& __s = __states.back();
5783 if (__s.__node_)
5784 __s.__node_->__exec(__s);
5785 switch (__s.__do_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005786 {
Howard Hinnantac303862010-07-12 15:51:17 +00005787 case __state::__end_state:
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005788 if (!__matched || __highest_j < __s.__current_ - __s.__first_)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005789 {
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005790 __highest_j = __s.__current_ - __s.__first_;
Howard Hinnantac303862010-07-12 15:51:17 +00005791 __best_state = __s;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005792 }
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005793 __matched = true;
Howard Hinnant99968442011-11-29 18:15:50 +00005794 if (__highest_j == _Np)
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005795 __states.clear();
5796 else
5797 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005798 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005799 case __state::__accept_and_consume:
Howard Hinnantcba352d2010-07-12 18:16:05 +00005800 __j += __s.__current_ - __current;
5801 __current = __s.__current_;
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005802 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005803 case __state::__repeat:
5804 case __state::__accept_but_not_consume:
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005805 break;
Howard Hinnantac303862010-07-12 15:51:17 +00005806 case __state::__split:
5807 {
5808 __state __snext = __s;
5809 __s.__node_->__exec_split(true, __s);
5810 __snext.__node_->__exec_split(false, __snext);
Howard Hinnant0949eed2011-06-30 21:18:19 +00005811 __states.push_back(_VSTD::move(__snext));
Howard Hinnantac303862010-07-12 15:51:17 +00005812 }
5813 break;
5814 case __state::__reject:
5815 __states.pop_back();
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005816 break;
5817 default:
Howard Hinnantd4444702010-08-11 17:04:31 +00005818#ifndef _LIBCPP_NO_EXCEPTIONS
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005819 throw regex_error(regex_constants::__re_err_unknown);
Howard Hinnantd4444702010-08-11 17:04:31 +00005820#endif
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005821 break;
5822 }
Howard Hinnantac303862010-07-12 15:51:17 +00005823 } while (!__states.empty());
5824 if (__matched)
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005825 {
5826 __m.__matches_[0].first = __first;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005827 __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005828 __m.__matches_[0].matched = true;
Howard Hinnantac303862010-07-12 15:51:17 +00005829 for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
5830 __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
Howard Hinnante77aa5e2010-07-08 17:43:58 +00005831 return true;
5832 }
5833 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005834 return false;
5835}
5836
5837template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005838template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005839bool
5840basic_regex<_CharT, _Traits>::__match_at_start(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005841 const _CharT* __first, const _CharT* __last,
5842 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005843 regex_constants::match_flag_type __flags, bool __at_first) const
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005844{
Howard Hinnantad2a7ab2010-07-27 17:24:17 +00005845 if ((__flags_ & 0x1F0) == ECMAScript)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005846 return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005847 if (mark_count() == 0)
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005848 return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
5849 return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005850}
5851
5852template <class _CharT, class _Traits>
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005853template <class _Allocator>
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005854bool
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005855basic_regex<_CharT, _Traits>::__search(
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005856 const _CharT* __first, const _CharT* __last,
5857 match_results<const _CharT*, _Allocator>& __m,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005858 regex_constants::match_flag_type __flags) const
5859{
Howard Hinnanta712c722010-08-16 20:21:16 +00005860 __m.__init(1 + mark_count(), __first, __last,
5861 __flags & regex_constants::__no_update_pos);
Howard Hinnant7670f7d2013-07-09 17:29:09 +00005862 if (__match_at_start(__first, __last, __m, __flags,
5863 !(__flags & regex_constants::__no_update_pos)))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005864 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005865 __m.__prefix_.second = __m[0].first;
5866 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5867 __m.__suffix_.first = __m[0].second;
5868 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5869 return true;
5870 }
Howard Hinnant8daa7332010-07-29 01:15:27 +00005871 if (__first != __last && !(__flags & regex_constants::match_continuous))
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005872 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005873 __flags |= regex_constants::match_prev_avail;
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005874 for (++__first; __first != __last; ++__first)
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005875 {
Howard Hinnantf3dcca02010-07-29 15:17:28 +00005876 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant41fb6e12011-03-26 20:02:27 +00005877 if (__match_at_start(__first, __last, __m, __flags, false))
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005878 {
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005879 __m.__prefix_.second = __m[0].first;
5880 __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5881 __m.__suffix_.first = __m[0].second;
5882 __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5883 return true;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005884 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005885 __m.__matches_.assign(__m.size(), __m.__unmatched_);
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005886 }
5887 }
Howard Hinnantf8ce4592010-07-07 19:14:52 +00005888 __m.__matches_.clear();
5889 return false;
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005890}
5891
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005892template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005893inline _LIBCPP_INLINE_VISIBILITY
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005894bool
5895regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5896 match_results<_BidirectionalIterator, _Allocator>& __m,
5897 const basic_regex<_CharT, _Traits>& __e,
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005898 regex_constants::match_flag_type __flags = regex_constants::match_default)
5899{
Howard Hinnante8402082013-07-11 15:32:55 +00005900 int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
5901 basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005902 match_results<const _CharT*> __mc;
Howard Hinnante8402082013-07-11 15:32:55 +00005903 bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005904 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005905 return __r;
5906}
5907
Howard Hinnanta9602d52013-06-29 23:45:43 +00005908template <class _Iter, class _Allocator, class _CharT, class _Traits>
5909inline _LIBCPP_INLINE_VISIBILITY
5910bool
5911regex_search(__wrap_iter<_Iter> __first,
5912 __wrap_iter<_Iter> __last,
5913 match_results<__wrap_iter<_Iter>, _Allocator>& __m,
5914 const basic_regex<_CharT, _Traits>& __e,
5915 regex_constants::match_flag_type __flags = regex_constants::match_default)
5916{
5917 match_results<const _CharT*> __mc;
5918 bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
5919 __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
5920 return __r;
5921}
5922
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005923template <class _Allocator, class _CharT, class _Traits>
5924inline _LIBCPP_INLINE_VISIBILITY
5925bool
5926regex_search(const _CharT* __first, const _CharT* __last,
5927 match_results<const _CharT*, _Allocator>& __m,
5928 const basic_regex<_CharT, _Traits>& __e,
5929 regex_constants::match_flag_type __flags = regex_constants::match_default)
5930{
Howard Hinnant9b80f2b2010-06-30 17:22:19 +00005931 return __e.__search(__first, __last, __m, __flags);
5932}
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005933
5934template <class _BidirectionalIterator, class _CharT, class _Traits>
5935inline _LIBCPP_INLINE_VISIBILITY
5936bool
5937regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5938 const basic_regex<_CharT, _Traits>& __e,
5939 regex_constants::match_flag_type __flags = regex_constants::match_default)
5940{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005941 basic_string<_CharT> __s(__first, __last);
5942 match_results<const _CharT*> __mc;
5943 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5944}
5945
5946template <class _CharT, class _Traits>
5947inline _LIBCPP_INLINE_VISIBILITY
5948bool
5949regex_search(const _CharT* __first, const _CharT* __last,
5950 const basic_regex<_CharT, _Traits>& __e,
5951 regex_constants::match_flag_type __flags = regex_constants::match_default)
5952{
5953 match_results<const _CharT*> __mc;
5954 return __e.__search(__first, __last, __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005955}
5956
5957template <class _CharT, class _Allocator, class _Traits>
5958inline _LIBCPP_INLINE_VISIBILITY
5959bool
5960regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5961 const basic_regex<_CharT, _Traits>& __e,
5962 regex_constants::match_flag_type __flags = regex_constants::match_default)
5963{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005964 return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005965}
5966
5967template <class _CharT, class _Traits>
5968inline _LIBCPP_INLINE_VISIBILITY
5969bool
5970regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5971 regex_constants::match_flag_type __flags = regex_constants::match_default)
5972{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005973 match_results<const _CharT*> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00005974 return _VSTD::regex_search(__str, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005975}
5976
5977template <class _ST, class _SA, class _CharT, class _Traits>
5978inline _LIBCPP_INLINE_VISIBILITY
5979bool
5980regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5981 const basic_regex<_CharT, _Traits>& __e,
5982 regex_constants::match_flag_type __flags = regex_constants::match_default)
5983{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005984 match_results<const _CharT*> __mc;
5985 return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00005986}
5987
5988template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5989inline _LIBCPP_INLINE_VISIBILITY
5990bool
5991regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5992 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5993 const basic_regex<_CharT, _Traits>& __e,
5994 regex_constants::match_flag_type __flags = regex_constants::match_default)
5995{
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005996 match_results<const _CharT*> __mc;
5997 bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
Howard Hinnanta712c722010-08-16 20:21:16 +00005998 __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
Howard Hinnant22ce0b42010-07-14 21:14:52 +00005999 return __r;
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006000}
6001
Marshall Clowe0f86722014-02-19 21:21:11 +00006002#if _LIBCPP_STD_VER > 11
6003template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
6004bool
6005regex_search(const basic_string<_Cp, _ST, _SA>&& __s,
6006 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
6007 const basic_regex<_Cp, _Tp>& __e,
6008 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6009#endif
6010
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006011// regex_match
6012
6013template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
6014bool
6015regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6016 match_results<_BidirectionalIterator, _Allocator>& __m,
6017 const basic_regex<_CharT, _Traits>& __e,
6018 regex_constants::match_flag_type __flags = regex_constants::match_default)
6019{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006020 bool __r = _VSTD::regex_search(__first, __last, __m, __e,
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006021 __flags | regex_constants::match_continuous);
6022 if (__r)
6023 {
6024 __r = !__m.suffix().matched;
6025 if (!__r)
6026 __m.__matches_.clear();
6027 }
6028 return __r;
6029}
6030
6031template <class _BidirectionalIterator, class _CharT, class _Traits>
6032inline _LIBCPP_INLINE_VISIBILITY
6033bool
6034regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
6035 const basic_regex<_CharT, _Traits>& __e,
6036 regex_constants::match_flag_type __flags = regex_constants::match_default)
6037{
6038 match_results<_BidirectionalIterator> __m;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006039 return _VSTD::regex_match(__first, __last, __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006040}
6041
6042template <class _CharT, class _Allocator, class _Traits>
6043inline _LIBCPP_INLINE_VISIBILITY
6044bool
6045regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
6046 const basic_regex<_CharT, _Traits>& __e,
6047 regex_constants::match_flag_type __flags = regex_constants::match_default)
6048{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006049 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006050}
6051
6052template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6053inline _LIBCPP_INLINE_VISIBILITY
6054bool
6055regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6056 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6057 const basic_regex<_CharT, _Traits>& __e,
6058 regex_constants::match_flag_type __flags = regex_constants::match_default)
6059{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006060 return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006061}
6062
Marshall Clowe0f86722014-02-19 21:21:11 +00006063#if _LIBCPP_STD_VER > 11
6064template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
6065inline _LIBCPP_INLINE_VISIBILITY
6066bool
6067regex_match(const basic_string<_CharT, _ST, _SA>&& __s,
6068 match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
6069 const basic_regex<_CharT, _Traits>& __e,
6070 regex_constants::match_flag_type __flags = regex_constants::match_default) = delete;
6071#endif
6072
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006073template <class _CharT, class _Traits>
6074inline _LIBCPP_INLINE_VISIBILITY
6075bool
6076regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
6077 regex_constants::match_flag_type __flags = regex_constants::match_default)
6078{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006079 return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006080}
6081
6082template <class _ST, class _SA, class _CharT, class _Traits>
6083inline _LIBCPP_INLINE_VISIBILITY
6084bool
6085regex_match(const basic_string<_CharT, _ST, _SA>& __s,
6086 const basic_regex<_CharT, _Traits>& __e,
6087 regex_constants::match_flag_type __flags = regex_constants::match_default)
6088{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006089 return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
Howard Hinnant7e9d84b2010-06-30 00:21:42 +00006090}
6091
Howard Hinnanta712c722010-08-16 20:21:16 +00006092// regex_iterator
6093
6094template <class _BidirectionalIterator,
6095 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6096 class _Traits = regex_traits<_CharT> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +00006097class _LIBCPP_TYPE_VIS_ONLY regex_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00006098{
6099public:
6100 typedef basic_regex<_CharT, _Traits> regex_type;
6101 typedef match_results<_BidirectionalIterator> value_type;
6102 typedef ptrdiff_t difference_type;
6103 typedef const value_type* pointer;
6104 typedef const value_type& reference;
6105 typedef forward_iterator_tag iterator_category;
6106
6107private:
6108 _BidirectionalIterator __begin_;
6109 _BidirectionalIterator __end_;
6110 const regex_type* __pregex_;
6111 regex_constants::match_flag_type __flags_;
6112 value_type __match_;
6113
6114public:
6115 regex_iterator();
6116 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6117 const regex_type& __re,
Marshall Clowe0f86722014-02-19 21:21:11 +00006118 regex_constants::match_flag_type __m
6119 = regex_constants::match_default);
6120#if _LIBCPP_STD_VER > 11
6121 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6122 const regex_type&& __re,
6123 regex_constants::match_flag_type __m
6124 = regex_constants::match_default) = delete;
6125#endif
Howard Hinnanta712c722010-08-16 20:21:16 +00006126
6127 bool operator==(const regex_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006128 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006129 bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
6130
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006131 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006132 reference operator*() const {return __match_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006133 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006134 pointer operator->() const {return &__match_;}
6135
6136 regex_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006137 _LIBCPP_INLINE_VISIBILITY
Howard Hinnanta712c722010-08-16 20:21:16 +00006138 regex_iterator operator++(int)
6139 {
6140 regex_iterator __t(*this);
6141 ++(*this);
6142 return __t;
6143 }
6144};
6145
6146template <class _BidirectionalIterator, class _CharT, class _Traits>
6147regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
6148 : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
6149{
6150}
6151
6152template <class _BidirectionalIterator, class _CharT, class _Traits>
6153regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6154 regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6155 const regex_type& __re, regex_constants::match_flag_type __m)
6156 : __begin_(__a),
6157 __end_(__b),
6158 __pregex_(&__re),
6159 __flags_(__m)
6160{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006161 _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
Howard Hinnanta712c722010-08-16 20:21:16 +00006162}
6163
6164template <class _BidirectionalIterator, class _CharT, class _Traits>
6165bool
6166regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6167 operator==(const regex_iterator& __x) const
6168{
6169 if (__match_.empty() && __x.__match_.empty())
6170 return true;
6171 if (__match_.empty() || __x.__match_.empty())
6172 return false;
6173 return __begin_ == __x.__begin_ &&
6174 __end_ == __x.__end_ &&
6175 __pregex_ == __x.__pregex_ &&
6176 __flags_ == __x.__flags_ &&
6177 __match_[0] == __x.__match_[0];
6178}
6179
6180template <class _BidirectionalIterator, class _CharT, class _Traits>
6181regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6182regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6183{
6184 __flags_ |= regex_constants::__no_update_pos;
6185 _BidirectionalIterator __start = __match_[0].second;
Howard Hinnanta9602d52013-06-29 23:45:43 +00006186 if (__match_.empty())
Howard Hinnanta712c722010-08-16 20:21:16 +00006187 {
6188 if (__start == __end_)
6189 {
6190 __match_ = value_type();
6191 return *this;
6192 }
Howard Hinnant0949eed2011-06-30 21:18:19 +00006193 else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
Howard Hinnanta712c722010-08-16 20:21:16 +00006194 __flags_ | regex_constants::match_not_null |
6195 regex_constants::match_continuous))
6196 return *this;
6197 else
6198 ++__start;
6199 }
6200 __flags_ |= regex_constants::match_prev_avail;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006201 if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
Howard Hinnanta712c722010-08-16 20:21:16 +00006202 __match_ = value_type();
6203 return *this;
6204}
6205
6206typedef regex_iterator<const char*> cregex_iterator;
6207typedef regex_iterator<const wchar_t*> wcregex_iterator;
6208typedef regex_iterator<string::const_iterator> sregex_iterator;
6209typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
6210
6211// regex_token_iterator
6212
6213template <class _BidirectionalIterator,
6214 class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6215 class _Traits = regex_traits<_CharT> >
Howard Hinnant0f678bd2013-08-12 18:38:34 +00006216class _LIBCPP_TYPE_VIS_ONLY regex_token_iterator
Howard Hinnanta712c722010-08-16 20:21:16 +00006217{
6218public:
6219 typedef basic_regex<_CharT, _Traits> regex_type;
6220 typedef sub_match<_BidirectionalIterator> value_type;
6221 typedef ptrdiff_t difference_type;
6222 typedef const value_type* pointer;
6223 typedef const value_type& reference;
6224 typedef forward_iterator_tag iterator_category;
6225
Howard Hinnant262b7792010-08-17 20:42:03 +00006226private:
6227 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6228
6229 _Position __position_;
6230 const value_type* __result_;
6231 value_type __suffix_;
6232 ptrdiff_t _N_;
6233 vector<int> __subs_;
6234
6235public:
Howard Hinnanta712c722010-08-16 20:21:16 +00006236 regex_token_iterator();
6237 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6238 const regex_type& __re, int __submatch = 0,
Howard Hinnant262b7792010-08-17 20:42:03 +00006239 regex_constants::match_flag_type __m =
6240 regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +00006241#if _LIBCPP_STD_VER > 11
6242 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6243 const regex_type&& __re, int __submatch = 0,
6244 regex_constants::match_flag_type __m =
6245 regex_constants::match_default) = delete;
6246#endif
6247
Howard Hinnanta712c722010-08-16 20:21:16 +00006248 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6249 const regex_type& __re, const vector<int>& __submatches,
Howard Hinnant262b7792010-08-17 20:42:03 +00006250 regex_constants::match_flag_type __m =
6251 regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +00006252#if _LIBCPP_STD_VER > 11
6253 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6254 const regex_type&& __re, const vector<int>& __submatches,
6255 regex_constants::match_flag_type __m =
6256 regex_constants::match_default) = delete;
6257#endif
6258
Howard Hinnante3e32912011-08-12 21:56:02 +00006259#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnanta712c722010-08-16 20:21:16 +00006260 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
Howard Hinnant262b7792010-08-17 20:42:03 +00006261 const regex_type& __re,
6262 initializer_list<int> __submatches,
6263 regex_constants::match_flag_type __m =
6264 regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +00006265
6266#if _LIBCPP_STD_VER > 11
6267 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6268 const regex_type&& __re,
6269 initializer_list<int> __submatches,
6270 regex_constants::match_flag_type __m =
6271 regex_constants::match_default) = delete;
6272#endif
Howard Hinnante3e32912011-08-12 21:56:02 +00006273#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
Howard Hinnant99968442011-11-29 18:15:50 +00006274 template <size_t _Np>
Howard Hinnant262b7792010-08-17 20:42:03 +00006275 regex_token_iterator(_BidirectionalIterator __a,
6276 _BidirectionalIterator __b,
6277 const regex_type& __re,
Howard Hinnant99968442011-11-29 18:15:50 +00006278 const int (&__submatches)[_Np],
Howard Hinnant262b7792010-08-17 20:42:03 +00006279 regex_constants::match_flag_type __m =
6280 regex_constants::match_default);
Marshall Clowe0f86722014-02-19 21:21:11 +00006281#if _LIBCPP_STD_VER > 11
6282 template <std::size_t _Np>
6283 regex_token_iterator(_BidirectionalIterator __a,
6284 _BidirectionalIterator __b,
6285 const regex_type&& __re,
6286 const int (&__submatches)[_Np],
6287 regex_constants::match_flag_type __m =
6288 regex_constants::match_default) = delete;
6289#endif
6290
Howard Hinnanta712c722010-08-16 20:21:16 +00006291 regex_token_iterator(const regex_token_iterator&);
6292 regex_token_iterator& operator=(const regex_token_iterator&);
6293
Howard Hinnant262b7792010-08-17 20:42:03 +00006294 bool operator==(const regex_token_iterator& __x) const;
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006295 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006296 bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
Howard Hinnanta712c722010-08-16 20:21:16 +00006297
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006298 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006299 const value_type& operator*() const {return *__result_;}
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006300 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006301 const value_type* operator->() const {return __result_;}
Howard Hinnanta712c722010-08-16 20:21:16 +00006302
6303 regex_token_iterator& operator++();
Howard Hinnantaef07cb2010-09-23 15:13:20 +00006304 _LIBCPP_INLINE_VISIBILITY
Howard Hinnant262b7792010-08-17 20:42:03 +00006305 regex_token_iterator operator++(int)
6306 {
6307 regex_token_iterator __t(*this);
6308 ++(*this);
6309 return __t;
6310 }
6311
6312private:
6313 void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006314 void __establish_result () {
6315 if (__subs_[_N_] == -1)
6316 __result_ = &__position_->prefix();
6317 else
6318 __result_ = &(*__position_)[__subs_[_N_]];
6319 }
Howard Hinnanta712c722010-08-16 20:21:16 +00006320};
6321
Howard Hinnant262b7792010-08-17 20:42:03 +00006322template <class _BidirectionalIterator, class _CharT, class _Traits>
6323regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6324 regex_token_iterator()
6325 : __result_(nullptr),
6326 __suffix_(),
6327 _N_(0)
6328{
6329}
6330
6331template <class _BidirectionalIterator, class _CharT, class _Traits>
6332void
6333regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6334 __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6335{
6336 if (__position_ != _Position())
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006337 __establish_result ();
Howard Hinnant262b7792010-08-17 20:42:03 +00006338 else if (__subs_[_N_] == -1)
6339 {
6340 __suffix_.matched = true;
6341 __suffix_.first = __a;
6342 __suffix_.second = __b;
6343 __result_ = &__suffix_;
6344 }
6345 else
6346 __result_ = nullptr;
6347}
6348
6349template <class _BidirectionalIterator, class _CharT, class _Traits>
6350regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6351 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6352 const regex_type& __re, int __submatch,
6353 regex_constants::match_flag_type __m)
6354 : __position_(__a, __b, __re, __m),
6355 _N_(0),
6356 __subs_(1, __submatch)
6357{
6358 __init(__a, __b);
6359}
6360
6361template <class _BidirectionalIterator, class _CharT, class _Traits>
6362regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6363 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6364 const regex_type& __re, const vector<int>& __submatches,
6365 regex_constants::match_flag_type __m)
6366 : __position_(__a, __b, __re, __m),
6367 _N_(0),
6368 __subs_(__submatches)
6369{
6370 __init(__a, __b);
6371}
6372
Howard Hinnante3e32912011-08-12 21:56:02 +00006373#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6374
Howard Hinnant262b7792010-08-17 20:42:03 +00006375template <class _BidirectionalIterator, class _CharT, class _Traits>
6376regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6377 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6378 const regex_type& __re,
6379 initializer_list<int> __submatches,
6380 regex_constants::match_flag_type __m)
6381 : __position_(__a, __b, __re, __m),
6382 _N_(0),
6383 __subs_(__submatches)
6384{
6385 __init(__a, __b);
6386}
6387
Howard Hinnante3e32912011-08-12 21:56:02 +00006388#endif // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6389
Howard Hinnant262b7792010-08-17 20:42:03 +00006390template <class _BidirectionalIterator, class _CharT, class _Traits>
Howard Hinnant99968442011-11-29 18:15:50 +00006391template <size_t _Np>
Howard Hinnant262b7792010-08-17 20:42:03 +00006392regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6393 regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6394 const regex_type& __re,
Howard Hinnant99968442011-11-29 18:15:50 +00006395 const int (&__submatches)[_Np],
Howard Hinnant262b7792010-08-17 20:42:03 +00006396 regex_constants::match_flag_type __m)
6397 : __position_(__a, __b, __re, __m),
6398 _N_(0),
Howard Hinnant99968442011-11-29 18:15:50 +00006399 __subs_(__submatches, __submatches + _Np)
Howard Hinnant262b7792010-08-17 20:42:03 +00006400{
6401 __init(__a, __b);
6402}
6403
6404template <class _BidirectionalIterator, class _CharT, class _Traits>
6405regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6406 regex_token_iterator(const regex_token_iterator& __x)
6407 : __position_(__x.__position_),
6408 __result_(__x.__result_),
6409 __suffix_(__x.__suffix_),
6410 _N_(__x._N_),
6411 __subs_(__x.__subs_)
6412{
6413 if (__x.__result_ == &__x.__suffix_)
Marshall Clow72fe0ae2014-01-13 17:47:08 +00006414 __result_ = &__suffix_;
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006415 else if ( __result_ != nullptr )
6416 __establish_result ();
Howard Hinnant262b7792010-08-17 20:42:03 +00006417}
6418
6419template <class _BidirectionalIterator, class _CharT, class _Traits>
6420regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6421regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6422 operator=(const regex_token_iterator& __x)
6423{
6424 if (this != &__x)
6425 {
6426 __position_ = __x.__position_;
6427 if (__x.__result_ == &__x.__suffix_)
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006428 __result_ = &__suffix_;
Howard Hinnant262b7792010-08-17 20:42:03 +00006429 else
6430 __result_ = __x.__result_;
6431 __suffix_ = __x.__suffix_;
6432 _N_ = __x._N_;
6433 __subs_ = __x.__subs_;
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006434
6435 if ( __result_ != nullptr && __result_ != &__suffix_ )
6436 __establish_result();
Howard Hinnant262b7792010-08-17 20:42:03 +00006437 }
6438 return *this;
6439}
6440
6441template <class _BidirectionalIterator, class _CharT, class _Traits>
6442bool
6443regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6444 operator==(const regex_token_iterator& __x) const
6445{
6446 if (__result_ == nullptr && __x.__result_ == nullptr)
6447 return true;
6448 if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6449 __suffix_ == __x.__suffix_)
6450 return true;
6451 if (__result_ == nullptr || __x.__result_ == nullptr)
6452 return false;
6453 if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6454 return false;
6455 return __position_ == __x.__position_ && _N_ == __x._N_ &&
6456 __subs_ == __x.__subs_;
6457}
6458
6459template <class _BidirectionalIterator, class _CharT, class _Traits>
6460regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6461regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6462{
6463 _Position __prev = __position_;
6464 if (__result_ == &__suffix_)
6465 __result_ = nullptr;
6466 else if (_N_ + 1 < __subs_.size())
6467 {
6468 ++_N_;
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006469 __establish_result();
Howard Hinnant262b7792010-08-17 20:42:03 +00006470 }
6471 else
6472 {
6473 _N_ = 0;
6474 ++__position_;
6475 if (__position_ != _Position())
Marshall Clow0efd9dc2014-01-09 18:25:57 +00006476 __establish_result();
Howard Hinnant262b7792010-08-17 20:42:03 +00006477 else
6478 {
Howard Hinnant0949eed2011-06-30 21:18:19 +00006479 if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
Howard Hinnant262b7792010-08-17 20:42:03 +00006480 && __prev->suffix().length() != 0)
6481 {
6482 __suffix_.matched = true;
6483 __suffix_.first = __prev->suffix().first;
6484 __suffix_.second = __prev->suffix().second;
6485 __result_ = &__suffix_;
6486 }
6487 else
6488 __result_ = nullptr;
6489 }
6490 }
6491 return *this;
6492}
6493
Howard Hinnanta712c722010-08-16 20:21:16 +00006494typedef regex_token_iterator<const char*> cregex_token_iterator;
6495typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
6496typedef regex_token_iterator<string::const_iterator> sregex_token_iterator;
6497typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
6498
Howard Hinnanta8d77592010-08-18 00:13:08 +00006499// regex_replace
6500
6501template <class _OutputIterator, class _BidirectionalIterator,
6502 class _Traits, class _CharT>
6503_OutputIterator
6504regex_replace(_OutputIterator __out,
6505 _BidirectionalIterator __first, _BidirectionalIterator __last,
6506 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6507 regex_constants::match_flag_type __flags = regex_constants::match_default)
6508{
6509 typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6510 _Iter __i(__first, __last, __e, __flags);
6511 _Iter __eof;
6512 if (__i == __eof)
6513 {
6514 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006515 __out = _VSTD::copy(__first, __last, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006516 }
6517 else
6518 {
6519 sub_match<_BidirectionalIterator> __lm;
6520 for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6521 {
6522 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006523 __out = _VSTD::copy(__i->prefix().first, __i->prefix().second, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006524 __out = __i->format(__out, __fmt, __fmt + __len, __flags);
6525 __lm = __i->suffix();
6526 if (__flags & regex_constants::format_first_only)
6527 break;
6528 }
6529 if (!(__flags & regex_constants::format_no_copy))
Howard Hinnant0949eed2011-06-30 21:18:19 +00006530 __out = _VSTD::copy(__lm.first, __lm.second, __out);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006531 }
6532 return __out;
6533}
6534
6535template <class _OutputIterator, class _BidirectionalIterator,
6536 class _Traits, class _CharT, class _ST, class _SA>
6537inline _LIBCPP_INLINE_VISIBILITY
6538_OutputIterator
6539regex_replace(_OutputIterator __out,
6540 _BidirectionalIterator __first, _BidirectionalIterator __last,
6541 const basic_regex<_CharT, _Traits>& __e,
6542 const basic_string<_CharT, _ST, _SA>& __fmt,
6543 regex_constants::match_flag_type __flags = regex_constants::match_default)
6544{
Howard Hinnant0949eed2011-06-30 21:18:19 +00006545 return _VSTD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags);
Howard Hinnanta8d77592010-08-18 00:13:08 +00006546}
6547
6548template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6549 class _FSA>
6550inline _LIBCPP_INLINE_VISIBILITY
6551basic_string<_CharT, _ST, _SA>
6552regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6553 const basic_regex<_CharT, _Traits>& __e,
6554 const basic_string<_CharT, _FST, _FSA>& __fmt,
6555 regex_constants::match_flag_type __flags = regex_constants::match_default)
6556{
6557 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006558 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006559 __fmt.c_str(), __flags);
6560 return __r;
6561}
6562
6563template <class _Traits, class _CharT, class _ST, class _SA>
6564inline _LIBCPP_INLINE_VISIBILITY
6565basic_string<_CharT, _ST, _SA>
6566regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6567 const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6568 regex_constants::match_flag_type __flags = regex_constants::match_default)
6569{
6570 basic_string<_CharT, _ST, _SA> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006571 _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006572 __fmt, __flags);
6573 return __r;
6574}
6575
6576template <class _Traits, class _CharT, class _ST, class _SA>
6577inline _LIBCPP_INLINE_VISIBILITY
6578basic_string<_CharT>
6579regex_replace(const _CharT* __s,
6580 const basic_regex<_CharT, _Traits>& __e,
6581 const basic_string<_CharT, _ST, _SA>& __fmt,
6582 regex_constants::match_flag_type __flags = regex_constants::match_default)
6583{
6584 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006585 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006586 __s + char_traits<_CharT>::length(__s), __e,
6587 __fmt.c_str(), __flags);
6588 return __r;
6589}
6590
6591template <class _Traits, class _CharT>
6592inline _LIBCPP_INLINE_VISIBILITY
6593basic_string<_CharT>
6594regex_replace(const _CharT* __s,
6595 const basic_regex<_CharT, _Traits>& __e,
6596 const _CharT* __fmt,
6597 regex_constants::match_flag_type __flags = regex_constants::match_default)
6598{
6599 basic_string<_CharT> __r;
Howard Hinnant0949eed2011-06-30 21:18:19 +00006600 _VSTD::regex_replace(back_inserter(__r), __s,
Howard Hinnanta8d77592010-08-18 00:13:08 +00006601 __s + char_traits<_CharT>::length(__s), __e,
6602 __fmt, __flags);
6603 return __r;
6604}
6605
Howard Hinnant3257c982010-06-17 00:34:59 +00006606_LIBCPP_END_NAMESPACE_STD
6607
6608#endif // _LIBCPP_REGEX