Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / c++ / regex @ 14

History | View | Annotate | Download (212 KB)

1
// -*- C++ -*-
2
//===--------------------------- regex ------------------------------------===//
3
//
4
//                     The LLVM Compiler Infrastructure
5
//
6
// This file is dual licensed under the MIT and the University of Illinois Open
7
// Source Licenses. See LICENSE.TXT for details.
8
//
9
//===----------------------------------------------------------------------===//
10

    
11
#ifndef _LIBCPP_REGEX
12
#define _LIBCPP_REGEX
13

    
14
/*
15
    regex synopsis
16

    
17
#include <initializer_list>
18

    
19
namespace std
20
{
21

    
22
namespace regex_constants
23
{
24

    
25
emum 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

    
39
constexpr syntax_option_type operator~(syntax_option_type f);
40
constexpr syntax_option_type operator&(syntax_option_type lhs, syntax_option_type rhs);
41
constexpr syntax_option_type operator|(syntax_option_type lhs, syntax_option_type rhs);
42

    
43
enum 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

    
60
constexpr match_flag_type operator~(match_flag_type f);
61
constexpr match_flag_type operator&(match_flag_type lhs, match_flag_type rhs);
62
constexpr match_flag_type operator|(match_flag_type lhs, match_flag_type rhs);
63

    
64
enum 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

    
83
class regex_error
84
    : public runtime_error
85
{
86
public:
87
    explicit regex_error(regex_constants::error_type ecode);
88
    regex_constants::error_type code() const;
89
};
90

    
91
template <class charT>
92
struct regex_traits
93
{
94
public:
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

    
124
template <class charT, class traits = regex_traits<charT>>
125
class basic_regex
126
{
127
public:
128
    // types:
129
    typedef charT                               value_type;
130
    typedef regex_constants::syntax_option_type flag_type;
131
    typedef typename traits::locale_type        locale_type;
132

    
133
    // constants:
134
    static constexpr regex_constants::syntax_option_type icase = regex_constants::icase;
135
    static constexpr regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
136
    static constexpr regex_constants::syntax_option_type optimize = regex_constants::optimize;
137
    static constexpr regex_constants::syntax_option_type collate = regex_constants::collate;
138
    static constexpr regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
139
    static constexpr regex_constants::syntax_option_type basic = regex_constants::basic;
140
    static constexpr regex_constants::syntax_option_type extended = regex_constants::extended;
141
    static constexpr regex_constants::syntax_option_type awk = regex_constants::awk;
142
    static constexpr regex_constants::syntax_option_type grep = regex_constants::grep;
143
    static constexpr regex_constants::syntax_option_type egrep = regex_constants::egrep;
144

    
145
    // construct/copy/destroy:
146
    basic_regex();
147
    explicit basic_regex(const charT* p, flag_type f = regex_constants::ECMAScript);
148
    basic_regex(const charT* p, size_t len, flag_type f);
149
    basic_regex(const basic_regex&);
150
    basic_regex(basic_regex&&) noexcept;
151
    template <class ST, class SA>
152
        explicit basic_regex(const basic_string<charT, ST, SA>& p,
153
                             flag_type f = regex_constants::ECMAScript);
154
    template <class ForwardIterator>
155
        basic_regex(ForwardIterator first, ForwardIterator last,
156
                    flag_type f = regex_constants::ECMAScript);
157
    basic_regex(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
158

    
159
    ~basic_regex();
160

    
161
    basic_regex& operator=(const basic_regex&);
162
    basic_regex& operator=(basic_regex&&) noexcept;
163
    basic_regex& operator=(const charT* ptr);
164
    basic_regex& operator=(initializer_list<charT> il);
165
    template <class ST, class SA>
166
        basic_regex& operator=(const basic_string<charT, ST, SA>& p);
167

    
168
    // assign:
169
    basic_regex& assign(const basic_regex& that);
170
    basic_regex& assign(basic_regex&& that) noexcept;
171
    basic_regex& assign(const charT* ptr, flag_type f = regex_constants::ECMAScript);
172
    basic_regex& assign(const charT* p, size_t len, flag_type f);
173
    template <class string_traits, class A>
174
        basic_regex& assign(const basic_string<charT, string_traits, A>& s,
175
                            flag_type f = regex_constants::ECMAScript);
176
    template <class InputIterator>
177
        basic_regex& assign(InputIterator first, InputIterator last,
178
                            flag_type f = regex_constants::ECMAScript);
179
    basic_regex& assign(initializer_list<charT>, flag_type = regex_constants::ECMAScript);
180

    
181
    // const operations:
182
    unsigned mark_count() const;
183
    flag_type flags() const;
184

    
185
    // locale:
186
    locale_type imbue(locale_type loc);
187
    locale_type getloc() const;
188

    
189
    // swap:
190
    void swap(basic_regex&);
191
};
192

    
193
typedef basic_regex<char>    regex;
194
typedef basic_regex<wchar_t> wregex;
195

    
196
template <class charT, class traits>
197
    void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2);
198

    
199
template <class BidirectionalIterator>
200
class sub_match
201
    : public pair<BidirectionalIterator, BidirectionalIterator>
202
{
203
public:
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

    
211
    constexpr sub_match();
212

    
213
    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

    
222
typedef sub_match<const char*>             csub_match;
223
typedef sub_match<const wchar_t*>          wcsub_match;
224
typedef sub_match<string::const_iterator>  ssub_match;
225
typedef sub_match<wstring::const_iterator> wssub_match;
226

    
227
template <class BiIter>
228
    bool
229
    operator==(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
230

    
231
template <class BiIter>
232
    bool
233
    operator!=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
234

    
235
template <class BiIter>
236
    bool
237
    operator<(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
238

    
239
template <class BiIter>
240
    bool
241
    operator<=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
242

    
243
template <class BiIter>
244
    bool
245
    operator>=(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
246

    
247
template <class BiIter>
248
    bool
249
    operator>(const sub_match<BiIter>& lhs, const sub_match<BiIter>& rhs);
250

    
251
template <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

    
256
template <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

    
261
template <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

    
266
template <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

    
271
template <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

    
275
template <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

    
280
template <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

    
285
template <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

    
290
template <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

    
295
template <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

    
299
template <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

    
304
template <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

    
309
template <class BiIter>
310
    bool
311
    operator==(typename iterator_traits<BiIter>::value_type const* lhs,
312
               const sub_match<BiIter>& rhs);
313

    
314
template <class BiIter>
315
    bool
316
    operator!=(typename iterator_traits<BiIter>::value_type const* lhs,
317
               const sub_match<BiIter>& rhs);
318

    
319
template <class BiIter>
320
    bool
321
    operator<(typename iterator_traits<BiIter>::value_type const* lhs,
322
              const sub_match<BiIter>& rhs);
323

    
324
template <class BiIter>
325
    bool
326
    operator>(typename iterator_traits<BiIter>::value_type const* lhs,
327
              const sub_match<BiIter>& rhs);
328

    
329
template <class BiIter>
330
    bool
331
    operator>=(typename iterator_traits<BiIter>::value_type const* lhs,
332
               const sub_match<BiIter>& rhs);
333

    
334
template <class BiIter>
335
    bool
336
    operator<=(typename iterator_traits<BiIter>::value_type const* lhs,
337
               const sub_match<BiIter>& rhs);
338

    
339
template <class BiIter>
340
    bool
341
    operator==(const sub_match<BiIter>& lhs,
342
               typename iterator_traits<BiIter>::value_type const* rhs);
343

    
344
template <class BiIter>
345
    bool
346
    operator!=(const sub_match<BiIter>& lhs,
347
               typename iterator_traits<BiIter>::value_type const* rhs);
348

    
349
template <class BiIter>
350
    bool
351
    operator<(const sub_match<BiIter>& lhs,
352
              typename iterator_traits<BiIter>::value_type const* rhs);
353

    
354
template <class BiIter>
355
    bool
356
    operator>(const sub_match<BiIter>& lhs,
357
              typename iterator_traits<BiIter>::value_type const* rhs);
358

    
359
template <class BiIter>
360
    bool
361
    operator>=(const sub_match<BiIter>& lhs,
362
               typename iterator_traits<BiIter>::value_type const* rhs);
363

    
364
template <class BiIter>
365
    bool
366
    operator<=(const sub_match<BiIter>& lhs,
367
               typename iterator_traits<BiIter>::value_type const* rhs);
368

    
369
template <class BiIter>
370
    bool
371
    operator==(typename iterator_traits<BiIter>::value_type const& lhs,
372
               const sub_match<BiIter>& rhs);
373

    
374
template <class BiIter>
375
    bool
376
    operator!=(typename iterator_traits<BiIter>::value_type const& lhs,
377
               const sub_match<BiIter>& rhs);
378

    
379
template <class BiIter>
380
    bool
381
    operator<(typename iterator_traits<BiIter>::value_type const& lhs,
382
              const sub_match<BiIter>& rhs);
383

    
384
template <class BiIter>
385
    bool
386
    operator>(typename iterator_traits<BiIter>::value_type const& lhs,
387
              const sub_match<BiIter>& rhs);
388

    
389
template <class BiIter>
390
    bool
391
    operator>=(typename iterator_traits<BiIter>::value_type const& lhs,
392
               const sub_match<BiIter>& rhs);
393

    
394
template <class BiIter>
395
    bool
396
    operator<=(typename iterator_traits<BiIter>::value_type const& lhs,
397
               const sub_match<BiIter>& rhs);
398

    
399
template <class BiIter>
400
    bool
401
    operator==(const sub_match<BiIter>& lhs,
402
               typename iterator_traits<BiIter>::value_type const& rhs);
403

    
404
template <class BiIter>
405
    bool
406
    operator!=(const sub_match<BiIter>& lhs,
407
               typename iterator_traits<BiIter>::value_type const& rhs);
408

    
409
template <class BiIter>
410
    bool
411
    operator<(const sub_match<BiIter>& lhs,
412
              typename iterator_traits<BiIter>::value_type const& rhs);
413

    
414
template <class BiIter>
415
    bool
416
    operator>(const sub_match<BiIter>& lhs,
417
              typename iterator_traits<BiIter>::value_type const& rhs);
418

    
419
template <class BiIter>
420
    bool
421
    operator>=(const sub_match<BiIter>& lhs,
422
               typename iterator_traits<BiIter>::value_type const& rhs);
423

    
424
template <class BiIter>
425
    bool
426
    operator<=(const sub_match<BiIter>& lhs,
427
               typename iterator_traits<BiIter>::value_type const& rhs);
428

    
429
template <class charT, class ST, class BiIter>
430
    basic_ostream<charT, ST>&
431
    operator<<(basic_ostream<charT, ST>& os, const sub_match<BiIter>& m);
432

    
433
template <class BidirectionalIterator,
434
          class Allocator = allocator<sub_match<BidirectionalIterator>>>
435
class match_results
436
{
437
public:
438
    typedef sub_match<BidirectionalIterator>                  value_type;
439
    typedef const value_type&                                 const_reference;
440
    typedef value_type&                                       reference;
441
    typedef /implementation-defined/                          const_iterator;
442
    typedef const_iterator                                    iterator;
443
    typedef typename iterator_traits<BidirectionalIterator>::difference_type difference_type;
444
    typedef typename allocator_traits<Allocator>::size_type   size_type;
445
    typedef Allocator                                         allocator_type;
446
    typedef typename iterator_traits<BidirectionalIterator>::value_type char_type;
447
    typedef basic_string<char_type>                           string_type;
448

    
449
    // construct/copy/destroy:
450
    explicit match_results(const Allocator& a = Allocator());
451
    match_results(const match_results& m);
452
    match_results(match_results&& m) noexcept;
453
    match_results& operator=(const match_results& m);
454
    match_results& operator=(match_results&& m);
455
    ~match_results();
456

    
457
    bool ready() const;
458

    
459
    // 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

    
503
typedef match_results<const char*>             cmatch;
504
typedef match_results<const wchar_t*>          wcmatch;
505
typedef match_results<string::const_iterator>  smatch;
506
typedef match_results<wstring::const_iterator> wsmatch;
507

    
508
template <class BidirectionalIterator, class Allocator>
509
    bool
510
    operator==(const match_results<BidirectionalIterator, Allocator>& m1,
511
               const match_results<BidirectionalIterator, Allocator>& m2);
512

    
513
template <class BidirectionalIterator, class Allocator>
514
    bool
515
    operator!=(const match_results<BidirectionalIterator, Allocator>& m1,
516
               const match_results<BidirectionalIterator, Allocator>& m2);
517

    
518
template <class BidirectionalIterator, class Allocator>
519
    void
520
    swap(match_results<BidirectionalIterator, Allocator>& m1,
521
         match_results<BidirectionalIterator, Allocator>& m2);
522

    
523
template <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

    
530
template <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

    
536
template <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

    
542
template <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

    
549
template <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

    
556
template <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

    
561
template <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

    
567
template <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

    
574
template <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

    
580
template <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

    
586
template <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

    
591
template <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

    
597
template <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

    
604
template <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

    
611
template <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

    
620
template <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

    
628
template <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

    
635
template <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

    
641
template <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

    
648
template <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

    
655
template <class BidirectionalIterator,
656
          class charT = typename iterator_traits< BidirectionalIterator>::value_type,
657
          class traits = regex_traits<charT>>
658
class regex_iterator
659
{
660
public:
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);
672
    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
676
    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

    
689
typedef regex_iterator<const char*>             cregex_iterator;
690
typedef regex_iterator<const wchar_t*>          wcregex_iterator;
691
typedef regex_iterator<string::const_iterator>  sregex_iterator;
692
typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
693

    
694
template <class BidirectionalIterator,
695
          class charT = typename iterator_traits< BidirectionalIterator>::value_type,
696
          class traits = regex_traits<charT>>
697
class regex_token_iterator
698
{
699
public:
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,
712
                         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,
715
                         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,
718
                         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,
721
                         const regex_type& re, initializer_list<int> submatches,
722
                         regex_constants::match_flag_type m = regex_constants::match_default);
723
    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
726
    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);
730
    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;
734
    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

    
747
typedef regex_token_iterator<const char*>             cregex_token_iterator;
748
typedef regex_token_iterator<const wchar_t*>          wcregex_token_iterator;
749
typedef regex_token_iterator<string::const_iterator>  sregex_token_iterator;
750
typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
751

    
752
} // std
753
*/
754

    
755
#include <__config>
756
#include <stdexcept>
757
#include <__locale>
758
#include <initializer_list>
759
#include <utility>
760
#include <iterator>
761
#include <string>
762
#include <memory>
763
#include <vector>
764
#include <deque>
765
#include <cassert>
766

    
767
#include <__undef_min_max>
768

    
769
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
770
#pragma GCC system_header
771
#endif
772

    
773
_LIBCPP_BEGIN_NAMESPACE_STD
774

    
775
namespace regex_constants
776
{
777

    
778
// syntax_option_type
779

    
780
enum syntax_option_type
781
{
782
    icase      = 1 << 0,
783
    nosubs     = 1 << 1,
784
    optimize   = 1 << 2,
785
    collate    = 1 << 3,
786
    ECMAScript = 0,
787
    basic      = 1 << 4,
788
    extended   = 1 << 5,
789
    awk        = 1 << 6,
790
    grep       = 1 << 7,
791
    egrep      = 1 << 8
792
};
793

    
794
inline _LIBCPP_INLINE_VISIBILITY
795
_LIBCPP_CONSTEXPR
796
syntax_option_type
797
operator~(syntax_option_type __x)
798
{
799
    return syntax_option_type(~int(__x) & 0x1FF);
800
}
801

    
802
inline _LIBCPP_INLINE_VISIBILITY
803
_LIBCPP_CONSTEXPR
804
syntax_option_type
805
operator&(syntax_option_type __x, syntax_option_type __y)
806
{
807
    return syntax_option_type(int(__x) & int(__y));
808
}
809

    
810
inline _LIBCPP_INLINE_VISIBILITY
811
_LIBCPP_CONSTEXPR
812
syntax_option_type
813
operator|(syntax_option_type __x, syntax_option_type __y)
814
{
815
    return syntax_option_type(int(__x) | int(__y));
816
}
817

    
818
inline _LIBCPP_INLINE_VISIBILITY
819
_LIBCPP_CONSTEXPR
820
syntax_option_type
821
operator^(syntax_option_type __x, syntax_option_type __y)
822
{
823
    return syntax_option_type(int(__x) ^ int(__y));
824
}
825

    
826
inline _LIBCPP_INLINE_VISIBILITY
827
syntax_option_type&
828
operator&=(syntax_option_type& __x, syntax_option_type __y)
829
{
830
    __x = __x & __y;
831
    return __x;
832
}
833

    
834
inline _LIBCPP_INLINE_VISIBILITY
835
syntax_option_type&
836
operator|=(syntax_option_type& __x, syntax_option_type __y)
837
{
838
    __x = __x | __y;
839
    return __x;
840
}
841

    
842
inline _LIBCPP_INLINE_VISIBILITY
843
syntax_option_type&
844
operator^=(syntax_option_type& __x, syntax_option_type __y)
845
{
846
    __x = __x ^ __y;
847
    return __x;
848
}
849

    
850
// match_flag_type
851

    
852
enum match_flag_type
853
{
854
    match_default     = 0,
855
    match_not_bol     = 1 << 0,
856
    match_not_eol     = 1 << 1,
857
    match_not_bow     = 1 << 2,
858
    match_not_eow     = 1 << 3,
859
    match_any         = 1 << 4,
860
    match_not_null    = 1 << 5,
861
    match_continuous  = 1 << 6,
862
    match_prev_avail  = 1 << 7,
863
    format_default    = 0,
864
    format_sed        = 1 << 8,
865
    format_no_copy    = 1 << 9,
866
    format_first_only = 1 << 10,
867
    __no_update_pos   = 1 << 11
868
};
869

    
870
inline _LIBCPP_INLINE_VISIBILITY
871
_LIBCPP_CONSTEXPR
872
match_flag_type
873
operator~(match_flag_type __x)
874
{
875
    return match_flag_type(~int(__x) & 0x0FFF);
876
}
877

    
878
inline _LIBCPP_INLINE_VISIBILITY
879
_LIBCPP_CONSTEXPR
880
match_flag_type
881
operator&(match_flag_type __x, match_flag_type __y)
882
{
883
    return match_flag_type(int(__x) & int(__y));
884
}
885

    
886
inline _LIBCPP_INLINE_VISIBILITY
887
_LIBCPP_CONSTEXPR
888
match_flag_type
889
operator|(match_flag_type __x, match_flag_type __y)
890
{
891
    return match_flag_type(int(__x) | int(__y));
892
}
893

    
894
inline _LIBCPP_INLINE_VISIBILITY
895
_LIBCPP_CONSTEXPR
896
match_flag_type
897
operator^(match_flag_type __x, match_flag_type __y)
898
{
899
    return match_flag_type(int(__x) ^ int(__y));
900
}
901

    
902
inline _LIBCPP_INLINE_VISIBILITY
903
match_flag_type&
904
operator&=(match_flag_type& __x, match_flag_type __y)
905
{
906
    __x = __x & __y;
907
    return __x;
908
}
909

    
910
inline _LIBCPP_INLINE_VISIBILITY
911
match_flag_type&
912
operator|=(match_flag_type& __x, match_flag_type __y)
913
{
914
    __x = __x | __y;
915
    return __x;
916
}
917

    
918
inline _LIBCPP_INLINE_VISIBILITY
919
match_flag_type&
920
operator^=(match_flag_type& __x, match_flag_type __y)
921
{
922
    __x = __x ^ __y;
923
    return __x;
924
}
925

    
926
enum error_type
927
{
928
    error_collate = 1,
929
    error_ctype,
930
    error_escape,
931
    error_backref,
932
    error_brack,
933
    error_paren,
934
    error_brace,
935
    error_badbrace,
936
    error_range,
937
    error_space,
938
    error_badrepeat,
939
    error_complexity,
940
    error_stack,
941
    __re_err_grammar,
942
    __re_err_empty,
943
    __re_err_unknown
944
};
945

    
946
}  // regex_constants
947

    
948
class _LIBCPP_EXCEPTION_ABI regex_error
949
    : public runtime_error
950
{
951
    regex_constants::error_type __code_;
952
public:
953
    explicit regex_error(regex_constants::error_type __ecode);
954
    virtual ~regex_error() throw();
955
     _LIBCPP_INLINE_VISIBILITY
956
    regex_constants::error_type code() const {return __code_;}
957
};
958

    
959
template <regex_constants::error_type _Ev>
960
_LIBCPP_ALWAYS_INLINE
961
void __throw_regex_error()
962
{
963
#ifndef _LIBCPP_NO_EXCEPTIONS
964
    throw regex_error(_Ev);
965
#else
966
    assert(!"regex_error");
967
#endif
968
}
969

    
970
template <class _CharT>
971
struct _LIBCPP_TYPE_VIS_ONLY regex_traits
972
{
973
public:
974
    typedef _CharT                  char_type;
975
    typedef basic_string<char_type> string_type;
976
    typedef locale                  locale_type;
977
    typedef ctype_base::mask        char_class_type;
978

    
979
    static const char_class_type __regex_word = 0x80;
980
private:
981
    locale __loc_;
982
    const ctype<char_type>* __ct_;
983
    const collate<char_type>* __col_;
984

    
985
public:
986
    regex_traits();
987

    
988
    _LIBCPP_INLINE_VISIBILITY
989
    static size_t length(const char_type* __p)
990
        {return char_traits<char_type>::length(__p);}
991
    _LIBCPP_INLINE_VISIBILITY
992
    char_type translate(char_type __c) const {return __c;}
993
    char_type translate_nocase(char_type __c) const;
994
    template <class _ForwardIterator>
995
        string_type
996
        transform(_ForwardIterator __f, _ForwardIterator __l) const;
997
    template <class _ForwardIterator>
998
        _LIBCPP_INLINE_VISIBILITY
999
        string_type
1000
        transform_primary( _ForwardIterator __f, _ForwardIterator __l) const
1001
            {return __transform_primary(__f, __l, char_type());}
1002
    template <class _ForwardIterator>
1003
        _LIBCPP_INLINE_VISIBILITY
1004
        string_type
1005
        lookup_collatename(_ForwardIterator __f, _ForwardIterator __l) const
1006
            {return __lookup_collatename(__f, __l, char_type());}
1007
    template <class _ForwardIterator>
1008
        _LIBCPP_INLINE_VISIBILITY
1009
        char_class_type
1010
        lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1011
                         bool __icase = false) const
1012
            {return __lookup_classname(__f, __l, __icase, char_type());}
1013
    bool isctype(char_type __c, char_class_type __m) const;
1014
    _LIBCPP_INLINE_VISIBILITY
1015
    int value(char_type __ch, int __radix) const
1016
        {return __regex_traits_value(__ch, __radix);}
1017
    locale_type imbue(locale_type __l);
1018
    _LIBCPP_INLINE_VISIBILITY
1019
    locale_type getloc()const {return __loc_;}
1020

    
1021
private:
1022
    void __init();
1023

    
1024
    template <class _ForwardIterator>
1025
        string_type
1026
        __transform_primary(_ForwardIterator __f, _ForwardIterator __l, char) const;
1027
    template <class _ForwardIterator>
1028
        string_type
1029
        __transform_primary(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
1030

    
1031
    template <class _ForwardIterator>
1032
        string_type
1033
        __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, char) const;
1034
    template <class _ForwardIterator>
1035
        string_type
1036
        __lookup_collatename(_ForwardIterator __f, _ForwardIterator __l, wchar_t) const;
1037

    
1038
    template <class _ForwardIterator>
1039
        char_class_type
1040
        __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1041
                           bool __icase, char) const;
1042
    template <class _ForwardIterator>
1043
        char_class_type
1044
        __lookup_classname(_ForwardIterator __f, _ForwardIterator __l,
1045
                           bool __icase, wchar_t) const;
1046

    
1047
    static int __regex_traits_value(unsigned char __ch, int __radix);
1048
    _LIBCPP_INLINE_VISIBILITY
1049
    int __regex_traits_value(char __ch, int __radix) const
1050
        {return __regex_traits_value(static_cast<unsigned char>(__ch), __radix);}
1051
    int __regex_traits_value(wchar_t __ch, int __radix) const;
1052
};
1053

    
1054
template <class _CharT>
1055
const typename regex_traits<_CharT>::char_class_type
1056
regex_traits<_CharT>::__regex_word;
1057

    
1058
template <class _CharT>
1059
regex_traits<_CharT>::regex_traits()
1060
{
1061
    __init();
1062
}
1063

    
1064
template <class _CharT>
1065
typename regex_traits<_CharT>::char_type
1066
regex_traits<_CharT>::translate_nocase(char_type __c) const
1067
{
1068
    return __ct_->tolower(__c);
1069
}
1070

    
1071
template <class _CharT>
1072
template <class _ForwardIterator>
1073
typename regex_traits<_CharT>::string_type
1074
regex_traits<_CharT>::transform(_ForwardIterator __f, _ForwardIterator __l) const
1075
{
1076
    string_type __s(__f, __l);
1077
    return __col_->transform(__s.data(), __s.data() + __s.size());
1078
}
1079

    
1080
template <class _CharT>
1081
void
1082
regex_traits<_CharT>::__init()
1083
{
1084
    __ct_ = &use_facet<ctype<char_type> >(__loc_);
1085
    __col_ = &use_facet<collate<char_type> >(__loc_);
1086
}
1087

    
1088
template <class _CharT>
1089
typename regex_traits<_CharT>::locale_type
1090
regex_traits<_CharT>::imbue(locale_type __l)
1091
{
1092
    locale __r = __loc_;
1093
    __loc_ = __l;
1094
    __init();
1095
    return __r;
1096
}
1097

    
1098
// transform_primary is very FreeBSD-specific
1099

    
1100
template <class _CharT>
1101
template <class _ForwardIterator>
1102
typename regex_traits<_CharT>::string_type
1103
regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1104
                                          _ForwardIterator __l, char) const
1105
{
1106
    const string_type __s(__f, __l);
1107
    string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1108
    switch (__d.size())
1109
    {
1110
    case 1:
1111
        break;
1112
    case 12:
1113
        __d[11] = __d[3];
1114
        break;
1115
    default:
1116
        __d.clear();
1117
        break;
1118
    }
1119
    return __d;
1120
}
1121

    
1122
template <class _CharT>
1123
template <class _ForwardIterator>
1124
typename regex_traits<_CharT>::string_type
1125
regex_traits<_CharT>::__transform_primary(_ForwardIterator __f,
1126
                                          _ForwardIterator __l, wchar_t) const
1127
{
1128
    const string_type __s(__f, __l);
1129
    string_type __d = __col_->transform(__s.data(), __s.data() + __s.size());
1130
    switch (__d.size())
1131
    {
1132
    case 1:
1133
        break;
1134
    case 3:
1135
        __d[2] = __d[0];
1136
        break;
1137
    default:
1138
        __d.clear();
1139
        break;
1140
    }
1141
    return __d;
1142
}
1143

    
1144
// lookup_collatename is very FreeBSD-specific
1145

    
1146
_LIBCPP_FUNC_VIS string __get_collation_name(const char* __s);
1147

    
1148
template <class _CharT>
1149
template <class _ForwardIterator>
1150
typename regex_traits<_CharT>::string_type
1151
regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1152
                                           _ForwardIterator __l, char) const
1153
{
1154
    string_type __s(__f, __l);
1155
    string_type __r;
1156
    if (!__s.empty())
1157
    {
1158
        __r = __get_collation_name(__s.c_str());
1159
        if (__r.empty() && __s.size() <= 2)
1160
        {
1161
            __r = __col_->transform(__s.data(), __s.data() + __s.size());
1162
            if (__r.size() == 1 || __r.size() == 12)
1163
                __r = __s;
1164
            else
1165
                __r.clear();
1166
        }
1167
    }
1168
    return __r;
1169
}
1170

    
1171
template <class _CharT>
1172
template <class _ForwardIterator>
1173
typename regex_traits<_CharT>::string_type
1174
regex_traits<_CharT>::__lookup_collatename(_ForwardIterator __f,
1175
                                           _ForwardIterator __l, wchar_t) const
1176
{
1177
    string_type __s(__f, __l);
1178
    string __n;
1179
    __n.reserve(__s.size());
1180
    for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1181
                                                              __i != __e; ++__i)
1182
    {
1183
        if (static_cast<unsigned>(*__i) >= 127)
1184
            return string_type();
1185
        __n.push_back(char(*__i));
1186
    }
1187
    string_type __r;
1188
    if (!__s.empty())
1189
    {
1190
        __n = __get_collation_name(__n.c_str());
1191
        if (!__n.empty())
1192
            __r.assign(__n.begin(), __n.end());
1193
        else if (__s.size() <= 2)
1194
        {
1195
            __r = __col_->transform(__s.data(), __s.data() + __s.size());
1196
            if (__r.size() == 1 || __r.size() == 3)
1197
                __r = __s;
1198
            else
1199
                __r.clear();
1200
        }
1201
    }
1202
    return __r;
1203
}
1204

    
1205
// lookup_classname
1206

    
1207
regex_traits<char>::char_class_type _LIBCPP_FUNC_VIS
1208
__get_classname(const char* __s, bool __icase);
1209

    
1210
template <class _CharT>
1211
template <class _ForwardIterator>
1212
typename regex_traits<_CharT>::char_class_type
1213
regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1214
                                         _ForwardIterator __l,
1215
                                         bool __icase, char) const
1216
{
1217
    string_type __s(__f, __l);
1218
    __ct_->tolower(&__s[0], &__s[0] + __s.size());
1219
    return __get_classname(__s.c_str(), __icase);
1220
}
1221

    
1222
template <class _CharT>
1223
template <class _ForwardIterator>
1224
typename regex_traits<_CharT>::char_class_type
1225
regex_traits<_CharT>::__lookup_classname(_ForwardIterator __f,
1226
                                         _ForwardIterator __l,
1227
                                         bool __icase, wchar_t) const
1228
{
1229
    string_type __s(__f, __l);
1230
    __ct_->tolower(&__s[0], &__s[0] + __s.size());
1231
    string __n;
1232
    __n.reserve(__s.size());
1233
    for (typename string_type::const_iterator __i = __s.begin(), __e = __s.end();
1234
                                                              __i != __e; ++__i)
1235
    {
1236
        if (static_cast<unsigned>(*__i) >= 127)
1237
            return char_class_type();
1238
        __n.push_back(char(*__i));
1239
    }
1240
    return __get_classname(__n.c_str(), __icase);
1241
}
1242

    
1243
template <class _CharT>
1244
bool
1245
regex_traits<_CharT>::isctype(char_type __c, char_class_type __m) const
1246
{
1247
    if (__ct_->is(__m, __c))
1248
        return true;
1249
    return (__c == '_' && (__m & __regex_word));
1250
}
1251

    
1252
template <class _CharT>
1253
int
1254
regex_traits<_CharT>::__regex_traits_value(unsigned char __ch, int __radix)
1255
{
1256
    if ((__ch & 0xF8u) == 0x30)  // '0' <= __ch && __ch <= '7'
1257
        return __ch - '0';
1258
    if (__radix != 8)
1259
    {
1260
        if ((__ch & 0xFEu) == 0x38)  // '8' <= __ch && __ch <= '9'
1261
            return __ch - '0';
1262
        if (__radix == 16)
1263
        {
1264
            __ch |= 0x20;  // tolower
1265
            if ('a' <= __ch && __ch <= 'f')
1266
                return __ch - ('a' - 10);
1267
        }
1268
    }
1269
    return -1;
1270
}
1271

    
1272
template <class _CharT>
1273
inline _LIBCPP_INLINE_VISIBILITY
1274
int
1275
regex_traits<_CharT>::__regex_traits_value(wchar_t __ch, int __radix) const
1276
{
1277
    return __regex_traits_value(static_cast<unsigned char>(__ct_->narrow(__ch, char_type())), __radix);
1278
}
1279

    
1280
template <class _CharT> class __node;
1281

    
1282
template <class _BidirectionalIterator> class _LIBCPP_TYPE_VIS_ONLY sub_match;
1283

    
1284
template <class _BidirectionalIterator,
1285
          class _Allocator = allocator<sub_match<_BidirectionalIterator> > >
1286
class _LIBCPP_TYPE_VIS_ONLY match_results;
1287

    
1288
template <class _CharT>
1289
struct __state
1290
{
1291
    enum
1292
    {
1293
        __end_state = -1000,
1294
        __consume_input,  // -999
1295
        __begin_marked_expr, // -998
1296
        __end_marked_expr,   // -997
1297
        __pop_state,           // -996
1298
        __accept_and_consume,  // -995
1299
        __accept_but_not_consume,  // -994
1300
        __reject,                  // -993
1301
        __split,
1302
        __repeat
1303
    };
1304

    
1305
    int __do_;
1306
    const _CharT* __first_;
1307
    const _CharT* __current_;
1308
    const _CharT* __last_;
1309
    vector<sub_match<const _CharT*> > __sub_matches_;
1310
    vector<pair<size_t, const _CharT*> > __loop_data_;
1311
    const __node<_CharT>* __node_;
1312
    regex_constants::match_flag_type __flags_;
1313
    bool __at_first_;
1314

    
1315
    _LIBCPP_INLINE_VISIBILITY
1316
    __state()
1317
        : __do_(0), __first_(nullptr), __current_(nullptr), __last_(nullptr),
1318
          __node_(nullptr), __flags_() {}
1319
};
1320

    
1321
// __node
1322

    
1323
template <class _CharT>
1324
class __node
1325
{
1326
    __node(const __node&);
1327
    __node& operator=(const __node&);
1328
public:
1329
    typedef _VSTD::__state<_CharT> __state;
1330

    
1331
    _LIBCPP_INLINE_VISIBILITY
1332
    __node() {}
1333
    _LIBCPP_INLINE_VISIBILITY
1334
    virtual ~__node() {}
1335

    
1336
    _LIBCPP_INLINE_VISIBILITY
1337
    virtual void __exec(__state&) const {};
1338
    _LIBCPP_INLINE_VISIBILITY
1339
    virtual void __exec_split(bool, __state&) const {};
1340
};
1341

    
1342
// __end_state
1343

    
1344
template <class _CharT>
1345
class __end_state
1346
    : public __node<_CharT>
1347
{
1348
public:
1349
    typedef _VSTD::__state<_CharT> __state;
1350

    
1351
    _LIBCPP_INLINE_VISIBILITY
1352
    __end_state() {}
1353

    
1354
    virtual void __exec(__state&) const;
1355
};
1356

    
1357
template <class _CharT>
1358
void
1359
__end_state<_CharT>::__exec(__state& __s) const
1360
{
1361
    __s.__do_ = __state::__end_state;
1362
}
1363

    
1364
// __has_one_state
1365

    
1366
template <class _CharT>
1367
class __has_one_state
1368
    : public __node<_CharT>
1369
{
1370
    __node<_CharT>* __first_;
1371

    
1372
public:
1373
    _LIBCPP_INLINE_VISIBILITY
1374
    explicit __has_one_state(__node<_CharT>* __s)
1375
        : __first_(__s) {}
1376

    
1377
    _LIBCPP_INLINE_VISIBILITY
1378
    __node<_CharT>*  first() const {return __first_;}
1379
    _LIBCPP_INLINE_VISIBILITY
1380
    __node<_CharT>*& first()       {return __first_;}
1381
};
1382

    
1383
// __owns_one_state
1384

    
1385
template <class _CharT>
1386
class __owns_one_state
1387
    : public __has_one_state<_CharT>
1388
{
1389
    typedef __has_one_state<_CharT> base;
1390

    
1391
public:
1392
    _LIBCPP_INLINE_VISIBILITY
1393
    explicit __owns_one_state(__node<_CharT>* __s)
1394
        : base(__s) {}
1395

    
1396
    virtual ~__owns_one_state();
1397
};
1398

    
1399
template <class _CharT>
1400
__owns_one_state<_CharT>::~__owns_one_state()
1401
{
1402
    delete this->first();
1403
}
1404

    
1405
// __empty_state
1406

    
1407
template <class _CharT>
1408
class __empty_state
1409
    : public __owns_one_state<_CharT>
1410
{
1411
    typedef __owns_one_state<_CharT> base;
1412

    
1413
public:
1414
    typedef _VSTD::__state<_CharT> __state;
1415

    
1416
    _LIBCPP_INLINE_VISIBILITY
1417
    explicit __empty_state(__node<_CharT>* __s)
1418
        : base(__s) {}
1419

    
1420
    virtual void __exec(__state&) const;
1421
};
1422

    
1423
template <class _CharT>
1424
void
1425
__empty_state<_CharT>::__exec(__state& __s) const
1426
{
1427
    __s.__do_ = __state::__accept_but_not_consume;
1428
    __s.__node_ = this->first();
1429
}
1430

    
1431
// __empty_non_own_state
1432

    
1433
template <class _CharT>
1434
class __empty_non_own_state
1435
    : public __has_one_state<_CharT>
1436
{
1437
    typedef __has_one_state<_CharT> base;
1438

    
1439
public:
1440
    typedef _VSTD::__state<_CharT> __state;
1441

    
1442
    _LIBCPP_INLINE_VISIBILITY
1443
    explicit __empty_non_own_state(__node<_CharT>* __s)
1444
        : base(__s) {}
1445

    
1446
    virtual void __exec(__state&) const;
1447
};
1448

    
1449
template <class _CharT>
1450
void
1451
__empty_non_own_state<_CharT>::__exec(__state& __s) const
1452
{
1453
    __s.__do_ = __state::__accept_but_not_consume;
1454
    __s.__node_ = this->first();
1455
}
1456

    
1457
// __repeat_one_loop
1458

    
1459
template <class _CharT>
1460
class __repeat_one_loop
1461
    : public __has_one_state<_CharT>
1462
{
1463
    typedef __has_one_state<_CharT> base;
1464

    
1465
public:
1466
    typedef _VSTD::__state<_CharT> __state;
1467

    
1468
    _LIBCPP_INLINE_VISIBILITY
1469
    explicit __repeat_one_loop(__node<_CharT>* __s)
1470
        : base(__s) {}
1471

    
1472
    virtual void __exec(__state&) const;
1473
};
1474

    
1475
template <class _CharT>
1476
void
1477
__repeat_one_loop<_CharT>::__exec(__state& __s) const
1478
{
1479
    __s.__do_ = __state::__repeat;
1480
    __s.__node_ = this->first();
1481
}
1482

    
1483
// __owns_two_states
1484

    
1485
template <class _CharT>
1486
class __owns_two_states
1487
    : public __owns_one_state<_CharT>
1488
{
1489
    typedef __owns_one_state<_CharT> base;
1490

    
1491
    base* __second_;
1492

    
1493
public:
1494
    _LIBCPP_INLINE_VISIBILITY
1495
    explicit __owns_two_states(__node<_CharT>* __s1, base* __s2)
1496
        : base(__s1), __second_(__s2) {}
1497

    
1498
    virtual ~__owns_two_states();
1499

    
1500
    _LIBCPP_INLINE_VISIBILITY
1501
    base*  second() const {return __second_;}
1502
    _LIBCPP_INLINE_VISIBILITY
1503
    base*& second()       {return __second_;}
1504
};
1505

    
1506
template <class _CharT>
1507
__owns_two_states<_CharT>::~__owns_two_states()
1508
{
1509
    delete __second_;
1510
}
1511

    
1512
// __loop
1513

    
1514
template <class _CharT>
1515
class __loop
1516
    : public __owns_two_states<_CharT>
1517
{
1518
    typedef __owns_two_states<_CharT> base;
1519

    
1520
    size_t __min_;
1521
    size_t __max_;
1522
    unsigned __loop_id_;
1523
    unsigned __mexp_begin_;
1524
    unsigned __mexp_end_;
1525
    bool __greedy_;
1526

    
1527
public:
1528
    typedef _VSTD::__state<_CharT> __state;
1529

    
1530
    _LIBCPP_INLINE_VISIBILITY
1531
    explicit __loop(unsigned __loop_id,
1532
                          __node<_CharT>* __s1, __owns_one_state<_CharT>* __s2,
1533
                          unsigned __mexp_begin, unsigned __mexp_end,
1534
                          bool __greedy = true,
1535
                          size_t __min = 0,
1536
                          size_t __max = numeric_limits<size_t>::max())
1537
        : base(__s1, __s2), __min_(__min), __max_(__max), __loop_id_(__loop_id),
1538
          __mexp_begin_(__mexp_begin), __mexp_end_(__mexp_end),
1539
          __greedy_(__greedy) {}
1540

    
1541
    virtual void __exec(__state& __s) const;
1542
    virtual void __exec_split(bool __second, __state& __s) const;
1543

    
1544
private:
1545
    _LIBCPP_INLINE_VISIBILITY
1546
    void __init_repeat(__state& __s) const
1547
    {
1548
        __s.__loop_data_[__loop_id_].second = __s.__current_;
1549
        for (size_t __i = __mexp_begin_-1; __i != __mexp_end_-1; ++__i)
1550
        {
1551
            __s.__sub_matches_[__i].first = __s.__last_;
1552
            __s.__sub_matches_[__i].second = __s.__last_;
1553
            __s.__sub_matches_[__i].matched = false;
1554
        }
1555
    }
1556
};
1557

    
1558
template <class _CharT>
1559
void
1560
__loop<_CharT>::__exec(__state& __s) const
1561
{
1562
    if (__s.__do_ == __state::__repeat)
1563
    {
1564
        bool __do_repeat = ++__s.__loop_data_[__loop_id_].first < __max_;
1565
        bool __do_alt = __s.__loop_data_[__loop_id_].first >= __min_;
1566
        if (__do_repeat && __do_alt &&
1567
                               __s.__loop_data_[__loop_id_].second == __s.__current_)
1568
            __do_repeat = false;
1569
        if (__do_repeat && __do_alt)
1570
            __s.__do_ = __state::__split;
1571
        else if (__do_repeat)
1572
        {
1573
            __s.__do_ = __state::__accept_but_not_consume;
1574
            __s.__node_ = this->first();
1575
            __init_repeat(__s);
1576
        }
1577
        else
1578
        {
1579
            __s.__do_ = __state::__accept_but_not_consume;
1580
            __s.__node_ = this->second();
1581
        }
1582
    }
1583
    else
1584
    {
1585
        __s.__loop_data_[__loop_id_].first = 0;
1586
        bool __do_repeat = 0 < __max_;
1587
        bool __do_alt = 0 >= __min_;
1588
        if (__do_repeat && __do_alt)
1589
            __s.__do_ = __state::__split;
1590
        else if (__do_repeat)
1591
        {
1592
            __s.__do_ = __state::__accept_but_not_consume;
1593
            __s.__node_ = this->first();
1594
            __init_repeat(__s);
1595
        }
1596
        else
1597
        {
1598
            __s.__do_ = __state::__accept_but_not_consume;
1599
            __s.__node_ = this->second();
1600
        }
1601
    }
1602
}
1603

    
1604
template <class _CharT>
1605
void
1606
__loop<_CharT>::__exec_split(bool __second, __state& __s) const
1607
{
1608
    __s.__do_ = __state::__accept_but_not_consume;
1609
    if (__greedy_ != __second)
1610
    {
1611
        __s.__node_ = this->first();
1612
        __init_repeat(__s);
1613
    }
1614
    else
1615
        __s.__node_ = this->second();
1616
}
1617

    
1618
// __alternate
1619

    
1620
template <class _CharT>
1621
class __alternate
1622
    : public __owns_two_states<_CharT>
1623
{
1624
    typedef __owns_two_states<_CharT> base;
1625

    
1626
public:
1627
    typedef _VSTD::__state<_CharT> __state;
1628

    
1629
    _LIBCPP_INLINE_VISIBILITY
1630
    explicit __alternate(__owns_one_state<_CharT>* __s1,
1631
                         __owns_one_state<_CharT>* __s2)
1632
        : base(__s1, __s2) {}
1633

    
1634
    virtual void __exec(__state& __s) const;
1635
    virtual void __exec_split(bool __second, __state& __s) const;
1636
};
1637

    
1638
template <class _CharT>
1639
void
1640
__alternate<_CharT>::__exec(__state& __s) const
1641
{
1642
    __s.__do_ = __state::__split;
1643
}
1644

    
1645
template <class _CharT>
1646
void
1647
__alternate<_CharT>::__exec_split(bool __second, __state& __s) const
1648
{
1649
    __s.__do_ = __state::__accept_but_not_consume;
1650
    if (__second)
1651
        __s.__node_ = this->second();
1652
    else
1653
        __s.__node_ = this->first();
1654
}
1655

    
1656
// __begin_marked_subexpression
1657

    
1658
template <class _CharT>
1659
class __begin_marked_subexpression
1660
    : public __owns_one_state<_CharT>
1661
{
1662
    typedef __owns_one_state<_CharT> base;
1663

    
1664
    unsigned __mexp_;
1665
public:
1666
    typedef _VSTD::__state<_CharT> __state;
1667

    
1668
    _LIBCPP_INLINE_VISIBILITY
1669
    explicit __begin_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
1670
        : base(__s), __mexp_(__mexp) {}
1671

    
1672
    virtual void __exec(__state&) const;
1673
};
1674

    
1675
template <class _CharT>
1676
void
1677
__begin_marked_subexpression<_CharT>::__exec(__state& __s) const
1678
{
1679
    __s.__do_ = __state::__accept_but_not_consume;
1680
    __s.__sub_matches_[__mexp_-1].first = __s.__current_;
1681
    __s.__node_ = this->first();
1682
}
1683

    
1684
// __end_marked_subexpression
1685

    
1686
template <class _CharT>
1687
class __end_marked_subexpression
1688
    : public __owns_one_state<_CharT>
1689
{
1690
    typedef __owns_one_state<_CharT> base;
1691

    
1692
    unsigned __mexp_;
1693
public:
1694
    typedef _VSTD::__state<_CharT> __state;
1695

    
1696
    _LIBCPP_INLINE_VISIBILITY
1697
    explicit __end_marked_subexpression(unsigned __mexp, __node<_CharT>* __s)
1698
        : base(__s), __mexp_(__mexp) {}
1699

    
1700
    virtual void __exec(__state&) const;
1701
};
1702

    
1703
template <class _CharT>
1704
void
1705
__end_marked_subexpression<_CharT>::__exec(__state& __s) const
1706
{
1707
    __s.__do_ = __state::__accept_but_not_consume;
1708
    __s.__sub_matches_[__mexp_-1].second = __s.__current_;
1709
    __s.__sub_matches_[__mexp_-1].matched = true;
1710
    __s.__node_ = this->first();
1711
}
1712

    
1713
// __back_ref
1714

    
1715
template <class _CharT>
1716
class __back_ref
1717
    : public __owns_one_state<_CharT>
1718
{
1719
    typedef __owns_one_state<_CharT> base;
1720

    
1721
    unsigned __mexp_;
1722
public:
1723
    typedef _VSTD::__state<_CharT> __state;
1724

    
1725
    _LIBCPP_INLINE_VISIBILITY
1726
    explicit __back_ref(unsigned __mexp, __node<_CharT>* __s)
1727
        : base(__s), __mexp_(__mexp) {}
1728

    
1729
    virtual void __exec(__state&) const;
1730
};
1731

    
1732
template <class _CharT>
1733
void
1734
__back_ref<_CharT>::__exec(__state& __s) const
1735
{
1736
    sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1737
    if (__sm.matched)
1738
    {
1739
        ptrdiff_t __len = __sm.second - __sm.first;
1740
        if (__s.__last_ - __s.__current_ >= __len &&
1741
            _VSTD::equal(__sm.first, __sm.second, __s.__current_))
1742
        {
1743
            __s.__do_ = __state::__accept_but_not_consume;
1744
            __s.__current_ += __len;
1745
            __s.__node_ = this->first();
1746
        }
1747
        else
1748
        {
1749
            __s.__do_ = __state::__reject;
1750
            __s.__node_ = nullptr;
1751
        }
1752
    }
1753
    else
1754
    {
1755
        __s.__do_ = __state::__reject;
1756
        __s.__node_ = nullptr;
1757
    }
1758
}
1759

    
1760
// __back_ref_icase
1761

    
1762
template <class _CharT, class _Traits>
1763
class __back_ref_icase
1764
    : public __owns_one_state<_CharT>
1765
{
1766
    typedef __owns_one_state<_CharT> base;
1767

    
1768
    _Traits __traits_;
1769
    unsigned __mexp_;
1770
public:
1771
    typedef _VSTD::__state<_CharT> __state;
1772

    
1773
    _LIBCPP_INLINE_VISIBILITY
1774
    explicit __back_ref_icase(const _Traits& __traits, unsigned __mexp,
1775
                              __node<_CharT>* __s)
1776
        : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1777

    
1778
    virtual void __exec(__state&) const;
1779
};
1780

    
1781
template <class _CharT, class _Traits>
1782
void
1783
__back_ref_icase<_CharT, _Traits>::__exec(__state& __s) const
1784
{
1785
    sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1786
    if (__sm.matched)
1787
    {
1788
        ptrdiff_t __len = __sm.second - __sm.first;
1789
        if (__s.__last_ - __s.__current_ >= __len)
1790
        {
1791
            for (ptrdiff_t __i = 0; __i < __len; ++__i)
1792
            {
1793
                if (__traits_.translate_nocase(__sm.first[__i]) !=
1794
                                __traits_.translate_nocase(__s.__current_[__i]))
1795
                    goto __not_equal;
1796
            }
1797
            __s.__do_ = __state::__accept_but_not_consume;
1798
            __s.__current_ += __len;
1799
            __s.__node_ = this->first();
1800
        }
1801
        else
1802
        {
1803
            __s.__do_ = __state::__reject;
1804
            __s.__node_ = nullptr;
1805
        }
1806
    }
1807
    else
1808
    {
1809
__not_equal:
1810
        __s.__do_ = __state::__reject;
1811
        __s.__node_ = nullptr;
1812
    }
1813
}
1814

    
1815
// __back_ref_collate
1816

    
1817
template <class _CharT, class _Traits>
1818
class __back_ref_collate
1819
    : public __owns_one_state<_CharT>
1820
{
1821
    typedef __owns_one_state<_CharT> base;
1822

    
1823
    _Traits __traits_;
1824
    unsigned __mexp_;
1825
public:
1826
    typedef _VSTD::__state<_CharT> __state;
1827

    
1828
    _LIBCPP_INLINE_VISIBILITY
1829
    explicit __back_ref_collate(const _Traits& __traits, unsigned __mexp,
1830
                              __node<_CharT>* __s)
1831
        : base(__s), __traits_(__traits), __mexp_(__mexp) {}
1832

    
1833
    virtual void __exec(__state&) const;
1834
};
1835

    
1836
template <class _CharT, class _Traits>
1837
void
1838
__back_ref_collate<_CharT, _Traits>::__exec(__state& __s) const
1839
{
1840
    sub_match<const _CharT*>& __sm = __s.__sub_matches_[__mexp_-1];
1841
    if (__sm.matched)
1842
    {
1843
        ptrdiff_t __len = __sm.second - __sm.first;
1844
        if (__s.__last_ - __s.__current_ >= __len)
1845
        {
1846
            for (ptrdiff_t __i = 0; __i < __len; ++__i)
1847
            {
1848
                if (__traits_.translate(__sm.first[__i]) !=
1849
                                       __traits_.translate(__s.__current_[__i]))
1850
                    goto __not_equal;
1851
            }
1852
            __s.__do_ = __state::__accept_but_not_consume;
1853
            __s.__current_ += __len;
1854
            __s.__node_ = this->first();
1855
        }
1856
        else
1857
        {
1858
            __s.__do_ = __state::__reject;
1859
            __s.__node_ = nullptr;
1860
        }
1861
    }
1862
    else
1863
    {
1864
__not_equal:
1865
        __s.__do_ = __state::__reject;
1866
        __s.__node_ = nullptr;
1867
    }
1868
}
1869

    
1870
// __word_boundary
1871

    
1872
template <class _CharT, class _Traits>
1873
class __word_boundary
1874
    : public __owns_one_state<_CharT>
1875
{
1876
    typedef __owns_one_state<_CharT> base;
1877

    
1878
    _Traits __traits_;
1879
    bool __invert_;
1880
public:
1881
    typedef _VSTD::__state<_CharT> __state;
1882

    
1883
    _LIBCPP_INLINE_VISIBILITY
1884
    explicit __word_boundary(const _Traits& __traits, bool __invert,
1885
                             __node<_CharT>* __s)
1886
        : base(__s), __traits_(__traits), __invert_(__invert) {}
1887

    
1888
    virtual void __exec(__state&) const;
1889
};
1890

    
1891
template <class _CharT, class _Traits>
1892
void
1893
__word_boundary<_CharT, _Traits>::__exec(__state& __s) const
1894
{
1895
    bool __is_word_b = false;
1896
    if (__s.__first_ != __s.__last_)
1897
    {
1898
        if (__s.__current_ == __s.__last_)
1899
        {
1900
            if (!(__s.__flags_ & regex_constants::match_not_eow))
1901
            {
1902
                _CharT __c = __s.__current_[-1];
1903
                __is_word_b = __c == '_' ||
1904
                              __traits_.isctype(__c, ctype_base::alnum);
1905
            }
1906
        }
1907
        else if (__s.__current_ == __s.__first_ &&
1908
                !(__s.__flags_ & regex_constants::match_prev_avail))
1909
        {
1910
            if (!(__s.__flags_ & regex_constants::match_not_bow))
1911
            {
1912
                _CharT __c = *__s.__current_;
1913
                __is_word_b = __c == '_' ||
1914
                              __traits_.isctype(__c, ctype_base::alnum);
1915
            }
1916
        }
1917
        else
1918
        {
1919
            _CharT __c1 = __s.__current_[-1];
1920
            _CharT __c2 = *__s.__current_;
1921
            bool __is_c1_b = __c1 == '_' ||
1922
                             __traits_.isctype(__c1, ctype_base::alnum);
1923
            bool __is_c2_b = __c2 == '_' ||
1924
                             __traits_.isctype(__c2, ctype_base::alnum);
1925
            __is_word_b = __is_c1_b != __is_c2_b;
1926
        }
1927
    }
1928
    if (__is_word_b != __invert_)
1929
    {
1930
        __s.__do_ = __state::__accept_but_not_consume;
1931
        __s.__node_ = this->first();
1932
    }
1933
    else
1934
    {
1935
        __s.__do_ = __state::__reject;
1936
        __s.__node_ = nullptr;
1937
    }
1938
}
1939

    
1940
// __l_anchor
1941

    
1942
template <class _CharT>
1943
class __l_anchor
1944
    : public __owns_one_state<_CharT>
1945
{
1946
    typedef __owns_one_state<_CharT> base;
1947

    
1948
public:
1949
    typedef _VSTD::__state<_CharT> __state;
1950

    
1951
    _LIBCPP_INLINE_VISIBILITY
1952
    __l_anchor(__node<_CharT>* __s)
1953
        : base(__s) {}
1954

    
1955
    virtual void __exec(__state&) const;
1956
};
1957

    
1958
template <class _CharT>
1959
void
1960
__l_anchor<_CharT>::__exec(__state& __s) const
1961
{
1962
    if (__s.__at_first_ && __s.__current_ == __s.__first_ &&
1963
        !(__s.__flags_ & regex_constants::match_not_bol))
1964
    {
1965
        __s.__do_ = __state::__accept_but_not_consume;
1966
        __s.__node_ = this->first();
1967
    }
1968
    else
1969
    {
1970
        __s.__do_ = __state::__reject;
1971
        __s.__node_ = nullptr;
1972
    }
1973
}
1974

    
1975
// __r_anchor
1976

    
1977
template <class _CharT>
1978
class __r_anchor
1979
    : public __owns_one_state<_CharT>
1980
{
1981
    typedef __owns_one_state<_CharT> base;
1982

    
1983
public:
1984
    typedef _VSTD::__state<_CharT> __state;
1985

    
1986
    _LIBCPP_INLINE_VISIBILITY
1987
    __r_anchor(__node<_CharT>* __s)
1988
        : base(__s) {}
1989

    
1990
    virtual void __exec(__state&) const;
1991
};
1992

    
1993
template <class _CharT>
1994
void
1995
__r_anchor<_CharT>::__exec(__state& __s) const
1996
{
1997
    if (__s.__current_ == __s.__last_ &&
1998
        !(__s.__flags_ & regex_constants::match_not_eol))
1999
    {
2000
        __s.__do_ = __state::__accept_but_not_consume;
2001
        __s.__node_ = this->first();
2002
    }
2003
    else
2004
    {
2005
        __s.__do_ = __state::__reject;
2006
        __s.__node_ = nullptr;
2007
    }
2008
}
2009

    
2010
// __match_any
2011

    
2012
template <class _CharT>
2013
class __match_any
2014
    : public __owns_one_state<_CharT>
2015
{
2016
    typedef __owns_one_state<_CharT> base;
2017

    
2018
public:
2019
    typedef _VSTD::__state<_CharT> __state;
2020

    
2021
    _LIBCPP_INLINE_VISIBILITY
2022
    __match_any(__node<_CharT>* __s)
2023
        : base(__s) {}
2024

    
2025
    virtual void __exec(__state&) const;
2026
};
2027

    
2028
template <class _CharT>
2029
void
2030
__match_any<_CharT>::__exec(__state& __s) const
2031
{
2032
    if (__s.__current_ != __s.__last_ && *__s.__current_ != 0)
2033
    {
2034
        __s.__do_ = __state::__accept_and_consume;
2035
        ++__s.__current_;
2036
        __s.__node_ = this->first();
2037
    }
2038
    else
2039
    {
2040
        __s.__do_ = __state::__reject;
2041
        __s.__node_ = nullptr;
2042
    }
2043
}
2044

    
2045
// __match_any_but_newline
2046

    
2047
template <class _CharT>
2048
class __match_any_but_newline
2049
    : public __owns_one_state<_CharT>
2050
{
2051
    typedef __owns_one_state<_CharT> base;
2052

    
2053
public:
2054
    typedef _VSTD::__state<_CharT> __state;
2055

    
2056
    _LIBCPP_INLINE_VISIBILITY
2057
    __match_any_but_newline(__node<_CharT>* __s)
2058
        : base(__s) {}
2059

    
2060
    virtual void __exec(__state&) const;
2061
};
2062

    
2063
template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<char>::__exec(__state&) const;
2064
template <> _LIBCPP_FUNC_VIS void __match_any_but_newline<wchar_t>::__exec(__state&) const;
2065

    
2066
// __match_char
2067

    
2068
template <class _CharT>
2069
class __match_char
2070
    : public __owns_one_state<_CharT>
2071
{
2072
    typedef __owns_one_state<_CharT> base;
2073

    
2074
    _CharT __c_;
2075

    
2076
    __match_char(const __match_char&);
2077
    __match_char& operator=(const __match_char&);
2078
public:
2079
    typedef _VSTD::__state<_CharT> __state;
2080

    
2081
    _LIBCPP_INLINE_VISIBILITY
2082
    __match_char(_CharT __c, __node<_CharT>* __s)
2083
        : base(__s), __c_(__c) {}
2084

    
2085
    virtual void __exec(__state&) const;
2086
};
2087

    
2088
template <class _CharT>
2089
void
2090
__match_char<_CharT>::__exec(__state& __s) const
2091
{
2092
    if (__s.__current_ != __s.__last_ && *__s.__current_ == __c_)
2093
    {
2094
        __s.__do_ = __state::__accept_and_consume;
2095
        ++__s.__current_;
2096
        __s.__node_ = this->first();
2097
    }
2098
    else
2099
    {
2100
        __s.__do_ = __state::__reject;
2101
        __s.__node_ = nullptr;
2102
    }
2103
}
2104

    
2105
// __match_char_icase
2106

    
2107
template <class _CharT, class _Traits>
2108
class __match_char_icase
2109
    : public __owns_one_state<_CharT>
2110
{
2111
    typedef __owns_one_state<_CharT> base;
2112

    
2113
    _Traits __traits_;
2114
    _CharT __c_;
2115

    
2116
    __match_char_icase(const __match_char_icase&);
2117
    __match_char_icase& operator=(const __match_char_icase&);
2118
public:
2119
    typedef _VSTD::__state<_CharT> __state;
2120

    
2121
    _LIBCPP_INLINE_VISIBILITY
2122
    __match_char_icase(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2123
        : base(__s), __traits_(__traits), __c_(__traits.translate_nocase(__c)) {}
2124

    
2125
    virtual void __exec(__state&) const;
2126
};
2127

    
2128
template <class _CharT, class _Traits>
2129
void
2130
__match_char_icase<_CharT, _Traits>::__exec(__state& __s) const
2131
{
2132
    if (__s.__current_ != __s.__last_ &&
2133
        __traits_.translate_nocase(*__s.__current_) == __c_)
2134
    {
2135
        __s.__do_ = __state::__accept_and_consume;
2136
        ++__s.__current_;
2137
        __s.__node_ = this->first();
2138
    }
2139
    else
2140
    {
2141
        __s.__do_ = __state::__reject;
2142
        __s.__node_ = nullptr;
2143
    }
2144
}
2145

    
2146
// __match_char_collate
2147

    
2148
template <class _CharT, class _Traits>
2149
class __match_char_collate
2150
    : public __owns_one_state<_CharT>
2151
{
2152
    typedef __owns_one_state<_CharT> base;
2153

    
2154
    _Traits __traits_;
2155
    _CharT __c_;
2156

    
2157
    __match_char_collate(const __match_char_collate&);
2158
    __match_char_collate& operator=(const __match_char_collate&);
2159
public:
2160
    typedef _VSTD::__state<_CharT> __state;
2161

    
2162
    _LIBCPP_INLINE_VISIBILITY
2163
    __match_char_collate(const _Traits& __traits, _CharT __c, __node<_CharT>* __s)
2164
        : base(__s), __traits_(__traits), __c_(__traits.translate(__c)) {}
2165

    
2166
    virtual void __exec(__state&) const;
2167
};
2168

    
2169
template <class _CharT, class _Traits>
2170
void
2171
__match_char_collate<_CharT, _Traits>::__exec(__state& __s) const
2172
{
2173
    if (__s.__current_ != __s.__last_ &&
2174
        __traits_.translate(*__s.__current_) == __c_)
2175
    {
2176
        __s.__do_ = __state::__accept_and_consume;
2177
        ++__s.__current_;
2178
        __s.__node_ = this->first();
2179
    }
2180
    else
2181
    {
2182
        __s.__do_ = __state::__reject;
2183
        __s.__node_ = nullptr;
2184
    }
2185
}
2186

    
2187
// __bracket_expression
2188

    
2189
template <class _CharT, class _Traits>
2190
class __bracket_expression
2191
    : public __owns_one_state<_CharT>
2192
{
2193
    typedef __owns_one_state<_CharT> base;
2194
    typedef typename _Traits::string_type string_type;
2195

    
2196
    _Traits __traits_;
2197
    vector<_CharT> __chars_;
2198
    vector<_CharT> __neg_chars_;
2199
    vector<pair<string_type, string_type> > __ranges_;
2200
    vector<pair<_CharT, _CharT> > __digraphs_;
2201
    vector<string_type> __equivalences_;
2202
    typename regex_traits<_CharT>::char_class_type __mask_;
2203
    typename regex_traits<_CharT>::char_class_type __neg_mask_;
2204
    bool __negate_;
2205
    bool __icase_;
2206
    bool __collate_;
2207
    bool __might_have_digraph_;
2208

    
2209
    __bracket_expression(const __bracket_expression&);
2210
    __bracket_expression& operator=(const __bracket_expression&);
2211
public:
2212
    typedef _VSTD::__state<_CharT> __state;
2213

    
2214
    _LIBCPP_INLINE_VISIBILITY
2215
    __bracket_expression(const _Traits& __traits, __node<_CharT>* __s,
2216
                                 bool __negate, bool __icase, bool __collate)
2217
        : base(__s), __traits_(__traits), __mask_(), __neg_mask_(),
2218
          __negate_(__negate), __icase_(__icase), __collate_(__collate),
2219
          __might_have_digraph_(__traits_.getloc().name() != "C") {}
2220

    
2221
    virtual void __exec(__state&) const;
2222

    
2223
    _LIBCPP_INLINE_VISIBILITY
2224
    bool __negated() const {return __negate_;}
2225

    
2226
    _LIBCPP_INLINE_VISIBILITY
2227
    void __add_char(_CharT __c)
2228
        {
2229
            if (__icase_)
2230
                __chars_.push_back(__traits_.translate_nocase(__c));
2231
            else if (__collate_)
2232
                __chars_.push_back(__traits_.translate(__c));
2233
            else
2234
                __chars_.push_back(__c);
2235
        }
2236
    _LIBCPP_INLINE_VISIBILITY
2237
    void __add_neg_char(_CharT __c)
2238
        {
2239
            if (__icase_)
2240
                __neg_chars_.push_back(__traits_.translate_nocase(__c));
2241
            else if (__collate_)
2242
                __neg_chars_.push_back(__traits_.translate(__c));
2243
            else
2244
                __neg_chars_.push_back(__c);
2245
        }
2246
    _LIBCPP_INLINE_VISIBILITY
2247
    void __add_range(string_type __b, string_type __e)
2248
        {
2249
            if (__collate_)
2250
            {
2251
                if (__icase_)
2252
                {
2253
                    for (size_t __i = 0; __i < __b.size(); ++__i)
2254
                        __b[__i] = __traits_.translate_nocase(__b[__i]);
2255
                    for (size_t __i = 0; __i < __e.size(); ++__i)
2256
                        __e[__i] = __traits_.translate_nocase(__e[__i]);
2257
                }
2258
                else
2259
                {
2260
                    for (size_t __i = 0; __i < __b.size(); ++__i)
2261
                        __b[__i] = __traits_.translate(__b[__i]);
2262
                    for (size_t __i = 0; __i < __e.size(); ++__i)
2263
                        __e[__i] = __traits_.translate(__e[__i]);
2264
                }
2265
                __ranges_.push_back(make_pair(
2266
                                  __traits_.transform(__b.begin(), __b.end()),
2267
                                  __traits_.transform(__e.begin(), __e.end())));
2268
            }
2269
            else
2270
            {
2271
                if (__b.size() != 1 || __e.size() != 1)
2272
                    __throw_regex_error<regex_constants::error_collate>();
2273
                if (__icase_)
2274
                {
2275
                    __b[0] = __traits_.translate_nocase(__b[0]);
2276
                    __e[0] = __traits_.translate_nocase(__e[0]);
2277
                }
2278
                __ranges_.push_back(make_pair(_VSTD::move(__b), _VSTD::move(__e)));
2279
            }
2280
        }
2281
    _LIBCPP_INLINE_VISIBILITY
2282
    void __add_digraph(_CharT __c1, _CharT __c2)
2283
        {
2284
            if (__icase_)
2285
                __digraphs_.push_back(make_pair(__traits_.translate_nocase(__c1),
2286
                                                __traits_.translate_nocase(__c2)));
2287
            else if (__collate_)
2288
                __digraphs_.push_back(make_pair(__traits_.translate(__c1),
2289
                                                __traits_.translate(__c2)));
2290
            else
2291
                __digraphs_.push_back(make_pair(__c1, __c2));
2292
        }
2293
    _LIBCPP_INLINE_VISIBILITY
2294
    void __add_equivalence(const string_type& __s)
2295
        {__equivalences_.push_back(__s);}
2296
    _LIBCPP_INLINE_VISIBILITY
2297
    void __add_class(typename regex_traits<_CharT>::char_class_type __mask)
2298
        {__mask_ |= __mask;}
2299
    _LIBCPP_INLINE_VISIBILITY
2300
    void __add_neg_class(typename regex_traits<_CharT>::char_class_type __mask)
2301
        {__neg_mask_ |= __mask;}
2302
};
2303

    
2304
template <class _CharT, class _Traits>
2305
void
2306
__bracket_expression<_CharT, _Traits>::__exec(__state& __s) const
2307
{
2308
    bool __found = false;
2309
    unsigned __consumed = 0;
2310
    if (__s.__current_ != __s.__last_)
2311
    {
2312
        ++__consumed;
2313
        if (__might_have_digraph_)
2314
        {
2315
            const _CharT* __next = _VSTD::next(__s.__current_);
2316
            if (__next != __s.__last_)
2317
            {
2318
                pair<_CharT, _CharT> __ch2(*__s.__current_, *__next);
2319
                if (__icase_)
2320
                {
2321
                    __ch2.first = __traits_.translate_nocase(__ch2.first);
2322
                    __ch2.second = __traits_.translate_nocase(__ch2.second);
2323
                }
2324
                else if (__collate_)
2325
                {
2326
                    __ch2.first = __traits_.translate(__ch2.first);
2327
                    __ch2.second = __traits_.translate(__ch2.second);
2328
                }
2329
                if (!__traits_.lookup_collatename(&__ch2.first, &__ch2.first+2).empty())
2330
                {
2331
                    // __ch2 is a digraph in this locale
2332
                    ++__consumed;
2333
                    for (size_t __i = 0; __i < __digraphs_.size(); ++__i)
2334
                    {
2335
                        if (__ch2 == __digraphs_[__i])
2336
                        {
2337
                            __found = true;
2338
                            goto __exit;
2339
                        }
2340
                    }
2341
                    if (__collate_ && !__ranges_.empty())
2342
                    {
2343
                        string_type __s2 = __traits_.transform(&__ch2.first,
2344
                                                               &__ch2.first + 2);
2345
                        for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2346
                        {
2347
                            if (__ranges_[__i].first <= __s2 &&
2348
                                __s2 <= __ranges_[__i].second)
2349
                            {
2350
                                __found = true;
2351
                                goto __exit;
2352
                            }
2353
                        }
2354
                    }
2355
                    if (!__equivalences_.empty())
2356
                    {
2357
                        string_type __s2 = __traits_.transform_primary(&__ch2.first,
2358
                                                                       &__ch2.first + 2);
2359
                        for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2360
                        {
2361
                            if (__s2 == __equivalences_[__i])
2362
                            {
2363
                                __found = true;
2364
                                goto __exit;
2365
                            }
2366
                        }
2367
                    }
2368
                    if (__traits_.isctype(__ch2.first, __mask_) &&
2369
                        __traits_.isctype(__ch2.second, __mask_))
2370
                    {
2371
                        __found = true;
2372
                        goto __exit;
2373
                    }
2374
                    if (!__traits_.isctype(__ch2.first, __neg_mask_) &&
2375
                        !__traits_.isctype(__ch2.second, __neg_mask_))
2376
                    {
2377
                        __found = true;
2378
                        goto __exit;
2379
                    }
2380
                    goto __exit;
2381
                }
2382
            }
2383
        }
2384
        // test *__s.__current_ as not a digraph
2385
        _CharT __ch = *__s.__current_;
2386
        if (__icase_)
2387
            __ch = __traits_.translate_nocase(__ch);
2388
        else if (__collate_)
2389
            __ch = __traits_.translate(__ch);
2390
        for (size_t __i = 0; __i < __chars_.size(); ++__i)
2391
        {
2392
            if (__ch == __chars_[__i])
2393
            {
2394
                __found = true;
2395
                goto __exit;
2396
            }
2397
        }
2398
        if (!__neg_chars_.empty())
2399
        {
2400
            for (size_t __i = 0; __i < __neg_chars_.size(); ++__i)
2401
            {
2402
                if (__ch == __neg_chars_[__i])
2403
                    goto __is_neg_char;
2404
            }
2405
            __found = true;
2406
            goto __exit;
2407
        }
2408
__is_neg_char:
2409
        if (!__ranges_.empty())
2410
        {
2411
            string_type __s2 = __collate_ ?
2412
                                   __traits_.transform(&__ch, &__ch + 1) :
2413
                                   string_type(1, __ch);
2414
            for (size_t __i = 0; __i < __ranges_.size(); ++__i)
2415
            {
2416
                if (__ranges_[__i].first <= __s2 && __s2 <= __ranges_[__i].second)
2417
                {
2418
                    __found = true;
2419
                    goto __exit;
2420
                }
2421
            }
2422
        }
2423
        if (!__equivalences_.empty())
2424
        {
2425
            string_type __s2 = __traits_.transform_primary(&__ch, &__ch + 1);
2426
            for (size_t __i = 0; __i < __equivalences_.size(); ++__i)
2427
            {
2428
                if (__s2 == __equivalences_[__i])
2429
                {
2430
                    __found = true;
2431
                    goto __exit;
2432
                }
2433
            }
2434
        }
2435
        if (__traits_.isctype(__ch, __mask_))
2436
        {
2437
            __found = true;
2438
            goto __exit;
2439
        }
2440
        if (__neg_mask_ && !__traits_.isctype(__ch, __neg_mask_))
2441
        {
2442
            __found = true;
2443
            goto __exit;
2444
        }
2445
    }
2446
    else
2447
        __found = __negate_;  // force reject
2448
__exit:
2449
    if (__found != __negate_)
2450
    {
2451
        __s.__do_ = __state::__accept_and_consume;
2452
        __s.__current_ += __consumed;
2453
        __s.__node_ = this->first();
2454
    }
2455
    else
2456
    {
2457
        __s.__do_ = __state::__reject;
2458
        __s.__node_ = nullptr;
2459
    }
2460
}
2461

    
2462
template <class _CharT, class _Traits> class __lookahead;
2463

    
2464
template <class _CharT, class _Traits = regex_traits<_CharT> >
2465
class _LIBCPP_TYPE_VIS_ONLY basic_regex
2466
{
2467
public:
2468
    // types:
2469
    typedef _CharT                              value_type;
2470
    typedef regex_constants::syntax_option_type flag_type;
2471
    typedef typename _Traits::locale_type       locale_type;
2472

    
2473
private:
2474
    _Traits   __traits_;
2475
    flag_type __flags_;
2476
    unsigned __marked_count_;
2477
    unsigned __loop_count_;
2478
    int __open_count_;
2479
    shared_ptr<__empty_state<_CharT> > __start_;
2480
    __owns_one_state<_CharT>* __end_;
2481

    
2482
    typedef _VSTD::__state<_CharT> __state;
2483
    typedef _VSTD::__node<_CharT> __node;
2484

    
2485
public:
2486
    // constants:
2487
    static const regex_constants::syntax_option_type icase = regex_constants::icase;
2488
    static const regex_constants::syntax_option_type nosubs = regex_constants::nosubs;
2489
    static const regex_constants::syntax_option_type optimize = regex_constants::optimize;
2490
    static const regex_constants::syntax_option_type collate = regex_constants::collate;
2491
    static const regex_constants::syntax_option_type ECMAScript = regex_constants::ECMAScript;
2492
    static const regex_constants::syntax_option_type basic = regex_constants::basic;
2493
    static const regex_constants::syntax_option_type extended = regex_constants::extended;
2494
    static const regex_constants::syntax_option_type awk = regex_constants::awk;
2495
    static const regex_constants::syntax_option_type grep = regex_constants::grep;
2496
    static const regex_constants::syntax_option_type egrep = regex_constants::egrep;
2497

    
2498
    // construct/copy/destroy:
2499
    _LIBCPP_INLINE_VISIBILITY
2500
    basic_regex()
2501
        : __flags_(), __marked_count_(0), __loop_count_(0), __open_count_(0),
2502
          __end_(0)
2503
        {}
2504
    _LIBCPP_INLINE_VISIBILITY
2505
    explicit basic_regex(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2506
        : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2507
          __end_(0)
2508
        {__parse(__p, __p + __traits_.length(__p));}
2509
    _LIBCPP_INLINE_VISIBILITY
2510
    basic_regex(const value_type* __p, size_t __len, flag_type __f)
2511
        : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2512
          __end_(0)
2513
        {__parse(__p, __p + __len);}
2514
//     basic_regex(const basic_regex&) = default;
2515
//     basic_regex(basic_regex&&) = default;
2516
    template <class _ST, class _SA>
2517
        _LIBCPP_INLINE_VISIBILITY
2518
        explicit basic_regex(const basic_string<value_type, _ST, _SA>& __p,
2519
                             flag_type __f = regex_constants::ECMAScript)
2520
        : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2521
          __end_(0)
2522
        {__parse(__p.begin(), __p.end());}
2523
    template <class _ForwardIterator>
2524
        _LIBCPP_INLINE_VISIBILITY
2525
        basic_regex(_ForwardIterator __first, _ForwardIterator __last,
2526
                    flag_type __f = regex_constants::ECMAScript)
2527
        : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2528
          __end_(0)
2529
        {__parse(__first, __last);}
2530
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2531
    _LIBCPP_INLINE_VISIBILITY
2532
    basic_regex(initializer_list<value_type> __il,
2533
                flag_type __f = regex_constants::ECMAScript)
2534
        : __flags_(__f), __marked_count_(0), __loop_count_(0), __open_count_(0),
2535
          __end_(0)
2536
        {__parse(__il.begin(), __il.end());}
2537
#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2538

    
2539
//    ~basic_regex() = default;
2540

    
2541
//     basic_regex& operator=(const basic_regex&) = default;
2542
//     basic_regex& operator=(basic_regex&&) = default;
2543
    _LIBCPP_INLINE_VISIBILITY
2544
    basic_regex& operator=(const value_type* __p)
2545
        {return assign(__p);}
2546
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2547
    _LIBCPP_INLINE_VISIBILITY
2548
    basic_regex& operator=(initializer_list<value_type> __il)
2549
        {return assign(__il);}
2550
#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2551
    template <class _ST, class _SA>
2552
        _LIBCPP_INLINE_VISIBILITY
2553
        basic_regex& operator=(const basic_string<value_type, _ST, _SA>& __p)
2554
        {return assign(__p);}
2555

    
2556
    // assign:
2557
    _LIBCPP_INLINE_VISIBILITY
2558
    basic_regex& assign(const basic_regex& __that)
2559
        {return *this = __that;}
2560
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2561
    _LIBCPP_INLINE_VISIBILITY
2562
    basic_regex& assign(basic_regex&& __that) _NOEXCEPT
2563
        {return *this = _VSTD::move(__that);}
2564
#endif
2565
    _LIBCPP_INLINE_VISIBILITY
2566
    basic_regex& assign(const value_type* __p, flag_type __f = regex_constants::ECMAScript)
2567
        {return assign(__p, __p + __traits_.length(__p), __f);}
2568
    _LIBCPP_INLINE_VISIBILITY
2569
    basic_regex& assign(const value_type* __p, size_t __len, flag_type __f)
2570
        {return assign(__p, __p + __len, __f);}
2571
    template <class _ST, class _SA>
2572
        _LIBCPP_INLINE_VISIBILITY
2573
        basic_regex& assign(const basic_string<value_type, _ST, _SA>& __s,
2574
                            flag_type __f = regex_constants::ECMAScript)
2575
            {return assign(__s.begin(), __s.end(), __f);}
2576

    
2577
    template <class _InputIterator>
2578
        _LIBCPP_INLINE_VISIBILITY
2579
        typename enable_if
2580
        <
2581
             __is_input_iterator  <_InputIterator>::value &&
2582
            !__is_forward_iterator<_InputIterator>::value,
2583
            basic_regex&
2584
        >::type
2585
        assign(_InputIterator __first, _InputIterator __last,
2586
                            flag_type __f = regex_constants::ECMAScript)
2587
        {
2588
            basic_string<_CharT> __t(__first, __last);
2589
            return assign(__t.begin(), __t.end(), __f);
2590
        }
2591

    
2592
private:
2593
    _LIBCPP_INLINE_VISIBILITY
2594
    void __member_init(flag_type __f)
2595
    {
2596
        __flags_ = __f;
2597
        __marked_count_ = 0;
2598
        __loop_count_ = 0;
2599
        __open_count_ = 0;
2600
        __end_ = nullptr;
2601
    }
2602
public:
2603

    
2604
    template <class _ForwardIterator>
2605
        _LIBCPP_INLINE_VISIBILITY
2606
        typename enable_if
2607
        <
2608
            __is_forward_iterator<_ForwardIterator>::value,
2609
            basic_regex&
2610
        >::type
2611
        assign(_ForwardIterator __first, _ForwardIterator __last,
2612
                            flag_type __f = regex_constants::ECMAScript)
2613
        {
2614
            return assign(basic_regex(__first, __last, __f));
2615
        }
2616

    
2617
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2618

    
2619
    _LIBCPP_INLINE_VISIBILITY
2620
    basic_regex& assign(initializer_list<value_type> __il,
2621
                        flag_type __f = regex_constants::ECMAScript)
2622
        {return assign(__il.begin(), __il.end(), __f);}
2623

    
2624
#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
2625

    
2626
    // const operations:
2627
    _LIBCPP_INLINE_VISIBILITY
2628
    unsigned mark_count() const {return __marked_count_;}
2629
    _LIBCPP_INLINE_VISIBILITY
2630
    flag_type flags() const {return __flags_;}
2631

    
2632
    // locale:
2633
    _LIBCPP_INLINE_VISIBILITY
2634
    locale_type imbue(locale_type __loc)
2635
    {
2636
        __member_init(ECMAScript);
2637
        __start_.reset();
2638
        return __traits_.imbue(__loc);
2639
    }
2640
    _LIBCPP_INLINE_VISIBILITY
2641
    locale_type getloc() const {return __traits_.getloc();}
2642

    
2643
    // swap:
2644
    void swap(basic_regex& __r);
2645

    
2646
private:
2647
    _LIBCPP_INLINE_VISIBILITY
2648
    unsigned __loop_count() const {return __loop_count_;}
2649

    
2650
    template <class _ForwardIterator>
2651
        _ForwardIterator
2652
        __parse(_ForwardIterator __first, _ForwardIterator __last);
2653
    template <class _ForwardIterator>
2654
        _ForwardIterator
2655
        __parse_basic_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2656
    template <class _ForwardIterator>
2657
        _ForwardIterator
2658
        __parse_RE_expression(_ForwardIterator __first, _ForwardIterator __last);
2659
    template <class _ForwardIterator>
2660
        _ForwardIterator
2661
        __parse_simple_RE(_ForwardIterator __first, _ForwardIterator __last);
2662
    template <class _ForwardIterator>
2663
        _ForwardIterator
2664
        __parse_nondupl_RE(_ForwardIterator __first, _ForwardIterator __last);
2665
    template <class _ForwardIterator>
2666
        _ForwardIterator
2667
        __parse_one_char_or_coll_elem_RE(_ForwardIterator __first, _ForwardIterator __last);
2668
    template <class _ForwardIterator>
2669
        _ForwardIterator
2670
        __parse_Back_open_paren(_ForwardIterator __first, _ForwardIterator __last);
2671
    template <class _ForwardIterator>
2672
        _ForwardIterator
2673
        __parse_Back_close_paren(_ForwardIterator __first, _ForwardIterator __last);
2674
    template <class _ForwardIterator>
2675
        _ForwardIterator
2676
        __parse_Back_open_brace(_ForwardIterator __first, _ForwardIterator __last);
2677
    template <class _ForwardIterator>
2678
        _ForwardIterator
2679
        __parse_Back_close_brace(_ForwardIterator __first, _ForwardIterator __last);
2680
    template <class _ForwardIterator>
2681
        _ForwardIterator
2682
        __parse_BACKREF(_ForwardIterator __first, _ForwardIterator __last);
2683
    template <class _ForwardIterator>
2684
        _ForwardIterator
2685
        __parse_ORD_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2686
    template <class _ForwardIterator>
2687
        _ForwardIterator
2688
        __parse_QUOTED_CHAR(_ForwardIterator __first, _ForwardIterator __last);
2689
    template <class _ForwardIterator>
2690
        _ForwardIterator
2691
        __parse_RE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2692
                               __owns_one_state<_CharT>* __s,
2693
                               unsigned __mexp_begin, unsigned __mexp_end);
2694
    template <class _ForwardIterator>
2695
        _ForwardIterator
2696
        __parse_ERE_dupl_symbol(_ForwardIterator __first, _ForwardIterator __last,
2697
                                __owns_one_state<_CharT>* __s,
2698
                                unsigned __mexp_begin, unsigned __mexp_end);
2699
    template <class _ForwardIterator>
2700
        _ForwardIterator
2701
        __parse_bracket_expression(_ForwardIterator __first, _ForwardIterator __last);
2702
    template <class _ForwardIterator>
2703
        _ForwardIterator
2704
        __parse_follow_list(_ForwardIterator __first, _ForwardIterator __last,
2705
                            __bracket_expression<_CharT, _Traits>* __ml);
2706
    template <class _ForwardIterator>
2707
        _ForwardIterator
2708
        __parse_expression_term(_ForwardIterator __first, _ForwardIterator __last,
2709
                                __bracket_expression<_CharT, _Traits>* __ml);
2710
    template <class _ForwardIterator>
2711
        _ForwardIterator
2712
        __parse_equivalence_class(_ForwardIterator __first, _ForwardIterator __last,
2713
                                  __bracket_expression<_CharT, _Traits>* __ml);
2714
    template <class _ForwardIterator>
2715
        _ForwardIterator
2716
        __parse_character_class(_ForwardIterator __first, _ForwardIterator __last,
2717
                                __bracket_expression<_CharT, _Traits>* __ml);
2718
    template <class _ForwardIterator>
2719
        _ForwardIterator
2720
        __parse_collating_symbol(_ForwardIterator __first, _ForwardIterator __last,
2721
                                 basic_string<_CharT>& __col_sym);
2722
    template <class _ForwardIterator>
2723
        _ForwardIterator
2724
        __parse_DUP_COUNT(_ForwardIterator __first, _ForwardIterator __last, int& __c);
2725
    template <class _ForwardIterator>
2726
        _ForwardIterator
2727
        __parse_extended_reg_exp(_ForwardIterator __first, _ForwardIterator __last);
2728
    template <class _ForwardIterator>
2729
        _ForwardIterator
2730
        __parse_ERE_branch(_ForwardIterator __first, _ForwardIterator __last);
2731
    template <class _ForwardIterator>
2732
        _ForwardIterator
2733
        __parse_ERE_expression(_ForwardIterator __first, _ForwardIterator __last);
2734
    template <class _ForwardIterator>
2735
        _ForwardIterator
2736
        __parse_one_char_or_coll_elem_ERE(_ForwardIterator __first, _ForwardIterator __last);
2737
    template <class _ForwardIterator>
2738
        _ForwardIterator
2739
        __parse_ORD_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2740
    template <class _ForwardIterator>
2741
        _ForwardIterator
2742
        __parse_QUOTED_CHAR_ERE(_ForwardIterator __first, _ForwardIterator __last);
2743
    template <class _ForwardIterator>
2744
        _ForwardIterator
2745
        __parse_ecma_exp(_ForwardIterator __first, _ForwardIterator __last);
2746
    template <class _ForwardIterator>
2747
        _ForwardIterator
2748
        __parse_alternative(_ForwardIterator __first, _ForwardIterator __last);
2749
    template <class _ForwardIterator>
2750
        _ForwardIterator
2751
        __parse_term(_ForwardIterator __first, _ForwardIterator __last);
2752
    template <class _ForwardIterator>
2753
        _ForwardIterator
2754
        __parse_assertion(_ForwardIterator __first, _ForwardIterator __last);
2755
    template <class _ForwardIterator>
2756
        _ForwardIterator
2757
        __parse_atom(_ForwardIterator __first, _ForwardIterator __last);
2758
    template <class _ForwardIterator>
2759
        _ForwardIterator
2760
        __parse_atom_escape(_ForwardIterator __first, _ForwardIterator __last);
2761
    template <class _ForwardIterator>
2762
        _ForwardIterator
2763
        __parse_decimal_escape(_ForwardIterator __first, _ForwardIterator __last);
2764
    template <class _ForwardIterator>
2765
        _ForwardIterator
2766
        __parse_character_class_escape(_ForwardIterator __first, _ForwardIterator __last);
2767
    template <class _ForwardIterator>
2768
        _ForwardIterator
2769
        __parse_character_escape(_ForwardIterator __first, _ForwardIterator __last,
2770
                                 basic_string<_CharT>* __str = nullptr);
2771
    template <class _ForwardIterator>
2772
        _ForwardIterator
2773
        __parse_pattern_character(_ForwardIterator __first, _ForwardIterator __last);
2774
    template <class _ForwardIterator>
2775
        _ForwardIterator
2776
        __parse_grep(_ForwardIterator __first, _ForwardIterator __last);
2777
    template <class _ForwardIterator>
2778
        _ForwardIterator
2779
        __parse_egrep(_ForwardIterator __first, _ForwardIterator __last);
2780
    template <class _ForwardIterator>
2781
        _ForwardIterator
2782
        __parse_class_escape(_ForwardIterator __first, _ForwardIterator __last,
2783
                          basic_string<_CharT>& __str,
2784
                          __bracket_expression<_CharT, _Traits>* __ml);
2785
    template <class _ForwardIterator>
2786
        _ForwardIterator
2787
        __parse_awk_escape(_ForwardIterator __first, _ForwardIterator __last,
2788
                          basic_string<_CharT>* __str = nullptr);
2789

    
2790
    _LIBCPP_INLINE_VISIBILITY
2791
    void __push_l_anchor();
2792
    void __push_r_anchor();
2793
    void __push_match_any();
2794
    void __push_match_any_but_newline();
2795
    _LIBCPP_INLINE_VISIBILITY
2796
    void __push_greedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2797
                                  unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2798
        {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2799
                     __mexp_begin, __mexp_end);}
2800
    _LIBCPP_INLINE_VISIBILITY
2801
    void __push_nongreedy_inf_repeat(size_t __min, __owns_one_state<_CharT>* __s,
2802
                                  unsigned __mexp_begin = 0, unsigned __mexp_end = 0)
2803
        {__push_loop(__min, numeric_limits<size_t>::max(), __s,
2804
                     __mexp_begin, __mexp_end, false);}
2805
    void __push_loop(size_t __min, size_t __max, __owns_one_state<_CharT>* __s,
2806
                     size_t __mexp_begin = 0, size_t __mexp_end = 0,
2807
                     bool __greedy = true);
2808
    __bracket_expression<_CharT, _Traits>* __start_matching_list(bool __negate);
2809
    void __push_char(value_type __c);
2810
    void __push_back_ref(int __i);
2811
    void __push_alternation(__owns_one_state<_CharT>* __sa,
2812
                            __owns_one_state<_CharT>* __sb);
2813
    void __push_begin_marked_subexpression();
2814
    void __push_end_marked_subexpression(unsigned);
2815
    void __push_empty();
2816
    void __push_word_boundary(bool);
2817
    void __push_lookahead(const basic_regex&, bool, unsigned);
2818

    
2819
    template <class _Allocator>
2820
        bool
2821
        __search(const _CharT* __first, const _CharT* __last,
2822
                 match_results<const _CharT*, _Allocator>& __m,
2823
                 regex_constants::match_flag_type __flags) const;
2824

    
2825
    template <class _Allocator>
2826
        bool
2827
        __match_at_start(const _CharT* __first, const _CharT* __last,
2828
                 match_results<const _CharT*, _Allocator>& __m,
2829
                 regex_constants::match_flag_type __flags, bool) const;
2830
    template <class _Allocator>
2831
        bool
2832
        __match_at_start_ecma(const _CharT* __first, const _CharT* __last,
2833
                 match_results<const _CharT*, _Allocator>& __m,
2834
                 regex_constants::match_flag_type __flags, bool) const;
2835
    template <class _Allocator>
2836
        bool
2837
        __match_at_start_posix_nosubs(const _CharT* __first, const _CharT* __last,
2838
                 match_results<const _CharT*, _Allocator>& __m,
2839
                 regex_constants::match_flag_type __flags, bool) const;
2840
    template <class _Allocator>
2841
        bool
2842
        __match_at_start_posix_subs(const _CharT* __first, const _CharT* __last,
2843
                 match_results<const _CharT*, _Allocator>& __m,
2844
                 regex_constants::match_flag_type __flags, bool) const;
2845

    
2846
    template <class _Bp, class _Ap, class _Cp, class _Tp>
2847
    friend
2848
    bool
2849
    regex_search(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
2850
                 regex_constants::match_flag_type);
2851

    
2852
    template <class _Ap, class _Cp, class _Tp>
2853
    friend
2854
    bool
2855
    regex_search(const _Cp*, const _Cp*, match_results<const _Cp*, _Ap>&,
2856
                 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
2857

    
2858
    template <class _Bp, class _Cp, class _Tp>
2859
    friend
2860
    bool
2861
    regex_search(_Bp, _Bp, const basic_regex<_Cp, _Tp>&,
2862
                 regex_constants::match_flag_type);
2863

    
2864
    template <class _Cp, class _Tp>
2865
    friend
2866
    bool
2867
    regex_search(const _Cp*, const _Cp*,
2868
                 const basic_regex<_Cp, _Tp>&, regex_constants::match_flag_type);
2869

    
2870
    template <class _Cp, class _Ap, class _Tp>
2871
    friend
2872
    bool
2873
    regex_search(const _Cp*, match_results<const _Cp*, _Ap>&, const basic_regex<_Cp, _Tp>&,
2874
                 regex_constants::match_flag_type);
2875

    
2876
    template <class _ST, class _SA, class _Cp, class _Tp>
2877
    friend
2878
    bool
2879
    regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2880
                 const basic_regex<_Cp, _Tp>& __e,
2881
                 regex_constants::match_flag_type __flags);
2882

    
2883
    template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
2884
    friend
2885
    bool
2886
    regex_search(const basic_string<_Cp, _ST, _SA>& __s,
2887
                 match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
2888
                 const basic_regex<_Cp, _Tp>& __e,
2889
                 regex_constants::match_flag_type __flags);
2890

    
2891
    template <class _Iter, class _Ap, class _Cp, class _Tp>
2892
    friend
2893
    bool
2894
    regex_search(__wrap_iter<_Iter> __first,
2895
                 __wrap_iter<_Iter> __last,
2896
                 match_results<__wrap_iter<_Iter>, _Ap>& __m,
2897
                 const basic_regex<_Cp, _Tp>& __e,
2898
                 regex_constants::match_flag_type __flags);
2899

    
2900
    template <class, class> friend class __lookahead;
2901
};
2902

    
2903
template <class _CharT, class _Traits>
2904
    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::icase;
2905
template <class _CharT, class _Traits>
2906
    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::nosubs;
2907
template <class _CharT, class _Traits>
2908
    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::optimize;
2909
template <class _CharT, class _Traits>
2910
    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::collate;
2911
template <class _CharT, class _Traits>
2912
    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::ECMAScript;
2913
template <class _CharT, class _Traits>
2914
    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::basic;
2915
template <class _CharT, class _Traits>
2916
    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::extended;
2917
template <class _CharT, class _Traits>
2918
    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::awk;
2919
template <class _CharT, class _Traits>
2920
    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::grep;
2921
template <class _CharT, class _Traits>
2922
    const regex_constants::syntax_option_type basic_regex<_CharT, _Traits>::egrep;
2923

    
2924
template <class _CharT, class _Traits>
2925
void
2926
basic_regex<_CharT, _Traits>::swap(basic_regex& __r)
2927
{
2928
    using _VSTD::swap;
2929
    swap(__traits_, __r.__traits_);
2930
    swap(__flags_, __r.__flags_);
2931
    swap(__marked_count_, __r.__marked_count_);
2932
    swap(__loop_count_, __r.__loop_count_);
2933
    swap(__open_count_, __r.__open_count_);
2934
    swap(__start_, __r.__start_);
2935
    swap(__end_, __r.__end_);
2936
}
2937

    
2938
template <class _CharT, class _Traits>
2939
inline _LIBCPP_INLINE_VISIBILITY
2940
void
2941
swap(basic_regex<_CharT, _Traits>& __x, basic_regex<_CharT, _Traits>& __y)
2942
{
2943
    return __x.swap(__y);
2944
}
2945

    
2946
// __lookahead
2947

    
2948
template <class _CharT, class _Traits>
2949
class __lookahead
2950
    : public __owns_one_state<_CharT>
2951
{
2952
    typedef __owns_one_state<_CharT> base;
2953

    
2954
    basic_regex<_CharT, _Traits> __exp_;
2955
    unsigned __mexp_;
2956
    bool __invert_;
2957

    
2958
    __lookahead(const __lookahead&);
2959
    __lookahead& operator=(const __lookahead&);
2960
public:
2961
    typedef _VSTD::__state<_CharT> __state;
2962

    
2963
    _LIBCPP_INLINE_VISIBILITY
2964
    __lookahead(const basic_regex<_CharT, _Traits>& __exp, bool __invert, __node<_CharT>* __s, unsigned __mexp)
2965
        : base(__s), __exp_(__exp), __mexp_(__mexp), __invert_(__invert) {}
2966

    
2967
    virtual void __exec(__state&) const;
2968
};
2969

    
2970
template <class _CharT, class _Traits>
2971
void
2972
__lookahead<_CharT, _Traits>::__exec(__state& __s) const
2973
{
2974
    match_results<const _CharT*> __m;
2975
    __m.__init(1 + __exp_.mark_count(), __s.__current_, __s.__last_);
2976
    bool __matched = __exp_.__match_at_start_ecma(__s.__current_, __s.__last_,
2977
                                                  __m,
2978
                                                  __s.__flags_ | regex_constants::match_continuous,
2979
                                                  __s.__at_first_ && __s.__current_ == __s.__first_);
2980
    if (__matched != __invert_)
2981
    {
2982
        __s.__do_ = __state::__accept_but_not_consume;
2983
        __s.__node_ = this->first();
2984
        for (unsigned __i = 1; __i < __m.size(); ++__i) {
2985
            __s.__sub_matches_[__mexp_ + __i - 1] = __m.__matches_[__i];
2986
        }
2987
    }
2988
    else
2989
    {
2990
        __s.__do_ = __state::__reject;
2991
        __s.__node_ = nullptr;
2992
    }
2993
}
2994

    
2995
template <class _CharT, class _Traits>
2996
template <class _ForwardIterator>
2997
_ForwardIterator
2998
basic_regex<_CharT, _Traits>::__parse(_ForwardIterator __first,
2999
                                      _ForwardIterator __last)
3000
{
3001
    {
3002
        unique_ptr<__node> __h(new __end_state<_CharT>);
3003
        __start_.reset(new __empty_state<_CharT>(__h.get()));
3004
        __h.release();
3005
        __end_ = __start_.get();
3006
    }
3007
    switch (__flags_ & 0x1F0)
3008
    {
3009
    case ECMAScript:
3010
        __first = __parse_ecma_exp(__first, __last);
3011
        break;
3012
    case basic:
3013
        __first = __parse_basic_reg_exp(__first, __last);
3014
        break;
3015
    case extended:
3016
    case awk:
3017
        __first = __parse_extended_reg_exp(__first, __last);
3018
        break;
3019
    case grep:
3020
        __first = __parse_grep(__first, __last);
3021
        break;
3022
    case egrep:
3023
        __first = __parse_egrep(__first, __last);
3024
        break;
3025
    default:
3026
        __throw_regex_error<regex_constants::__re_err_grammar>();
3027
    }
3028
    return __first;
3029
}
3030

    
3031
template <class _CharT, class _Traits>
3032
template <class _ForwardIterator>
3033
_ForwardIterator
3034
basic_regex<_CharT, _Traits>::__parse_basic_reg_exp(_ForwardIterator __first,
3035
                                                    _ForwardIterator __last)
3036
{
3037
    if (__first != __last)
3038
    {
3039
        if (*__first == '^')
3040
        {
3041
            __push_l_anchor();
3042
            ++__first;
3043
        }
3044
        if (__first != __last)
3045
        {
3046
            __first = __parse_RE_expression(__first, __last);
3047
            if (__first != __last)
3048
            {
3049
                _ForwardIterator __temp = _VSTD::next(__first);
3050
                if (__temp == __last && *__first == '$')
3051
                {
3052
                    __push_r_anchor();
3053
                    ++__first;
3054
                }
3055
            }
3056
        }
3057
        if (__first != __last)
3058
            __throw_regex_error<regex_constants::__re_err_empty>();
3059
    }
3060
    return __first;
3061
}
3062

    
3063
template <class _CharT, class _Traits>
3064
template <class _ForwardIterator>
3065
_ForwardIterator
3066
basic_regex<_CharT, _Traits>::__parse_extended_reg_exp(_ForwardIterator __first,
3067
                                                       _ForwardIterator __last)
3068
{
3069
    __owns_one_state<_CharT>* __sa = __end_;
3070
    _ForwardIterator __temp = __parse_ERE_branch(__first, __last);
3071
    if (__temp == __first)
3072
        __throw_regex_error<regex_constants::__re_err_empty>();
3073
    __first = __temp;
3074
    while (__first != __last && *__first == '|')
3075
    {
3076
        __owns_one_state<_CharT>* __sb = __end_;
3077
        __temp = __parse_ERE_branch(++__first, __last);
3078
        if (__temp == __first)
3079
            __throw_regex_error<regex_constants::__re_err_empty>();
3080
        __push_alternation(__sa, __sb);
3081
        __first = __temp;
3082
    }
3083
    return __first;
3084
}
3085

    
3086
template <class _CharT, class _Traits>
3087
template <class _ForwardIterator>
3088
_ForwardIterator
3089
basic_regex<_CharT, _Traits>::__parse_ERE_branch(_ForwardIterator __first,
3090
                                                 _ForwardIterator __last)
3091
{
3092
    _ForwardIterator __temp = __parse_ERE_expression(__first, __last);
3093
    if (__temp == __first)
3094
        __throw_regex_error<regex_constants::__re_err_empty>();
3095
    do
3096
    {
3097
        __first = __temp;
3098
        __temp = __parse_ERE_expression(__first, __last);
3099
    } while (__temp != __first);
3100
    return __first;
3101
}
3102

    
3103
template <class _CharT, class _Traits>
3104
template <class _ForwardIterator>
3105
_ForwardIterator
3106
basic_regex<_CharT, _Traits>::__parse_ERE_expression(_ForwardIterator __first,
3107
                                                     _ForwardIterator __last)
3108
{
3109
    __owns_one_state<_CharT>* __e = __end_;
3110
    unsigned __mexp_begin = __marked_count_;
3111
    _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 '(':
3125
            __push_begin_marked_subexpression();
3126
            unsigned __temp_count = __marked_count_;
3127
            ++__open_count_;
3128
            __temp = __parse_extended_reg_exp(++__temp, __last);
3129
            if (__temp == __last || *__temp != ')')
3130
                __throw_regex_error<regex_constants::error_paren>();
3131
            __push_end_marked_subexpression(__temp_count);
3132
            --__open_count_;
3133
            ++__temp;
3134
            break;
3135
        }
3136
    }
3137
    if (__temp != __first)
3138
        __temp = __parse_ERE_dupl_symbol(__temp, __last, __e, __mexp_begin+1,
3139
                                         __marked_count_+1);
3140
    __first = __temp;
3141
    return __first;
3142
}
3143

    
3144
template <class _CharT, class _Traits>
3145
template <class _ForwardIterator>
3146
_ForwardIterator
3147
basic_regex<_CharT, _Traits>::__parse_RE_expression(_ForwardIterator __first,
3148
                                                    _ForwardIterator __last)
3149
{
3150
    while (true)
3151
    {
3152
        _ForwardIterator __temp = __parse_simple_RE(__first, __last);
3153
        if (__temp == __first)
3154
            break;
3155
        __first = __temp;
3156
    }
3157
    return __first;
3158
}
3159

    
3160
template <class _CharT, class _Traits>
3161
template <class _ForwardIterator>
3162
_ForwardIterator
3163
basic_regex<_CharT, _Traits>::__parse_simple_RE(_ForwardIterator __first,
3164
                                                _ForwardIterator __last)
3165
{
3166
    if (__first != __last)
3167
    {
3168
        __owns_one_state<_CharT>* __e = __end_;
3169
        unsigned __mexp_begin = __marked_count_;
3170
        _ForwardIterator __temp = __parse_nondupl_RE(__first, __last);
3171
        if (__temp != __first)
3172
            __first = __parse_RE_dupl_symbol(__temp, __last, __e,
3173
                                             __mexp_begin+1, __marked_count_+1);
3174
    }
3175
    return __first;
3176
}
3177

    
3178
template <class _CharT, class _Traits>
3179
template <class _ForwardIterator>
3180
_ForwardIterator
3181
basic_regex<_CharT, _Traits>::__parse_nondupl_RE(_ForwardIterator __first,
3182
                                                 _ForwardIterator __last)
3183
{
3184
    _ForwardIterator __temp = __first;
3185
    __first = __parse_one_char_or_coll_elem_RE(__first, __last);
3186
    if (__temp == __first)
3187
    {
3188
        __temp = __parse_Back_open_paren(__first, __last);
3189
        if (__temp != __first)
3190
        {
3191
            __push_begin_marked_subexpression();
3192
            unsigned __temp_count = __marked_count_;
3193
            __first = __parse_RE_expression(__temp, __last);
3194
            __temp = __parse_Back_close_paren(__first, __last);
3195
            if (__temp == __first)
3196
                __throw_regex_error<regex_constants::error_paren>();
3197
            __push_end_marked_subexpression(__temp_count);
3198
            __first = __temp;
3199
        }
3200
        else
3201
            __first = __parse_BACKREF(__first, __last);
3202
    }
3203
    return __first;
3204
}
3205

    
3206
template <class _CharT, class _Traits>
3207
template <class _ForwardIterator>
3208
_ForwardIterator
3209
basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_RE(
3210
                                                       _ForwardIterator __first,
3211
                                                       _ForwardIterator __last)
3212
{
3213
    _ForwardIterator __temp = __parse_ORD_CHAR(__first, __last);
3214
    if (__temp == __first)
3215
    {
3216
        __temp = __parse_QUOTED_CHAR(__first, __last);
3217
        if (__temp == __first)
3218
        {
3219
            if (__temp != __last && *__temp == '.')
3220
            {
3221
                __push_match_any();
3222
                ++__temp;
3223
            }
3224
            else
3225
                __temp = __parse_bracket_expression(__first, __last);
3226
        }
3227
    }
3228
    __first = __temp;
3229
    return __first;
3230
}
3231

    
3232
template <class _CharT, class _Traits>
3233
template <class _ForwardIterator>
3234
_ForwardIterator
3235
basic_regex<_CharT, _Traits>::__parse_one_char_or_coll_elem_ERE(
3236
                                                       _ForwardIterator __first,
3237
                                                       _ForwardIterator __last)
3238
{
3239
    _ForwardIterator __temp = __parse_ORD_CHAR_ERE(__first, __last);
3240
    if (__temp == __first)
3241
    {
3242
        __temp = __parse_QUOTED_CHAR_ERE(__first, __last);
3243
        if (__temp == __first)
3244
        {
3245
            if (__temp != __last && *__temp == '.')
3246
            {
3247
                __push_match_any();
3248
                ++__temp;
3249
            }
3250
            else
3251
                __temp = __parse_bracket_expression(__first, __last);
3252
        }
3253
    }
3254
    __first = __temp;
3255
    return __first;
3256
}
3257

    
3258
template <class _CharT, class _Traits>
3259
template <class _ForwardIterator>
3260
_ForwardIterator
3261
basic_regex<_CharT, _Traits>::__parse_Back_open_paren(_ForwardIterator __first,
3262
                                                      _ForwardIterator __last)
3263
{
3264
    if (__first != __last)
3265
    {
3266
        _ForwardIterator __temp = _VSTD::next(__first);
3267
        if (__temp != __last)
3268
        {
3269
            if (*__first == '\\' && *__temp == '(')
3270
                __first = ++__temp;
3271
        }
3272
    }
3273
    return __first;
3274
}
3275

    
3276
template <class _CharT, class _Traits>
3277
template <class _ForwardIterator>
3278
_ForwardIterator
3279
basic_regex<_CharT, _Traits>::__parse_Back_close_paren(_ForwardIterator __first,
3280
                                                       _ForwardIterator __last)
3281
{
3282
    if (__first != __last)
3283
    {
3284
        _ForwardIterator __temp = _VSTD::next(__first);
3285
        if (__temp != __last)
3286
        {
3287
            if (*__first == '\\' && *__temp == ')')
3288
                __first = ++__temp;
3289
        }
3290
    }
3291
    return __first;
3292
}
3293

    
3294
template <class _CharT, class _Traits>
3295
template <class _ForwardIterator>
3296
_ForwardIterator
3297
basic_regex<_CharT, _Traits>::__parse_Back_open_brace(_ForwardIterator __first,
3298
                                                      _ForwardIterator __last)
3299
{
3300
    if (__first != __last)
3301
    {
3302
        _ForwardIterator __temp = _VSTD::next(__first);
3303
        if (__temp != __last)
3304
        {
3305
            if (*__first == '\\' && *__temp == '{')
3306
                __first = ++__temp;
3307
        }
3308
    }
3309
    return __first;
3310
}
3311

    
3312
template <class _CharT, class _Traits>
3313
template <class _ForwardIterator>
3314
_ForwardIterator
3315
basic_regex<_CharT, _Traits>::__parse_Back_close_brace(_ForwardIterator __first,
3316
                                                       _ForwardIterator __last)
3317
{
3318
    if (__first != __last)
3319
    {
3320
        _ForwardIterator __temp = _VSTD::next(__first);
3321
        if (__temp != __last)
3322
        {
3323
            if (*__first == '\\' && *__temp == '}')
3324
                __first = ++__temp;
3325
        }
3326
    }
3327
    return __first;
3328
}
3329

    
3330
template <class _CharT, class _Traits>
3331
template <class _ForwardIterator>
3332
_ForwardIterator
3333
basic_regex<_CharT, _Traits>::__parse_BACKREF(_ForwardIterator __first,
3334
                                              _ForwardIterator __last)
3335
{
3336
    if (__first != __last)
3337
    {
3338
        _ForwardIterator __temp = _VSTD::next(__first);
3339
        if (__temp != __last)
3340
        {
3341
            if (*__first == '\\')
3342
            { 
3343
                int __val = __traits_.value(*__temp, 10);
3344
                if (__val >= 1 && __val <= 9)
3345
                {
3346
                    __push_back_ref(__val);
3347
                    __first = ++__temp;
3348
                }
3349
            }
3350
        }
3351
    }
3352
    return __first;
3353
}
3354

    
3355
template <class _CharT, class _Traits>
3356
template <class _ForwardIterator>
3357
_ForwardIterator
3358
basic_regex<_CharT, _Traits>::__parse_ORD_CHAR(_ForwardIterator __first,
3359
                                               _ForwardIterator __last)
3360
{
3361
    if (__first != __last)
3362
    {
3363
        _ForwardIterator __temp = _VSTD::next(__first);
3364
        if (__temp == __last && *__first == '$')
3365
            return __first;
3366
        // Not called inside a bracket
3367
        if (*__first == '.' || *__first == '\\' || *__first == '[')
3368
            return __first;
3369
        __push_char(*__first);
3370
        ++__first;
3371
    }
3372
    return __first;
3373
}
3374

    
3375
template <class _CharT, class _Traits>
3376
template <class _ForwardIterator>
3377
_ForwardIterator
3378
basic_regex<_CharT, _Traits>::__parse_ORD_CHAR_ERE(_ForwardIterator __first,
3379
                                                   _ForwardIterator __last)
3380
{
3381
    if (__first != __last)
3382
    {
3383
        switch (*__first)
3384
        {
3385
        case '^':
3386
        case '.':
3387
        case '[':
3388
        case '$':
3389
        case '(':
3390
        case '|':
3391
        case '*':
3392
        case '+':
3393
        case '?':
3394
        case '{':
3395
        case '\\':
3396
            break;
3397
        case ')':
3398
            if (__open_count_ == 0)
3399
            {
3400
                __push_char(*__first);
3401
                ++__first;
3402
            }
3403
            break;
3404
        default:
3405
            __push_char(*__first);
3406
            ++__first;
3407
            break;
3408
        }
3409
    }
3410
    return __first;
3411
}
3412

    
3413
template <class _CharT, class _Traits>
3414
template <class _ForwardIterator>
3415
_ForwardIterator
3416
basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR(_ForwardIterator __first,
3417
                                                  _ForwardIterator __last)
3418
{
3419
    if (__first != __last)
3420
    {
3421
        _ForwardIterator __temp = _VSTD::next(__first);
3422
        if (__temp != __last)
3423
        {
3424
            if (*__first == '\\')
3425
            {
3426
                switch (*__temp)
3427
                {
3428
                case '^':
3429
                case '.':
3430
                case '*':
3431
                case '[':
3432
                case '$':
3433
                case '\\':
3434
                    __push_char(*__temp);
3435
                    __first = ++__temp;
3436
                    break;
3437
                }
3438
            }
3439
        }
3440
    }
3441
    return __first;
3442
}
3443

    
3444
template <class _CharT, class _Traits>
3445
template <class _ForwardIterator>
3446
_ForwardIterator
3447
basic_regex<_CharT, _Traits>::__parse_QUOTED_CHAR_ERE(_ForwardIterator __first,
3448
                                                      _ForwardIterator __last)
3449
{
3450
    if (__first != __last)
3451
    {
3452
        _ForwardIterator __temp = _VSTD::next(__first);
3453
        if (__temp != __last)
3454
        {
3455
            if (*__first == '\\')
3456
            {
3457
                switch (*__temp)
3458
                {
3459
                case '^':
3460
                case '.':
3461
                case '*':
3462
                case '[':
3463
                case '$':
3464
                case '\\':
3465
                case '(':
3466
                case ')':
3467
                case '|':
3468
                case '+':
3469
                case '?':
3470
                case '{':
3471
                case '}':
3472
                    __push_char(*__temp);
3473
                    __first = ++__temp;
3474
                    break;
3475
                default:
3476
                    if ((__flags_ & 0x1F0) == awk)
3477
                        __first = __parse_awk_escape(++__first, __last);
3478
                    break;
3479
                }
3480
            }
3481
        }
3482
    }
3483
    return __first;
3484
}
3485

    
3486
template <class _CharT, class _Traits>
3487
template <class _ForwardIterator>
3488
_ForwardIterator
3489
basic_regex<_CharT, _Traits>::__parse_RE_dupl_symbol(_ForwardIterator __first,
3490
                                                     _ForwardIterator __last,
3491
                                                     __owns_one_state<_CharT>* __s,
3492
                                                     unsigned __mexp_begin,
3493
                                                     unsigned __mexp_end)
3494
{
3495
    if (__first != __last)
3496
    {
3497
        if (*__first == '*')
3498
        {
3499
            __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3500
            ++__first;
3501
        }
3502
        else
3503
        {
3504
            _ForwardIterator __temp = __parse_Back_open_brace(__first, __last);
3505
            if (__temp != __first)
3506
            {
3507
                int __min = 0;
3508
                __first = __temp;
3509
                __temp = __parse_DUP_COUNT(__first, __last, __min);
3510
                if (__temp == __first)
3511
                    __throw_regex_error<regex_constants::error_badbrace>();
3512
                __first = __temp;
3513
                if (__first == __last)
3514
                    __throw_regex_error<regex_constants::error_brace>();
3515
                if (*__first != ',')
3516
                {
3517
                    __temp = __parse_Back_close_brace(__first, __last);
3518
                    if (__temp == __first)
3519
                        __throw_regex_error<regex_constants::error_brace>();
3520
                    __push_loop(__min, __min, __s, __mexp_begin, __mexp_end,
3521
                                    true);
3522
                    __first = __temp;
3523
                }
3524
                else
3525
                {
3526
                    ++__first;  // consume ','
3527
                    int __max = -1;
3528
                    __first = __parse_DUP_COUNT(__first, __last, __max);
3529
                    __temp = __parse_Back_close_brace(__first, __last);
3530
                    if (__temp == __first)
3531
                        __throw_regex_error<regex_constants::error_brace>();
3532
                    if (__max == -1)
3533
                        __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3534
                    else
3535
                    {
3536
                        if (__max < __min)
3537
                            __throw_regex_error<regex_constants::error_badbrace>();
3538
                        __push_loop(__min, __max, __s, __mexp_begin, __mexp_end,
3539
                                    true);
3540
                    }
3541
                    __first = __temp;
3542
                }
3543
            }
3544
        }
3545
    }
3546
    return __first;
3547
}
3548

    
3549
template <class _CharT, class _Traits>
3550
template <class _ForwardIterator>
3551
_ForwardIterator
3552
basic_regex<_CharT, _Traits>::__parse_ERE_dupl_symbol(_ForwardIterator __first,
3553
                                                      _ForwardIterator __last,
3554
                                                      __owns_one_state<_CharT>* __s,
3555
                                                      unsigned __mexp_begin,
3556
                                                      unsigned __mexp_end)
3557
{
3558
    if (__first != __last)
3559
    {
3560
        unsigned __grammar = __flags_ & 0x1F0;
3561
        switch (*__first)
3562
        {
3563
        case '*':
3564
            ++__first;
3565
            if (__grammar == ECMAScript && __first != __last && *__first == '?')
3566
            {
3567
                ++__first;
3568
                __push_nongreedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3569
            }
3570
            else
3571
                __push_greedy_inf_repeat(0, __s, __mexp_begin, __mexp_end);
3572
            break;
3573
        case '+':
3574
            ++__first;
3575
            if (__grammar == ECMAScript && __first != __last && *__first == '?')
3576
            {
3577
                ++__first;
3578
                __push_nongreedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3579
            }
3580
            else
3581
                __push_greedy_inf_repeat(1, __s, __mexp_begin, __mexp_end);
3582
            break;
3583
        case '?':
3584
            ++__first;
3585
            if (__grammar == ECMAScript && __first != __last && *__first == '?')
3586
            {
3587
                ++__first;
3588
                __push_loop(0, 1, __s, __mexp_begin, __mexp_end, false);
3589
            }
3590
            else
3591
                __push_loop(0, 1, __s, __mexp_begin, __mexp_end);
3592
            break;
3593
        case '{':
3594
            {
3595
                int __min;
3596
                _ForwardIterator __temp = __parse_DUP_COUNT(++__first, __last, __min);
3597
                if (__temp == __first)
3598
                    __throw_regex_error<regex_constants::error_badbrace>();
3599
                __first = __temp;
3600
                if (__first == __last)
3601
                    __throw_regex_error<regex_constants::error_brace>();
3602
                switch (*__first)
3603
                {
3604
                case '}':
3605
                    ++__first;
3606
                    if (__grammar == ECMAScript && __first != __last && *__first == '?')
3607
                    {
3608
                        ++__first;
3609
                        __push_loop(__min, __min, __s, __mexp_begin, __mexp_end, false);
3610
                    }
3611
                    else
3612
                        __push_loop(__min, __min, __s, __mexp_begin, __mexp_end);
3613
                    break;
3614
                case ',':
3615
                    ++__first;
3616
                    if (__first == __last)
3617
                        __throw_regex_error<regex_constants::error_badbrace>();
3618
                    if (*__first == '}')
3619
                    {
3620
                        ++__first;
3621
                        if (__grammar == ECMAScript && __first != __last && *__first == '?')
3622
                        {
3623
                            ++__first;
3624
                            __push_nongreedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3625
                        }
3626
                        else
3627
                            __push_greedy_inf_repeat(__min, __s, __mexp_begin, __mexp_end);
3628
                    }
3629
                    else
3630
                    {
3631
                        int __max = -1;
3632
                        __temp = __parse_DUP_COUNT(__first, __last, __max);
3633
                        if (__temp == __first)
3634
                            __throw_regex_error<regex_constants::error_brace>();
3635
                        __first = __temp;
3636
                        if (__first == __last || *__first != '}')
3637
                            __throw_regex_error<regex_constants::error_brace>();
3638
                        ++__first;
3639
                        if (__max < __min)
3640
                            __throw_regex_error<regex_constants::error_badbrace>();
3641
                        if (__grammar == ECMAScript && __first != __last && *__first == '?')
3642
                        {
3643
                            ++__first;
3644
                            __push_loop(__min, __max, __s, __mexp_begin, __mexp_end, false);
3645
                        }
3646
                        else
3647
                            __push_loop(__min, __max, __s, __mexp_begin, __mexp_end);
3648
                    }
3649
                    break;
3650
                default:
3651
                    __throw_regex_error<regex_constants::error_badbrace>();
3652
                }
3653
            }
3654
            break;
3655
        }
3656
    }
3657
    return __first;
3658
}
3659

    
3660
template <class _CharT, class _Traits>
3661
template <class _ForwardIterator>
3662
_ForwardIterator
3663
basic_regex<_CharT, _Traits>::__parse_bracket_expression(_ForwardIterator __first,
3664
                                                         _ForwardIterator __last)
3665
{
3666
    if (__first != __last && *__first == '[')
3667
    {
3668
        ++__first;
3669
        if (__first == __last)
3670
            __throw_regex_error<regex_constants::error_brack>();
3671
        bool __negate = false;
3672
        if (*__first == '^')
3673
        {
3674
            ++__first;
3675
            __negate = true;
3676
        }
3677
        __bracket_expression<_CharT, _Traits>* __ml = __start_matching_list(__negate);
3678
        // __ml owned by *this
3679
        if (__first == __last)
3680
            __throw_regex_error<regex_constants::error_brack>();
3681
        if ((__flags_ & 0x1F0) != ECMAScript && *__first == ']')
3682
        {
3683
            __ml->__add_char(']');
3684
            ++__first;
3685
        }
3686
        __first = __parse_follow_list(__first, __last, __ml);
3687
        if (__first == __last)
3688
            __throw_regex_error<regex_constants::error_brack>();
3689
        if (*__first == '-')
3690
        {
3691
            __ml->__add_char('-');
3692
            ++__first;
3693
        }
3694
        if (__first == __last || *__first != ']')
3695
            __throw_regex_error<regex_constants::error_brack>();
3696
        ++__first;
3697
    }
3698
    return __first;
3699
}
3700

    
3701
template <class _CharT, class _Traits>
3702
template <class _ForwardIterator>
3703
_ForwardIterator
3704
basic_regex<_CharT, _Traits>::__parse_follow_list(_ForwardIterator __first,
3705
                                    _ForwardIterator __last,
3706
                                    __bracket_expression<_CharT, _Traits>* __ml)
3707
{
3708
    if (__first != __last)
3709
    {
3710
        while (true)
3711
        {
3712
            _ForwardIterator __temp = __parse_expression_term(__first, __last,
3713
                                                              __ml);
3714
            if (__temp == __first)
3715
                break;
3716
            __first = __temp;
3717
        }
3718
    }
3719
    return __first;
3720
}
3721

    
3722
template <class _CharT, class _Traits>
3723
template <class _ForwardIterator>
3724
_ForwardIterator
3725
basic_regex<_CharT, _Traits>::__parse_expression_term(_ForwardIterator __first,
3726
                                    _ForwardIterator __last,
3727
                                    __bracket_expression<_CharT, _Traits>* __ml)
3728
{
3729
    if (__first != __last && *__first != ']')
3730
    {
3731
        _ForwardIterator __temp = _VSTD::next(__first);
3732
        basic_string<_CharT> __start_range;
3733
        if (__temp != __last && *__first == '[')
3734
        {
3735
            if (*__temp == '=')
3736
                return __parse_equivalence_class(++__temp, __last, __ml);
3737
            else if (*__temp == ':')
3738
                return __parse_character_class(++__temp, __last, __ml);
3739
            else if (*__temp == '.')
3740
                __first = __parse_collating_symbol(++__temp, __last, __start_range);
3741
        }
3742
        unsigned __grammar = __flags_ & 0x1F0;
3743
        if (__start_range.empty())
3744
        {
3745
            if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3746
            {
3747
                if (__grammar == ECMAScript)
3748
                    __first = __parse_class_escape(++__first, __last, __start_range, __ml);
3749
                else
3750
                    __first = __parse_awk_escape(++__first, __last, &__start_range);
3751
            }
3752
            else
3753
            {
3754
                __start_range = *__first;
3755
                ++__first;
3756
            }
3757
        }
3758
        if (__first != __last && *__first != ']')
3759
        {
3760
            __temp = _VSTD::next(__first);
3761
            if (__temp != __last && *__first == '-' && *__temp != ']')
3762
            {
3763
                // parse a range
3764
                basic_string<_CharT> __end_range;
3765
                __first = __temp;
3766
                ++__temp;
3767
                if (__temp != __last && *__first == '[' && *__temp == '.')
3768
                    __first = __parse_collating_symbol(++__temp, __last, __end_range);
3769
                else
3770
                {
3771
                    if ((__grammar == ECMAScript || __grammar == awk) && *__first == '\\')
3772
                    {
3773
                        if (__grammar == ECMAScript)
3774
                            __first = __parse_class_escape(++__first, __last,
3775
                                                           __end_range, __ml);
3776
                        else
3777
                            __first = __parse_awk_escape(++__first, __last,
3778
                                                         &__end_range);
3779
                    }
3780
                    else
3781
                    {
3782
                        __end_range = *__first;
3783
                        ++__first;
3784
                    }
3785
                }
3786
                __ml->__add_range(_VSTD::move(__start_range), _VSTD::move(__end_range));
3787
            }
3788
            else if (!__start_range.empty())
3789
            {
3790
                if (__start_range.size() == 1)
3791
                    __ml->__add_char(__start_range[0]);
3792
                else
3793
                    __ml->__add_digraph(__start_range[0], __start_range[1]);
3794
            }
3795
        }
3796
        else if (!__start_range.empty())
3797
        {
3798
            if (__start_range.size() == 1)
3799
                __ml->__add_char(__start_range[0]);
3800
            else
3801
                __ml->__add_digraph(__start_range[0], __start_range[1]);
3802
        }
3803
    }
3804
    return __first;
3805
}
3806

    
3807
template <class _CharT, class _Traits>
3808
template <class _ForwardIterator>
3809
_ForwardIterator
3810
basic_regex<_CharT, _Traits>::__parse_class_escape(_ForwardIterator __first,
3811
                          _ForwardIterator __last,
3812
                          basic_string<_CharT>& __str,
3813
                          __bracket_expression<_CharT, _Traits>* __ml)
3814
{
3815
    if (__first == __last)
3816
        __throw_regex_error<regex_constants::error_escape>();
3817
    switch (*__first)
3818
    {
3819
    case 0:
3820
        __str = *__first;
3821
        return ++__first;
3822
    case 'b':
3823
        __str = _CharT(8);
3824
        return ++__first;
3825
    case 'd':
3826
        __ml->__add_class(ctype_base::digit);
3827
        return ++__first;
3828
    case 'D':
3829
        __ml->__add_neg_class(ctype_base::digit);
3830
        return ++__first;
3831
    case 's':
3832
        __ml->__add_class(ctype_base::space);
3833
        return ++__first;
3834
    case 'S':
3835
        __ml->__add_neg_class(ctype_base::space);
3836
        return ++__first;
3837
    case 'w':
3838
        __ml->__add_class(ctype_base::alnum);
3839
        __ml->__add_char('_');
3840
        return ++__first;
3841
    case 'W':
3842
        __ml->__add_neg_class(ctype_base::alnum);
3843
        __ml->__add_neg_char('_');
3844
        return ++__first;
3845
    }
3846
    __first = __parse_character_escape(__first, __last, &__str);
3847
    return __first;
3848
}
3849

    
3850
template <class _CharT, class _Traits>
3851
template <class _ForwardIterator>
3852
_ForwardIterator
3853
basic_regex<_CharT, _Traits>::__parse_awk_escape(_ForwardIterator __first,
3854
                          _ForwardIterator __last,
3855
                          basic_string<_CharT>* __str)
3856
{
3857
    if (__first == __last)
3858
        __throw_regex_error<regex_constants::error_escape>();
3859
    switch (*__first)
3860
    {
3861
    case '\\':
3862
    case '"':
3863
    case '/':
3864
        if (__str)
3865
            *__str = *__first;
3866
        else
3867
            __push_char(*__first);
3868
        return ++__first;
3869
    case 'a':
3870
        if (__str)
3871
            *__str = _CharT(7);
3872
        else
3873
            __push_char(_CharT(7));
3874
        return ++__first;
3875
    case 'b':
3876
        if (__str)
3877
            *__str = _CharT(8);
3878
        else
3879
            __push_char(_CharT(8));
3880
        return ++__first;
3881
    case 'f':
3882
        if (__str)
3883
            *__str = _CharT(0xC);
3884
        else
3885
            __push_char(_CharT(0xC));
3886
        return ++__first;
3887
    case 'n':
3888
        if (__str)
3889
            *__str = _CharT(0xA);
3890
        else
3891
            __push_char(_CharT(0xA));
3892
        return ++__first;
3893
    case 'r':
3894
        if (__str)
3895
            *__str = _CharT(0xD);
3896
        else
3897
            __push_char(_CharT(0xD));
3898
        return ++__first;
3899
    case 't':
3900
        if (__str)
3901
            *__str = _CharT(0x9);
3902
        else
3903
            __push_char(_CharT(0x9));
3904
        return ++__first;
3905
    case 'v':
3906
        if (__str)
3907
            *__str = _CharT(0xB);
3908
        else
3909
            __push_char(_CharT(0xB));
3910
        return ++__first;
3911
    }
3912
    if ('0' <= *__first && *__first <= '7')
3913
    {
3914
        unsigned __val = *__first - '0';
3915
        if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3916
        {
3917
            __val = 8 * __val + *__first - '0';
3918
            if (++__first != __last && ('0' <= *__first && *__first <= '7'))
3919
                __val = 8 * __val + *__first++ - '0';
3920
        }
3921
        if (__str)
3922
            *__str = _CharT(__val);
3923
        else
3924
            __push_char(_CharT(__val));
3925
    }
3926
    else
3927
        __throw_regex_error<regex_constants::error_escape>();
3928
    return __first;
3929
}
3930

    
3931
template <class _CharT, class _Traits>
3932
template <class _ForwardIterator>
3933
_ForwardIterator
3934
basic_regex<_CharT, _Traits>::__parse_equivalence_class(_ForwardIterator __first,
3935
                                    _ForwardIterator __last,
3936
                                    __bracket_expression<_CharT, _Traits>* __ml)
3937
{
3938
    // Found [=
3939
    //   This means =] must exist
3940
    value_type _Equal_close[2] = {'=', ']'};
3941
    _ForwardIterator __temp = _VSTD::search(__first, __last, _Equal_close,
3942
                                                            _Equal_close+2);
3943
    if (__temp == __last)
3944
        __throw_regex_error<regex_constants::error_brack>();
3945
    // [__first, __temp) contains all text in [= ... =]
3946
    typedef typename _Traits::string_type string_type;
3947
    string_type __collate_name =
3948
        __traits_.lookup_collatename(__first, __temp);
3949
    if (__collate_name.empty())
3950
        __throw_regex_error<regex_constants::error_collate>();
3951
    string_type __equiv_name =
3952
        __traits_.transform_primary(__collate_name.begin(),
3953
                                    __collate_name.end());
3954
    if (!__equiv_name.empty())
3955
        __ml->__add_equivalence(__equiv_name);
3956
    else
3957
    {
3958
        switch (__collate_name.size())
3959
        {
3960
        case 1:
3961
            __ml->__add_char(__collate_name[0]);
3962
            break;
3963
        case 2:
3964
            __ml->__add_digraph(__collate_name[0], __collate_name[1]);
3965
            break;
3966
        default:
3967
            __throw_regex_error<regex_constants::error_collate>();
3968
        }
3969
    }
3970
    __first = _VSTD::next(__temp, 2);
3971
    return __first;
3972
}
3973

    
3974
template <class _CharT, class _Traits>
3975
template <class _ForwardIterator>
3976
_ForwardIterator
3977
basic_regex<_CharT, _Traits>::__parse_character_class(_ForwardIterator __first,
3978
                                    _ForwardIterator __last,
3979
                                    __bracket_expression<_CharT, _Traits>* __ml)
3980
{
3981
    // Found [:
3982
    //   This means :] must exist
3983
    value_type _Colon_close[2] = {':', ']'};
3984
    _ForwardIterator __temp = _VSTD::search(__first, __last, _Colon_close,
3985
                                                            _Colon_close+2);
3986
    if (__temp == __last)
3987
        __throw_regex_error<regex_constants::error_brack>();
3988
    // [__first, __temp) contains all text in [: ... :]
3989
    typedef typename _Traits::char_class_type char_class_type;
3990
    char_class_type __class_type =
3991
        __traits_.lookup_classname(__first, __temp, __flags_ & icase);
3992
    if (__class_type == 0)
3993
        __throw_regex_error<regex_constants::error_brack>();
3994
    __ml->__add_class(__class_type);
3995
    __first = _VSTD::next(__temp, 2);
3996
    return __first;
3997
}
3998

    
3999
template <class _CharT, class _Traits>
4000
template <class _ForwardIterator>
4001
_ForwardIterator
4002
basic_regex<_CharT, _Traits>::__parse_collating_symbol(_ForwardIterator __first,
4003
                                                _ForwardIterator __last,
4004
                                                basic_string<_CharT>& __col_sym)
4005
{
4006
    // Found [.
4007
    //   This means .] must exist
4008
    value_type _Dot_close[2] = {'.', ']'};
4009
    _ForwardIterator __temp = _VSTD::search(__first, __last, _Dot_close,
4010
                                                            _Dot_close+2);
4011
    if (__temp == __last)
4012
        __throw_regex_error<regex_constants::error_brack>();
4013
    // [__first, __temp) contains all text in [. ... .]
4014
    __col_sym = __traits_.lookup_collatename(__first, __temp);
4015
    switch (__col_sym.size())
4016
    {
4017
    case 1:
4018
    case 2:
4019
        break;
4020
    default:
4021
        __throw_regex_error<regex_constants::error_collate>();
4022
    }
4023
    __first = _VSTD::next(__temp, 2);
4024
    return __first;
4025
}
4026

    
4027
template <class _CharT, class _Traits>
4028
template <class _ForwardIterator>
4029
_ForwardIterator
4030
basic_regex<_CharT, _Traits>::__parse_DUP_COUNT(_ForwardIterator __first,
4031
                                                _ForwardIterator __last,
4032
                                                int& __c)
4033
{
4034
    if (__first != __last )
4035
    {
4036
        int __val = __traits_.value(*__first, 10);
4037
        if ( __val != -1 )
4038
        {
4039
            __c = __val;
4040
            for (++__first; 
4041
                 __first != __last && ( __val = __traits_.value(*__first, 10)) != -1;
4042
                 ++__first)
4043
            {
4044
                __c *= 10;
4045
                __c += __val;
4046
            }
4047
        }
4048
    }
4049
    return __first;
4050
}
4051

    
4052
template <class _CharT, class _Traits>
4053
template <class _ForwardIterator>
4054
_ForwardIterator
4055
basic_regex<_CharT, _Traits>::__parse_ecma_exp(_ForwardIterator __first,
4056
                                               _ForwardIterator __last)
4057
{
4058
    __owns_one_state<_CharT>* __sa = __end_;
4059
    _ForwardIterator __temp = __parse_alternative(__first, __last);
4060
    if (__temp == __first)
4061
        __push_empty();
4062
    __first = __temp;
4063
    while (__first != __last && *__first == '|')
4064
    {
4065
        __owns_one_state<_CharT>* __sb = __end_;
4066
        __temp = __parse_alternative(++__first, __last);
4067
        if (__temp == __first)
4068
            __push_empty();
4069
        __push_alternation(__sa, __sb);
4070
        __first = __temp;
4071
    }
4072
    return __first;
4073
}
4074

    
4075
template <class _CharT, class _Traits>
4076
template <class _ForwardIterator>
4077
_ForwardIterator
4078
basic_regex<_CharT, _Traits>::__parse_alternative(_ForwardIterator __first,
4079
                                                  _ForwardIterator __last)
4080
{
4081
    while (true)
4082
    {
4083
        _ForwardIterator __temp = __parse_term(__first, __last);
4084
        if (__temp == __first)
4085
            break;
4086
        __first = __temp;
4087
    }
4088
    return __first;
4089
}
4090

    
4091
template <class _CharT, class _Traits>
4092
template <class _ForwardIterator>
4093
_ForwardIterator
4094
basic_regex<_CharT, _Traits>::__parse_term(_ForwardIterator __first,
4095
                                           _ForwardIterator __last)
4096
{
4097
    _ForwardIterator __temp = __parse_assertion(__first, __last);
4098
    if (__temp == __first)
4099
    {
4100
        __owns_one_state<_CharT>* __e = __end_;
4101
        unsigned __mexp_begin = __marked_count_;
4102
        __temp = __parse_atom(__first, __last);
4103
        if (__temp != __first)
4104
            __first = __parse_ERE_dupl_symbol(__temp, __last, __e,
4105
                                              __mexp_begin+1, __marked_count_+1);
4106
    }
4107
    else
4108
        __first = __temp;
4109
    return __first;
4110
}
4111

    
4112
template <class _CharT, class _Traits>
4113
template <class _ForwardIterator>
4114
_ForwardIterator
4115
basic_regex<_CharT, _Traits>::__parse_assertion(_ForwardIterator __first,
4116
                                                _ForwardIterator __last)
4117
{
4118
    if (__first != __last)
4119
    {
4120
        switch (*__first)
4121
        {
4122
        case '^':
4123
            __push_l_anchor();
4124
            ++__first;
4125
            break;
4126
        case '$':
4127
            __push_r_anchor();
4128
            ++__first;
4129
            break;
4130
        case '\\':
4131
            {
4132
                _ForwardIterator __temp = _VSTD::next(__first);
4133
                if (__temp != __last)
4134
                {
4135
                    if (*__temp == 'b')
4136
                    {
4137
                        __push_word_boundary(false);
4138
                        __first = ++__temp;
4139
                    }
4140
                    else if (*__temp == 'B')
4141
                    {
4142
                        __push_word_boundary(true);
4143
                        __first = ++__temp;
4144
                    }
4145
                }
4146
            }
4147
            break;
4148
        case '(':
4149
            {
4150
                _ForwardIterator __temp = _VSTD::next(__first);
4151
                if (__temp != __last && *__temp == '?')
4152
                {
4153
                    if (++__temp != __last)
4154
                    {
4155
                        switch (*__temp)
4156
                        {
4157
                        case '=':
4158
                            {
4159
                                basic_regex __exp;
4160
                                __exp.__flags_ = __flags_;
4161
                                __temp = __exp.__parse(++__temp, __last);
4162
                                unsigned __mexp = __exp.__marked_count_;
4163
                                __push_lookahead(_VSTD::move(__exp), false, __marked_count_);
4164
                                __marked_count_ += __mexp;
4165
                                if (__temp == __last || *__temp != ')')
4166
                                    __throw_regex_error<regex_constants::error_paren>();
4167
                                __first = ++__temp;
4168
                            }
4169
                            break;
4170
                        case '!':
4171
                            {
4172
                                basic_regex __exp;
4173
                                __exp.__flags_ = __flags_;
4174
                                __temp = __exp.__parse(++__temp, __last);
4175
                                unsigned __mexp = __exp.__marked_count_;
4176
                                __push_lookahead(_VSTD::move(__exp), true, __marked_count_);
4177
                                __marked_count_ += __mexp;
4178
                                if (__temp == __last || *__temp != ')')
4179
                                    __throw_regex_error<regex_constants::error_paren>();
4180
                                __first = ++__temp;
4181
                            }
4182
                            break;
4183
                        }
4184
                    }
4185
                }
4186
            }
4187
            break;
4188
        }
4189
    }
4190
    return __first;
4191
}
4192

    
4193
template <class _CharT, class _Traits>
4194
template <class _ForwardIterator>
4195
_ForwardIterator
4196
basic_regex<_CharT, _Traits>::__parse_atom(_ForwardIterator __first,
4197
                                           _ForwardIterator __last)
4198
{
4199
    if (__first != __last)
4200
    {
4201
        switch (*__first)
4202
        {
4203
        case '.':
4204
            __push_match_any_but_newline();
4205
            ++__first;
4206
            break;
4207
        case '\\':
4208
            __first = __parse_atom_escape(__first, __last);
4209
            break;
4210
        case '[':
4211
            __first = __parse_bracket_expression(__first, __last);
4212
            break;
4213
        case '(':
4214
            {
4215
                ++__first;
4216
                if (__first == __last)
4217
                    __throw_regex_error<regex_constants::error_paren>();
4218
                _ForwardIterator __temp = _VSTD::next(__first);
4219
                if (__temp != __last && *__first == '?' && *__temp == ':')
4220
                {
4221
                    ++__open_count_;
4222
                    __first = __parse_ecma_exp(++__temp, __last);
4223
                    if (__first == __last || *__first != ')')
4224
                        __throw_regex_error<regex_constants::error_paren>();
4225
                    --__open_count_;
4226
                    ++__first;
4227
                }
4228
                else
4229
                {
4230
                    __push_begin_marked_subexpression();
4231
                    unsigned __temp_count = __marked_count_;
4232
                    ++__open_count_;
4233
                    __first = __parse_ecma_exp(__first, __last);
4234
                    if (__first == __last || *__first != ')')
4235
                        __throw_regex_error<regex_constants::error_paren>();
4236
                    __push_end_marked_subexpression(__temp_count);
4237
                    --__open_count_;
4238
                    ++__first;
4239
                }
4240
            }
4241
            break;
4242
        case '*':
4243
        case '+':
4244
        case '?':
4245
        case '{':
4246
            __throw_regex_error<regex_constants::error_badrepeat>();
4247
            break;
4248
        default:
4249
            __first = __parse_pattern_character(__first, __last);
4250
            break;
4251
        }
4252
    }
4253
    return __first;
4254
}
4255

    
4256
template <class _CharT, class _Traits>
4257
template <class _ForwardIterator>
4258
_ForwardIterator
4259
basic_regex<_CharT, _Traits>::__parse_atom_escape(_ForwardIterator __first,
4260
                                                  _ForwardIterator __last)
4261
{
4262
    if (__first != __last && *__first == '\\')
4263
    {
4264
        _ForwardIterator __t1 = _VSTD::next(__first);
4265
        _ForwardIterator __t2 = __parse_decimal_escape(__t1, __last);
4266
        if (__t2 != __t1)
4267
            __first = __t2;
4268
        else
4269
        {
4270
            __t2 = __parse_character_class_escape(__t1, __last);
4271
            if (__t2 != __t1)
4272
                __first = __t2;
4273
            else
4274
            {
4275
                __t2 = __parse_character_escape(__t1, __last);
4276
                if (__t2 != __t1)
4277
                    __first = __t2;
4278
            }
4279
        }
4280
    }
4281
    return __first;
4282
}
4283

    
4284
template <class _CharT, class _Traits>
4285
template <class _ForwardIterator>
4286
_ForwardIterator
4287
basic_regex<_CharT, _Traits>::__parse_decimal_escape(_ForwardIterator __first,
4288
                                                     _ForwardIterator __last)
4289
{
4290
    if (__first != __last)
4291
    {
4292
        if (*__first == '0')
4293
        {
4294
            __push_char(_CharT());
4295
            ++__first;
4296
        }
4297
        else if ('1' <= *__first && *__first <= '9')
4298
        {
4299
            unsigned __v = *__first - '0';
4300
            for (++__first; '0' <= *__first && *__first <= '9'; ++__first)
4301
                __v = 10 * __v + *__first - '0';
4302
            if (__v > mark_count())
4303
                __throw_regex_error<regex_constants::error_backref>();
4304
            __push_back_ref(__v);
4305
        }
4306
    }
4307
    return __first;
4308
}
4309

    
4310
template <class _CharT, class _Traits>
4311
template <class _ForwardIterator>
4312
_ForwardIterator
4313
basic_regex<_CharT, _Traits>::__parse_character_class_escape(_ForwardIterator __first,
4314
                                                             _ForwardIterator __last)
4315
{
4316
    if (__first != __last)
4317
    {
4318
        __bracket_expression<_CharT, _Traits>* __ml;
4319
        switch (*__first)
4320
        {
4321
        case 'd':
4322
            __ml = __start_matching_list(false);
4323
            __ml->__add_class(ctype_base::digit);
4324
            ++__first;
4325
            break;
4326
        case 'D':
4327
            __ml = __start_matching_list(true);
4328
            __ml->__add_class(ctype_base::digit);
4329
            ++__first;
4330
            break;
4331
        case 's':
4332
            __ml = __start_matching_list(false);
4333
            __ml->__add_class(ctype_base::space);
4334
            ++__first;
4335
            break;
4336
        case 'S':
4337
            __ml = __start_matching_list(true);
4338
            __ml->__add_class(ctype_base::space);
4339
            ++__first;
4340
            break;
4341
        case 'w':
4342
            __ml = __start_matching_list(false);
4343
            __ml->__add_class(ctype_base::alnum);
4344
            __ml->__add_char('_');
4345
            ++__first;
4346
            break;
4347
        case 'W':
4348
            __ml = __start_matching_list(true);
4349
            __ml->__add_class(ctype_base::alnum);
4350
            __ml->__add_char('_');
4351
            ++__first;
4352
            break;
4353
        }
4354
    }
4355
    return __first;
4356
}
4357

    
4358
template <class _CharT, class _Traits>
4359
template <class _ForwardIterator>
4360
_ForwardIterator
4361
basic_regex<_CharT, _Traits>::__parse_character_escape(_ForwardIterator __first,
4362
                                                    _ForwardIterator __last,
4363
                                                    basic_string<_CharT>* __str)
4364
{
4365
    if (__first != __last)
4366
    {
4367
        _ForwardIterator __t;
4368
        unsigned __sum = 0;
4369
        int __hd;
4370
        switch (*__first)
4371
        {
4372
        case 'f':
4373
            if (__str)
4374
                *__str = _CharT(0xC);
4375
            else
4376
                __push_char(_CharT(0xC));
4377
            ++__first;
4378
            break;
4379
        case 'n':
4380
            if (__str)
4381
                *__str = _CharT(0xA);
4382
            else
4383
                __push_char(_CharT(0xA));
4384
            ++__first;
4385
            break;
4386
        case 'r':
4387
            if (__str)
4388
                *__str = _CharT(0xD);
4389
            else
4390
                __push_char(_CharT(0xD));
4391
            ++__first;
4392
            break;
4393
        case 't':
4394
            if (__str)
4395
                *__str = _CharT(0x9);
4396
            else
4397
                __push_char(_CharT(0x9));
4398
            ++__first;
4399
            break;
4400
        case 'v':
4401
            if (__str)
4402
                *__str = _CharT(0xB);
4403
            else
4404
                __push_char(_CharT(0xB));
4405
            ++__first;
4406
            break;
4407
        case 'c':
4408
            if ((__t = _VSTD::next(__first)) != __last)
4409
            {
4410
                if (('A' <= *__t && *__t <= 'Z') || 
4411
                    ('a' <= *__t && *__t <= 'z'))
4412
                {
4413
                    if (__str)
4414
                        *__str = _CharT(*__t % 32);
4415
                    else
4416
                        __push_char(_CharT(*__t % 32));
4417
                    __first = ++__t;
4418
                }
4419
                else 
4420
                    __throw_regex_error<regex_constants::error_escape>();
4421
            }
4422
            else
4423
                __throw_regex_error<regex_constants::error_escape>();
4424
            break;
4425
        case 'u':
4426
            ++__first;
4427
            if (__first == __last)
4428
                __throw_regex_error<regex_constants::error_escape>();
4429
            __hd = __traits_.value(*__first, 16);
4430
            if (__hd == -1)
4431
                __throw_regex_error<regex_constants::error_escape>();
4432
            __sum = 16 * __sum + static_cast<unsigned>(__hd);
4433
            ++__first;
4434
            if (__first == __last)
4435
                __throw_regex_error<regex_constants::error_escape>();
4436
            __hd = __traits_.value(*__first, 16);
4437
            if (__hd == -1)
4438
                __throw_regex_error<regex_constants::error_escape>();
4439
            __sum = 16 * __sum + static_cast<unsigned>(__hd);
4440
            // drop through
4441
        case 'x':
4442
            ++__first;
4443
            if (__first == __last)
4444
                __throw_regex_error<regex_constants::error_escape>();
4445
            __hd = __traits_.value(*__first, 16);
4446
            if (__hd == -1)
4447
                __throw_regex_error<regex_constants::error_escape>();
4448
            __sum = 16 * __sum + static_cast<unsigned>(__hd);
4449
            ++__first;
4450
            if (__first == __last)
4451
                __throw_regex_error<regex_constants::error_escape>();
4452
            __hd = __traits_.value(*__first, 16);
4453
            if (__hd == -1)
4454
                __throw_regex_error<regex_constants::error_escape>();
4455
            __sum = 16 * __sum + static_cast<unsigned>(__hd);
4456
            if (__str)
4457
                *__str = _CharT(__sum);
4458
            else
4459
                __push_char(_CharT(__sum));
4460
            ++__first;
4461
            break;
4462
        case '0':
4463
            if (__str)
4464
                *__str = _CharT(0);
4465
            else
4466
                __push_char(_CharT(0));
4467
            ++__first;
4468
            break;
4469
        default:
4470
            if (*__first != '_' && !__traits_.isctype(*__first, ctype_base::alnum))
4471
            {
4472
                if (__str)
4473
                    *__str = *__first;
4474
                else
4475
                    __push_char(*__first);
4476
                ++__first;
4477
            }
4478
            else
4479
                __throw_regex_error<regex_constants::error_escape>();
4480
            break;
4481
        }
4482
    }
4483
    return __first;
4484
}
4485

    
4486
template <class _CharT, class _Traits>
4487
template <class _ForwardIterator>
4488
_ForwardIterator
4489
basic_regex<_CharT, _Traits>::__parse_pattern_character(_ForwardIterator __first,
4490
                                                        _ForwardIterator __last)
4491
{
4492
    if (__first != __last)
4493
    {
4494
        switch (*__first)
4495
        {
4496
        case '^':
4497
        case '$':
4498
        case '\\':
4499
        case '.':
4500
        case '*':
4501
        case '+':
4502
        case '?':
4503
        case '(':
4504
        case ')':
4505
        case '[':
4506
        case ']':
4507
        case '{':
4508
        case '}':
4509
        case '|':
4510
            break;
4511
        default:
4512
            __push_char(*__first);
4513
            ++__first;
4514
            break;
4515
        }
4516
    }
4517
    return __first;
4518
}
4519

    
4520
template <class _CharT, class _Traits>
4521
template <class _ForwardIterator>
4522
_ForwardIterator
4523
basic_regex<_CharT, _Traits>::__parse_grep(_ForwardIterator __first,
4524
                                           _ForwardIterator __last)
4525
{
4526
    __owns_one_state<_CharT>* __sa = __end_;
4527
    _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4528
    if (__t1 != __first)
4529
        __parse_basic_reg_exp(__first, __t1);
4530
    else
4531
        __push_empty();
4532
    __first = __t1;
4533
    if (__first != __last)
4534
        ++__first;
4535
    while (__first != __last)
4536
    {
4537
        __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4538
        __owns_one_state<_CharT>* __sb = __end_;
4539
        if (__t1 != __first)
4540
            __parse_basic_reg_exp(__first, __t1);
4541
        else
4542
            __push_empty();
4543
        __push_alternation(__sa, __sb);
4544
        __first = __t1;
4545
        if (__first != __last)
4546
            ++__first;
4547
    }
4548
    return __first;
4549
}
4550

    
4551
template <class _CharT, class _Traits>
4552
template <class _ForwardIterator>
4553
_ForwardIterator
4554
basic_regex<_CharT, _Traits>::__parse_egrep(_ForwardIterator __first,
4555
                                            _ForwardIterator __last)
4556
{
4557
    __owns_one_state<_CharT>* __sa = __end_;
4558
    _ForwardIterator __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4559
    if (__t1 != __first)
4560
        __parse_extended_reg_exp(__first, __t1);
4561
    else
4562
        __push_empty();
4563
    __first = __t1;
4564
    if (__first != __last)
4565
        ++__first;
4566
    while (__first != __last)
4567
    {
4568
        __t1 = _VSTD::find(__first, __last, _CharT('\n'));
4569
        __owns_one_state<_CharT>* __sb = __end_;
4570
        if (__t1 != __first)
4571
            __parse_extended_reg_exp(__first, __t1);
4572
        else
4573
            __push_empty();
4574
        __push_alternation(__sa, __sb);
4575
        __first = __t1;
4576
        if (__first != __last)
4577
            ++__first;
4578
    }
4579
    return __first;
4580
}
4581

    
4582
template <class _CharT, class _Traits>
4583
void
4584
basic_regex<_CharT, _Traits>::__push_loop(size_t __min, size_t __max,
4585
        __owns_one_state<_CharT>* __s, size_t __mexp_begin, size_t __mexp_end,
4586
        bool __greedy)
4587
{
4588
    unique_ptr<__empty_state<_CharT> > __e1(new __empty_state<_CharT>(__end_->first()));
4589
    __end_->first() = nullptr;
4590
    unique_ptr<__loop<_CharT> > __e2(new __loop<_CharT>(__loop_count_,
4591
                __s->first(), __e1.get(), __mexp_begin, __mexp_end, __greedy,
4592
                __min, __max));
4593
    __s->first() = nullptr;
4594
    __e1.release();
4595
    __end_->first() = new __repeat_one_loop<_CharT>(__e2.get());
4596
    __end_ = __e2->second();
4597
    __s->first() = __e2.release();
4598
    ++__loop_count_;
4599
}
4600

    
4601
template <class _CharT, class _Traits>
4602
void
4603
basic_regex<_CharT, _Traits>::__push_char(value_type __c)
4604
{
4605
    if (flags() & icase)
4606
        __end_->first() = new __match_char_icase<_CharT, _Traits>
4607
                                              (__traits_, __c, __end_->first());
4608
    else if (flags() & collate)
4609
        __end_->first() = new __match_char_collate<_CharT, _Traits>
4610
                                              (__traits_, __c, __end_->first());
4611
    else
4612
        __end_->first() = new __match_char<_CharT>(__c, __end_->first());
4613
    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4614
}
4615

    
4616
template <class _CharT, class _Traits>
4617
void
4618
basic_regex<_CharT, _Traits>::__push_begin_marked_subexpression()
4619
{
4620
    if (!(__flags_ & nosubs))
4621
    {
4622
        __end_->first() =
4623
                new __begin_marked_subexpression<_CharT>(++__marked_count_,
4624
                                                         __end_->first());
4625
        __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4626
    }
4627
}
4628

    
4629
template <class _CharT, class _Traits>
4630
void
4631
basic_regex<_CharT, _Traits>::__push_end_marked_subexpression(unsigned __sub)
4632
{
4633
    if (!(__flags_ & nosubs))
4634
    {
4635
        __end_->first() =
4636
                new __end_marked_subexpression<_CharT>(__sub, __end_->first());
4637
        __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4638
    }
4639
}
4640

    
4641
template <class _CharT, class _Traits>
4642
void
4643
basic_regex<_CharT, _Traits>::__push_l_anchor()
4644
{
4645
    __end_->first() = new __l_anchor<_CharT>(__end_->first());
4646
    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4647
}
4648

    
4649
template <class _CharT, class _Traits>
4650
void
4651
basic_regex<_CharT, _Traits>::__push_r_anchor()
4652
{
4653
    __end_->first() = new __r_anchor<_CharT>(__end_->first());
4654
    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4655
}
4656

    
4657
template <class _CharT, class _Traits>
4658
void
4659
basic_regex<_CharT, _Traits>::__push_match_any()
4660
{
4661
    __end_->first() = new __match_any<_CharT>(__end_->first());
4662
    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4663
}
4664

    
4665
template <class _CharT, class _Traits>
4666
void
4667
basic_regex<_CharT, _Traits>::__push_match_any_but_newline()
4668
{
4669
    __end_->first() = new __match_any_but_newline<_CharT>(__end_->first());
4670
    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4671
}
4672

    
4673
template <class _CharT, class _Traits>
4674
void
4675
basic_regex<_CharT, _Traits>::__push_empty()
4676
{
4677
    __end_->first() = new __empty_state<_CharT>(__end_->first());
4678
    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4679
}
4680

    
4681
template <class _CharT, class _Traits>
4682
void
4683
basic_regex<_CharT, _Traits>::__push_word_boundary(bool __invert)
4684
{
4685
    __end_->first() = new __word_boundary<_CharT, _Traits>(__traits_, __invert,
4686
                                                           __end_->first());
4687
    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4688
}
4689

    
4690
template <class _CharT, class _Traits>
4691
void
4692
basic_regex<_CharT, _Traits>::__push_back_ref(int __i)
4693
{
4694
    if (flags() & icase)
4695
        __end_->first() = new __back_ref_icase<_CharT, _Traits>
4696
                                              (__traits_, __i, __end_->first());
4697
    else if (flags() & collate)
4698
        __end_->first() = new __back_ref_collate<_CharT, _Traits>
4699
                                              (__traits_, __i, __end_->first());
4700
    else
4701
        __end_->first() = new __back_ref<_CharT>(__i, __end_->first());
4702
    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4703
}
4704

    
4705
template <class _CharT, class _Traits>
4706
void
4707
basic_regex<_CharT, _Traits>::__push_alternation(__owns_one_state<_CharT>* __sa,
4708
                                                 __owns_one_state<_CharT>* __ea)
4709
{
4710
    __sa->first() = new __alternate<_CharT>(
4711
                         static_cast<__owns_one_state<_CharT>*>(__sa->first()),
4712
                         static_cast<__owns_one_state<_CharT>*>(__ea->first()));
4713
    __ea->first() = nullptr;
4714
    __ea->first() = new __empty_state<_CharT>(__end_->first());
4715
    __end_->first() = nullptr;
4716
    __end_->first() = new __empty_non_own_state<_CharT>(__ea->first());
4717
    __end_ = static_cast<__owns_one_state<_CharT>*>(__ea->first());
4718
}
4719

    
4720
template <class _CharT, class _Traits>
4721
__bracket_expression<_CharT, _Traits>*
4722
basic_regex<_CharT, _Traits>::__start_matching_list(bool __negate)
4723
{
4724
    __bracket_expression<_CharT, _Traits>* __r =
4725
        new __bracket_expression<_CharT, _Traits>(__traits_, __end_->first(),
4726
                                                  __negate, __flags_ & icase,
4727
                                                  __flags_ & collate);
4728
    __end_->first() = __r;
4729
    __end_ = __r;
4730
    return __r;
4731
}
4732

    
4733
template <class _CharT, class _Traits>
4734
void
4735
basic_regex<_CharT, _Traits>::__push_lookahead(const basic_regex& __exp,
4736
                                               bool __invert,
4737
                                               unsigned __mexp)
4738
{
4739
    __end_->first() = new __lookahead<_CharT, _Traits>(__exp, __invert,
4740
                                                           __end_->first(), __mexp);
4741
    __end_ = static_cast<__owns_one_state<_CharT>*>(__end_->first());
4742
}
4743

    
4744
typedef basic_regex<char>    regex;
4745
typedef basic_regex<wchar_t> wregex;
4746

    
4747
// sub_match
4748

    
4749
template <class _BidirectionalIterator>
4750
class _LIBCPP_TYPE_VIS_ONLY sub_match
4751
    : public pair<_BidirectionalIterator, _BidirectionalIterator>
4752
{
4753
public:
4754
    typedef _BidirectionalIterator                              iterator;
4755
    typedef typename iterator_traits<iterator>::value_type      value_type;
4756
    typedef typename iterator_traits<iterator>::difference_type difference_type;
4757
    typedef basic_string<value_type>                            string_type;
4758

    
4759
    bool matched;
4760

    
4761
    _LIBCPP_INLINE_VISIBILITY
4762
    _LIBCPP_CONSTEXPR sub_match() : matched() {}
4763

    
4764
    _LIBCPP_INLINE_VISIBILITY
4765
    difference_type length() const
4766
        {return matched ? _VSTD::distance(this->first, this->second) : 0;}
4767
    _LIBCPP_INLINE_VISIBILITY
4768
    string_type str() const
4769
        {return matched ? string_type(this->first, this->second) : string_type();}
4770
    _LIBCPP_INLINE_VISIBILITY
4771
    operator string_type() const
4772
        {return str();}
4773

    
4774
    _LIBCPP_INLINE_VISIBILITY
4775
    int compare(const sub_match& __s) const
4776
        {return str().compare(__s.str());}
4777
    _LIBCPP_INLINE_VISIBILITY
4778
    int compare(const string_type& __s) const
4779
        {return str().compare(__s);}
4780
    _LIBCPP_INLINE_VISIBILITY
4781
    int compare(const value_type* __s) const
4782
        {return str().compare(__s);}
4783
};
4784

    
4785
typedef sub_match<const char*>             csub_match;
4786
typedef sub_match<const wchar_t*>          wcsub_match;
4787
typedef sub_match<string::const_iterator>  ssub_match;
4788
typedef sub_match<wstring::const_iterator> wssub_match;
4789

    
4790
template <class _BiIter>
4791
inline _LIBCPP_INLINE_VISIBILITY
4792
bool
4793
operator==(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4794
{
4795
    return __x.compare(__y) == 0;
4796
}
4797

    
4798
template <class _BiIter>
4799
inline _LIBCPP_INLINE_VISIBILITY
4800
bool
4801
operator!=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4802
{
4803
    return !(__x == __y);
4804
}
4805

    
4806
template <class _BiIter>
4807
inline _LIBCPP_INLINE_VISIBILITY
4808
bool
4809
operator<(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4810
{
4811
    return __x.compare(__y) < 0;
4812
}
4813

    
4814
template <class _BiIter>
4815
inline _LIBCPP_INLINE_VISIBILITY
4816
bool
4817
operator<=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4818
{
4819
    return !(__y < __x);
4820
}
4821

    
4822
template <class _BiIter>
4823
inline _LIBCPP_INLINE_VISIBILITY
4824
bool
4825
operator>=(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4826
{
4827
    return !(__x < __y);
4828
}
4829

    
4830
template <class _BiIter>
4831
inline _LIBCPP_INLINE_VISIBILITY
4832
bool
4833
operator>(const sub_match<_BiIter>& __x, const sub_match<_BiIter>& __y)
4834
{
4835
    return __y < __x;
4836
}
4837

    
4838
template <class _BiIter, class _ST, class _SA>
4839
inline _LIBCPP_INLINE_VISIBILITY
4840
bool
4841
operator==(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4842
           const sub_match<_BiIter>& __y)
4843
{
4844
    return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) == 0;
4845
}
4846

    
4847
template <class _BiIter, class _ST, class _SA>
4848
inline _LIBCPP_INLINE_VISIBILITY
4849
bool
4850
operator!=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4851
           const sub_match<_BiIter>& __y)
4852
{
4853
    return !(__x == __y);
4854
}
4855

    
4856
template <class _BiIter, class _ST, class _SA>
4857
inline _LIBCPP_INLINE_VISIBILITY
4858
bool
4859
operator<(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4860
          const sub_match<_BiIter>& __y)
4861
{
4862
    return __y.compare(typename sub_match<_BiIter>::string_type(__x.data(), __x.size())) > 0;
4863
}
4864

    
4865
template <class _BiIter, class _ST, class _SA>
4866
inline _LIBCPP_INLINE_VISIBILITY
4867
bool
4868
operator>(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4869
          const sub_match<_BiIter>& __y)
4870
{
4871
    return __y < __x;
4872
}
4873

    
4874
template <class _BiIter, class _ST, class _SA>
4875
inline _LIBCPP_INLINE_VISIBILITY
4876
bool operator>=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4877
                const sub_match<_BiIter>& __y)
4878
{
4879
    return !(__x < __y);
4880
}
4881

    
4882
template <class _BiIter, class _ST, class _SA>
4883
inline _LIBCPP_INLINE_VISIBILITY
4884
bool
4885
operator<=(const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __x,
4886
           const sub_match<_BiIter>& __y)
4887
{
4888
    return !(__y < __x);
4889
}
4890

    
4891
template <class _BiIter, class _ST, class _SA>
4892
inline _LIBCPP_INLINE_VISIBILITY
4893
bool
4894
operator==(const sub_match<_BiIter>& __x,
4895
           const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4896
{
4897
    return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) == 0;
4898
}
4899

    
4900
template <class _BiIter, class _ST, class _SA>
4901
inline _LIBCPP_INLINE_VISIBILITY
4902
bool
4903
operator!=(const sub_match<_BiIter>& __x,
4904
           const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4905
{
4906
    return !(__x == __y);
4907
}
4908

    
4909
template <class _BiIter, class _ST, class _SA>
4910
inline _LIBCPP_INLINE_VISIBILITY
4911
bool
4912
operator<(const sub_match<_BiIter>& __x,
4913
          const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4914
{
4915
    return __x.compare(typename sub_match<_BiIter>::string_type(__y.data(), __y.size())) < 0;
4916
}
4917

    
4918
template <class _BiIter, class _ST, class _SA>
4919
inline _LIBCPP_INLINE_VISIBILITY
4920
bool operator>(const sub_match<_BiIter>& __x,
4921
               const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4922
{
4923
    return __y < __x;
4924
}
4925

    
4926
template <class _BiIter, class _ST, class _SA>
4927
inline _LIBCPP_INLINE_VISIBILITY
4928
bool
4929
operator>=(const sub_match<_BiIter>& __x,
4930
           const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4931
{
4932
    return !(__x < __y);
4933
}
4934

    
4935
template <class _BiIter, class _ST, class _SA>
4936
inline _LIBCPP_INLINE_VISIBILITY
4937
bool
4938
operator<=(const sub_match<_BiIter>& __x,
4939
           const basic_string<typename iterator_traits<_BiIter>::value_type, _ST, _SA>& __y)
4940
{
4941
    return !(__y < __x);
4942
}
4943

    
4944
template <class _BiIter>
4945
inline _LIBCPP_INLINE_VISIBILITY
4946
bool
4947
operator==(typename iterator_traits<_BiIter>::value_type const* __x,
4948
           const sub_match<_BiIter>& __y)
4949
{
4950
    return __y.compare(__x) == 0;
4951
}
4952

    
4953
template <class _BiIter>
4954
inline _LIBCPP_INLINE_VISIBILITY
4955
bool
4956
operator!=(typename iterator_traits<_BiIter>::value_type const* __x,
4957
           const sub_match<_BiIter>& __y)
4958
{
4959
    return !(__x == __y);
4960
}
4961

    
4962
template <class _BiIter>
4963
inline _LIBCPP_INLINE_VISIBILITY
4964
bool
4965
operator<(typename iterator_traits<_BiIter>::value_type const* __x,
4966
          const sub_match<_BiIter>& __y)
4967
{
4968
    return __y.compare(__x) > 0;
4969
}
4970

    
4971
template <class _BiIter>
4972
inline _LIBCPP_INLINE_VISIBILITY
4973
bool
4974
operator>(typename iterator_traits<_BiIter>::value_type const* __x,
4975
          const sub_match<_BiIter>& __y)
4976
{
4977
    return __y < __x;
4978
}
4979

    
4980
template <class _BiIter>
4981
inline _LIBCPP_INLINE_VISIBILITY
4982
bool
4983
operator>=(typename iterator_traits<_BiIter>::value_type const* __x,
4984
           const sub_match<_BiIter>& __y)
4985
{
4986
    return !(__x < __y);
4987
}
4988

    
4989
template <class _BiIter>
4990
inline _LIBCPP_INLINE_VISIBILITY
4991
bool
4992
operator<=(typename iterator_traits<_BiIter>::value_type const* __x,
4993
           const sub_match<_BiIter>& __y)
4994
{
4995
    return !(__y < __x);
4996
}
4997

    
4998
template <class _BiIter>
4999
inline _LIBCPP_INLINE_VISIBILITY
5000
bool
5001
operator==(const sub_match<_BiIter>& __x,
5002
           typename iterator_traits<_BiIter>::value_type const* __y)
5003
{
5004
    return __x.compare(__y) == 0;
5005
}
5006

    
5007
template <class _BiIter>
5008
inline _LIBCPP_INLINE_VISIBILITY
5009
bool
5010
operator!=(const sub_match<_BiIter>& __x,
5011
           typename iterator_traits<_BiIter>::value_type const* __y)
5012
{
5013
    return !(__x == __y);
5014
}
5015

    
5016
template <class _BiIter>
5017
inline _LIBCPP_INLINE_VISIBILITY
5018
bool
5019
operator<(const sub_match<_BiIter>& __x,
5020
          typename iterator_traits<_BiIter>::value_type const* __y)
5021
{
5022
    return __x.compare(__y) < 0;
5023
}
5024

    
5025
template <class _BiIter>
5026
inline _LIBCPP_INLINE_VISIBILITY
5027
bool
5028
operator>(const sub_match<_BiIter>& __x,
5029
          typename iterator_traits<_BiIter>::value_type const* __y)
5030
{
5031
    return __y < __x;
5032
}
5033

    
5034
template <class _BiIter>
5035
inline _LIBCPP_INLINE_VISIBILITY
5036
bool
5037
operator>=(const sub_match<_BiIter>& __x,
5038
           typename iterator_traits<_BiIter>::value_type const* __y)
5039
{
5040
    return !(__x < __y);
5041
}
5042

    
5043
template <class _BiIter>
5044
inline _LIBCPP_INLINE_VISIBILITY
5045
bool
5046
operator<=(const sub_match<_BiIter>& __x,
5047
           typename iterator_traits<_BiIter>::value_type const* __y)
5048
{
5049
    return !(__y < __x);
5050
}
5051

    
5052
template <class _BiIter>
5053
inline _LIBCPP_INLINE_VISIBILITY
5054
bool
5055
operator==(typename iterator_traits<_BiIter>::value_type const& __x,
5056
           const sub_match<_BiIter>& __y)
5057
{
5058
    typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5059
    return __y.compare(string_type(1, __x)) == 0;
5060
}
5061

    
5062
template <class _BiIter>
5063
inline _LIBCPP_INLINE_VISIBILITY
5064
bool
5065
operator!=(typename iterator_traits<_BiIter>::value_type const& __x,
5066
           const sub_match<_BiIter>& __y)
5067
{
5068
    return !(__x == __y);
5069
}
5070

    
5071
template <class _BiIter>
5072
inline _LIBCPP_INLINE_VISIBILITY
5073
bool
5074
operator<(typename iterator_traits<_BiIter>::value_type const& __x,
5075
          const sub_match<_BiIter>& __y)
5076
{
5077
    typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5078
    return __y.compare(string_type(1, __x)) > 0;
5079
}
5080

    
5081
template <class _BiIter>
5082
inline _LIBCPP_INLINE_VISIBILITY
5083
bool
5084
operator>(typename iterator_traits<_BiIter>::value_type const& __x,
5085
          const sub_match<_BiIter>& __y)
5086
{
5087
    return __y < __x;
5088
}
5089

    
5090
template <class _BiIter>
5091
inline _LIBCPP_INLINE_VISIBILITY
5092
bool
5093
operator>=(typename iterator_traits<_BiIter>::value_type const& __x,
5094
           const sub_match<_BiIter>& __y)
5095
{
5096
    return !(__x < __y);
5097
}
5098

    
5099
template <class _BiIter>
5100
inline _LIBCPP_INLINE_VISIBILITY
5101
bool
5102
operator<=(typename iterator_traits<_BiIter>::value_type const& __x,
5103
           const sub_match<_BiIter>& __y)
5104
{
5105
    return !(__y < __x);
5106
}
5107

    
5108
template <class _BiIter>
5109
inline _LIBCPP_INLINE_VISIBILITY
5110
bool
5111
operator==(const sub_match<_BiIter>& __x,
5112
           typename iterator_traits<_BiIter>::value_type const& __y)
5113
{
5114
    typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5115
    return __x.compare(string_type(1, __y)) == 0;
5116
}
5117

    
5118
template <class _BiIter>
5119
inline _LIBCPP_INLINE_VISIBILITY
5120
bool
5121
operator!=(const sub_match<_BiIter>& __x,
5122
           typename iterator_traits<_BiIter>::value_type const& __y)
5123
{
5124
    return !(__x == __y);
5125
}
5126

    
5127
template <class _BiIter>
5128
inline _LIBCPP_INLINE_VISIBILITY
5129
bool
5130
operator<(const sub_match<_BiIter>& __x,
5131
          typename iterator_traits<_BiIter>::value_type const& __y)
5132
{
5133
    typedef basic_string<typename iterator_traits<_BiIter>::value_type> string_type;
5134
    return __x.compare(string_type(1, __y)) < 0;
5135
}
5136

    
5137
template <class _BiIter>
5138
inline _LIBCPP_INLINE_VISIBILITY
5139
bool
5140
operator>(const sub_match<_BiIter>& __x,
5141
          typename iterator_traits<_BiIter>::value_type const& __y)
5142
{
5143
    return __y < __x;
5144
}
5145

    
5146
template <class _BiIter>
5147
inline _LIBCPP_INLINE_VISIBILITY
5148
bool
5149
operator>=(const sub_match<_BiIter>& __x,
5150
           typename iterator_traits<_BiIter>::value_type const& __y)
5151
{
5152
    return !(__x < __y);
5153
}
5154

    
5155
template <class _BiIter>
5156
inline _LIBCPP_INLINE_VISIBILITY
5157
bool
5158
operator<=(const sub_match<_BiIter>& __x,
5159
           typename iterator_traits<_BiIter>::value_type const& __y)
5160
{
5161
    return !(__y < __x);
5162
}
5163

    
5164
template <class _CharT, class _ST, class _BiIter>
5165
inline _LIBCPP_INLINE_VISIBILITY
5166
basic_ostream<_CharT, _ST>&
5167
operator<<(basic_ostream<_CharT, _ST>& __os, const sub_match<_BiIter>& __m)
5168
{
5169
    return __os << __m.str();
5170
}
5171

    
5172
template <class _BidirectionalIterator, class _Allocator>
5173
class _LIBCPP_TYPE_VIS_ONLY match_results
5174
{
5175
public:
5176
    typedef _Allocator                                        allocator_type;
5177
    typedef sub_match<_BidirectionalIterator>                 value_type;
5178
private:
5179
    typedef vector<value_type, allocator_type>                __container_type;
5180

    
5181
    __container_type  __matches_;
5182
    value_type __unmatched_;
5183
    value_type __prefix_;
5184
    value_type __suffix_;
5185
    bool       __ready_;
5186
public:
5187
    _BidirectionalIterator __position_start_;
5188
    typedef const value_type&                                 const_reference;
5189
    typedef value_type&                                       reference;
5190
    typedef typename __container_type::const_iterator         const_iterator;
5191
    typedef const_iterator                                    iterator;
5192
    typedef typename iterator_traits<_BidirectionalIterator>::difference_type difference_type;
5193
    typedef typename allocator_traits<allocator_type>::size_type size_type;
5194
    typedef typename iterator_traits<_BidirectionalIterator>::value_type char_type;
5195
    typedef basic_string<char_type>                           string_type;
5196

    
5197
    // construct/copy/destroy:
5198
    explicit match_results(const allocator_type& __a = allocator_type());
5199
//    match_results(const match_results&) = default;
5200
//    match_results& operator=(const match_results&) = default;
5201
//    match_results(match_results&& __m) = default;
5202
//    match_results& operator=(match_results&& __m) = default;
5203
//    ~match_results() = default;
5204

    
5205
    _LIBCPP_INLINE_VISIBILITY
5206
    bool ready() const {return __ready_;}
5207

    
5208
    // size:
5209
    _LIBCPP_INLINE_VISIBILITY
5210
    size_type size() const {return __matches_.size();}
5211
    _LIBCPP_INLINE_VISIBILITY
5212
    size_type max_size() const {return __matches_.max_size();}
5213
    _LIBCPP_INLINE_VISIBILITY
5214
    bool empty() const {return size() == 0;}
5215

    
5216
    // element access:
5217
    _LIBCPP_INLINE_VISIBILITY
5218
    difference_type length(size_type __sub = 0) const
5219
        {return (*this)[__sub].length();}
5220
    _LIBCPP_INLINE_VISIBILITY
5221
    difference_type position(size_type __sub = 0) const
5222
        {return _VSTD::distance(__position_start_, (*this)[__sub].first);}
5223
    _LIBCPP_INLINE_VISIBILITY
5224
    string_type str(size_type __sub = 0) const
5225
        {return (*this)[__sub].str();}
5226
    _LIBCPP_INLINE_VISIBILITY
5227
    const_reference operator[](size_type __n) const
5228
        {return __n < __matches_.size() ? __matches_[__n] : __unmatched_;}
5229

    
5230
    _LIBCPP_INLINE_VISIBILITY
5231
    const_reference prefix() const {return __prefix_;}
5232
    _LIBCPP_INLINE_VISIBILITY
5233
    const_reference suffix() const {return __suffix_;}
5234

    
5235
    _LIBCPP_INLINE_VISIBILITY
5236
    const_iterator begin() const {return empty() ? __matches_.end() : __matches_.begin();}
5237
    _LIBCPP_INLINE_VISIBILITY
5238
    const_iterator end() const {return __matches_.end();}
5239
    _LIBCPP_INLINE_VISIBILITY
5240
    const_iterator cbegin() const {return empty() ? __matches_.end() : __matches_.begin();}
5241
    _LIBCPP_INLINE_VISIBILITY
5242
    const_iterator cend() const {return __matches_.end();}
5243

    
5244
    // format:
5245
    template <class _OutputIter>
5246
        _OutputIter
5247
        format(_OutputIter __out, const char_type* __fmt_first,
5248
               const char_type* __fmt_last,
5249
               regex_constants::match_flag_type __flags = regex_constants::format_default) const;
5250
    template <class _OutputIter, class _ST, class _SA>
5251
        _LIBCPP_INLINE_VISIBILITY
5252
        _OutputIter
5253
        format(_OutputIter __out, const basic_string<char_type, _ST, _SA>& __fmt,
5254
               regex_constants::match_flag_type __flags = regex_constants::format_default) const
5255
            {return format(__out, __fmt.data(), __fmt.data() + __fmt.size(), __flags);}
5256
    template <class _ST, class _SA>
5257
        _LIBCPP_INLINE_VISIBILITY
5258
        basic_string<char_type, _ST, _SA>
5259
        format(const basic_string<char_type, _ST, _SA>& __fmt,
5260
               regex_constants::match_flag_type __flags = regex_constants::format_default) const
5261
        {
5262
            basic_string<char_type, _ST, _SA> __r;
5263
            format(back_inserter(__r), __fmt.data(), __fmt.data() + __fmt.size(),
5264
                   __flags);
5265
            return __r;
5266
        }
5267
    _LIBCPP_INLINE_VISIBILITY
5268
    string_type
5269
        format(const char_type* __fmt,
5270
               regex_constants::match_flag_type __flags = regex_constants::format_default) const
5271
        {
5272
            string_type __r;
5273
            format(back_inserter(__r), __fmt,
5274
                   __fmt + char_traits<char_type>::length(__fmt), __flags);
5275
            return __r;
5276
        }
5277

    
5278
    // allocator:
5279
    _LIBCPP_INLINE_VISIBILITY
5280
    allocator_type get_allocator() const {return __matches_.get_allocator();}
5281

    
5282
    // swap:
5283
    void swap(match_results& __m);
5284

    
5285
    template <class _Bp, class _Ap>
5286
        _LIBCPP_INLINE_VISIBILITY
5287
        void __assign(_BidirectionalIterator __f, _BidirectionalIterator __l,
5288
                      const match_results<_Bp, _Ap>& __m, bool __no_update_pos)
5289
    {
5290
        _Bp __mf = __m.prefix().first;
5291
        __matches_.resize(__m.size());
5292
        for (size_type __i = 0; __i < __matches_.size(); ++__i)
5293
        {
5294
            __matches_[__i].first = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].first));
5295
            __matches_[__i].second = _VSTD::next(__f, _VSTD::distance(__mf, __m[__i].second));
5296
            __matches_[__i].matched = __m[__i].matched;
5297
        }
5298
        __unmatched_.first   = __l;
5299
        __unmatched_.second  = __l;
5300
        __unmatched_.matched = false;
5301
        __prefix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().first));
5302
        __prefix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.prefix().second));
5303
        __prefix_.matched = __m.prefix().matched;
5304
        __suffix_.first = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().first));
5305
        __suffix_.second = _VSTD::next(__f, _VSTD::distance(__mf, __m.suffix().second));
5306
        __suffix_.matched = __m.suffix().matched;
5307
        if (!__no_update_pos)
5308
            __position_start_ = __prefix_.first;
5309
        __ready_ = __m.ready();
5310
    }
5311

    
5312
private:
5313
    void __init(unsigned __s,
5314
                _BidirectionalIterator __f, _BidirectionalIterator __l,
5315
                bool __no_update_pos = false);
5316

    
5317
    template <class, class> friend class basic_regex;
5318

    
5319
    template <class _Bp, class _Ap, class _Cp, class _Tp>
5320
    friend
5321
    bool
5322
    regex_match(_Bp, _Bp, match_results<_Bp, _Ap>&, const basic_regex<_Cp, _Tp>&,
5323
                regex_constants::match_flag_type);
5324

    
5325
    template <class _Bp, class _Ap>
5326
    friend
5327
    bool
5328
    operator==(const match_results<_Bp, _Ap>&, const match_results<_Bp, _Ap>&);
5329

    
5330
    template <class, class> friend class __lookahead;
5331
};
5332

    
5333
template <class _BidirectionalIterator, class _Allocator>
5334
match_results<_BidirectionalIterator, _Allocator>::match_results(
5335
        const allocator_type& __a)
5336
    : __matches_(__a),
5337
      __unmatched_(),
5338
      __prefix_(),
5339
      __suffix_(),
5340
      __ready_(false),
5341
      __position_start_()
5342
{
5343
}
5344

    
5345
template <class _BidirectionalIterator, class _Allocator>
5346
void
5347
match_results<_BidirectionalIterator, _Allocator>::__init(unsigned __s,
5348
                         _BidirectionalIterator __f, _BidirectionalIterator __l,
5349
                         bool __no_update_pos)
5350
{
5351
    __unmatched_.first   = __l;
5352
    __unmatched_.second  = __l;
5353
    __unmatched_.matched = false;
5354
    __matches_.assign(__s, __unmatched_);
5355
    __prefix_.first      = __f;
5356
    __prefix_.second     = __f;
5357
    __prefix_.matched    = false;
5358
    __suffix_ = __unmatched_;
5359
    if (!__no_update_pos)
5360
        __position_start_ = __prefix_.first;
5361
    __ready_ = true;
5362
}
5363

    
5364
template <class _BidirectionalIterator, class _Allocator>
5365
template <class _OutputIter>
5366
_OutputIter
5367
match_results<_BidirectionalIterator, _Allocator>::format(_OutputIter __out,
5368
        const char_type* __fmt_first, const char_type* __fmt_last,
5369
        regex_constants::match_flag_type __flags) const
5370
{
5371
    if (__flags & regex_constants::format_sed)
5372
    {
5373
        for (; __fmt_first != __fmt_last; ++__fmt_first)
5374
        {
5375
            if (*__fmt_first == '&')
5376
                __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5377
                                   __out);
5378
            else if (*__fmt_first == '\\' && __fmt_first + 1 != __fmt_last)
5379
            {
5380
                ++__fmt_first;
5381
                if ('0' <= *__fmt_first && *__fmt_first <= '9')
5382
                {
5383
                    size_t __i = *__fmt_first - '0';
5384
                    __out = _VSTD::copy(__matches_[__i].first,
5385
                                       __matches_[__i].second, __out);
5386
                }
5387
                else
5388
                {
5389
                    *__out = *__fmt_first;
5390
                    ++__out;
5391
                }
5392
            }
5393
            else
5394
            {
5395
                *__out = *__fmt_first;
5396
                ++__out;
5397
            }
5398
        }
5399
    }
5400
    else
5401
    {
5402
        for (; __fmt_first != __fmt_last; ++__fmt_first)
5403
        {
5404
            if (*__fmt_first == '$' && __fmt_first + 1 != __fmt_last)
5405
            {
5406
                switch (__fmt_first[1])
5407
                {
5408
                case '$':
5409
                    *__out = *++__fmt_first;
5410
                    ++__out;
5411
                    break;
5412
                case '&':
5413
                    ++__fmt_first;
5414
                    __out = _VSTD::copy(__matches_[0].first, __matches_[0].second,
5415
                                       __out);
5416
                    break;
5417
                case '`':
5418
                    ++__fmt_first;
5419
                    __out = _VSTD::copy(__prefix_.first, __prefix_.second, __out);
5420
                    break;
5421
                case '\'':
5422
                    ++__fmt_first;
5423
                    __out = _VSTD::copy(__suffix_.first, __suffix_.second, __out);
5424
                    break;
5425
                default:
5426
                    if ('0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5427
                    {
5428
                        ++__fmt_first;
5429
                        size_t __i = *__fmt_first - '0';
5430
                        if (__fmt_first + 1 != __fmt_last &&
5431
                            '0' <= __fmt_first[1] && __fmt_first[1] <= '9')
5432
                        {
5433
                            ++__fmt_first;
5434
                            __i = 10 * __i + *__fmt_first - '0';
5435
                        }
5436
                        __out = _VSTD::copy(__matches_[__i].first,
5437
                                           __matches_[__i].second, __out);
5438
                    }
5439
                    else
5440
                    {
5441
                        *__out = *__fmt_first;
5442
                        ++__out;
5443
                    }
5444
                    break;
5445
                }
5446
            }
5447
            else
5448
            {
5449
                *__out = *__fmt_first;
5450
                ++__out;
5451
            }
5452
        }
5453
    }
5454
    return __out;
5455
}
5456

    
5457
template <class _BidirectionalIterator, class _Allocator>
5458
void
5459
match_results<_BidirectionalIterator, _Allocator>::swap(match_results& __m)
5460
{
5461
    using _VSTD::swap;
5462
    swap(__matches_, __m.__matches_);
5463
    swap(__unmatched_, __m.__unmatched_);
5464
    swap(__prefix_, __m.__prefix_);
5465
    swap(__suffix_, __m.__suffix_);
5466
    swap(__position_start_, __m.__position_start_);
5467
    swap(__ready_, __m.__ready_);
5468
}
5469

    
5470
typedef match_results<const char*>             cmatch;
5471
typedef match_results<const wchar_t*>          wcmatch;
5472
typedef match_results<string::const_iterator>  smatch;
5473
typedef match_results<wstring::const_iterator> wsmatch;
5474

    
5475
template <class _BidirectionalIterator, class _Allocator>
5476
bool
5477
operator==(const match_results<_BidirectionalIterator, _Allocator>& __x,
5478
           const match_results<_BidirectionalIterator, _Allocator>& __y)
5479
{
5480
    if (__x.__ready_ != __y.__ready_)
5481
        return false;
5482
    if (!__x.__ready_)
5483
        return true;
5484
    return __x.__matches_ == __y.__matches_ &&
5485
           __x.__prefix_ == __y.__prefix_ &&
5486
           __x.__suffix_ == __y.__suffix_;
5487
}
5488

    
5489
template <class _BidirectionalIterator, class _Allocator>
5490
inline _LIBCPP_INLINE_VISIBILITY
5491
bool
5492
operator!=(const match_results<_BidirectionalIterator, _Allocator>& __x,
5493
           const match_results<_BidirectionalIterator, _Allocator>& __y)
5494
{
5495
    return !(__x == __y);
5496
}
5497

    
5498
template <class _BidirectionalIterator, class _Allocator>
5499
inline _LIBCPP_INLINE_VISIBILITY
5500
void
5501
swap(match_results<_BidirectionalIterator, _Allocator>& __x,
5502
     match_results<_BidirectionalIterator, _Allocator>& __y)
5503
{
5504
    __x.swap(__y);
5505
}
5506

    
5507
// regex_search
5508

    
5509
template <class _CharT, class _Traits>
5510
template <class _Allocator>
5511
bool
5512
basic_regex<_CharT, _Traits>::__match_at_start_ecma(
5513
        const _CharT* __first, const _CharT* __last,
5514
        match_results<const _CharT*, _Allocator>& __m,
5515
        regex_constants::match_flag_type __flags, bool __at_first) const
5516
{
5517
    vector<__state> __states;
5518
    __node* __st = __start_.get();
5519
    if (__st)
5520
    {
5521
        sub_match<const _CharT*> __unmatched;
5522
        __unmatched.first   = __last;
5523
        __unmatched.second  = __last;
5524
        __unmatched.matched = false;
5525

    
5526
        __states.push_back(__state());
5527
        __states.back().__do_ = 0;
5528
        __states.back().__first_ = __first;
5529
        __states.back().__current_ = __first;
5530
        __states.back().__last_ = __last;
5531
        __states.back().__sub_matches_.resize(mark_count(), __unmatched);
5532
        __states.back().__loop_data_.resize(__loop_count());
5533
        __states.back().__node_ = __st;
5534
        __states.back().__flags_ = __flags;
5535
        __states.back().__at_first_ = __at_first;
5536
        do
5537
        {
5538
            __state& __s = __states.back();
5539
            if (__s.__node_)
5540
                __s.__node_->__exec(__s);
5541
            switch (__s.__do_)
5542
            {
5543
            case __state::__end_state:
5544
                __m.__matches_[0].first = __first;
5545
                __m.__matches_[0].second = _VSTD::next(__first, __s.__current_ - __first);
5546
                __m.__matches_[0].matched = true;
5547
                for (unsigned __i = 0; __i < __s.__sub_matches_.size(); ++__i)
5548
                    __m.__matches_[__i+1] = __s.__sub_matches_[__i];
5549
                return true;
5550
            case __state::__accept_and_consume:
5551
            case __state::__repeat:
5552
            case __state::__accept_but_not_consume:
5553
                break;
5554
            case __state::__split:
5555
                {
5556
                __state __snext = __s;
5557
                __s.__node_->__exec_split(true, __s);
5558
                __snext.__node_->__exec_split(false, __snext);
5559
                __states.push_back(_VSTD::move(__snext));
5560
                }
5561
                break;
5562
            case __state::__reject:
5563
                __states.pop_back();
5564
                break;
5565
            default:
5566
                __throw_regex_error<regex_constants::__re_err_unknown>();
5567
                break;
5568

    
5569
            }
5570
        } while (!__states.empty());
5571
    }
5572
    return false;
5573
}
5574

    
5575
template <class _CharT, class _Traits>
5576
template <class _Allocator>
5577
bool
5578
basic_regex<_CharT, _Traits>::__match_at_start_posix_nosubs(
5579
        const _CharT* __first, const _CharT* __last,
5580
        match_results<const _CharT*, _Allocator>& __m,
5581
        regex_constants::match_flag_type __flags, bool __at_first) const
5582
{
5583
    deque<__state> __states;
5584
    ptrdiff_t __highest_j = 0;
5585
    ptrdiff_t _Np = _VSTD::distance(__first, __last);
5586
    __node* __st = __start_.get();
5587
    if (__st)
5588
    {
5589
        __states.push_back(__state());
5590
        __states.back().__do_ = 0;
5591
        __states.back().__first_ = __first;
5592
        __states.back().__current_ = __first;
5593
        __states.back().__last_ = __last;
5594
        __states.back().__loop_data_.resize(__loop_count());
5595
        __states.back().__node_ = __st;
5596
        __states.back().__flags_ = __flags;
5597
        __states.back().__at_first_ = __at_first;
5598
        bool __matched = false;
5599
        do
5600
        {
5601
            __state& __s = __states.back();
5602
            if (__s.__node_)
5603
                __s.__node_->__exec(__s);
5604
            switch (__s.__do_)
5605
            {
5606
            case __state::__end_state:
5607
                if (!__matched || __highest_j < __s.__current_ - __s.__first_)
5608
                    __highest_j = __s.__current_ - __s.__first_;
5609
                __matched = true;
5610
                if (__highest_j == _Np)
5611
                    __states.clear();
5612
                else
5613
                    __states.pop_back();
5614
                break;
5615
            case __state::__consume_input:
5616
                break;
5617
            case __state::__accept_and_consume:
5618
                __states.push_front(_VSTD::move(__s));
5619
                __states.pop_back();
5620
                break;
5621
            case __state::__repeat:
5622
            case __state::__accept_but_not_consume:
5623
                break;
5624
            case __state::__split:
5625
                {
5626
                __state __snext = __s;
5627
                __s.__node_->__exec_split(true, __s);
5628
                __snext.__node_->__exec_split(false, __snext);
5629
                __states.push_back(_VSTD::move(__snext));
5630
                }
5631
                break;
5632
            case __state::__reject:
5633
                __states.pop_back();
5634
                break;
5635
            default:
5636
                __throw_regex_error<regex_constants::__re_err_unknown>();
5637
                break;
5638
            }
5639
        } while (!__states.empty());
5640
        if (__matched)
5641
        {
5642
            __m.__matches_[0].first = __first;
5643
            __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
5644
            __m.__matches_[0].matched = true;
5645
            return true;
5646
        }
5647
    }
5648
    return false;
5649
}
5650

    
5651
template <class _CharT, class _Traits>
5652
template <class _Allocator>
5653
bool
5654
basic_regex<_CharT, _Traits>::__match_at_start_posix_subs(
5655
        const _CharT* __first, const _CharT* __last,
5656
        match_results<const _CharT*, _Allocator>& __m,
5657
        regex_constants::match_flag_type __flags, bool __at_first) const
5658
{
5659
    vector<__state> __states;
5660
    __state __best_state;
5661
    ptrdiff_t __j = 0;
5662
    ptrdiff_t __highest_j = 0;
5663
    ptrdiff_t _Np = _VSTD::distance(__first, __last);
5664
    __node* __st = __start_.get();
5665
    if (__st)
5666
    {
5667
        sub_match<const _CharT*> __unmatched;
5668
        __unmatched.first   = __last;
5669
        __unmatched.second  = __last;
5670
        __unmatched.matched = false;
5671

    
5672
        __states.push_back(__state());
5673
        __states.back().__do_ = 0;
5674
        __states.back().__first_ = __first;
5675
        __states.back().__current_ = __first;
5676
        __states.back().__last_ = __last;
5677
        __states.back().__sub_matches_.resize(mark_count(), __unmatched);
5678
        __states.back().__loop_data_.resize(__loop_count());
5679
        __states.back().__node_ = __st;
5680
        __states.back().__flags_ = __flags;
5681
        __states.back().__at_first_ = __at_first;
5682
        const _CharT* __current = __first;
5683
        bool __matched = false;
5684
        do
5685
        {
5686
            __state& __s = __states.back();
5687
            if (__s.__node_)
5688
                __s.__node_->__exec(__s);
5689
            switch (__s.__do_)
5690
            {
5691
            case __state::__end_state:
5692
                if (!__matched || __highest_j < __s.__current_ - __s.__first_)
5693
                {
5694
                    __highest_j = __s.__current_ - __s.__first_;
5695
                    __best_state = __s;
5696
                }
5697
                __matched = true;
5698
                if (__highest_j == _Np)
5699
                    __states.clear();
5700
                else
5701
                    __states.pop_back();
5702
                break;
5703
            case __state::__accept_and_consume:
5704
                __j += __s.__current_ - __current;
5705
                __current = __s.__current_;
5706
                break;
5707
            case __state::__repeat:
5708
            case __state::__accept_but_not_consume:
5709
                break;
5710
            case __state::__split:
5711
                {
5712
                __state __snext = __s;
5713
                __s.__node_->__exec_split(true, __s);
5714
                __snext.__node_->__exec_split(false, __snext);
5715
                __states.push_back(_VSTD::move(__snext));
5716
                }
5717
                break;
5718
            case __state::__reject:
5719
                __states.pop_back();
5720
                break;
5721
            default:
5722
                __throw_regex_error<regex_constants::__re_err_unknown>();
5723
                break;
5724
            }
5725
        } while (!__states.empty());
5726
        if (__matched)
5727
        {
5728
            __m.__matches_[0].first = __first;
5729
            __m.__matches_[0].second = _VSTD::next(__first, __highest_j);
5730
            __m.__matches_[0].matched = true;
5731
            for (unsigned __i = 0; __i < __best_state.__sub_matches_.size(); ++__i)
5732
                __m.__matches_[__i+1] = __best_state.__sub_matches_[__i];
5733
            return true;
5734
        }
5735
    }
5736
    return false;
5737
}
5738

    
5739
template <class _CharT, class _Traits>
5740
template <class _Allocator>
5741
bool
5742
basic_regex<_CharT, _Traits>::__match_at_start(
5743
        const _CharT* __first, const _CharT* __last,
5744
        match_results<const _CharT*, _Allocator>& __m,
5745
        regex_constants::match_flag_type __flags, bool __at_first) const
5746
{
5747
    if ((__flags_ & 0x1F0) == ECMAScript)
5748
        return __match_at_start_ecma(__first, __last, __m, __flags, __at_first);
5749
    if (mark_count() == 0)
5750
        return __match_at_start_posix_nosubs(__first, __last, __m, __flags, __at_first);
5751
    return __match_at_start_posix_subs(__first, __last, __m, __flags, __at_first);
5752
}
5753

    
5754
template <class _CharT, class _Traits>
5755
template <class _Allocator>
5756
bool
5757
basic_regex<_CharT, _Traits>::__search(
5758
        const _CharT* __first, const _CharT* __last,
5759
        match_results<const _CharT*, _Allocator>& __m,
5760
        regex_constants::match_flag_type __flags) const
5761
{
5762
    __m.__init(1 + mark_count(), __first, __last,
5763
                                    __flags & regex_constants::__no_update_pos);
5764
    if (__match_at_start(__first, __last, __m, __flags, 
5765
                                    !(__flags & regex_constants::__no_update_pos)))
5766
    {
5767
        __m.__prefix_.second = __m[0].first;
5768
        __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5769
        __m.__suffix_.first = __m[0].second;
5770
        __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5771
        return true;
5772
    }
5773
    if (__first != __last && !(__flags & regex_constants::match_continuous))
5774
    {
5775
        __flags |= regex_constants::match_prev_avail;
5776
        for (++__first; __first != __last; ++__first)
5777
        {
5778
            __m.__matches_.assign(__m.size(), __m.__unmatched_);
5779
            if (__match_at_start(__first, __last, __m, __flags, false))
5780
            {
5781
                __m.__prefix_.second = __m[0].first;
5782
                __m.__prefix_.matched = __m.__prefix_.first != __m.__prefix_.second;
5783
                __m.__suffix_.first = __m[0].second;
5784
                __m.__suffix_.matched = __m.__suffix_.first != __m.__suffix_.second;
5785
                return true;
5786
            }
5787
            __m.__matches_.assign(__m.size(), __m.__unmatched_);
5788
        }
5789
    }
5790
    __m.__matches_.clear();
5791
    return false;
5792
}
5793

    
5794
template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
5795
inline _LIBCPP_INLINE_VISIBILITY
5796
bool
5797
regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5798
             match_results<_BidirectionalIterator, _Allocator>& __m,
5799
             const basic_regex<_CharT, _Traits>& __e,
5800
             regex_constants::match_flag_type __flags = regex_constants::match_default)
5801
{
5802
    int __offset = (__flags & regex_constants::match_prev_avail) ? 1 : 0;
5803
    basic_string<_CharT> __s(_VSTD::prev(__first, __offset), __last);
5804
    match_results<const _CharT*> __mc;
5805
    bool __r = __e.__search(__s.data() + __offset, __s.data() + __s.size(), __mc, __flags);
5806
    __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
5807
    return __r;
5808
}
5809

    
5810
template <class _Iter, class _Allocator, class _CharT, class _Traits>
5811
inline _LIBCPP_INLINE_VISIBILITY
5812
bool
5813
regex_search(__wrap_iter<_Iter> __first,
5814
             __wrap_iter<_Iter> __last,
5815
             match_results<__wrap_iter<_Iter>, _Allocator>& __m,
5816
             const basic_regex<_CharT, _Traits>& __e,
5817
             regex_constants::match_flag_type __flags = regex_constants::match_default)
5818
{
5819
    match_results<const _CharT*> __mc;
5820
    bool __r = __e.__search(__first.base(), __last.base(), __mc, __flags);
5821
    __m.__assign(__first, __last, __mc, __flags & regex_constants::__no_update_pos);
5822
    return __r;
5823
}
5824

    
5825
template <class _Allocator, class _CharT, class _Traits>
5826
inline _LIBCPP_INLINE_VISIBILITY
5827
bool
5828
regex_search(const _CharT* __first, const _CharT* __last,
5829
             match_results<const _CharT*, _Allocator>& __m,
5830
             const basic_regex<_CharT, _Traits>& __e,
5831
             regex_constants::match_flag_type __flags = regex_constants::match_default)
5832
{
5833
    return __e.__search(__first, __last, __m, __flags);
5834
}
5835

    
5836
template <class _BidirectionalIterator, class _CharT, class _Traits>
5837
inline _LIBCPP_INLINE_VISIBILITY
5838
bool
5839
regex_search(_BidirectionalIterator __first, _BidirectionalIterator __last,
5840
             const basic_regex<_CharT, _Traits>& __e,
5841
             regex_constants::match_flag_type __flags = regex_constants::match_default)
5842
{
5843
    basic_string<_CharT> __s(__first, __last);
5844
    match_results<const _CharT*> __mc;
5845
    return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5846
}
5847

    
5848
template <class _CharT, class _Traits>
5849
inline _LIBCPP_INLINE_VISIBILITY
5850
bool
5851
regex_search(const _CharT* __first, const _CharT* __last,
5852
             const basic_regex<_CharT, _Traits>& __e,
5853
             regex_constants::match_flag_type __flags = regex_constants::match_default)
5854
{
5855
    match_results<const _CharT*> __mc;
5856
    return __e.__search(__first, __last, __mc, __flags);
5857
}
5858

    
5859
template <class _CharT, class _Allocator, class _Traits>
5860
inline _LIBCPP_INLINE_VISIBILITY
5861
bool
5862
regex_search(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5863
             const basic_regex<_CharT, _Traits>& __e,
5864
             regex_constants::match_flag_type __flags = regex_constants::match_default)
5865
{
5866
    return __e.__search(__str, __str + _Traits::length(__str), __m, __flags);
5867
}
5868

    
5869
template <class _CharT, class _Traits>
5870
inline _LIBCPP_INLINE_VISIBILITY
5871
bool
5872
regex_search(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5873
             regex_constants::match_flag_type __flags = regex_constants::match_default)
5874
{
5875
    match_results<const _CharT*> __m;
5876
    return _VSTD::regex_search(__str, __m, __e, __flags);
5877
}
5878

    
5879
template <class _ST, class _SA, class _CharT, class _Traits>
5880
inline _LIBCPP_INLINE_VISIBILITY
5881
bool
5882
regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5883
             const basic_regex<_CharT, _Traits>& __e,
5884
             regex_constants::match_flag_type __flags = regex_constants::match_default)
5885
{
5886
    match_results<const _CharT*> __mc;
5887
    return __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5888
}
5889

    
5890
template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5891
inline _LIBCPP_INLINE_VISIBILITY
5892
bool
5893
regex_search(const basic_string<_CharT, _ST, _SA>& __s,
5894
             match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5895
             const basic_regex<_CharT, _Traits>& __e,
5896
             regex_constants::match_flag_type __flags = regex_constants::match_default)
5897
{
5898
    match_results<const _CharT*> __mc;
5899
    bool __r = __e.__search(__s.data(), __s.data() + __s.size(), __mc, __flags);
5900
    __m.__assign(__s.begin(), __s.end(), __mc, __flags & regex_constants::__no_update_pos);
5901
    return __r;
5902
}
5903

    
5904
#if _LIBCPP_STD_VER > 11
5905
template <class _ST, class _SA, class _Ap, class _Cp, class _Tp>
5906
bool
5907
regex_search(const basic_string<_Cp, _ST, _SA>&& __s,
5908
             match_results<typename basic_string<_Cp, _ST, _SA>::const_iterator, _Ap>&,
5909
             const basic_regex<_Cp, _Tp>& __e,
5910
             regex_constants::match_flag_type __flags = regex_constants::match_default) = delete; 
5911
#endif
5912

    
5913
// regex_match
5914

    
5915
template <class _BidirectionalIterator, class _Allocator, class _CharT, class _Traits>
5916
bool
5917
regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
5918
            match_results<_BidirectionalIterator, _Allocator>& __m,
5919
            const basic_regex<_CharT, _Traits>& __e,
5920
            regex_constants::match_flag_type __flags = regex_constants::match_default)
5921
{
5922
    bool __r = _VSTD::regex_search(__first, __last, __m, __e,
5923
                            __flags | regex_constants::match_continuous);
5924
    if (__r)
5925
    {
5926
        __r = !__m.suffix().matched;
5927
        if (!__r)
5928
            __m.__matches_.clear();
5929
    }
5930
    return __r;
5931
}
5932

    
5933
template <class _BidirectionalIterator, class _CharT, class _Traits>
5934
inline _LIBCPP_INLINE_VISIBILITY
5935
bool
5936
regex_match(_BidirectionalIterator __first, _BidirectionalIterator __last,
5937
            const basic_regex<_CharT, _Traits>& __e,
5938
            regex_constants::match_flag_type __flags = regex_constants::match_default)
5939
{
5940
    match_results<_BidirectionalIterator> __m;
5941
    return _VSTD::regex_match(__first, __last, __m, __e, __flags);
5942
}
5943

    
5944
template <class _CharT, class _Allocator, class _Traits>
5945
inline _LIBCPP_INLINE_VISIBILITY
5946
bool
5947
regex_match(const _CharT* __str, match_results<const _CharT*, _Allocator>& __m,
5948
            const basic_regex<_CharT, _Traits>& __e,
5949
            regex_constants::match_flag_type __flags = regex_constants::match_default)
5950
{
5951
    return _VSTD::regex_match(__str, __str + _Traits::length(__str), __m, __e, __flags);
5952
}
5953

    
5954
template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5955
inline _LIBCPP_INLINE_VISIBILITY
5956
bool
5957
regex_match(const basic_string<_CharT, _ST, _SA>& __s,
5958
            match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5959
            const basic_regex<_CharT, _Traits>& __e,
5960
            regex_constants::match_flag_type __flags = regex_constants::match_default)
5961
{
5962
    return _VSTD::regex_match(__s.begin(), __s.end(), __m, __e, __flags);
5963
}
5964

    
5965
#if _LIBCPP_STD_VER > 11
5966
template <class _ST, class _SA, class _Allocator, class _CharT, class _Traits>
5967
inline _LIBCPP_INLINE_VISIBILITY
5968
bool
5969
regex_match(const basic_string<_CharT, _ST, _SA>&& __s,
5970
            match_results<typename basic_string<_CharT, _ST, _SA>::const_iterator, _Allocator>& __m,
5971
            const basic_regex<_CharT, _Traits>& __e,
5972
            regex_constants::match_flag_type __flags = regex_constants::match_default) = delete; 
5973
#endif
5974

    
5975
template <class _CharT, class _Traits>
5976
inline _LIBCPP_INLINE_VISIBILITY
5977
bool
5978
regex_match(const _CharT* __str, const basic_regex<_CharT, _Traits>& __e,
5979
            regex_constants::match_flag_type __flags = regex_constants::match_default)
5980
{
5981
    return _VSTD::regex_match(__str, __str + _Traits::length(__str), __e, __flags);
5982
}
5983

    
5984
template <class _ST, class _SA, class _CharT, class _Traits>
5985
inline _LIBCPP_INLINE_VISIBILITY
5986
bool
5987
regex_match(const basic_string<_CharT, _ST, _SA>& __s,
5988
            const basic_regex<_CharT, _Traits>& __e,
5989
            regex_constants::match_flag_type __flags = regex_constants::match_default)
5990
{
5991
    return _VSTD::regex_match(__s.begin(), __s.end(), __e, __flags);
5992
}
5993

    
5994
// regex_iterator
5995

    
5996
template <class _BidirectionalIterator,
5997
          class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
5998
          class _Traits = regex_traits<_CharT> >
5999
class _LIBCPP_TYPE_VIS_ONLY regex_iterator
6000
{
6001
public:
6002
    typedef basic_regex<_CharT, _Traits>          regex_type;
6003
    typedef match_results<_BidirectionalIterator> value_type;
6004
    typedef ptrdiff_t                             difference_type;
6005
    typedef const value_type*                     pointer;
6006
    typedef const value_type&                     reference;
6007
    typedef forward_iterator_tag                  iterator_category;
6008

    
6009
private:
6010
    _BidirectionalIterator           __begin_;
6011
    _BidirectionalIterator           __end_;
6012
    const regex_type*                __pregex_;
6013
    regex_constants::match_flag_type __flags_;
6014
    value_type                       __match_;
6015

    
6016
public:
6017
    regex_iterator();
6018
    regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6019
                   const regex_type& __re,
6020
                   regex_constants::match_flag_type __m
6021
                                              = regex_constants::match_default);
6022
#if _LIBCPP_STD_VER > 11
6023
    regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6024
                   const regex_type&& __re,
6025
                   regex_constants::match_flag_type __m 
6026
                                     = regex_constants::match_default) = delete;
6027
#endif
6028

    
6029
    bool operator==(const regex_iterator& __x) const;
6030
    _LIBCPP_INLINE_VISIBILITY
6031
    bool operator!=(const regex_iterator& __x) const {return !(*this == __x);}
6032

    
6033
    _LIBCPP_INLINE_VISIBILITY
6034
    reference operator*() const {return  __match_;}
6035
    _LIBCPP_INLINE_VISIBILITY
6036
    pointer operator->() const  {return &__match_;}
6037

    
6038
    regex_iterator& operator++();
6039
    _LIBCPP_INLINE_VISIBILITY
6040
    regex_iterator operator++(int)
6041
    {
6042
        regex_iterator __t(*this);
6043
        ++(*this);
6044
        return __t;
6045
    }
6046
};
6047

    
6048
template <class _BidirectionalIterator, class _CharT, class _Traits>
6049
regex_iterator<_BidirectionalIterator, _CharT, _Traits>::regex_iterator()
6050
    : __begin_(), __end_(), __pregex_(nullptr), __flags_(), __match_()
6051
{
6052
}
6053

    
6054
template <class _BidirectionalIterator, class _CharT, class _Traits>
6055
regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6056
    regex_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6057
                   const regex_type& __re, regex_constants::match_flag_type __m)
6058
    : __begin_(__a),
6059
      __end_(__b),
6060
      __pregex_(&__re),
6061
      __flags_(__m)
6062
{
6063
    _VSTD::regex_search(__begin_, __end_, __match_, *__pregex_, __flags_);
6064
}
6065

    
6066
template <class _BidirectionalIterator, class _CharT, class _Traits>
6067
bool
6068
regex_iterator<_BidirectionalIterator, _CharT, _Traits>::
6069
    operator==(const regex_iterator& __x) const
6070
{
6071
    if (__match_.empty() && __x.__match_.empty())
6072
        return true;
6073
    if (__match_.empty() || __x.__match_.empty())
6074
        return false;
6075
    return __begin_ == __x.__begin_       &&
6076
           __end_ == __x.__end_           &&
6077
           __pregex_ == __x.__pregex_     &&
6078
           __flags_ == __x.__flags_       &&
6079
           __match_[0] == __x.__match_[0];
6080
}
6081

    
6082
template <class _BidirectionalIterator, class _CharT, class _Traits>
6083
regex_iterator<_BidirectionalIterator, _CharT, _Traits>&
6084
regex_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6085
{
6086
    __flags_ |= regex_constants::__no_update_pos;
6087
    _BidirectionalIterator __start = __match_[0].second;
6088
    if (__match_.empty())
6089
    {
6090
        if (__start == __end_)
6091
        {
6092
            __match_ = value_type();
6093
            return *this;
6094
        }
6095
        else if (_VSTD::regex_search(__start, __end_, __match_, *__pregex_,
6096
                                    __flags_ | regex_constants::match_not_null |
6097
                                    regex_constants::match_continuous))
6098
            return *this;
6099
        else
6100
            ++__start;
6101
    }
6102
    __flags_ |= regex_constants::match_prev_avail;
6103
    if (!_VSTD::regex_search(__start, __end_, __match_, *__pregex_, __flags_))
6104
        __match_ = value_type();
6105
    return *this;
6106
}
6107

    
6108
typedef regex_iterator<const char*>             cregex_iterator;
6109
typedef regex_iterator<const wchar_t*>          wcregex_iterator;
6110
typedef regex_iterator<string::const_iterator>  sregex_iterator;
6111
typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
6112

    
6113
// regex_token_iterator
6114

    
6115
template <class _BidirectionalIterator,
6116
          class _CharT = typename iterator_traits<_BidirectionalIterator>::value_type,
6117
          class _Traits = regex_traits<_CharT> >
6118
class _LIBCPP_TYPE_VIS_ONLY regex_token_iterator
6119
{
6120
public:
6121
    typedef basic_regex<_CharT, _Traits>      regex_type;
6122
    typedef sub_match<_BidirectionalIterator> value_type;
6123
    typedef ptrdiff_t                         difference_type;
6124
    typedef const value_type*                 pointer;
6125
    typedef const value_type&                 reference;
6126
    typedef forward_iterator_tag              iterator_category;
6127

    
6128
private:
6129
    typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Position;
6130

    
6131
    _Position         __position_;
6132
    const value_type* __result_;
6133
    value_type        __suffix_;
6134
    ptrdiff_t         _N_;
6135
    vector<int>       __subs_;
6136

    
6137
public:
6138
    regex_token_iterator();
6139
    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6140
                         const regex_type& __re, int __submatch = 0,
6141
                         regex_constants::match_flag_type __m =
6142
                                                regex_constants::match_default);
6143
#if _LIBCPP_STD_VER > 11
6144
    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6145
                         const regex_type&& __re, int __submatch = 0,
6146
                         regex_constants::match_flag_type __m =
6147
                                       regex_constants::match_default) = delete;
6148
#endif
6149

    
6150
    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6151
                         const regex_type& __re, const vector<int>& __submatches,
6152
                         regex_constants::match_flag_type __m =
6153
                                                regex_constants::match_default);
6154
#if _LIBCPP_STD_VER > 11
6155
    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6156
                         const regex_type&& __re, const vector<int>& __submatches,
6157
                         regex_constants::match_flag_type __m =
6158
                                     regex_constants::match_default) = delete;
6159
#endif
6160

    
6161
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6162
    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6163
                         const regex_type& __re,
6164
                         initializer_list<int> __submatches,
6165
                         regex_constants::match_flag_type __m =
6166
                                                regex_constants::match_default);
6167

    
6168
#if _LIBCPP_STD_VER > 11
6169
    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6170
                         const regex_type&& __re,
6171
                         initializer_list<int> __submatches,
6172
                         regex_constants::match_flag_type __m =
6173
                                       regex_constants::match_default) = delete;
6174
#endif
6175
#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6176
    template <size_t _Np>
6177
        regex_token_iterator(_BidirectionalIterator __a,
6178
                             _BidirectionalIterator __b,
6179
                             const regex_type& __re,
6180
                             const int (&__submatches)[_Np],
6181
                             regex_constants::match_flag_type __m =
6182
                                                regex_constants::match_default);
6183
#if _LIBCPP_STD_VER > 11
6184
    template <std::size_t _Np>
6185
        regex_token_iterator(_BidirectionalIterator __a,
6186
                             _BidirectionalIterator __b,
6187
                             const regex_type&& __re,
6188
                             const int (&__submatches)[_Np],
6189
                             regex_constants::match_flag_type __m =
6190
                                      regex_constants::match_default) = delete;
6191
#endif
6192

    
6193
    regex_token_iterator(const regex_token_iterator&);
6194
    regex_token_iterator& operator=(const regex_token_iterator&);
6195

    
6196
    bool operator==(const regex_token_iterator& __x) const;
6197
    _LIBCPP_INLINE_VISIBILITY
6198
    bool operator!=(const regex_token_iterator& __x) const {return !(*this == __x);}
6199

    
6200
    _LIBCPP_INLINE_VISIBILITY
6201
    const value_type& operator*() const {return *__result_;}
6202
    _LIBCPP_INLINE_VISIBILITY
6203
    const value_type* operator->() const {return __result_;}
6204

    
6205
    regex_token_iterator& operator++();
6206
    _LIBCPP_INLINE_VISIBILITY
6207
    regex_token_iterator operator++(int)
6208
    {
6209
        regex_token_iterator __t(*this);
6210
        ++(*this);
6211
        return __t;
6212
    }
6213

    
6214
private:
6215
    void __init(_BidirectionalIterator __a, _BidirectionalIterator __b);
6216
    void __establish_result () {
6217
        if (__subs_[_N_] == -1)
6218
            __result_ = &__position_->prefix();
6219
        else
6220
            __result_ = &(*__position_)[__subs_[_N_]];
6221
        }       
6222
};
6223

    
6224
template <class _BidirectionalIterator, class _CharT, class _Traits>
6225
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6226
    regex_token_iterator()
6227
    : __result_(nullptr),
6228
      __suffix_(),
6229
      _N_(0)
6230
{
6231
}
6232

    
6233
template <class _BidirectionalIterator, class _CharT, class _Traits>
6234
void
6235
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6236
    __init(_BidirectionalIterator __a, _BidirectionalIterator __b)
6237
{
6238
    if (__position_ != _Position())
6239
        __establish_result ();
6240
    else if (__subs_[_N_] == -1)
6241
    {
6242
        __suffix_.matched = true;
6243
        __suffix_.first = __a;
6244
        __suffix_.second = __b;
6245
        __result_ = &__suffix_;
6246
    }
6247
    else
6248
        __result_ = nullptr;
6249
}
6250

    
6251
template <class _BidirectionalIterator, class _CharT, class _Traits>
6252
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6253
    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6254
                         const regex_type& __re, int __submatch,
6255
                         regex_constants::match_flag_type __m)
6256
    : __position_(__a, __b, __re, __m),
6257
      _N_(0),
6258
      __subs_(1, __submatch)
6259
{
6260
    __init(__a, __b);
6261
}
6262

    
6263
template <class _BidirectionalIterator, class _CharT, class _Traits>
6264
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6265
    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6266
                         const regex_type& __re, const vector<int>& __submatches,
6267
                         regex_constants::match_flag_type __m)
6268
    : __position_(__a, __b, __re, __m),
6269
      _N_(0),
6270
      __subs_(__submatches)
6271
{
6272
    __init(__a, __b);
6273
}
6274

    
6275
#ifndef _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6276

    
6277
template <class _BidirectionalIterator, class _CharT, class _Traits>
6278
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6279
    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6280
                         const regex_type& __re,
6281
                         initializer_list<int> __submatches,
6282
                         regex_constants::match_flag_type __m)
6283
    : __position_(__a, __b, __re, __m),
6284
      _N_(0),
6285
      __subs_(__submatches)
6286
{
6287
    __init(__a, __b);
6288
}
6289

    
6290
#endif  // _LIBCPP_HAS_NO_GENERALIZED_INITIALIZERS
6291

    
6292
template <class _BidirectionalIterator, class _CharT, class _Traits>
6293
template <size_t _Np>
6294
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6295
    regex_token_iterator(_BidirectionalIterator __a, _BidirectionalIterator __b,
6296
                             const regex_type& __re,
6297
                             const int (&__submatches)[_Np],
6298
                             regex_constants::match_flag_type __m)
6299
    : __position_(__a, __b, __re, __m),
6300
      _N_(0),
6301
      __subs_(__submatches, __submatches + _Np)
6302
{
6303
    __init(__a, __b);
6304
}
6305

    
6306
template <class _BidirectionalIterator, class _CharT, class _Traits>
6307
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6308
    regex_token_iterator(const regex_token_iterator& __x)
6309
    : __position_(__x.__position_),
6310
      __result_(__x.__result_),
6311
      __suffix_(__x.__suffix_),
6312
      _N_(__x._N_),
6313
      __subs_(__x.__subs_)
6314
{
6315
    if (__x.__result_ == &__x.__suffix_)
6316
        __result_ = &__suffix_;
6317
    else if ( __result_ != nullptr )
6318
        __establish_result ();
6319
}
6320

    
6321
template <class _BidirectionalIterator, class _CharT, class _Traits>
6322
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6323
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6324
    operator=(const regex_token_iterator& __x)
6325
{
6326
    if (this != &__x)
6327
    {
6328
        __position_ = __x.__position_;
6329
        if (__x.__result_ == &__x.__suffix_)
6330
            __result_ = &__suffix_;
6331
        else
6332
            __result_ = __x.__result_;
6333
        __suffix_ = __x.__suffix_;
6334
        _N_ = __x._N_;
6335
        __subs_ = __x.__subs_;
6336

    
6337
        if ( __result_ != nullptr && __result_ != &__suffix_ )
6338
            __establish_result();
6339
    }
6340
    return *this;
6341
}
6342

    
6343
template <class _BidirectionalIterator, class _CharT, class _Traits>
6344
bool
6345
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::
6346
    operator==(const regex_token_iterator& __x) const
6347
{
6348
    if (__result_ == nullptr && __x.__result_ == nullptr)
6349
        return true;
6350
    if (__result_ == &__suffix_ && __x.__result_ == &__x.__suffix_ &&
6351
            __suffix_ == __x.__suffix_)
6352
        return true;
6353
    if (__result_ == nullptr || __x.__result_ == nullptr)
6354
        return false;
6355
    if (__result_ == &__suffix_ || __x.__result_ == &__x.__suffix_)
6356
        return false;
6357
    return __position_ == __x.__position_ && _N_ == __x._N_ &&
6358
           __subs_ == __x.__subs_;
6359
}
6360

    
6361
template <class _BidirectionalIterator, class _CharT, class _Traits>
6362
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>&
6363
regex_token_iterator<_BidirectionalIterator, _CharT, _Traits>::operator++()
6364
{
6365
    _Position __prev = __position_;
6366
    if (__result_ == &__suffix_)
6367
        __result_ = nullptr;
6368
    else if (_N_ + 1 < __subs_.size())
6369
    {
6370
        ++_N_;
6371
        __establish_result();
6372
    }
6373
    else
6374
    {
6375
        _N_ = 0;
6376
        ++__position_;
6377
        if (__position_ != _Position())
6378
            __establish_result();
6379
        else
6380
        {
6381
            if (_VSTD::find(__subs_.begin(), __subs_.end(), -1) != __subs_.end()
6382
                && __prev->suffix().length() != 0)
6383
            {
6384
                __suffix_.matched = true;
6385
                __suffix_.first = __prev->suffix().first;
6386
                __suffix_.second = __prev->suffix().second;
6387
                __result_ = &__suffix_;
6388
            }
6389
            else
6390
                __result_ = nullptr;
6391
        }
6392
    }
6393
    return *this;
6394
}
6395

    
6396
typedef regex_token_iterator<const char*>             cregex_token_iterator;
6397
typedef regex_token_iterator<const wchar_t*>          wcregex_token_iterator;
6398
typedef regex_token_iterator<string::const_iterator>  sregex_token_iterator;
6399
typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
6400

    
6401
// regex_replace
6402

    
6403
template <class _OutputIterator, class _BidirectionalIterator,
6404
          class _Traits, class _CharT>
6405
_OutputIterator
6406
regex_replace(_OutputIterator __out,
6407
              _BidirectionalIterator __first, _BidirectionalIterator __last,
6408
              const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6409
              regex_constants::match_flag_type __flags = regex_constants::match_default)
6410
{
6411
    typedef regex_iterator<_BidirectionalIterator, _CharT, _Traits> _Iter;
6412
    _Iter __i(__first, __last, __e, __flags);
6413
    _Iter __eof;
6414
    if (__i == __eof)
6415
    {
6416
        if (!(__flags & regex_constants::format_no_copy))
6417
            __out = _VSTD::copy(__first, __last, __out);
6418
    }
6419
    else
6420
    {
6421
        sub_match<_BidirectionalIterator> __lm;
6422
        for (size_t __len = char_traits<_CharT>::length(__fmt); __i != __eof; ++__i)
6423
        {
6424
            if (!(__flags & regex_constants::format_no_copy))
6425
                __out = _VSTD::copy(__i->prefix().first, __i->prefix().second, __out);
6426
            __out = __i->format(__out, __fmt, __fmt + __len, __flags);
6427
            __lm = __i->suffix();
6428
            if (__flags & regex_constants::format_first_only)
6429
                break;
6430
        }
6431
        if (!(__flags & regex_constants::format_no_copy))
6432
            __out = _VSTD::copy(__lm.first, __lm.second, __out);
6433
    }
6434
    return __out;
6435
}
6436

    
6437
template <class _OutputIterator, class _BidirectionalIterator,
6438
          class _Traits, class _CharT, class _ST, class _SA>
6439
inline _LIBCPP_INLINE_VISIBILITY
6440
_OutputIterator
6441
regex_replace(_OutputIterator __out,
6442
              _BidirectionalIterator __first, _BidirectionalIterator __last,
6443
              const basic_regex<_CharT, _Traits>& __e,
6444
              const basic_string<_CharT, _ST, _SA>& __fmt,
6445
              regex_constants::match_flag_type __flags = regex_constants::match_default)
6446
{
6447
    return _VSTD::regex_replace(__out, __first, __last, __e, __fmt.c_str(), __flags);
6448
}
6449

    
6450
template <class _Traits, class _CharT, class _ST, class _SA, class _FST,
6451
          class _FSA>
6452
inline _LIBCPP_INLINE_VISIBILITY
6453
basic_string<_CharT, _ST, _SA>
6454
regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6455
              const basic_regex<_CharT, _Traits>& __e,
6456
              const basic_string<_CharT, _FST, _FSA>& __fmt,
6457
              regex_constants::match_flag_type __flags = regex_constants::match_default)
6458
{
6459
    basic_string<_CharT, _ST, _SA> __r;
6460
    _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
6461
                        __fmt.c_str(), __flags);
6462
    return __r;
6463
}
6464

    
6465
template <class _Traits, class _CharT, class _ST, class _SA>
6466
inline _LIBCPP_INLINE_VISIBILITY
6467
basic_string<_CharT, _ST, _SA>
6468
regex_replace(const basic_string<_CharT, _ST, _SA>& __s,
6469
              const basic_regex<_CharT, _Traits>& __e, const _CharT* __fmt,
6470
              regex_constants::match_flag_type __flags = regex_constants::match_default)
6471
{
6472
    basic_string<_CharT, _ST, _SA> __r;
6473
    _VSTD::regex_replace(back_inserter(__r), __s.begin(), __s.end(), __e,
6474
                        __fmt, __flags);
6475
    return __r;
6476
}
6477

    
6478
template <class _Traits, class _CharT, class _ST, class _SA>
6479
inline _LIBCPP_INLINE_VISIBILITY
6480
basic_string<_CharT>
6481
regex_replace(const _CharT* __s,
6482
              const basic_regex<_CharT, _Traits>& __e,
6483
              const basic_string<_CharT, _ST, _SA>& __fmt,
6484
              regex_constants::match_flag_type __flags = regex_constants::match_default)
6485
{
6486
    basic_string<_CharT> __r;
6487
    _VSTD::regex_replace(back_inserter(__r), __s,
6488
                        __s + char_traits<_CharT>::length(__s), __e,
6489
                        __fmt.c_str(), __flags);
6490
    return __r;
6491
}
6492

    
6493
template <class _Traits, class _CharT>
6494
inline _LIBCPP_INLINE_VISIBILITY
6495
basic_string<_CharT>
6496
regex_replace(const _CharT* __s,
6497
              const basic_regex<_CharT, _Traits>& __e,
6498
              const _CharT* __fmt,
6499
              regex_constants::match_flag_type __flags = regex_constants::match_default)
6500
{
6501
    basic_string<_CharT> __r;
6502
    _VSTD::regex_replace(back_inserter(__r), __s,
6503
                        __s + char_traits<_CharT>::length(__s), __e,
6504
                        __fmt, __flags);
6505
    return __r;
6506
}
6507

    
6508
_LIBCPP_END_NAMESPACE_STD
6509

    
6510
#endif  // _LIBCPP_REGEX