OpenCores
URL https://opencores.org/ocsvn/altor32/altor32/trunk

Subversion Repositories altor32

[/] [altor32/] [trunk/] [gcc-x64/] [or1knd-elf/] [or1knd-elf/] [include/] [c++/] [4.8.0/] [bits/] [regex.h] - Blame information for rev 35

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 35 ultra_embe
// class template regex -*- C++ -*-
2
 
3
// Copyright (C) 2010, 2011, 2012 Free Software Foundation, Inc.
4
//
5
// This file is part of the GNU ISO C++ Library.  This library is free
6
// software; you can redistribute it and/or modify it under the
7
// terms of the GNU General Public License as published by the
8
// Free Software Foundation; either version 3, or (at your option)
9
// any later version.
10
 
11
// This library is distributed in the hope that it will be useful,
12
// but WITHOUT ANY WARRANTY; without even the implied warranty of
13
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
// GNU General Public License for more details.
15
 
16
// Under Section 7 of GPL version 3, you are granted additional
17
// permissions described in the GCC Runtime Library Exception, version
18
// 3.1, as published by the Free Software Foundation.
19
 
20
// You should have received a copy of the GNU General Public License and
21
// a copy of the GCC Runtime Library Exception along with this program;
22
// see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
23
// <http://www.gnu.org/licenses/>.
24
 
25
/**
26
 *  @file bits/regex.h
27
 *  This is an internal header file, included by other library headers.
28
 *  Do not attempt to use it directly. @headername{regex}
29
 */
30
 
31
namespace std _GLIBCXX_VISIBILITY(default)
32
{
33
_GLIBCXX_BEGIN_NAMESPACE_VERSION
34
 
35
  /**
36
   * @addtogroup regex
37
   * @{
38
   */
39
 
40
  /**
41
   * @brief Class regex_traits. Describes aspects of a regular expression.
42
   *
43
   * A regular expression traits class that satisfies the requirements of
44
   * section [28.7].
45
   *
46
   * The class %regex is parameterized around a set of related types and
47
   * functions used to complete the definition of its semantics.  This class
48
   * satisfies the requirements of such a traits class.
49
   */
50
  template<typename _Ch_type>
51
    struct regex_traits
52
    {
53
    public:
54
      typedef _Ch_type                          char_type;
55
      typedef std::basic_string<char_type>      string_type;
56
      typedef std::locale                       locale_type;
57
      typedef std::ctype_base::mask             char_class_type;
58
 
59
    public:
60
      /**
61
       * @brief Constructs a default traits object.
62
       */
63
      regex_traits() { }
64
 
65
      /**
66
       * @brief Gives the length of a C-style string starting at @p __p.
67
       *
68
       * @param __p a pointer to the start of a character sequence.
69
       *
70
       * @returns the number of characters between @p *__p and the first
71
       * default-initialized value of type @p char_type.  In other words, uses
72
       * the C-string algorithm for determining the length of a sequence of
73
       * characters.
74
       */
75
      static std::size_t
76
      length(const char_type* __p)
77
      { return string_type::traits_type::length(__p); }
78
 
79
      /**
80
       * @brief Performs the identity translation.
81
       *
82
       * @param __c A character to the locale-specific character set.
83
       *
84
       * @returns __c.
85
       */
86
      char_type
87
      translate(char_type __c) const
88
      { return __c; }
89
 
90
      /**
91
       * @brief Translates a character into a case-insensitive equivalent.
92
       *
93
       * @param __c A character to the locale-specific character set.
94
       *
95
       * @returns the locale-specific lower-case equivalent of __c.
96
       * @throws std::bad_cast if the imbued locale does not support the ctype
97
       *         facet.
98
       */
99
      char_type
100
      translate_nocase(char_type __c) const
101
      {
102
        typedef std::ctype<char_type> __ctype_type;
103
        const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale));
104
        return __fctyp.tolower(__c);
105
      }
106
 
107
      /**
108
       * @brief Gets a sort key for a character sequence.
109
       *
110
       * @param __first beginning of the character sequence.
111
       * @param __last  one-past-the-end of the character sequence.
112
       *
113
       * Returns a sort key for the character sequence designated by the
114
       * iterator range [F1, F2) such that if the character sequence [G1, G2)
115
       * sorts before the character sequence [H1, H2) then
116
       * v.transform(G1, G2) < v.transform(H1, H2).
117
       *
118
       * What this really does is provide a more efficient way to compare a
119
       * string to multiple other strings in locales with fancy collation
120
       * rules and equivalence classes.
121
       *
122
       * @returns a locale-specific sort key equivalent to the input range.
123
       *
124
       * @throws std::bad_cast if the current locale does not have a collate
125
       *         facet.
126
       */
127
      template<typename _Fwd_iter>
128
        string_type
129
        transform(_Fwd_iter __first, _Fwd_iter __last) const
130
        {
131
          typedef std::collate<char_type> __collate_type;
132
          const __collate_type& __fclt(use_facet<__collate_type>(_M_locale));
133
          string_type __s(__first, __last);
134
          return __fclt.transform(__s.data(), __s.data() + __s.size());
135
        }
136
 
137
      /**
138
       * @brief Gets a sort key for a character sequence, independant of case.
139
       *
140
       * @param __first beginning of the character sequence.
141
       * @param __last  one-past-the-end of the character sequence.
142
       *
143
       * Effects: if typeid(use_facet<collate<_Ch_type> >) ==
144
       * typeid(collate_byname<_Ch_type>) and the form of the sort key
145
       * returned by collate_byname<_Ch_type>::transform(__first, __last)
146
       * is known and can be converted into a primary sort key
147
       * then returns that key, otherwise returns an empty string.
148
       *
149
       * @todo Implement this function.
150
       */
151
      template<typename _Fwd_iter>
152
        string_type
153
        transform_primary(_Fwd_iter __first, _Fwd_iter __last) const
154
        { return string_type(); }
155
 
156
      /**
157
       * @brief Gets a collation element by name.
158
       *
159
       * @param __first beginning of the collation element name.
160
       * @param __last  one-past-the-end of the collation element name.
161
       *
162
       * @returns a sequence of one or more characters that represents the
163
       * collating element consisting of the character sequence designated by
164
       * the iterator range [__first, __last). Returns an empty string if the
165
       * character sequence is not a valid collating element.
166
       *
167
       * @todo Implement this function.
168
       */
169
      template<typename _Fwd_iter>
170
        string_type
171
        lookup_collatename(_Fwd_iter __first, _Fwd_iter __last) const
172
        { return string_type(); }
173
 
174
      /**
175
       * @brief Maps one or more characters to a named character
176
       *        classification.
177
       *
178
       * @param __first beginning of the character sequence.
179
       * @param __last  one-past-the-end of the character sequence.
180
       * @param __icase ignores the case of the classification name.
181
       *
182
       * @returns an unspecified value that represents the character
183
       * classification named by the character sequence designated by
184
       * the iterator range [__first, __last). If @p icase is true,
185
       * the returned mask identifies the classification regardless of
186
       * the case of the characters to be matched (for example,
187
       * [[:lower:]] is the same as [[:alpha:]]), otherwise a
188
       * case-dependant classification is returned.  The value
189
       * returned shall be independent of the case of the characters
190
       * in the character sequence. If the name is not recognized then
191
       * returns a value that compares equal to 0.
192
       *
193
       * At least the following names (or their wide-character equivalent) are
194
       * supported.
195
       * - d
196
       * - w
197
       * - s
198
       * - alnum
199
       * - alpha
200
       * - blank
201
       * - cntrl
202
       * - digit
203
       * - graph
204
       * - lower
205
       * - print
206
       * - punct
207
       * - space
208
       * - upper
209
       * - xdigit
210
       *
211
       * @todo Implement this function.
212
       */
213
      template<typename _Fwd_iter>
214
        char_class_type
215
        lookup_classname(_Fwd_iter __first, _Fwd_iter __last,
216
                         bool __icase = false) const
217
        { return 0; }
218
 
219
      /**
220
       * @brief Determines if @p c is a member of an identified class.
221
       *
222
       * @param __c a character.
223
       * @param __f a class type (as returned from lookup_classname).
224
       *
225
       * @returns true if the character @p __c is a member of the classification
226
       * represented by @p __f, false otherwise.
227
       *
228
       * @throws std::bad_cast if the current locale does not have a ctype
229
       *         facet.
230
       */
231
      bool
232
      isctype(_Ch_type __c, char_class_type __f) const;
233
 
234
      /**
235
       * @brief Converts a digit to an int.
236
       *
237
       * @param __ch    a character representing a digit.
238
       * @param __radix the radix if the numeric conversion (limited to 8, 10,
239
       *              or 16).
240
       *
241
       * @returns the value represented by the digit __ch in base radix if the
242
       * character __ch is a valid digit in base radix; otherwise returns -1.
243
       */
244
      int
245
      value(_Ch_type __ch, int __radix) const;
246
 
247
      /**
248
       * @brief Imbues the regex_traits object with a copy of a new locale.
249
       *
250
       * @param __loc A locale.
251
       *
252
       * @returns a copy of the previous locale in use by the regex_traits
253
       *          object.
254
       *
255
       * @note Calling imbue with a different locale than the one currently in
256
       *       use invalidates all cached data held by *this.
257
       */
258
      locale_type
259
      imbue(locale_type __loc)
260
      {
261
        std::swap(_M_locale, __loc);
262
        return __loc;
263
      }
264
 
265
      /**
266
       * @brief Gets a copy of the current locale in use by the regex_traits
267
       * object.
268
       */
269
      locale_type
270
      getloc() const
271
      { return _M_locale; }
272
 
273
    protected:
274
      locale_type _M_locale;
275
    };
276
 
277
  template<typename _Ch_type>
278
    bool
279
    regex_traits<_Ch_type>::
280
    isctype(_Ch_type __c, char_class_type __f) const
281
    {
282
      typedef std::ctype<char_type> __ctype_type;
283
      const __ctype_type& __fctyp(use_facet<__ctype_type>(_M_locale));
284
 
285
      if (__fctyp.is(__f, __c))
286
        return true;
287
 
288
      // special case of underscore in [[:w:]]
289
      if (__c == __fctyp.widen('_'))
290
        {
291
          const char __wb[] = "w";
292
          char_class_type __wt = this->lookup_classname(__wb,
293
                                                        __wb + sizeof(__wb));
294
          if (__f | __wt)
295
            return true;
296
        }
297
 
298
      // special case of [[:space:]] in [[:blank:]]
299
      if (__fctyp.is(std::ctype_base::space, __c))
300
        {
301
          const char __bb[] = "blank";
302
          char_class_type __bt = this->lookup_classname(__bb,
303
                                                        __bb + sizeof(__bb));
304
          if (__f | __bt)
305
            return true;
306
        }
307
 
308
      return false;
309
    }
310
 
311
  template<typename _Ch_type>
312
    int
313
    regex_traits<_Ch_type>::
314
    value(_Ch_type __ch, int __radix) const
315
    {
316
      std::basic_istringstream<char_type> __is(string_type(1, __ch));
317
      int __v;
318
      if (__radix == 8)
319
        __is >> std::oct;
320
      else if (__radix == 16)
321
        __is >> std::hex;
322
      __is >> __v;
323
      return __is.fail() ? -1 : __v;
324
    }
325
 
326
  // [7.8] Class basic_regex
327
  /**
328
   * Objects of specializations of this class represent regular expressions
329
   * constructed from sequences of character type @p _Ch_type.
330
   *
331
   * Storage for the regular expression is allocated and deallocated as
332
   * necessary by the member functions of this class.
333
   */
334
  template<typename _Ch_type, typename _Rx_traits = regex_traits<_Ch_type> >
335
    class basic_regex
336
    {
337
    public:
338
      // types:
339
      typedef _Ch_type                            value_type;
340
      typedef _Rx_traits                          traits_type;
341
      typedef typename traits_type::string_type   string_type;
342
      typedef regex_constants::syntax_option_type flag_type;
343
      typedef typename traits_type::locale_type   locale_type;
344
 
345
      /**
346
       * @name Constants
347
       * std [28.8.1](1)
348
       */
349
      //@{
350
      static constexpr flag_type icase = regex_constants::icase;
351
      static constexpr flag_type nosubs = regex_constants::nosubs;
352
      static constexpr flag_type optimize = regex_constants::optimize;
353
      static constexpr flag_type collate = regex_constants::collate;
354
      static constexpr flag_type ECMAScript = regex_constants::ECMAScript;
355
      static constexpr flag_type basic = regex_constants::basic;
356
      static constexpr flag_type extended = regex_constants::extended;
357
      static constexpr flag_type awk = regex_constants::awk;
358
      static constexpr flag_type grep = regex_constants::grep;
359
      static constexpr flag_type egrep = regex_constants::egrep;
360
      //@}
361
 
362
      // [7.8.2] construct/copy/destroy
363
      /**
364
       * Constructs a basic regular expression that does not match any
365
       * character sequence.
366
       */
367
      basic_regex()
368
      : _M_flags(ECMAScript),
369
        _M_automaton(__detail::__compile<const _Ch_type*, _Rx_traits>(0, 0,
370
                     _M_traits, _M_flags))
371
      { }
372
 
373
      /**
374
       * @brief Constructs a basic regular expression from the
375
       * sequence [__p, __p + char_traits<_Ch_type>::length(__p))
376
       * interpreted according to the flags in @p __f.
377
       *
378
       * @param __p A pointer to the start of a C-style null-terminated string
379
       *          containing a regular expression.
380
       * @param __f Flags indicating the syntax rules and options.
381
       *
382
       * @throws regex_error if @p __p is not a valid regular expression.
383
       */
384
      explicit
385
      basic_regex(const _Ch_type* __p, flag_type __f = ECMAScript)
386
      : _M_flags(__f),
387
        _M_automaton(__detail::__compile(__p, __p + _Rx_traits::length(__p),
388
                                        _M_traits, _M_flags))
389
      { }
390
 
391
      /**
392
       * @brief Constructs a basic regular expression from the sequence
393
       * [p, p + len) interpreted according to the flags in @p f.
394
       *
395
       * @param __p   A pointer to the start of a string containing a regular
396
       *              expression.
397
       * @param __len The length of the string containing the regular
398
       *              expression.
399
       * @param __f   Flags indicating the syntax rules and options.
400
       *
401
       * @throws regex_error if @p __p is not a valid regular expression.
402
       */
403
      basic_regex(const _Ch_type* __p, std::size_t __len, flag_type __f)
404
      : _M_flags(__f),
405
        _M_automaton(__detail::__compile(__p, __p + __len, _M_traits, _M_flags))
406
      { }
407
 
408
      /**
409
       * @brief Copy-constructs a basic regular expression.
410
       *
411
       * @param __rhs A @p regex object.
412
       */
413
      basic_regex(const basic_regex& __rhs)
414
      : _M_flags(__rhs._M_flags), _M_traits(__rhs._M_traits),
415
        _M_automaton(__rhs._M_automaton)
416
      { }
417
 
418
      /**
419
       * @brief Move-constructs a basic regular expression.
420
       *
421
       * @param __rhs A @p regex object.
422
       */
423
      basic_regex(const basic_regex&& __rhs) noexcept
424
      : _M_flags(__rhs._M_flags), _M_traits(__rhs._M_traits),
425
        _M_automaton(std::move(__rhs._M_automaton))
426
      { }
427
 
428
      /**
429
       * @brief Constructs a basic regular expression from the string
430
       * @p s interpreted according to the flags in @p f.
431
       *
432
       * @param __s A string containing a regular expression.
433
       * @param __f Flags indicating the syntax rules and options.
434
       *
435
       * @throws regex_error if @p __s is not a valid regular expression.
436
       */
437
      template<typename _Ch_traits, typename _Ch_alloc>
438
        explicit
439
        basic_regex(const std::basic_string<_Ch_type, _Ch_traits,
440
                                            _Ch_alloc>& __s,
441
                    flag_type __f = ECMAScript)
442
        : _M_flags(__f),
443
          _M_automaton(__detail::__compile(__s.begin(), __s.end(),
444
                                          _M_traits, _M_flags))
445
        { }
446
 
447
      /**
448
       * @brief Constructs a basic regular expression from the range
449
       * [first, last) interpreted according to the flags in @p f.
450
       *
451
       * @param __first The start of a range containing a valid regular
452
       *                expression.
453
       * @param __last  The end of a range containing a valid regular
454
       *                expression.
455
       * @param __f     The format flags of the regular expression.
456
       *
457
       * @throws regex_error if @p [__first, __last) is not a valid regular
458
       *         expression.
459
       */
460
      template<typename _InputIterator>
461
        basic_regex(_InputIterator __first, _InputIterator __last,
462
                    flag_type __f = ECMAScript)
463
        : _M_flags(__f),
464
          _M_automaton(__detail::__compile(__first, __last, _M_traits, _M_flags))
465
        { }
466
 
467
      /**
468
       * @brief Constructs a basic regular expression from an initializer list.
469
       *
470
       * @param __l  The initializer list.
471
       * @param __f  The format flags of the regular expression.
472
       *
473
       * @throws regex_error if @p __l is not a valid regular expression.
474
       */
475
      basic_regex(initializer_list<_Ch_type> __l,
476
                  flag_type __f = ECMAScript)
477
      : _M_flags(__f),
478
        _M_automaton(__detail::__compile(__l.begin(), __l.end(),
479
                                        _M_traits, _M_flags))
480
      { }
481
 
482
      /**
483
       * @brief Destroys a basic regular expression.
484
       */
485
      ~basic_regex()
486
      { }
487
 
488
      /**
489
       * @brief Assigns one regular expression to another.
490
       */
491
      basic_regex&
492
      operator=(const basic_regex& __rhs)
493
      { return this->assign(__rhs); }
494
 
495
      /**
496
       * @brief Move-assigns one regular expression to another.
497
       */
498
      basic_regex&
499
      operator=(basic_regex&& __rhs) noexcept
500
      { return this->assign(std::move(__rhs)); }
501
 
502
      /**
503
       * @brief Replaces a regular expression with a new one constructed from
504
       * a C-style null-terminated string.
505
       *
506
       * @param __p A pointer to the start of a null-terminated C-style string
507
       *        containing a regular expression.
508
       */
509
      basic_regex&
510
      operator=(const _Ch_type* __p)
511
      { return this->assign(__p, flags()); }
512
 
513
      /**
514
       * @brief Replaces a regular expression with a new one constructed from
515
       * a string.
516
       *
517
       * @param __s A pointer to a string containing a regular expression.
518
       */
519
      template<typename _Ch_typeraits, typename _Alloc>
520
        basic_regex&
521
        operator=(const basic_string<_Ch_type, _Ch_typeraits, _Alloc>& __s)
522
        { return this->assign(__s, flags()); }
523
 
524
      // [7.8.3] assign
525
      /**
526
       * @brief the real assignment operator.
527
       *
528
       * @param __rhs Another regular expression object.
529
       */
530
      basic_regex&
531
      assign(const basic_regex& __rhs)
532
      {
533
        basic_regex __tmp(__rhs);
534
        this->swap(__tmp);
535
        return *this;
536
      }
537
 
538
      /**
539
       * @brief The move-assignment operator.
540
       *
541
       * @param __rhs Another regular expression object.
542
       */
543
      basic_regex&
544
      assign(basic_regex&& __rhs) noexcept
545
      {
546
        basic_regex __tmp(std::move(__rhs));
547
        this->swap(__tmp);
548
        return *this;
549
      }
550
 
551
      /**
552
       * @brief Assigns a new regular expression to a regex object from a
553
       * C-style null-terminated string containing a regular expression
554
       * pattern.
555
       *
556
       * @param __p     A pointer to a C-style null-terminated string containing
557
       *              a regular expression pattern.
558
       * @param __flags Syntax option flags.
559
       *
560
       * @throws regex_error if __p does not contain a valid regular
561
       * expression pattern interpreted according to @p __flags.  If
562
       * regex_error is thrown, *this remains unchanged.
563
       */
564
      basic_regex&
565
      assign(const _Ch_type* __p, flag_type __flags = ECMAScript)
566
      { return this->assign(string_type(__p), __flags); }
567
 
568
      /**
569
       * @brief Assigns a new regular expression to a regex object from a
570
       * C-style string containing a regular expression pattern.
571
       *
572
       * @param __p     A pointer to a C-style string containing a
573
       *                regular expression pattern.
574
       * @param __len   The length of the regular expression pattern string.
575
       * @param __flags Syntax option flags.
576
       *
577
       * @throws regex_error if p does not contain a valid regular
578
       * expression pattern interpreted according to @p __flags.  If
579
       * regex_error is thrown, *this remains unchanged.
580
       */
581
      basic_regex&
582
      assign(const _Ch_type* __p, std::size_t __len, flag_type __flags)
583
      { return this->assign(string_type(__p, __len), __flags); }
584
 
585
      /**
586
       * @brief Assigns a new regular expression to a regex object from a
587
       * string containing a regular expression pattern.
588
       *
589
       * @param __s     A string containing a regular expression pattern.
590
       * @param __flags Syntax option flags.
591
       *
592
       * @throws regex_error if __s does not contain a valid regular
593
       * expression pattern interpreted according to @p __flags.  If
594
       * regex_error is thrown, *this remains unchanged.
595
       */
596
      template<typename _Ch_typeraits, typename _Alloc>
597
        basic_regex&
598
        assign(const basic_string<_Ch_type, _Ch_typeraits, _Alloc>& __s,
599
               flag_type __flags = ECMAScript)
600
        {
601
          basic_regex __tmp(__s, __flags);
602
          this->swap(__tmp);
603
          return *this;
604
        }
605
 
606
      /**
607
       * @brief Assigns a new regular expression to a regex object.
608
       *
609
       * @param __first The start of a range containing a valid regular
610
       *                expression.
611
       * @param __last  The end of a range containing a valid regular
612
       *                expression.
613
       * @param __flags Syntax option flags.
614
       *
615
       * @throws regex_error if p does not contain a valid regular
616
       * expression pattern interpreted according to @p __flags.  If
617
       * regex_error is thrown, the object remains unchanged.
618
       */
619
      template<typename _InputIterator>
620
        basic_regex&
621
        assign(_InputIterator __first, _InputIterator __last,
622
               flag_type __flags = ECMAScript)
623
        { return this->assign(string_type(__first, __last), __flags); }
624
 
625
      /**
626
       * @brief Assigns a new regular expression to a regex object.
627
       *
628
       * @param __l     An initializer list representing a regular expression.
629
       * @param __flags Syntax option flags.
630
       *
631
       * @throws regex_error if @p __l does not contain a valid
632
       * regular expression pattern interpreted according to @p
633
       * __flags.  If regex_error is thrown, the object remains
634
       * unchanged.
635
       */
636
      basic_regex&
637
      assign(initializer_list<_Ch_type> __l, flag_type __flags = ECMAScript)
638
      { return this->assign(__l.begin(), __l.end(), __flags); }
639
 
640
      // [7.8.4] const operations
641
      /**
642
       * @brief Gets the number of marked subexpressions within the regular
643
       * expression.
644
       */
645
      unsigned int
646
      mark_count() const
647
      { return _M_automaton->_M_sub_count() - 1; }
648
 
649
      /**
650
       * @brief Gets the flags used to construct the regular expression
651
       * or in the last call to assign().
652
       */
653
      flag_type
654
      flags() const
655
      { return _M_flags; }
656
 
657
      // [7.8.5] locale
658
      /**
659
       * @brief Imbues the regular expression object with the given locale.
660
       *
661
       * @param __loc A locale.
662
       */
663
      locale_type
664
      imbue(locale_type __loc)
665
      { return _M_traits.imbue(__loc); }
666
 
667
      /**
668
       * @brief Gets the locale currently imbued in the regular expression
669
       *        object.
670
       */
671
      locale_type
672
      getloc() const
673
      { return _M_traits.getloc(); }
674
 
675
      // [7.8.6] swap
676
      /**
677
       * @brief Swaps the contents of two regular expression objects.
678
       *
679
       * @param __rhs Another regular expression object.
680
       */
681
      void
682
      swap(basic_regex& __rhs)
683
      {
684
        std::swap(_M_flags, __rhs._M_flags);
685
        std::swap(_M_traits, __rhs._M_traits);
686
        std::swap(_M_automaton, __rhs._M_automaton);
687
      }
688
 
689
#ifdef _GLIBCXX_DEBUG
690
      void
691
      _M_dot(std::ostream& __ostr)
692
      { _M_automaton->_M_dot(__ostr); }
693
#endif
694
 
695
      const __detail::_AutomatonPtr&
696
      _M_get_automaton() const
697
      { return _M_automaton; }
698
 
699
    protected:
700
      flag_type              _M_flags;
701
      _Rx_traits             _M_traits;
702
      __detail::_AutomatonPtr _M_automaton;
703
    };
704
 
705
  /** @brief Standard regular expressions. */
706
  typedef basic_regex<char>    regex;
707
 
708
#ifdef _GLIBCXX_USE_WCHAR_T
709
  /** @brief Standard wide-character regular expressions. */
710
  typedef basic_regex<wchar_t> wregex;
711
#endif
712
 
713
 
714
  // [7.8.6] basic_regex swap
715
  /**
716
   * @brief Swaps the contents of two regular expression objects.
717
   * @param __lhs First regular expression.
718
   * @param __rhs Second regular expression.
719
   */
720
  template<typename _Ch_type, typename _Rx_traits>
721
    inline void
722
    swap(basic_regex<_Ch_type, _Rx_traits>& __lhs,
723
         basic_regex<_Ch_type, _Rx_traits>& __rhs)
724
    { __lhs.swap(__rhs); }
725
 
726
 
727
  // [7.9] Class template sub_match
728
  /**
729
   * A sequence of characters matched by a particular marked sub-expression.
730
   *
731
   * An object of this class is essentially a pair of iterators marking a
732
   * matched subexpression within a regular expression pattern match. Such
733
   * objects can be converted to and compared with std::basic_string objects
734
   * of a similar base character type as the pattern matched by the regular
735
   * expression.
736
   *
737
   * The iterators that make up the pair are the usual half-open interval
738
   * referencing the actual original pattern matched.
739
   */
740
  template<typename _BiIter>
741
    class sub_match : public std::pair<_BiIter, _BiIter>
742
    {
743
      typedef iterator_traits<_BiIter>                  __iter_traits;
744
 
745
    public:
746
      typedef typename __iter_traits::value_type        value_type;
747
      typedef typename __iter_traits::difference_type   difference_type;
748
      typedef _BiIter                                   iterator;
749
      typedef std::basic_string<value_type>             string_type;
750
 
751
      bool matched;
752
 
753
      constexpr sub_match() : matched() { }
754
 
755
      /**
756
       * Gets the length of the matching sequence.
757
       */
758
      difference_type
759
      length() const
760
      { return this->matched ? std::distance(this->first, this->second) : 0; }
761
 
762
      /**
763
       * @brief Gets the matching sequence as a string.
764
       *
765
       * @returns the matching sequence as a string.
766
       *
767
       * This is the implicit conversion operator.  It is identical to the
768
       * str() member function except that it will want to pop up in
769
       * unexpected places and cause a great deal of confusion and cursing
770
       * from the unwary.
771
       */
772
      operator string_type() const
773
      {
774
        return this->matched
775
          ? string_type(this->first, this->second)
776
          : string_type();
777
      }
778
 
779
      /**
780
       * @brief Gets the matching sequence as a string.
781
       *
782
       * @returns the matching sequence as a string.
783
       */
784
      string_type
785
      str() const
786
      {
787
        return this->matched
788
          ? string_type(this->first, this->second)
789
          : string_type();
790
      }
791
 
792
      /**
793
       * @brief Compares this and another matched sequence.
794
       *
795
       * @param __s Another matched sequence to compare to this one.
796
       *
797
       * @retval <0 this matched sequence will collate before @p __s.
798
       * @retval =0 this matched sequence is equivalent to @p __s.
799
       * @retval <0 this matched sequence will collate after @p __s.
800
       */
801
      int
802
      compare(const sub_match& __s) const
803
      { return this->str().compare(__s.str()); }
804
 
805
      /**
806
       * @brief Compares this sub_match to a string.
807
       *
808
       * @param __s A string to compare to this sub_match.
809
       *
810
       * @retval <0 this matched sequence will collate before @p __s.
811
       * @retval =0 this matched sequence is equivalent to @p __s.
812
       * @retval <0 this matched sequence will collate after @p __s.
813
       */
814
      int
815
      compare(const string_type& __s) const
816
      { return this->str().compare(__s); }
817
 
818
      /**
819
       * @brief Compares this sub_match to a C-style string.
820
       *
821
       * @param __s A C-style string to compare to this sub_match.
822
       *
823
       * @retval <0 this matched sequence will collate before @p __s.
824
       * @retval =0 this matched sequence is equivalent to @p __s.
825
       * @retval <0 this matched sequence will collate after @p __s.
826
       */
827
      int
828
      compare(const value_type* __s) const
829
      { return this->str().compare(__s); }
830
    };
831
 
832
 
833
  /** @brief Standard regex submatch over a C-style null-terminated string. */
834
  typedef sub_match<const char*>             csub_match;
835
 
836
  /** @brief Standard regex submatch over a standard string. */
837
  typedef sub_match<string::const_iterator>  ssub_match;
838
 
839
#ifdef _GLIBCXX_USE_WCHAR_T
840
  /** @brief Regex submatch over a C-style null-terminated wide string. */
841
  typedef sub_match<const wchar_t*>          wcsub_match;
842
 
843
  /** @brief Regex submatch over a standard wide string. */
844
  typedef sub_match<wstring::const_iterator> wssub_match;
845
#endif
846
 
847
  // [7.9.2] sub_match non-member operators
848
 
849
  /**
850
   * @brief Tests the equivalence of two regular expression submatches.
851
   * @param __lhs First regular expression submatch.
852
   * @param __rhs Second regular expression submatch.
853
   * @returns true if @a __lhs  is equivalent to @a __rhs, false otherwise.
854
   */
855
  template<typename _BiIter>
856
    inline bool
857
    operator==(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs)
858
    { return __lhs.compare(__rhs) == 0; }
859
 
860
  /**
861
   * @brief Tests the inequivalence of two regular expression submatches.
862
   * @param __lhs First regular expression submatch.
863
   * @param __rhs Second regular expression submatch.
864
   * @returns true if @a __lhs  is not equivalent to @a __rhs, false otherwise.
865
   */
866
  template<typename _BiIter>
867
    inline bool
868
    operator!=(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs)
869
    { return __lhs.compare(__rhs) != 0; }
870
 
871
  /**
872
   * @brief Tests the ordering of two regular expression submatches.
873
   * @param __lhs First regular expression submatch.
874
   * @param __rhs Second regular expression submatch.
875
   * @returns true if @a __lhs precedes @a __rhs, false otherwise.
876
   */
877
  template<typename _BiIter>
878
    inline bool
879
    operator<(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs)
880
    { return __lhs.compare(__rhs) < 0; }
881
 
882
  /**
883
   * @brief Tests the ordering of two regular expression submatches.
884
   * @param __lhs First regular expression submatch.
885
   * @param __rhs Second regular expression submatch.
886
   * @returns true if @a __lhs does not succeed @a __rhs, false otherwise.
887
   */
888
  template<typename _BiIter>
889
    inline bool
890
    operator<=(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs)
891
    { return __lhs.compare(__rhs) <= 0; }
892
 
893
  /**
894
   * @brief Tests the ordering of two regular expression submatches.
895
   * @param __lhs First regular expression submatch.
896
   * @param __rhs Second regular expression submatch.
897
   * @returns true if @a __lhs does not precede @a __rhs, false otherwise.
898
   */
899
  template<typename _BiIter>
900
    inline bool
901
    operator>=(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs)
902
    { return __lhs.compare(__rhs) >= 0; }
903
 
904
  /**
905
   * @brief Tests the ordering of two regular expression submatches.
906
   * @param __lhs First regular expression submatch.
907
   * @param __rhs Second regular expression submatch.
908
   * @returns true if @a __lhs succeeds @a __rhs, false otherwise.
909
   */
910
  template<typename _BiIter>
911
    inline bool
912
    operator>(const sub_match<_BiIter>& __lhs, const sub_match<_BiIter>& __rhs)
913
    { return __lhs.compare(__rhs) > 0; }
914
 
915
  // Alias for sub_match'd string.
916
  template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc>
917
    using __sub_match_string = basic_string<
918
                              typename iterator_traits<_Bi_iter>::value_type,
919
                              _Ch_traits, _Ch_alloc>;
920
 
921
  /**
922
   * @brief Tests the equivalence of a string and a regular expression
923
   *        submatch.
924
   * @param __lhs A string.
925
   * @param __rhs A regular expression submatch.
926
   * @returns true if @a __lhs  is equivalent to @a __rhs, false otherwise.
927
   */
928
  template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc>
929
    inline bool
930
    operator==(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs,
931
               const sub_match<_Bi_iter>& __rhs)
932
    { return __rhs.compare(__lhs.c_str()) == 0; }
933
 
934
  /**
935
   * @brief Tests the inequivalence of a string and a regular expression
936
   *        submatch.
937
   * @param __lhs A string.
938
   * @param __rhs A regular expression submatch.
939
   * @returns true if @a __lhs  is not equivalent to @a __rhs, false otherwise.
940
   */
941
  template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc>
942
    inline bool
943
    operator!=(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs,
944
               const sub_match<_Bi_iter>& __rhs)
945
    { return !(__lhs == __rhs); }
946
 
947
  /**
948
   * @brief Tests the ordering of a string and a regular expression submatch.
949
   * @param __lhs A string.
950
   * @param __rhs A regular expression submatch.
951
   * @returns true if @a __lhs precedes @a __rhs, false otherwise.
952
   */
953
  template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc>
954
    inline bool
955
    operator<(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs,
956
              const sub_match<_Bi_iter>& __rhs)
957
     { return __rhs.compare(__lhs.c_str()) > 0; }
958
 
959
  /**
960
   * @brief Tests the ordering of a string and a regular expression submatch.
961
   * @param __lhs A string.
962
   * @param __rhs A regular expression submatch.
963
   * @returns true if @a __lhs succeeds @a __rhs, false otherwise.
964
   */
965
  template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc>
966
    inline bool
967
    operator>(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs,
968
              const sub_match<_Bi_iter>& __rhs)
969
    { return __rhs < __lhs; }
970
 
971
  /**
972
   * @brief Tests the ordering of a string and a regular expression submatch.
973
   * @param __lhs A string.
974
   * @param __rhs A regular expression submatch.
975
   * @returns true if @a __lhs does not precede @a __rhs, false otherwise.
976
   */
977
  template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc>
978
    inline bool
979
    operator>=(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs,
980
               const sub_match<_Bi_iter>& __rhs)
981
    { return !(__lhs < __rhs); }
982
 
983
  /**
984
   * @brief Tests the ordering of a string and a regular expression submatch.
985
   * @param __lhs A string.
986
   * @param __rhs A regular expression submatch.
987
   * @returns true if @a __lhs does not succeed @a __rhs, false otherwise.
988
   */
989
  template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc>
990
    inline bool
991
    operator<=(const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __lhs,
992
               const sub_match<_Bi_iter>& __rhs)
993
    { return !(__rhs < __lhs); }
994
 
995
  /**
996
   * @brief Tests the equivalence of a regular expression submatch and a
997
   *        string.
998
   * @param __lhs A regular expression submatch.
999
   * @param __rhs A string.
1000
   * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise.
1001
   */
1002
  template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc>
1003
    inline bool
1004
    operator==(const sub_match<_Bi_iter>& __lhs,
1005
               const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs)
1006
    { return __lhs.compare(__rhs.c_str()) == 0; }
1007
 
1008
  /**
1009
   * @brief Tests the inequivalence of a regular expression submatch and a
1010
   *        string.
1011
   * @param __lhs A regular expression submatch.
1012
   * @param __rhs A string.
1013
   * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise.
1014
   */
1015
  template<typename _Bi_iter, typename _Ch_traits, typename _Ch_alloc>
1016
    inline bool
1017
    operator!=(const sub_match<_Bi_iter>& __lhs,
1018
               const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs)
1019
    { return !(__lhs == __rhs); }
1020
 
1021
  /**
1022
   * @brief Tests the ordering of a regular expression submatch and a string.
1023
   * @param __lhs A regular expression submatch.
1024
   * @param __rhs A string.
1025
   * @returns true if @a __lhs precedes @a __rhs, false otherwise.
1026
   */
1027
  template<typename _Bi_iter, class _Ch_traits, class _Ch_alloc>
1028
    inline bool
1029
    operator<(const sub_match<_Bi_iter>& __lhs,
1030
              const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs)
1031
    { return __lhs.compare(__rhs.c_str()) < 0; }
1032
 
1033
  /**
1034
   * @brief Tests the ordering of a regular expression submatch and a string.
1035
   * @param __lhs A regular expression submatch.
1036
   * @param __rhs A string.
1037
   * @returns true if @a __lhs succeeds @a __rhs, false otherwise.
1038
   */
1039
  template<typename _Bi_iter, class _Ch_traits, class _Ch_alloc>
1040
    inline bool
1041
    operator>(const sub_match<_Bi_iter>& __lhs,
1042
              const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs)
1043
    { return __rhs < __lhs; }
1044
 
1045
  /**
1046
   * @brief Tests the ordering of a regular expression submatch and a string.
1047
   * @param __lhs A regular expression submatch.
1048
   * @param __rhs A string.
1049
   * @returns true if @a __lhs does not precede @a __rhs, false otherwise.
1050
   */
1051
  template<typename _Bi_iter, class _Ch_traits, class _Ch_alloc>
1052
    inline bool
1053
    operator>=(const sub_match<_Bi_iter>& __lhs,
1054
               const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs)
1055
    { return !(__lhs < __rhs); }
1056
 
1057
  /**
1058
   * @brief Tests the ordering of a regular expression submatch and a string.
1059
   * @param __lhs A regular expression submatch.
1060
   * @param __rhs A string.
1061
   * @returns true if @a __lhs does not succeed @a __rhs, false otherwise.
1062
   */
1063
  template<typename _Bi_iter, class _Ch_traits, class _Ch_alloc>
1064
    inline bool
1065
    operator<=(const sub_match<_Bi_iter>& __lhs,
1066
               const __sub_match_string<_Bi_iter, _Ch_traits, _Ch_alloc>& __rhs)
1067
    { return !(__rhs < __lhs); }
1068
 
1069
  /**
1070
   * @brief Tests the equivalence of a C string and a regular expression
1071
   *        submatch.
1072
   * @param __lhs A C string.
1073
   * @param __rhs A regular expression submatch.
1074
   * @returns true if @a __lhs  is equivalent to @a __rhs, false otherwise.
1075
   */
1076
  template<typename _Bi_iter>
1077
    inline bool
1078
    operator==(typename iterator_traits<_Bi_iter>::value_type const* __lhs,
1079
               const sub_match<_Bi_iter>& __rhs)
1080
    { return __rhs.compare(__lhs) == 0; }
1081
 
1082
  /**
1083
   * @brief Tests the inequivalence of an iterator value and a regular
1084
   *        expression submatch.
1085
   * @param __lhs A regular expression submatch.
1086
   * @param __rhs A string.
1087
   * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise.
1088
   */
1089
  template<typename _Bi_iter>
1090
    inline bool
1091
    operator!=(typename iterator_traits<_Bi_iter>::value_type const* __lhs,
1092
               const sub_match<_Bi_iter>& __rhs)
1093
    { return !(__lhs == __rhs); }
1094
 
1095
  /**
1096
   * @brief Tests the ordering of a string and a regular expression submatch.
1097
   * @param __lhs A string.
1098
   * @param __rhs A regular expression submatch.
1099
   * @returns true if @a __lhs precedes @a __rhs, false otherwise.
1100
   */
1101
  template<typename _Bi_iter>
1102
    inline bool
1103
    operator<(typename iterator_traits<_Bi_iter>::value_type const* __lhs,
1104
              const sub_match<_Bi_iter>& __rhs)
1105
    { return __rhs.compare(__lhs) > 0; }
1106
 
1107
  /**
1108
   * @brief Tests the ordering of a string and a regular expression submatch.
1109
   * @param __lhs A string.
1110
   * @param __rhs A regular expression submatch.
1111
   * @returns true if @a __lhs succeeds @a __rhs, false otherwise.
1112
   */
1113
  template<typename _Bi_iter>
1114
    inline bool
1115
    operator>(typename iterator_traits<_Bi_iter>::value_type const* __lhs,
1116
              const sub_match<_Bi_iter>& __rhs)
1117
    { return __rhs < __lhs; }
1118
 
1119
  /**
1120
   * @brief Tests the ordering of a string and a regular expression submatch.
1121
   * @param __lhs A string.
1122
   * @param __rhs A regular expression submatch.
1123
   * @returns true if @a __lhs does not precede @a __rhs, false otherwise.
1124
   */
1125
  template<typename _Bi_iter>
1126
    inline bool
1127
    operator>=(typename iterator_traits<_Bi_iter>::value_type const* __lhs,
1128
               const sub_match<_Bi_iter>& __rhs)
1129
    { return !(__lhs < __rhs); }
1130
 
1131
  /**
1132
   * @brief Tests the ordering of a string and a regular expression submatch.
1133
   * @param __lhs A string.
1134
   * @param __rhs A regular expression submatch.
1135
   * @returns true if @a __lhs does not succeed @a __rhs, false otherwise.
1136
   */
1137
  template<typename _Bi_iter>
1138
    inline bool
1139
    operator<=(typename iterator_traits<_Bi_iter>::value_type const* __lhs,
1140
               const sub_match<_Bi_iter>& __rhs)
1141
    { return !(__rhs < __lhs); }
1142
 
1143
  /**
1144
   * @brief Tests the equivalence of a regular expression submatch and a
1145
   *        string.
1146
   * @param __lhs A regular expression submatch.
1147
   * @param __rhs A pointer to a string?
1148
   * @returns true if @a __lhs  is equivalent to @a __rhs, false otherwise.
1149
   */
1150
  template<typename _Bi_iter>
1151
    inline bool
1152
    operator==(const sub_match<_Bi_iter>& __lhs,
1153
               typename iterator_traits<_Bi_iter>::value_type const* __rhs)
1154
    { return __lhs.compare(__rhs) == 0; }
1155
 
1156
  /**
1157
   * @brief Tests the inequivalence of a regular expression submatch and a
1158
   *        string.
1159
   * @param __lhs A regular expression submatch.
1160
   * @param __rhs A pointer to a string.
1161
   * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise.
1162
   */
1163
  template<typename _Bi_iter>
1164
    inline bool
1165
    operator!=(const sub_match<_Bi_iter>& __lhs,
1166
               typename iterator_traits<_Bi_iter>::value_type const* __rhs)
1167
    { return !(__lhs == __rhs); }
1168
 
1169
  /**
1170
   * @brief Tests the ordering of a regular expression submatch and a string.
1171
   * @param __lhs A regular expression submatch.
1172
   * @param __rhs A string.
1173
   * @returns true if @a __lhs precedes @a __rhs, false otherwise.
1174
   */
1175
  template<typename _Bi_iter>
1176
    inline bool
1177
    operator<(const sub_match<_Bi_iter>& __lhs,
1178
              typename iterator_traits<_Bi_iter>::value_type const* __rhs)
1179
    { return __lhs.compare(__rhs) < 0; }
1180
 
1181
  /**
1182
   * @brief Tests the ordering of a regular expression submatch and a string.
1183
   * @param __lhs A regular expression submatch.
1184
   * @param __rhs A string.
1185
   * @returns true if @a __lhs succeeds @a __rhs, false otherwise.
1186
   */
1187
  template<typename _Bi_iter>
1188
    inline bool
1189
    operator>(const sub_match<_Bi_iter>& __lhs,
1190
              typename iterator_traits<_Bi_iter>::value_type const* __rhs)
1191
    { return __rhs < __lhs; }
1192
 
1193
  /**
1194
   * @brief Tests the ordering of a regular expression submatch and a string.
1195
   * @param __lhs A regular expression submatch.
1196
   * @param __rhs A string.
1197
   * @returns true if @a __lhs does not precede @a __rhs, false otherwise.
1198
   */
1199
  template<typename _Bi_iter>
1200
    inline bool
1201
    operator>=(const sub_match<_Bi_iter>& __lhs,
1202
               typename iterator_traits<_Bi_iter>::value_type const* __rhs)
1203
    { return !(__lhs < __rhs); }
1204
 
1205
  /**
1206
   * @brief Tests the ordering of a regular expression submatch and a string.
1207
   * @param __lhs A regular expression submatch.
1208
   * @param __rhs A string.
1209
   * @returns true if @a __lhs does not succeed @a __rhs, false otherwise.
1210
   */
1211
  template<typename _Bi_iter>
1212
    inline bool
1213
    operator<=(const sub_match<_Bi_iter>& __lhs,
1214
               typename iterator_traits<_Bi_iter>::value_type const* __rhs)
1215
    { return !(__rhs < __lhs); }
1216
 
1217
  /**
1218
   * @brief Tests the equivalence of a string and a regular expression
1219
   *        submatch.
1220
   * @param __lhs A string.
1221
   * @param __rhs A regular expression submatch.
1222
   * @returns true if @a __lhs is equivalent to @a __rhs, false otherwise.
1223
   */
1224
  template<typename _Bi_iter>
1225
    inline bool
1226
    operator==(typename iterator_traits<_Bi_iter>::value_type const& __lhs,
1227
               const sub_match<_Bi_iter>& __rhs)
1228
    {
1229
      typedef typename sub_match<_Bi_iter>::string_type string_type;
1230
      return __rhs.compare(string_type(1, __lhs)) == 0;
1231
    }
1232
 
1233
  /**
1234
   * @brief Tests the inequivalence of a string and a regular expression
1235
   *        submatch.
1236
   * @param __lhs A string.
1237
   * @param __rhs A regular expression submatch.
1238
   * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise.
1239
   */
1240
  template<typename _Bi_iter>
1241
    inline bool
1242
    operator!=(typename iterator_traits<_Bi_iter>::value_type const& __lhs,
1243
               const sub_match<_Bi_iter>& __rhs)
1244
    { return !(__lhs == __rhs); }
1245
 
1246
  /**
1247
   * @brief Tests the ordering of a string and a regular expression submatch.
1248
   * @param __lhs A string.
1249
   * @param __rhs A regular expression submatch.
1250
   * @returns true if @a __lhs precedes @a __rhs, false otherwise.
1251
   */
1252
  template<typename _Bi_iter>
1253
    inline bool
1254
    operator<(typename iterator_traits<_Bi_iter>::value_type const& __lhs,
1255
              const sub_match<_Bi_iter>& __rhs)
1256
    {
1257
      typedef typename sub_match<_Bi_iter>::string_type string_type;
1258
      return __rhs.compare(string_type(1, __lhs)) > 0;
1259
    }
1260
 
1261
  /**
1262
   * @brief Tests the ordering of a string and a regular expression submatch.
1263
   * @param __lhs A string.
1264
   * @param __rhs A regular expression submatch.
1265
   * @returns true if @a __lhs succeeds @a __rhs, false otherwise.
1266
   */
1267
  template<typename _Bi_iter>
1268
    inline bool
1269
    operator>(typename iterator_traits<_Bi_iter>::value_type const& __lhs,
1270
              const sub_match<_Bi_iter>& __rhs)
1271
    { return __rhs < __lhs; }
1272
 
1273
  /**
1274
   * @brief Tests the ordering of a string and a regular expression submatch.
1275
   * @param __lhs A string.
1276
   * @param __rhs A regular expression submatch.
1277
   * @returns true if @a __lhs does not precede @a __rhs, false otherwise.
1278
   */
1279
  template<typename _Bi_iter>
1280
    inline bool
1281
    operator>=(typename iterator_traits<_Bi_iter>::value_type const& __lhs,
1282
               const sub_match<_Bi_iter>& __rhs)
1283
    { return !(__lhs < __rhs); }
1284
 
1285
  /**
1286
   * @brief Tests the ordering of a string and a regular expression submatch.
1287
   * @param __lhs A string.
1288
   * @param __rhs A regular expression submatch.
1289
   * @returns true if @a __lhs does not succeed @a __rhs, false otherwise.
1290
   */
1291
  template<typename _Bi_iter>
1292
    inline bool
1293
    operator<=(typename iterator_traits<_Bi_iter>::value_type const& __lhs,
1294
               const sub_match<_Bi_iter>& __rhs)
1295
    { return !(__rhs < __lhs); }
1296
 
1297
  /**
1298
   * @brief Tests the equivalence of a regular expression submatch and a
1299
   *        string.
1300
   * @param __lhs A regular expression submatch.
1301
   * @param __rhs A const string reference.
1302
   * @returns true if @a __lhs  is equivalent to @a __rhs, false otherwise.
1303
   */
1304
  template<typename _Bi_iter>
1305
    inline bool
1306
    operator==(const sub_match<_Bi_iter>& __lhs,
1307
               typename iterator_traits<_Bi_iter>::value_type const& __rhs)
1308
    {
1309
      typedef typename sub_match<_Bi_iter>::string_type string_type;
1310
      return __lhs.compare(string_type(1, __rhs)) == 0;
1311
    }
1312
 
1313
  /**
1314
   * @brief Tests the inequivalence of a regular expression submatch and a
1315
   *        string.
1316
   * @param __lhs A regular expression submatch.
1317
   * @param __rhs A const string reference.
1318
   * @returns true if @a __lhs is not equivalent to @a __rhs, false otherwise.
1319
   */
1320
  template<typename _Bi_iter>
1321
    inline bool
1322
    operator!=(const sub_match<_Bi_iter>& __lhs,
1323
               typename iterator_traits<_Bi_iter>::value_type const& __rhs)
1324
    { return !(__lhs == __rhs); }
1325
 
1326
  /**
1327
   * @brief Tests the ordering of a regular expression submatch and a string.
1328
   * @param __lhs A regular expression submatch.
1329
   * @param __rhs A const string reference.
1330
   * @returns true if @a __lhs precedes @a __rhs, false otherwise.
1331
   */
1332
  template<typename _Bi_iter>
1333
    inline bool
1334
    operator<(const sub_match<_Bi_iter>& __lhs,
1335
              typename iterator_traits<_Bi_iter>::value_type const& __rhs)
1336
    {
1337
      typedef typename sub_match<_Bi_iter>::string_type string_type;
1338
      return __lhs.compare(string_type(1, __rhs)) < 0;
1339
    }
1340
 
1341
  /**
1342
   * @brief Tests the ordering of a regular expression submatch and a string.
1343
   * @param __lhs A regular expression submatch.
1344
   * @param __rhs A const string reference.
1345
   * @returns true if @a __lhs succeeds @a __rhs, false otherwise.
1346
   */
1347
  template<typename _Bi_iter>
1348
    inline bool
1349
    operator>(const sub_match<_Bi_iter>& __lhs,
1350
              typename iterator_traits<_Bi_iter>::value_type const& __rhs)
1351
    { return __rhs < __lhs; }
1352
 
1353
  /**
1354
   * @brief Tests the ordering of a regular expression submatch and a string.
1355
   * @param __lhs A regular expression submatch.
1356
   * @param __rhs A const string reference.
1357
   * @returns true if @a __lhs does not precede @a __rhs, false otherwise.
1358
   */
1359
  template<typename _Bi_iter>
1360
    inline bool
1361
    operator>=(const sub_match<_Bi_iter>& __lhs,
1362
               typename iterator_traits<_Bi_iter>::value_type const& __rhs)
1363
    { return !(__lhs < __rhs); }
1364
 
1365
  /**
1366
   * @brief Tests the ordering of a regular expression submatch and a string.
1367
   * @param __lhs A regular expression submatch.
1368
   * @param __rhs A const string reference.
1369
   * @returns true if @a __lhs does not succeed @a __rhs, false otherwise.
1370
   */
1371
  template<typename _Bi_iter>
1372
    inline bool
1373
    operator<=(const sub_match<_Bi_iter>& __lhs,
1374
               typename iterator_traits<_Bi_iter>::value_type const& __rhs)
1375
    { return !(__rhs < __lhs); }
1376
 
1377
  /**
1378
   * @brief Inserts a matched string into an output stream.
1379
   *
1380
   * @param __os The output stream.
1381
   * @param __m  A submatch string.
1382
   *
1383
   * @returns the output stream with the submatch string inserted.
1384
   */
1385
  template<typename _Ch_type, typename _Ch_traits, typename _Bi_iter>
1386
    inline
1387
    basic_ostream<_Ch_type, _Ch_traits>&
1388
    operator<<(basic_ostream<_Ch_type, _Ch_traits>& __os,
1389
               const sub_match<_Bi_iter>& __m)
1390
    { return __os << __m.str(); }
1391
 
1392
  // [7.10] Class template match_results
1393
 
1394
  /*
1395
   * Special sub_match object representing an unmatched sub-expression.
1396
   */
1397
  template<typename _Bi_iter>
1398
    inline const sub_match<_Bi_iter>&
1399
    __unmatched_sub()
1400
    {
1401
      static const sub_match<_Bi_iter> __unmatched = sub_match<_Bi_iter>();
1402
      return __unmatched;
1403
    }
1404
 
1405
  /**
1406
   * @brief The results of a match or search operation.
1407
   *
1408
   * A collection of character sequences representing the result of a regular
1409
   * expression match.  Storage for the collection is allocated and freed as
1410
   * necessary by the member functions of class template match_results.
1411
   *
1412
   * This class satisfies the Sequence requirements, with the exception that
1413
   * only the operations defined for a const-qualified Sequence are supported.
1414
   *
1415
   * The sub_match object stored at index 0 represents sub-expression 0, i.e.
1416
   * the whole match. In this case the %sub_match member matched is always true.
1417
   * The sub_match object stored at index n denotes what matched the marked
1418
   * sub-expression n within the matched expression. If the sub-expression n
1419
   * participated in a regular expression match then the %sub_match member
1420
   * matched evaluates to true, and members first and second denote the range
1421
   * of characters [first, second) which formed that match. Otherwise matched
1422
   * is false, and members first and second point to the end of the sequence
1423
   * that was searched.
1424
   *
1425
   * @nosubgrouping
1426
   */
1427
  template<typename _Bi_iter,
1428
           typename _Alloc = allocator<sub_match<_Bi_iter> > >
1429
    class match_results
1430
    : private std::vector<sub_match<_Bi_iter>, _Alloc>
1431
    {
1432
    private:
1433
      /*
1434
       * The vector base is empty if this does not represent a successful match.
1435
       * Otherwise it contains n+3 elements where n is the number of marked
1436
       * sub-expressions:
1437
       * [0] entire match
1438
       * [1] 1st marked subexpression
1439
       * ...
1440
       * [n] nth marked subexpression
1441
       * [n+1] prefix
1442
       * [n+2] suffix
1443
       */
1444
      typedef std::vector<sub_match<_Bi_iter>, _Alloc>     _Base_type;
1445
      typedef std::iterator_traits<_Bi_iter>               __iter_traits;
1446
      typedef regex_constants::match_flag_type             match_flag_type;
1447
 
1448
    public:
1449
      /**
1450
       * @name 10.? Public Types
1451
       */
1452
      //@{
1453
      typedef _Alloc                                       allocator_type;
1454
      typedef sub_match<_Bi_iter>                          value_type;
1455
      typedef const value_type&                            const_reference;
1456
      typedef const_reference                              reference;
1457
      typedef typename _Base_type::const_iterator          const_iterator;
1458
      typedef const_iterator                               iterator;
1459
      typedef typename __iter_traits::difference_type      difference_type;
1460
      typedef typename __iter_traits::value_type           char_type;
1461
      typedef typename allocator_traits<_Alloc>::size_type size_type;
1462
 
1463
 
1464
      typedef std::basic_string<char_type>                 string_type;
1465
      //@}
1466
 
1467
    public:
1468
      /**
1469
       * @name 28.10.1 Construction, Copying, and Destruction
1470
       */
1471
      //@{
1472
 
1473
      /**
1474
       * @brief Constructs a default %match_results container.
1475
       * @post size() returns 0 and str() returns an empty string.
1476
       */
1477
      explicit
1478
      match_results(const _Alloc& __a = _Alloc())
1479
      : _Base_type(__a)
1480
      { }
1481
 
1482
      /**
1483
       * @brief Copy constructs a %match_results.
1484
       */
1485
      match_results(const match_results& __rhs)
1486
      : _Base_type(__rhs)
1487
      { }
1488
 
1489
      /**
1490
       * @brief Move constructs a %match_results.
1491
       */
1492
      match_results(match_results&& __rhs) noexcept
1493
      : _Base_type(std::move(__rhs))
1494
      { }
1495
 
1496
      /**
1497
       * @brief Assigns rhs to *this.
1498
       */
1499
      match_results&
1500
      operator=(const match_results& __rhs)
1501
      {
1502
        match_results(__rhs).swap(*this);
1503
        return *this;
1504
      }
1505
 
1506
      /**
1507
       * @brief Move-assigns rhs to *this.
1508
       */
1509
      match_results&
1510
      operator=(match_results&& __rhs)
1511
      {
1512
        match_results(std::move(__rhs)).swap(*this);
1513
        return *this;
1514
      }
1515
 
1516
      /**
1517
       * @brief Destroys a %match_results object.
1518
       */
1519
      ~match_results()
1520
      { }
1521
 
1522
      //@}
1523
 
1524
      // 28.10.2, state:
1525
      /**
1526
       * @brief Indicates if the %match_results is ready.
1527
       * @retval true   The object has a fully-established result state.
1528
       * @retval false  The object is not ready.
1529
       */
1530
      bool ready() const { return !_Base_type::empty(); }
1531
 
1532
      /**
1533
       * @name 28.10.2 Size
1534
       */
1535
      //@{
1536
 
1537
      /**
1538
       * @brief Gets the number of matches and submatches.
1539
       *
1540
       * The number of matches for a given regular expression will be either 0
1541
       * if there was no match or mark_count() + 1 if a match was successful.
1542
       * Some matches may be empty.
1543
       *
1544
       * @returns the number of matches found.
1545
       */
1546
      size_type
1547
      size() const
1548
      {
1549
        size_type __size = _Base_type::size();
1550
        return (__size && _Base_type::operator[](0).matched) ? __size - 2 : 0;
1551
      }
1552
 
1553
      size_type
1554
      max_size() const
1555
      { return _Base_type::max_size(); }
1556
 
1557
      /**
1558
       * @brief Indicates if the %match_results contains no results.
1559
       * @retval true The %match_results object is empty.
1560
       * @retval false The %match_results object is not empty.
1561
       */
1562
      bool
1563
      empty() const
1564
      { return size() == 0; }
1565
 
1566
      //@}
1567
 
1568
      /**
1569
       * @name 10.3 Element Access
1570
       */
1571
      //@{
1572
 
1573
      /**
1574
       * @brief Gets the length of the indicated submatch.
1575
       * @param __sub indicates the submatch.
1576
       * @pre   ready() == true
1577
       *
1578
       * This function returns the length of the indicated submatch, or the
1579
       * length of the entire match if @p __sub is zero (the default).
1580
       */
1581
      difference_type
1582
      length(size_type __sub = 0) const
1583
      { return (*this)[__sub].length(); }
1584
 
1585
      /**
1586
       * @brief Gets the offset of the beginning of the indicated submatch.
1587
       * @param __sub indicates the submatch.
1588
       * @pre   ready() == true
1589
       *
1590
       * This function returns the offset from the beginning of the target
1591
       * sequence to the beginning of the submatch, unless the value of @p __sub
1592
       * is zero (the default), in which case this function returns the offset
1593
       * from the beginning of the target sequence to the beginning of the
1594
       * match.
1595
       *
1596
       * Returns -1 if @p __sub is out of range.
1597
       */
1598
      difference_type
1599
      position(size_type __sub = 0) const
1600
      {
1601
        return __sub < size() ? std::distance(this->prefix().first,
1602
                                              (*this)[__sub].first) : -1;
1603
      }
1604
 
1605
      /**
1606
       * @brief Gets the match or submatch converted to a string type.
1607
       * @param __sub indicates the submatch.
1608
       * @pre   ready() == true
1609
       *
1610
       * This function gets the submatch (or match, if @p __sub is
1611
       * zero) extracted from the target range and converted to the
1612
       * associated string type.
1613
       */
1614
      string_type
1615
      str(size_type __sub = 0) const
1616
      { return (*this)[__sub].str(); }
1617
 
1618
      /**
1619
       * @brief Gets a %sub_match reference for the match or submatch.
1620
       * @param __sub indicates the submatch.
1621
       * @pre   ready() == true
1622
       *
1623
       * This function gets a reference to the indicated submatch, or
1624
       * the entire match if @p __sub is zero.
1625
       *
1626
       * If @p __sub >= size() then this function returns a %sub_match with a
1627
       * special value indicating no submatch.
1628
       */
1629
      const_reference
1630
      operator[](size_type __sub) const
1631
      {
1632
        _GLIBCXX_DEBUG_ASSERT( ready() );
1633
        return __sub < size()
1634
               ?  _Base_type::operator[](__sub)
1635
               : __unmatched_sub<_Bi_iter>();
1636
      }
1637
 
1638
      /**
1639
       * @brief Gets a %sub_match representing the match prefix.
1640
       * @pre   ready() == true
1641
       *
1642
       * This function gets a reference to a %sub_match object representing the
1643
       * part of the target range between the start of the target range and the
1644
       * start of the match.
1645
       */
1646
      const_reference
1647
      prefix() const
1648
      {
1649
        _GLIBCXX_DEBUG_ASSERT( ready() );
1650
        return !empty()
1651
               ? _Base_type::operator[](_Base_type::size() - 2)
1652
               : __unmatched_sub<_Bi_iter>();
1653
      }
1654
 
1655
      /**
1656
       * @brief Gets a %sub_match representing the match suffix.
1657
       * @pre   ready() == true
1658
       *
1659
       * This function gets a reference to a %sub_match object representing the
1660
       * part of the target range between the end of the match and the end of
1661
       * the target range.
1662
       */
1663
      const_reference
1664
      suffix() const
1665
      {
1666
        _GLIBCXX_DEBUG_ASSERT( ready() );
1667
        return !empty()
1668
               ? _Base_type::operator[](_Base_type::size() - 1)
1669
               : __unmatched_sub<_Bi_iter>();
1670
      }
1671
 
1672
      /**
1673
       * @brief Gets an iterator to the start of the %sub_match collection.
1674
       */
1675
      const_iterator
1676
      begin() const
1677
      { return _Base_type::begin(); }
1678
 
1679
      /**
1680
       * @brief Gets an iterator to the start of the %sub_match collection.
1681
       */
1682
      const_iterator
1683
      cbegin() const
1684
      { return _Base_type::cbegin(); }
1685
 
1686
      /**
1687
       * @brief Gets an iterator to one-past-the-end of the collection.
1688
       */
1689
      const_iterator
1690
      end() const
1691
      { return !empty() ? _Base_type::end() - 2 : _Base_type::end(); }
1692
 
1693
      /**
1694
       * @brief Gets an iterator to one-past-the-end of the collection.
1695
       */
1696
      const_iterator
1697
      cend() const
1698
      { return end(); }
1699
 
1700
      //@}
1701
 
1702
      /**
1703
       * @name 10.4 Formatting
1704
       *
1705
       * These functions perform formatted substitution of the matched
1706
       * character sequences into their target.  The format specifiers and
1707
       * escape sequences accepted by these functions are determined by
1708
       * their @p flags parameter as documented above.
1709
       */
1710
       //@{
1711
 
1712
      /**
1713
       * @pre   ready() == true
1714
       * @todo Implement this function.
1715
       */
1716
      template<typename _Out_iter>
1717
        _Out_iter
1718
        format(_Out_iter __out, const char_type* __fmt_first,
1719
               const char_type* __fmt_last,
1720
               match_flag_type __flags = regex_constants::format_default) const
1721
        { return __out; }
1722
 
1723
      /**
1724
       * @pre   ready() == true
1725
       */
1726
      template<typename _Out_iter, typename _St, typename _Sa>
1727
        _Out_iter
1728
        format(_Out_iter __out, const basic_string<char_type, _St, _Sa>& __fmt,
1729
               match_flag_type __flags = regex_constants::format_default) const
1730
        {
1731
          return format(__out, __fmt.data(), __fmt.data() + __fmt.size(),
1732
                        __flags);
1733
        }
1734
 
1735
      /**
1736
       * @pre   ready() == true
1737
       */
1738
      template<typename _Out_iter, typename _St, typename _Sa>
1739
        basic_string<char_type, _St, _Sa>
1740
        format(const basic_string<char_type, _St, _Sa>& __fmt,
1741
               match_flag_type __flags = regex_constants::format_default) const
1742
        {
1743
          basic_string<char_type, _St, _Sa> __result;
1744
          format(std::back_inserter(__result), __fmt, __flags);
1745
          return __result;
1746
        }
1747
 
1748
      /**
1749
       * @pre   ready() == true
1750
       */
1751
      string_type
1752
      format(const char_type* __fmt,
1753
             match_flag_type __flags = regex_constants::format_default) const
1754
      {
1755
        string_type __result;
1756
        format(std::back_inserter(__result),
1757
               __fmt + char_traits<char_type>::length(__fmt),
1758
               __flags);
1759
        return __result;
1760
      }
1761
 
1762
      //@} 
1763
 
1764
      /**
1765
       * @name 10.5 Allocator
1766
       */
1767
      //@{ 
1768
 
1769
      /**
1770
       * @brief Gets a copy of the allocator.
1771
       */
1772
      allocator_type
1773
      get_allocator() const
1774
      { return _Base_type::get_allocator(); }
1775
 
1776
      //@} 
1777
 
1778
      /**
1779
       * @name 10.6 Swap
1780
       */
1781
       //@{ 
1782
 
1783
      /**
1784
       * @brief Swaps the contents of two match_results.
1785
       */
1786
      void
1787
      swap(match_results& __that)
1788
      { _Base_type::swap(__that); }
1789
      //@} 
1790
 
1791
    private:
1792
      friend class __detail::_SpecializedResults<_Bi_iter, _Alloc>;
1793
    };
1794
 
1795
  typedef match_results<const char*>             cmatch;
1796
  typedef match_results<string::const_iterator>  smatch;
1797
#ifdef _GLIBCXX_USE_WCHAR_T
1798
  typedef match_results<const wchar_t*>          wcmatch;
1799
  typedef match_results<wstring::const_iterator> wsmatch;
1800
#endif
1801
 
1802
  // match_results comparisons
1803
  /**
1804
   * @brief Compares two match_results for equality.
1805
   * @returns true if the two objects refer to the same match,
1806
   * false otherwise.
1807
   */
1808
  template<typename _Bi_iter, typename _Alloc>
1809
    inline bool
1810
    operator==(const match_results<_Bi_iter, _Alloc>& __m1,
1811
               const match_results<_Bi_iter, _Alloc>& __m2)
1812
    {
1813
      if (__m1.ready() != __m2.ready())
1814
        return false;
1815
      if (!__m1.ready())  // both are not ready
1816
        return true;
1817
      if (__m1.empty() != __m2.empty())
1818
        return false;
1819
      if (__m1.empty())   // both are empty
1820
        return true;
1821
      return __m1.prefix() == __m2.prefix()
1822
        && __m1.size() == __m2.size()
1823
        && std::equal(__m1.begin(), __m1.end(), __m2.begin())
1824
        && __m1.suffix() == __m2.suffix();
1825
    }
1826
 
1827
  /**
1828
   * @brief Compares two match_results for inequality.
1829
   * @returns true if the two objects do not refer to the same match,
1830
   * false otherwise.
1831
   */
1832
  template<typename _Bi_iter, class _Alloc>
1833
    inline bool
1834
    operator!=(const match_results<_Bi_iter, _Alloc>& __m1,
1835
               const match_results<_Bi_iter, _Alloc>& __m2)
1836
    { return !(__m1 == __m2); }
1837
 
1838
  // [7.10.6] match_results swap
1839
  /**
1840
   * @brief Swaps two match results.
1841
   * @param __lhs A match result.
1842
   * @param __rhs A match result.
1843
   *
1844
   * The contents of the two match_results objects are swapped.
1845
   */
1846
  template<typename _Bi_iter, typename _Alloc>
1847
    inline void
1848
    swap(match_results<_Bi_iter, _Alloc>& __lhs,
1849
         match_results<_Bi_iter, _Alloc>& __rhs)
1850
    { __lhs.swap(__rhs); }
1851
 
1852
  // [7.11.2] Function template regex_match
1853
  /**
1854
   * @name Matching, Searching, and Replacing
1855
   */
1856
  //@{
1857
 
1858
  /**
1859
   * @brief Determines if there is a match between the regular expression @p e
1860
   * and all of the character sequence [first, last).
1861
   *
1862
   * @param __s     Start of the character sequence to match.
1863
   * @param __e     One-past-the-end of the character sequence to match.
1864
   * @param __m     The match results.
1865
   * @param __re    The regular expression.
1866
   * @param __flags Controls how the regular expression is matched.
1867
   *
1868
   * @retval true  A match exists.
1869
   * @retval false Otherwise.
1870
   *
1871
   * @throws an exception of type regex_error.
1872
   *
1873
   * @todo Implement this function.
1874
   */
1875
  template<typename _Bi_iter, typename _Alloc,
1876
           typename _Ch_type, typename _Rx_traits>
1877
    bool
1878
    regex_match(_Bi_iter                                 __s,
1879
                _Bi_iter                                 __e,
1880
                match_results<_Bi_iter, _Alloc>&     __m,
1881
                const basic_regex<_Ch_type, _Rx_traits>& __re,
1882
                regex_constants::match_flag_type         __flags
1883
                               = regex_constants::match_default)
1884
    {
1885
      __detail::_AutomatonPtr __a = __re._M_get_automaton();
1886
      __detail::_Automaton::_SizeT __sz = __a->_M_sub_count();
1887
      __detail::_SpecializedCursor<_Bi_iter> __cs(__s, __e);
1888
      __detail::_SpecializedResults<_Bi_iter, _Alloc> __r(__sz, __cs, __m);
1889
      __detail::_Grep_matcher __matcher(__cs, __r, __a, __flags);
1890
      return __m[0].matched;
1891
    }
1892
 
1893
  /**
1894
   * @brief Indicates if there is a match between the regular expression @p e
1895
   * and all of the character sequence [first, last).
1896
   *
1897
   * @param __first Beginning of the character sequence to match.
1898
   * @param __last  One-past-the-end of the character sequence to match.
1899
   * @param __re    The regular expression.
1900
   * @param __flags Controls how the regular expression is matched.
1901
   *
1902
   * @retval true  A match exists.
1903
   * @retval false Otherwise.
1904
   *
1905
   * @throws an exception of type regex_error.
1906
   */
1907
  template<typename _Bi_iter, typename _Ch_type, typename _Rx_traits>
1908
    bool
1909
    regex_match(_Bi_iter __first, _Bi_iter __last,
1910
                const basic_regex<_Ch_type, _Rx_traits>& __re,
1911
                regex_constants::match_flag_type __flags
1912
                = regex_constants::match_default)
1913
    {
1914
      match_results<_Bi_iter> __what;
1915
      return regex_match(__first, __last, __what, __re, __flags);
1916
    }
1917
 
1918
  /**
1919
   * @brief Determines if there is a match between the regular expression @p e
1920
   * and a C-style null-terminated string.
1921
   *
1922
   * @param __s  The C-style null-terminated string to match.
1923
   * @param __m  The match results.
1924
   * @param __re The regular expression.
1925
   * @param __f  Controls how the regular expression is matched.
1926
   *
1927
   * @retval true  A match exists.
1928
   * @retval false Otherwise.
1929
   *
1930
   * @throws an exception of type regex_error.
1931
   */
1932
  template<typename _Ch_type, typename _Alloc, typename _Rx_traits>
1933
    inline bool
1934
    regex_match(const _Ch_type* __s,
1935
                match_results<const _Ch_type*, _Alloc>& __m,
1936
                const basic_regex<_Ch_type, _Rx_traits>& __re,
1937
                regex_constants::match_flag_type __f
1938
                = regex_constants::match_default)
1939
    { return regex_match(__s, __s + _Rx_traits::length(__s), __m, __re, __f); }
1940
 
1941
  /**
1942
   * @brief Determines if there is a match between the regular expression @p e
1943
   * and a string.
1944
   *
1945
   * @param __s     The string to match.
1946
   * @param __m     The match results.
1947
   * @param __re    The regular expression.
1948
   * @param __flags Controls how the regular expression is matched.
1949
   *
1950
   * @retval true  A match exists.
1951
   * @retval false Otherwise.
1952
   *
1953
   * @throws an exception of type regex_error.
1954
   */
1955
  template<typename _Ch_traits, typename _Ch_alloc,
1956
           typename _Alloc, typename _Ch_type, typename _Rx_traits>
1957
    inline bool
1958
    regex_match(const basic_string<_Ch_type, _Ch_traits, _Ch_alloc>& __s,
1959
                match_results<typename basic_string<_Ch_type,
1960
                _Ch_traits, _Ch_alloc>::const_iterator, _Alloc>& __m,
1961
                const basic_regex<_Ch_type, _Rx_traits>& __re,
1962
                regex_constants::match_flag_type __flags
1963
                = regex_constants::match_default)
1964
    { return regex_match(__s.begin(), __s.end(), __m, __re, __flags); }
1965
 
1966
  /**
1967
   * @brief Indicates if there is a match between the regular expression @p e
1968
   * and a C-style null-terminated string.
1969
   *
1970
   * @param __s  The C-style null-terminated string to match.
1971
   * @param __re The regular expression.
1972
   * @param __f  Controls how the regular expression is matched.
1973
   *
1974
   * @retval true  A match exists.
1975
   * @retval false Otherwise.
1976
   *
1977
   * @throws an exception of type regex_error.
1978
   */
1979
  template<typename _Ch_type, class _Rx_traits>
1980
    inline bool
1981
    regex_match(const _Ch_type* __s,
1982
                const basic_regex<_Ch_type, _Rx_traits>& __re,
1983
                regex_constants::match_flag_type __f
1984
                = regex_constants::match_default)
1985
    { return regex_match(__s, __s + _Rx_traits::length(__s), __re, __f); }
1986
 
1987
  /**
1988
   * @brief Indicates if there is a match between the regular expression @p e
1989
   * and a string.
1990
   *
1991
   * @param __s     [IN] The string to match.
1992
   * @param __re    [IN] The regular expression.
1993
   * @param __flags [IN] Controls how the regular expression is matched.
1994
   *
1995
   * @retval true  A match exists.
1996
   * @retval false Otherwise.
1997
   *
1998
   * @throws an exception of type regex_error.
1999
   */
2000
  template<typename _Ch_traits, typename _Str_allocator,
2001
           typename _Ch_type, typename _Rx_traits>
2002
    inline bool
2003
    regex_match(const basic_string<_Ch_type, _Ch_traits, _Str_allocator>& __s,
2004
                const basic_regex<_Ch_type, _Rx_traits>& __re,
2005
                regex_constants::match_flag_type __flags
2006
                = regex_constants::match_default)
2007
    { return regex_match(__s.begin(), __s.end(), __re, __flags); }
2008
 
2009
  // [7.11.3] Function template regex_search
2010
  /**
2011
   * Searches for a regular expression within a range.
2012
   * @param __first [IN]  The start of the string to search.
2013
   * @param __last  [IN]  One-past-the-end of the string to search.
2014
   * @param __m     [OUT] The match results.
2015
   * @param __re    [IN]  The regular expression to search for.
2016
   * @param __flags [IN]  Search policy flags.
2017
   * @retval true  A match was found within the string.
2018
   * @retval false No match was found within the string, the content of %m is
2019
   *               undefined.
2020
   *
2021
   * @throws an exception of type regex_error.
2022
   *
2023
   * @todo Implement this function.
2024
   */
2025
  template<typename _Bi_iter, typename _Alloc,
2026
           typename _Ch_type, typename _Rx_traits>
2027
    inline bool
2028
    regex_search(_Bi_iter __first, _Bi_iter __last,
2029
                 match_results<_Bi_iter, _Alloc>& __m,
2030
                 const basic_regex<_Ch_type, _Rx_traits>& __re,
2031
                 regex_constants::match_flag_type __flags
2032
                 = regex_constants::match_default)
2033
    { return false; }
2034
 
2035
  /**
2036
   * Searches for a regular expression within a range.
2037
   * @param __first [IN]  The start of the string to search.
2038
   * @param __last  [IN]  One-past-the-end of the string to search.
2039
   * @param __re    [IN]  The regular expression to search for.
2040
   * @param __flags [IN]  Search policy flags.
2041
   * @retval true  A match was found within the string.
2042
   * @retval false No match was found within the string.
2043
   * @doctodo
2044
   *
2045
   * @throws an exception of type regex_error.
2046
   */
2047
  template<typename _Bi_iter, typename _Ch_type, typename _Rx_traits>
2048
    inline bool
2049
    regex_search(_Bi_iter __first, _Bi_iter __last,
2050
                 const basic_regex<_Ch_type, _Rx_traits>& __re,
2051
                 regex_constants::match_flag_type __flags
2052
                 = regex_constants::match_default)
2053
    {
2054
      match_results<_Bi_iter> __what;
2055
      return regex_search(__first, __last, __what, __re, __flags);
2056
    }
2057
 
2058
  /**
2059
   * @brief Searches for a regular expression within a C-string.
2060
   * @param __s [IN]  A C-string to search for the regex.
2061
   * @param __m [OUT] The set of regex matches.
2062
   * @param __e [IN]  The regex to search for in @p s.
2063
   * @param __f [IN]  The search flags.
2064
   * @retval true  A match was found within the string.
2065
   * @retval false No match was found within the string, the content of %m is
2066
   *               undefined.
2067
   * @doctodo
2068
   *
2069
   * @throws an exception of type regex_error.
2070
   */
2071
  template<typename _Ch_type, class _Alloc, class _Rx_traits>
2072
    inline bool
2073
    regex_search(const _Ch_type* __s,
2074
                 match_results<const _Ch_type*, _Alloc>& __m,
2075
                 const basic_regex<_Ch_type, _Rx_traits>& __e,
2076
                 regex_constants::match_flag_type __f
2077
                 = regex_constants::match_default)
2078
    { return regex_search(__s, __s + _Rx_traits::length(__s), __m, __e, __f); }
2079
 
2080
  /**
2081
   * @brief Searches for a regular expression within a C-string.
2082
   * @param __s [IN]  The C-string to search.
2083
   * @param __e [IN]  The regular expression to search for.
2084
   * @param __f [IN]  Search policy flags.
2085
   * @retval true  A match was found within the string.
2086
   * @retval false No match was found within the string.
2087
   * @doctodo
2088
   *
2089
   * @throws an exception of type regex_error.
2090
   */
2091
  template<typename _Ch_type, typename _Rx_traits>
2092
    inline bool
2093
    regex_search(const _Ch_type* __s,
2094
                 const basic_regex<_Ch_type, _Rx_traits>& __e,
2095
                 regex_constants::match_flag_type __f
2096
                 = regex_constants::match_default)
2097
    { return regex_search(__s, __s + _Rx_traits::length(__s), __e, __f); }
2098
 
2099
  /**
2100
   * @brief Searches for a regular expression within a string.
2101
   * @param __s     [IN]  The string to search.
2102
   * @param __e     [IN]  The regular expression to search for.
2103
   * @param __flags [IN]  Search policy flags.
2104
   * @retval true  A match was found within the string.
2105
   * @retval false No match was found within the string.
2106
   * @doctodo
2107
   *
2108
   * @throws an exception of type regex_error.
2109
   */
2110
  template<typename _Ch_traits, typename _String_allocator,
2111
           typename _Ch_type, typename _Rx_traits>
2112
    inline bool
2113
    regex_search(const basic_string<_Ch_type, _Ch_traits,
2114
                 _String_allocator>& __s,
2115
                 const basic_regex<_Ch_type, _Rx_traits>& __e,
2116
                 regex_constants::match_flag_type __flags
2117
                 = regex_constants::match_default)
2118
    { return regex_search(__s.begin(), __s.end(), __e, __flags); }
2119
 
2120
  /**
2121
   * @brief Searches for a regular expression within a string.
2122
   * @param __s [IN]  A C++ string to search for the regex.
2123
   * @param __m [OUT] The set of regex matches.
2124
   * @param __e [IN]  The regex to search for in @p s.
2125
   * @param __f [IN]  The search flags.
2126
   * @retval true  A match was found within the string.
2127
   * @retval false No match was found within the string, the content of %m is
2128
   *               undefined.
2129
   *
2130
   * @throws an exception of type regex_error.
2131
   */
2132
  template<typename _Ch_traits, typename _Ch_alloc,
2133
           typename _Alloc, typename _Ch_type,
2134
           typename _Rx_traits>
2135
    inline bool
2136
    regex_search(const basic_string<_Ch_type, _Ch_traits, _Ch_alloc>& __s,
2137
                 match_results<typename basic_string<_Ch_type,
2138
                 _Ch_traits, _Ch_alloc>::const_iterator, _Alloc>& __m,
2139
                 const basic_regex<_Ch_type, _Rx_traits>& __e,
2140
                 regex_constants::match_flag_type __f
2141
                 = regex_constants::match_default)
2142
    { return regex_search(__s.begin(), __s.end(), __m, __e, __f); }
2143
 
2144
  // std [28.11.4] Function template regex_replace
2145
  /**
2146
   * @doctodo
2147
   * @param __out
2148
   * @param __first
2149
   * @param __last
2150
   * @param __e
2151
   * @param __fmt
2152
   * @param __flags
2153
   *
2154
   * @returns out
2155
   * @throws an exception of type regex_error.
2156
   *
2157
   * @todo Implement this function.
2158
   */
2159
  template<typename _Out_iter, typename _Bi_iter,
2160
           typename _Rx_traits, typename _Ch_type>
2161
    inline _Out_iter
2162
    regex_replace(_Out_iter __out, _Bi_iter __first, _Bi_iter __last,
2163
                  const basic_regex<_Ch_type, _Rx_traits>& __e,
2164
                  const basic_string<_Ch_type>& __fmt,
2165
                  regex_constants::match_flag_type __flags
2166
                  = regex_constants::match_default)
2167
    { return __out; }
2168
 
2169
  /**
2170
   * @doctodo
2171
   * @param __s
2172
   * @param __e
2173
   * @param __fmt
2174
   * @param __flags
2175
   *
2176
   * @returns a copy of string @p s with replacements.
2177
   *
2178
   * @throws an exception of type regex_error.
2179
   */
2180
  template<typename _Rx_traits, typename _Ch_type>
2181
    inline basic_string<_Ch_type>
2182
    regex_replace(const basic_string<_Ch_type>& __s,
2183
                  const basic_regex<_Ch_type, _Rx_traits>& __e,
2184
                  const basic_string<_Ch_type>& __fmt,
2185
                  regex_constants::match_flag_type __flags
2186
                  = regex_constants::match_default)
2187
    {
2188
      basic_string<_Ch_type> __result;
2189
      regex_replace(std::back_inserter(__result),
2190
                    __s.begin(), __s.end(), __e, __fmt, __flags);
2191
      return __result;
2192
    }
2193
 
2194
  //@}
2195
 
2196
  // std [28.12] Class template regex_iterator
2197
  /**
2198
   * An iterator adaptor that will provide repeated calls of regex_search over
2199
   * a range until no more matches remain.
2200
   */
2201
  template<typename _Bi_iter,
2202
           typename _Ch_type = typename iterator_traits<_Bi_iter>::value_type,
2203
           typename _Rx_traits = regex_traits<_Ch_type> >
2204
    class regex_iterator
2205
    {
2206
    public:
2207
      typedef basic_regex<_Ch_type, _Rx_traits>  regex_type;
2208
      typedef match_results<_Bi_iter>            value_type;
2209
      typedef std::ptrdiff_t                     difference_type;
2210
      typedef const value_type*                  pointer;
2211
      typedef const value_type&                  reference;
2212
      typedef std::forward_iterator_tag          iterator_category;
2213
 
2214
      /**
2215
       * @brief Provides a singular iterator, useful for indicating
2216
       * one-past-the-end of a range.
2217
       * @todo Implement this function.
2218
       * @doctodo
2219
       */
2220
      regex_iterator();
2221
 
2222
      /**
2223
       * Constructs a %regex_iterator...
2224
       * @param __a  [IN] The start of a text range to search.
2225
       * @param __b  [IN] One-past-the-end of the text range to search.
2226
       * @param __re [IN] The regular expression to match.
2227
       * @param __m  [IN] Policy flags for match rules.
2228
       * @todo Implement this function.
2229
       * @doctodo
2230
       */
2231
      regex_iterator(_Bi_iter __a, _Bi_iter __b, const regex_type& __re,
2232
                     regex_constants::match_flag_type __m
2233
                     = regex_constants::match_default);
2234
 
2235
      /**
2236
       * Copy constructs a %regex_iterator.
2237
       * @todo Implement this function.
2238
       * @doctodo
2239
       */
2240
      regex_iterator(const regex_iterator& __rhs);
2241
 
2242
      /**
2243
       * @todo Implement this function.
2244
       * @doctodo
2245
       */
2246
      regex_iterator&
2247
      operator=(const regex_iterator& __rhs);
2248
 
2249
      /**
2250
       * @todo Implement this function.
2251
       * @doctodo
2252
       */
2253
      bool
2254
      operator==(const regex_iterator& __rhs);
2255
 
2256
      /**
2257
       * @todo Implement this function.
2258
       * @doctodo
2259
       */
2260
      bool
2261
      operator!=(const regex_iterator& __rhs);
2262
 
2263
      /**
2264
       * @todo Implement this function.
2265
       * @doctodo
2266
       */
2267
      const value_type&
2268
      operator*();
2269
 
2270
      /**
2271
       * @todo Implement this function.
2272
       * @doctodo
2273
       */
2274
      const value_type*
2275
      operator->();
2276
 
2277
      /**
2278
       * @todo Implement this function.
2279
       * @doctodo
2280
       */
2281
      regex_iterator&
2282
      operator++();
2283
 
2284
      /**
2285
       * @todo Implement this function.
2286
       * @doctodo
2287
       */
2288
      regex_iterator
2289
      operator++(int);
2290
 
2291
    private:
2292
      // these members are shown for exposition only:
2293
      _Bi_iter                         begin;
2294
      _Bi_iter                         end;
2295
      const regex_type*                pregex;
2296
      regex_constants::match_flag_type flags;
2297
      match_results<_Bi_iter>          match;
2298
    };
2299
 
2300
  typedef regex_iterator<const char*>             cregex_iterator;
2301
  typedef regex_iterator<string::const_iterator>  sregex_iterator;
2302
#ifdef _GLIBCXX_USE_WCHAR_T
2303
  typedef regex_iterator<const wchar_t*>          wcregex_iterator;
2304
  typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
2305
#endif
2306
 
2307
  // [7.12.2] Class template regex_token_iterator
2308
  /**
2309
   * Iterates over submatches in a range (or @a splits a text string).
2310
   *
2311
   * The purpose of this iterator is to enumerate all, or all specified,
2312
   * matches of a regular expression within a text range.  The dereferenced
2313
   * value of an iterator of this class is a std::sub_match object.
2314
   */
2315
  template<typename _Bi_iter,
2316
           typename _Ch_type = typename iterator_traits<_Bi_iter>::value_type,
2317
           typename _Rx_traits = regex_traits<_Ch_type> >
2318
    class regex_token_iterator
2319
    {
2320
    public:
2321
      typedef basic_regex<_Ch_type, _Rx_traits> regex_type;
2322
      typedef sub_match<_Bi_iter>               value_type;
2323
      typedef std::ptrdiff_t                    difference_type;
2324
      typedef const value_type*                 pointer;
2325
      typedef const value_type&                 reference;
2326
      typedef std::forward_iterator_tag         iterator_category;
2327
 
2328
    public:
2329
      /**
2330
       * @brief Default constructs a %regex_token_iterator.
2331
       * @todo Implement this function.
2332
       *
2333
       * A default-constructed %regex_token_iterator is a singular iterator
2334
       * that will compare equal to the one-past-the-end value for any
2335
       * iterator of the same type.
2336
       */
2337
      regex_token_iterator();
2338
 
2339
      /**
2340
       * Constructs a %regex_token_iterator...
2341
       * @param __a          [IN] The start of the text to search.
2342
       * @param __b          [IN] One-past-the-end of the text to search.
2343
       * @param __re         [IN] The regular expression to search for.
2344
       * @param __submatch   [IN] Which submatch to return.  There are some
2345
       *                        special values for this parameter:
2346
       *                        - -1 each enumerated subexpression does NOT
2347
       *                          match the regular expression (aka field
2348
       *                          splitting)
2349
       *                        - 0 the entire string matching the
2350
       *                          subexpression is returned for each match
2351
       *                          within the text.
2352
       *                        - >0 enumerates only the indicated
2353
       *                          subexpression from a match within the text.
2354
       * @param __m          [IN] Policy flags for match rules.
2355
       *
2356
       * @todo Implement this function.
2357
       * @doctodo
2358
       */
2359
      regex_token_iterator(_Bi_iter __a, _Bi_iter __b, const regex_type& __re,
2360
                           int __submatch = 0,
2361
                           regex_constants::match_flag_type __m
2362
                           = regex_constants::match_default);
2363
 
2364
      /**
2365
       * Constructs a %regex_token_iterator...
2366
       * @param __a          [IN] The start of the text to search.
2367
       * @param __b          [IN] One-past-the-end of the text to search.
2368
       * @param __re         [IN] The regular expression to search for.
2369
       * @param __submatches [IN] A list of subexpressions to return for each
2370
       *                        regular expression match within the text.
2371
       * @param __m          [IN] Policy flags for match rules.
2372
       *
2373
       * @todo Implement this function.
2374
       * @doctodo
2375
       */
2376
      regex_token_iterator(_Bi_iter __a, _Bi_iter __b,
2377
                           const regex_type& __re,
2378
                           const std::vector<int>& __submatches,
2379
                           regex_constants::match_flag_type __m
2380
                             = regex_constants::match_default);
2381
 
2382
      /**
2383
       * Constructs a %regex_token_iterator...
2384
       * @param __a          [IN] The start of the text to search.
2385
       * @param __b          [IN] One-past-the-end of the text to search.
2386
       * @param __re         [IN] The regular expression to search for.
2387
       * @param __submatches [IN] A list of subexpressions to return for each
2388
       *                          regular expression match within the text.
2389
       * @param __m          [IN] Policy flags for match rules.
2390
 
2391
       * @todo Implement this function.
2392
       * @doctodo
2393
       */
2394
      template<std::size_t _Nm>
2395
        regex_token_iterator(_Bi_iter __a, _Bi_iter __b,
2396
                             const regex_type& __re,
2397
                             const int (&__submatches)[_Nm],
2398
                             regex_constants::match_flag_type __m
2399
                             = regex_constants::match_default);
2400
 
2401
      /**
2402
       * @brief Copy constructs a %regex_token_iterator.
2403
       * @param __rhs [IN] A %regex_token_iterator to copy.
2404
       * @todo Implement this function.
2405
       */
2406
      regex_token_iterator(const regex_token_iterator& __rhs);
2407
 
2408
      /**
2409
       * @brief Assigns a %regex_token_iterator to another.
2410
       * @param __rhs [IN] A %regex_token_iterator to copy.
2411
       * @todo Implement this function.
2412
       */
2413
      regex_token_iterator&
2414
      operator=(const regex_token_iterator& __rhs);
2415
 
2416
      /**
2417
       * @brief Compares a %regex_token_iterator to another for equality.
2418
       * @todo Implement this function.
2419
       */
2420
      bool
2421
      operator==(const regex_token_iterator& __rhs);
2422
 
2423
      /**
2424
       * @brief Compares a %regex_token_iterator to another for inequality.
2425
       * @todo Implement this function.
2426
       */
2427
      bool
2428
      operator!=(const regex_token_iterator& __rhs);
2429
 
2430
      /**
2431
       * @brief Dereferences a %regex_token_iterator.
2432
       * @todo Implement this function.
2433
       */
2434
      const value_type&
2435
      operator*();
2436
 
2437
      /**
2438
       * @brief Selects a %regex_token_iterator member.
2439
       * @todo Implement this function.
2440
       */
2441
      const value_type*
2442
      operator->();
2443
 
2444
      /**
2445
       * @brief Increments a %regex_token_iterator.
2446
       * @todo Implement this function.
2447
       */
2448
      regex_token_iterator&
2449
      operator++();
2450
 
2451
      /**
2452
       * @brief Postincrements a %regex_token_iterator.
2453
       * @todo Implement this function.
2454
       */
2455
      regex_token_iterator
2456
      operator++(int);
2457
 
2458
    private: // data members for exposition only:
2459
      typedef regex_iterator<_Bi_iter, _Ch_type, _Rx_traits> position_iterator;
2460
 
2461
      position_iterator __position;
2462
      const value_type* __result;
2463
      value_type        __suffix;
2464
      std::size_t       __n;
2465
      std::vector<int>  __subs;
2466
    };
2467
 
2468
  /** @brief Token iterator for C-style NULL-terminated strings. */
2469
  typedef regex_token_iterator<const char*>             cregex_token_iterator;
2470
 
2471
  /** @brief Token iterator for standard strings. */
2472
  typedef regex_token_iterator<string::const_iterator>  sregex_token_iterator;
2473
 
2474
#ifdef _GLIBCXX_USE_WCHAR_T
2475
  /** @brief Token iterator for C-style NULL-terminated wide strings. */
2476
  typedef regex_token_iterator<const wchar_t*>          wcregex_token_iterator;
2477
 
2478
  /** @brief Token iterator for standard wide-character strings. */
2479
  typedef regex_token_iterator<wstring::const_iterator> wsregex_token_iterator;
2480
#endif
2481
 
2482
  //@} // group regex
2483
_GLIBCXX_END_NAMESPACE_VERSION
2484
} // namespace
2485
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.