libcxx

libcxx mirror with random patches
git clone https://git.neptards.moe/neptards/libcxx.git
Log | Files | Refs

ecma.pass.cpp (57712B)


      1 //===----------------------------------------------------------------------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is dual licensed under the MIT and the University of Illinois Open
      6 // Source Licenses. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // NetBSD does not support LC_COLLATE at the moment
     11 // XFAIL: netbsd
     12 
     13 // REQUIRES: locale.cs_CZ.ISO8859-2
     14 
     15 // <regex>
     16 
     17 // template <class BidirectionalIterator, class Allocator, class charT, class traits>
     18 //     bool
     19 //     regex_search(BidirectionalIterator first, BidirectionalIterator last,
     20 //                  match_results<BidirectionalIterator, Allocator>& m,
     21 //                  const basic_regex<charT, traits>& e,
     22 //                  regex_constants::match_flag_type flags = regex_constants::match_default);
     23 
     24 // TODO: investigation needed
     25 // XFAIL: linux-gnu
     26 
     27 #include <regex>
     28 #include <cassert>
     29 #include "test_macros.h"
     30 #include "test_iterators.h"
     31 
     32 #include "platform_support.h" // locale name macros
     33 
     34 int main()
     35 {
     36     {
     37         std::cmatch m;
     38         const char s[] = "a";
     39         assert(std::regex_search(s, m, std::regex("a")));
     40         assert(m.size() == 1);
     41         assert(!m.empty());
     42         assert(!m.prefix().matched);
     43         assert(m.prefix().first == s);
     44         assert(m.prefix().second == m[0].first);
     45         assert(!m.suffix().matched);
     46         assert(m.suffix().first == m[0].second);
     47         assert(m.suffix().second == s+1);
     48         assert(m.length(0) == 1);
     49         assert(m.position(0) == 0);
     50         assert(m.str(0) == "a");
     51     }
     52     {
     53         std::cmatch m;
     54         const char s[] = "ab";
     55         assert(std::regex_search(s, m, std::regex("ab")));
     56         assert(m.size() == 1);
     57         assert(!m.prefix().matched);
     58         assert(m.prefix().first == s);
     59         assert(m.prefix().second == m[0].first);
     60         assert(!m.suffix().matched);
     61         assert(m.suffix().first == m[0].second);
     62         assert(m.suffix().second == s+2);
     63         assert(m.length(0) == 2);
     64         assert(m.position(0) == 0);
     65         assert(m.str(0) == "ab");
     66     }
     67     {
     68         std::cmatch m;
     69         const char s[] = "ab";
     70         assert(!std::regex_search(s, m, std::regex("ba")));
     71         assert(m.size() == 0);
     72         assert(m.empty());
     73     }
     74     {
     75         std::cmatch m;
     76         const char s[] = "aab";
     77         assert(std::regex_search(s, m, std::regex("ab")));
     78         assert(m.size() == 1);
     79         assert(m.prefix().matched);
     80         assert(m.prefix().first == s);
     81         assert(m.prefix().second == m[0].first);
     82         assert(!m.suffix().matched);
     83         assert(m.suffix().first == m[0].second);
     84         assert(m.suffix().second == s+3);
     85         assert(m.length(0) == 2);
     86         assert(m.position(0) == 1);
     87         assert(m.str(0) == "ab");
     88     }
     89     {
     90         std::cmatch m;
     91         const char s[] = "aab";
     92         assert(!std::regex_search(s, m, std::regex("ab"),
     93                                             std::regex_constants::match_continuous));
     94         assert(m.size() == 0);
     95     }
     96     {
     97         std::cmatch m;
     98         const char s[] = "abcd";
     99         assert(std::regex_search(s, m, std::regex("bc")));
    100         assert(m.size() == 1);
    101         assert(m.prefix().matched);
    102         assert(m.prefix().first == s);
    103         assert(m.prefix().second == m[0].first);
    104         assert(m.suffix().matched);
    105         assert(m.suffix().first == m[0].second);
    106         assert(m.suffix().second == s+4);
    107         assert(m.length(0) == 2);
    108         assert(m.position(0) == 1);
    109         assert(m.str(0) == "bc");
    110     }
    111     {
    112         std::cmatch m;
    113         const char s[] = "abbc";
    114         assert(std::regex_search(s, m, std::regex("ab*c")));
    115         assert(m.size() == 1);
    116         assert(!m.prefix().matched);
    117         assert(m.prefix().first == s);
    118         assert(m.prefix().second == m[0].first);
    119         assert(!m.suffix().matched);
    120         assert(m.suffix().first == m[0].second);
    121         assert(m.suffix().second == s+4);
    122         assert(m.length(0) == 4);
    123         assert(m.position(0) == 0);
    124         assert(m.str(0) == s);
    125     }
    126     {
    127         std::cmatch m;
    128         const char s[] = "ababc";
    129         assert(std::regex_search(s, m, std::regex("(ab)*c")));
    130         assert(m.size() == 2);
    131         assert(!m.prefix().matched);
    132         assert(m.prefix().first == s);
    133         assert(m.prefix().second == m[0].first);
    134         assert(!m.suffix().matched);
    135         assert(m.suffix().first == m[0].second);
    136         assert(m.suffix().second == s+5);
    137         assert(m.length(0) == 5);
    138         assert(m.position(0) == 0);
    139         assert(m.str(0) == s);
    140         assert(m.length(1) == 2);
    141         assert(m.position(1) == 2);
    142         assert(m.str(1) == "ab");
    143     }
    144     {
    145         std::cmatch m;
    146         const char s[] = "abcdefghijk";
    147         assert(std::regex_search(s, m, std::regex("cd((e)fg)hi")));
    148         assert(m.size() == 3);
    149         assert(m.prefix().matched);
    150         assert(m.prefix().first == s);
    151         assert(m.prefix().second == m[0].first);
    152         assert(m.suffix().matched);
    153         assert(m.suffix().first == m[0].second);
    154         assert(m.suffix().second == s+std::regex_traits<char>::length(s));
    155         assert(m.length(0) == 7);
    156         assert(m.position(0) == 2);
    157         assert(m.str(0) == "cdefghi");
    158         assert(m.length(1) == 3);
    159         assert(m.position(1) == 4);
    160         assert(m.str(1) == "efg");
    161         assert(m.length(2) == 1);
    162         assert(m.position(2) == 4);
    163         assert(m.str(2) == "e");
    164     }
    165     {
    166         std::cmatch m;
    167         const char s[] = "abc";
    168         assert(std::regex_search(s, m, std::regex("^abc")));
    169         assert(m.size() == 1);
    170         assert(!m.prefix().matched);
    171         assert(m.prefix().first == s);
    172         assert(m.prefix().second == m[0].first);
    173         assert(!m.suffix().matched);
    174         assert(m.suffix().first == m[0].second);
    175         assert(m.suffix().second == s+3);
    176         assert(m.length(0) == 3);
    177         assert(m.position(0) == 0);
    178         assert(m.str(0) == s);
    179     }
    180     {
    181         std::cmatch m;
    182         const char s[] = "abcd";
    183         assert(std::regex_search(s, m, std::regex("^abc")));
    184         assert(m.size() == 1);
    185         assert(!m.prefix().matched);
    186         assert(m.prefix().first == s);
    187         assert(m.prefix().second == m[0].first);
    188         assert(m.suffix().matched);
    189         assert(m.suffix().first == m[0].second);
    190         assert(m.suffix().second == s+4);
    191         assert(m.length(0) == 3);
    192         assert(m.position(0) == 0);
    193         assert(m.str(0) == "abc");
    194     }
    195     {
    196         std::cmatch m;
    197         const char s[] = "aabc";
    198         assert(!std::regex_search(s, m, std::regex("^abc")));
    199         assert(m.size() == 0);
    200     }
    201     {
    202         std::cmatch m;
    203         const char s[] = "abc";
    204         assert(std::regex_search(s, m, std::regex("abc$")));
    205         assert(m.size() == 1);
    206         assert(!m.prefix().matched);
    207         assert(m.prefix().first == s);
    208         assert(m.prefix().second == m[0].first);
    209         assert(!m.suffix().matched);
    210         assert(m.suffix().first == m[0].second);
    211         assert(m.suffix().second == s+3);
    212         assert(m.length(0) == 3);
    213         assert(m.position(0) == 0);
    214         assert(m.str(0) == s);
    215     }
    216     {
    217         std::cmatch m;
    218         const char s[] = "efabc";
    219         assert(std::regex_search(s, m, std::regex("abc$")));
    220         assert(m.size() == 1);
    221         assert(m.prefix().matched);
    222         assert(m.prefix().first == s);
    223         assert(m.prefix().second == m[0].first);
    224         assert(!m.suffix().matched);
    225         assert(m.suffix().first == m[0].second);
    226         assert(m.suffix().second == s+5);
    227         assert(m.length(0) == 3);
    228         assert(m.position(0) == 2);
    229         assert(m.str(0) == s+2);
    230     }
    231     {
    232         std::cmatch m;
    233         const char s[] = "efabcg";
    234         assert(!std::regex_search(s, m, std::regex("abc$")));
    235         assert(m.size() == 0);
    236     }
    237     {
    238         std::cmatch m;
    239         const char s[] = "abc";
    240         assert(std::regex_search(s, m, std::regex("a.c")));
    241         assert(m.size() == 1);
    242         assert(!m.prefix().matched);
    243         assert(m.prefix().first == s);
    244         assert(m.prefix().second == m[0].first);
    245         assert(!m.suffix().matched);
    246         assert(m.suffix().first == m[0].second);
    247         assert(m.suffix().second == s+3);
    248         assert(m.length(0) == 3);
    249         assert(m.position(0) == 0);
    250         assert(m.str(0) == s);
    251     }
    252     {
    253         std::cmatch m;
    254         const char s[] = "acc";
    255         assert(std::regex_search(s, m, std::regex("a.c")));
    256         assert(m.size() == 1);
    257         assert(!m.prefix().matched);
    258         assert(m.prefix().first == s);
    259         assert(m.prefix().second == m[0].first);
    260         assert(!m.suffix().matched);
    261         assert(m.suffix().first == m[0].second);
    262         assert(m.suffix().second == s+3);
    263         assert(m.length(0) == 3);
    264         assert(m.position(0) == 0);
    265         assert(m.str(0) == s);
    266     }
    267     {
    268         std::cmatch m;
    269         const char s[] = "acc";
    270         assert(std::regex_search(s, m, std::regex("a.c")));
    271         assert(m.size() == 1);
    272         assert(!m.prefix().matched);
    273         assert(m.prefix().first == s);
    274         assert(m.prefix().second == m[0].first);
    275         assert(!m.suffix().matched);
    276         assert(m.suffix().first == m[0].second);
    277         assert(m.suffix().second == s+3);
    278         assert(m.length(0) == 3);
    279         assert(m.position(0) == 0);
    280         assert(m.str(0) == s);
    281     }
    282     {
    283         std::cmatch m;
    284         const char s[] = "abcdef";
    285         assert(std::regex_search(s, m, std::regex("(.*).*")));
    286         assert(m.size() == 2);
    287         assert(!m.prefix().matched);
    288         assert(m.prefix().first == s);
    289         assert(m.prefix().second == m[0].first);
    290         assert(!m.suffix().matched);
    291         assert(m.suffix().first == m[0].second);
    292         assert(m.suffix().second == s+6);
    293         assert(m.length(0) == 6);
    294         assert(m.position(0) == 0);
    295         assert(m.str(0) == s);
    296         assert(m.length(1) == 6);
    297         assert(m.position(1) == 0);
    298         assert(m.str(1) == s);
    299     }
    300     {
    301         std::cmatch m;
    302         const char s[] = "bc";
    303         assert(std::regex_search(s, m, std::regex("(a*)*")));
    304         assert(m.size() == 2);
    305         assert(!m.prefix().matched);
    306         assert(m.prefix().first == s);
    307         assert(m.prefix().second == m[0].first);
    308         assert(m.suffix().matched);
    309         assert(m.suffix().first == m[0].second);
    310         assert(m.suffix().second == s+2);
    311         assert(m.length(0) == 0);
    312         assert(m.position(0) == 0);
    313         assert(m.str(0) == "");
    314         assert(m.length(1) == 0);
    315         assert(m.position(1) == 0);
    316         assert(m.str(1) == "");
    317     }
    318     {
    319         std::cmatch m;
    320         const char s[] = "abbc";
    321         assert(!std::regex_search(s, m, std::regex("ab{3,5}c")));
    322         assert(m.size() == 0);
    323     }
    324     {
    325         std::cmatch m;
    326         const char s[] = "abbbc";
    327         assert(std::regex_search(s, m, std::regex("ab{3,5}c")));
    328         assert(m.size() == 1);
    329         assert(!m.prefix().matched);
    330         assert(m.prefix().first == s);
    331         assert(m.prefix().second == m[0].first);
    332         assert(!m.suffix().matched);
    333         assert(m.suffix().first == m[0].second);
    334         assert(m.suffix().second == m[0].second);
    335         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    336         assert(m.position(0) == 0);
    337         assert(m.str(0) == s);
    338     }
    339     {
    340         std::cmatch m;
    341         const char s[] = "abbbbc";
    342         assert(std::regex_search(s, m, std::regex("ab{3,5}c")));
    343         assert(m.size() == 1);
    344         assert(!m.prefix().matched);
    345         assert(m.prefix().first == s);
    346         assert(m.prefix().second == m[0].first);
    347         assert(!m.suffix().matched);
    348         assert(m.suffix().first == m[0].second);
    349         assert(m.suffix().second == m[0].second);
    350         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    351         assert(m.position(0) == 0);
    352         assert(m.str(0) == s);
    353     }
    354     {
    355         std::cmatch m;
    356         const char s[] = "abbbbbc";
    357         assert(std::regex_search(s, m, std::regex("ab{3,5}c")));
    358         assert(m.size() == 1);
    359         assert(!m.prefix().matched);
    360         assert(m.prefix().first == s);
    361         assert(m.prefix().second == m[0].first);
    362         assert(!m.suffix().matched);
    363         assert(m.suffix().first == m[0].second);
    364         assert(m.suffix().second == m[0].second);
    365         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    366         assert(m.position(0) == 0);
    367         assert(m.str(0) == s);
    368     }
    369     {
    370         std::cmatch m;
    371         const char s[] = "adefc";
    372         assert(!std::regex_search(s, m, std::regex("ab{3,5}c")));
    373         assert(m.size() == 0);
    374     }
    375     {
    376         std::cmatch m;
    377         const char s[] = "abbbbbbc";
    378         assert(!std::regex_search(s, m, std::regex("ab{3,5}c")));
    379         assert(m.size() == 0);
    380     }
    381     {
    382         std::cmatch m;
    383         const char s[] = "adec";
    384         assert(!std::regex_search(s, m, std::regex("a.{3,5}c")));
    385         assert(m.size() == 0);
    386     }
    387     {
    388         std::cmatch m;
    389         const char s[] = "adefc";
    390         assert(std::regex_search(s, m, std::regex("a.{3,5}c")));
    391         assert(m.size() == 1);
    392         assert(!m.prefix().matched);
    393         assert(m.prefix().first == s);
    394         assert(m.prefix().second == m[0].first);
    395         assert(!m.suffix().matched);
    396         assert(m.suffix().first == m[0].second);
    397         assert(m.suffix().second == m[0].second);
    398         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    399         assert(m.position(0) == 0);
    400         assert(m.str(0) == s);
    401     }
    402     {
    403         std::cmatch m;
    404         const char s[] = "adefgc";
    405         assert(std::regex_search(s, m, std::regex("a.{3,5}c")));
    406         assert(m.size() == 1);
    407         assert(!m.prefix().matched);
    408         assert(m.prefix().first == s);
    409         assert(m.prefix().second == m[0].first);
    410         assert(!m.suffix().matched);
    411         assert(m.suffix().first == m[0].second);
    412         assert(m.suffix().second == m[0].second);
    413         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    414         assert(m.position(0) == 0);
    415         assert(m.str(0) == s);
    416     }
    417     {
    418         std::cmatch m;
    419         const char s[] = "adefghc";
    420         assert(std::regex_search(s, m, std::regex("a.{3,5}c")));
    421         assert(m.size() == 1);
    422         assert(!m.prefix().matched);
    423         assert(m.prefix().first == s);
    424         assert(m.prefix().second == m[0].first);
    425         assert(!m.suffix().matched);
    426         assert(m.suffix().first == m[0].second);
    427         assert(m.suffix().second == m[0].second);
    428         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    429         assert(m.position(0) == 0);
    430         assert(m.str(0) == s);
    431     }
    432     {
    433         std::cmatch m;
    434         const char s[] = "adefghic";
    435         assert(!std::regex_search(s, m, std::regex("a.{3,5}c")));
    436         assert(m.size() == 0);
    437     }
    438     {
    439         std::cmatch m;
    440         const char s[] = "tournament";
    441         assert(std::regex_search(s, m, std::regex("tour|to|tournament")));
    442         assert(m.size() == 1);
    443         assert(!m.prefix().matched);
    444         assert(m.prefix().first == s);
    445         assert(m.prefix().second == m[0].first);
    446         assert(m.suffix().matched);
    447         assert(m.suffix().first == m[0].second);
    448         assert(m.suffix().second == s + std::char_traits<char>::length(s));
    449         assert(m.length(0) == 4);
    450         assert(m.position(0) == 0);
    451         assert(m.str(0) == "tour");
    452     }
    453     {
    454         std::cmatch m;
    455         const char s[] = "tournamenttotour";
    456         assert(std::regex_search(s, m, std::regex("(tour|to|tournament)+",
    457                std::regex_constants::nosubs)));
    458         assert(m.size() == 1);
    459         assert(!m.prefix().matched);
    460         assert(m.prefix().first == s);
    461         assert(m.prefix().second == m[0].first);
    462         assert(m.suffix().matched);
    463         assert(m.suffix().first == m[0].second);
    464         assert(m.suffix().second == s + std::char_traits<char>::length(s));
    465         assert(m.length(0) == 4);
    466         assert(m.position(0) == 0);
    467         assert(m.str(0) == "tour");
    468     }
    469     {
    470         std::cmatch m;
    471         const char s[] = "ttotour";
    472         assert(std::regex_search(s, m, std::regex("(tour|to|t)+")));
    473         assert(m.size() == 2);
    474         assert(!m.prefix().matched);
    475         assert(m.prefix().first == s);
    476         assert(m.prefix().second == m[0].first);
    477         assert(!m.suffix().matched);
    478         assert(m.suffix().first == m[0].second);
    479         assert(m.suffix().second == m[0].second);
    480         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    481         assert(m.position(0) == 0);
    482         assert(m.str(0) == s);
    483         assert(m.length(1) == 4);
    484         assert(m.position(1) == 3);
    485         assert(m.str(1) == "tour");
    486     }
    487     {
    488         std::cmatch m;
    489         const char s[] = "-ab,ab-";
    490         assert(!std::regex_search(s, m, std::regex("-(.*),\1-")));
    491         assert(m.size() == 0);
    492     }
    493     {
    494         std::cmatch m;
    495         const char s[] = "-ab,ab-";
    496         assert(std::regex_search(s, m, std::regex("-.*,.*-")));
    497         assert(m.size() == 1);
    498         assert(!m.prefix().matched);
    499         assert(m.prefix().first == s);
    500         assert(m.prefix().second == m[0].first);
    501         assert(!m.suffix().matched);
    502         assert(m.suffix().first == m[0].second);
    503         assert(m.suffix().second == m[0].second);
    504         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    505         assert(m.position(0) == 0);
    506         assert(m.str(0) == s);
    507     }
    508     {
    509         std::cmatch m;
    510         const char s[] = "a";
    511         assert(std::regex_search(s, m, std::regex("^[a]$")));
    512         assert(m.size() == 1);
    513         assert(!m.prefix().matched);
    514         assert(m.prefix().first == s);
    515         assert(m.prefix().second == m[0].first);
    516         assert(!m.suffix().matched);
    517         assert(m.suffix().first == m[0].second);
    518         assert(m.suffix().second == m[0].second);
    519         assert(m.length(0) == 1);
    520         assert(m.position(0) == 0);
    521         assert(m.str(0) == "a");
    522     }
    523     {
    524         std::cmatch m;
    525         const char s[] = "a";
    526         assert(std::regex_search(s, m, std::regex("^[ab]$")));
    527         assert(m.size() == 1);
    528         assert(!m.prefix().matched);
    529         assert(m.prefix().first == s);
    530         assert(m.prefix().second == m[0].first);
    531         assert(!m.suffix().matched);
    532         assert(m.suffix().first == m[0].second);
    533         assert(m.suffix().second == m[0].second);
    534         assert(m.length(0) == 1);
    535         assert(m.position(0) == 0);
    536         assert(m.str(0) == "a");
    537     }
    538     {
    539         std::cmatch m;
    540         const char s[] = "c";
    541         assert(std::regex_search(s, m, std::regex("^[a-f]$")));
    542         assert(m.size() == 1);
    543         assert(!m.prefix().matched);
    544         assert(m.prefix().first == s);
    545         assert(m.prefix().second == m[0].first);
    546         assert(!m.suffix().matched);
    547         assert(m.suffix().first == m[0].second);
    548         assert(m.suffix().second == m[0].second);
    549         assert(m.length(0) == 1);
    550         assert(m.position(0) == 0);
    551         assert(m.str(0) == s);
    552     }
    553     {
    554         std::cmatch m;
    555         const char s[] = "g";
    556         assert(!std::regex_search(s, m, std::regex("^[a-f]$")));
    557         assert(m.size() == 0);
    558     }
    559     {
    560         std::cmatch m;
    561         const char s[] = "Iraqi";
    562         assert(std::regex_search(s, m, std::regex("q[^u]")));
    563         assert(m.size() == 1);
    564         assert(m.prefix().matched);
    565         assert(m.prefix().first == s);
    566         assert(m.prefix().second == m[0].first);
    567         assert(!m.suffix().matched);
    568         assert(m.suffix().first == m[0].second);
    569         assert(m.suffix().second == m[0].second);
    570         assert(m.length(0) == 2);
    571         assert(m.position(0) == 3);
    572         assert(m.str(0) == "qi");
    573     }
    574     {
    575         std::cmatch m;
    576         const char s[] = "Iraq";
    577         assert(!std::regex_search(s, m, std::regex("q[^u]")));
    578         assert(m.size() == 0);
    579     }
    580     {
    581         std::cmatch m;
    582         const char s[] = "AmB";
    583         assert(std::regex_search(s, m, std::regex("A[[:lower:]]B")));
    584         assert(m.size() == 1);
    585         assert(!m.prefix().matched);
    586         assert(m.prefix().first == s);
    587         assert(m.prefix().second == m[0].first);
    588         assert(!m.suffix().matched);
    589         assert(m.suffix().first == m[0].second);
    590         assert(m.suffix().second == m[0].second);
    591         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    592         assert(m.position(0) == 0);
    593         assert(m.str(0) == s);
    594     }
    595     {
    596         std::cmatch m;
    597         const char s[] = "AMB";
    598         assert(!std::regex_search(s, m, std::regex("A[[:lower:]]B")));
    599         assert(m.size() == 0);
    600     }
    601     {
    602         std::cmatch m;
    603         const char s[] = "AMB";
    604         assert(std::regex_search(s, m, std::regex("A[^[:lower:]]B")));
    605         assert(m.size() == 1);
    606         assert(!m.prefix().matched);
    607         assert(m.prefix().first == s);
    608         assert(m.prefix().second == m[0].first);
    609         assert(!m.suffix().matched);
    610         assert(m.suffix().first == m[0].second);
    611         assert(m.suffix().second == m[0].second);
    612         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    613         assert(m.position(0) == 0);
    614         assert(m.str(0) == s);
    615     }
    616     {
    617         std::cmatch m;
    618         const char s[] = "AmB";
    619         assert(!std::regex_search(s, m, std::regex("A[^[:lower:]]B")));
    620         assert(m.size() == 0);
    621     }
    622     {
    623         std::cmatch m;
    624         const char s[] = "A5B";
    625         assert(!std::regex_search(s, m, std::regex("A[^[:lower:]0-9]B")));
    626         assert(m.size() == 0);
    627     }
    628     {
    629         std::cmatch m;
    630         const char s[] = "A?B";
    631         assert(std::regex_search(s, m, std::regex("A[^[:lower:]0-9]B")));
    632         assert(m.size() == 1);
    633         assert(!m.prefix().matched);
    634         assert(m.prefix().first == s);
    635         assert(m.prefix().second == m[0].first);
    636         assert(!m.suffix().matched);
    637         assert(m.suffix().first == m[0].second);
    638         assert(m.suffix().second == m[0].second);
    639         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    640         assert(m.position(0) == 0);
    641         assert(m.str(0) == s);
    642     }
    643     {
    644         std::cmatch m;
    645         const char s[] = "-";
    646         assert(std::regex_search(s, m, std::regex("[a[.hyphen.]z]")));
    647         assert(m.size() == 1);
    648         assert(!m.prefix().matched);
    649         assert(m.prefix().first == s);
    650         assert(m.prefix().second == m[0].first);
    651         assert(!m.suffix().matched);
    652         assert(m.suffix().first == m[0].second);
    653         assert(m.suffix().second == m[0].second);
    654         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    655         assert(m.position(0) == 0);
    656         assert(m.str(0) == s);
    657     }
    658     {
    659         std::cmatch m;
    660         const char s[] = "z";
    661         assert(std::regex_search(s, m, std::regex("[a[.hyphen.]z]")));
    662         assert(m.size() == 1);
    663         assert(!m.prefix().matched);
    664         assert(m.prefix().first == s);
    665         assert(m.prefix().second == m[0].first);
    666         assert(!m.suffix().matched);
    667         assert(m.suffix().first == m[0].second);
    668         assert(m.suffix().second == m[0].second);
    669         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    670         assert(m.position(0) == 0);
    671         assert(m.str(0) == s);
    672     }
    673     {
    674         std::cmatch m;
    675         const char s[] = "m";
    676         assert(!std::regex_search(s, m, std::regex("[a[.hyphen.]z]")));
    677         assert(m.size() == 0);
    678     }
    679     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
    680     {
    681         std::cmatch m;
    682         const char s[] = "m";
    683         assert(std::regex_search(s, m, std::regex("[a[=M=]z]")));
    684         assert(m.size() == 1);
    685         assert(!m.prefix().matched);
    686         assert(m.prefix().first == s);
    687         assert(m.prefix().second == m[0].first);
    688         assert(!m.suffix().matched);
    689         assert(m.suffix().first == m[0].second);
    690         assert(m.suffix().second == m[0].second);
    691         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    692         assert(m.position(0) == 0);
    693         assert(m.str(0) == s);
    694     }
    695     {
    696         std::cmatch m;
    697         const char s[] = "Ch";
    698         assert(std::regex_search(s, m, std::regex("[a[.ch.]z]",
    699                    std::regex_constants::icase)));
    700         assert(m.size() == 1);
    701         assert(!m.prefix().matched);
    702         assert(m.prefix().first == s);
    703         assert(m.prefix().second == m[0].first);
    704         assert(!m.suffix().matched);
    705         assert(m.suffix().first == m[0].second);
    706         assert(m.suffix().second == m[0].second);
    707         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    708         assert(m.position(0) == 0);
    709         assert(m.str(0) == s);
    710     }
    711     std::locale::global(std::locale("C"));
    712     {
    713         std::cmatch m;
    714         const char s[] = "m";
    715         assert(!std::regex_search(s, m, std::regex("[a[=M=]z]")));
    716         assert(m.size() == 0);
    717     }
    718     {
    719         std::cmatch m;
    720         const char s[] = "01a45cef9";
    721         assert(std::regex_search(s, m, std::regex("[ace1-9]*")));
    722         assert(m.size() == 1);
    723         assert(!m.prefix().matched);
    724         assert(m.prefix().first == s);
    725         assert(m.prefix().second == m[0].first);
    726         assert(m.suffix().matched);
    727         assert(m.suffix().first == m[0].second);
    728         assert(m.suffix().second == s + std::char_traits<char>::length(s));
    729         assert(m.length(0) == 0);
    730         assert(m.position(0) == 0);
    731         assert(m.str(0) == "");
    732     }
    733     {
    734         std::cmatch m;
    735         const char s[] = "01a45cef9";
    736         assert(std::regex_search(s, m, std::regex("[ace1-9]+")));
    737         assert(m.size() == 1);
    738         assert(m.prefix().matched);
    739         assert(m.prefix().first == s);
    740         assert(m.prefix().second == m[0].first);
    741         assert(m.suffix().matched);
    742         assert(m.suffix().first == m[0].second);
    743         assert(m.suffix().second == s + std::char_traits<char>::length(s));
    744         assert(m.length(0) == 6);
    745         assert(m.position(0) == 1);
    746         assert(m.str(0) == "1a45ce");
    747     }
    748     {
    749         const char r[] = "^[-+]?[0-9]+[CF]$";
    750         std::ptrdiff_t sr = std::char_traits<char>::length(r);
    751         typedef forward_iterator<const char*> FI;
    752         typedef bidirectional_iterator<const char*> BI;
    753         std::regex regex(FI(r), FI(r+sr));
    754         std::match_results<BI> m;
    755         const char s[] = "-40C";
    756         std::ptrdiff_t ss = std::char_traits<char>::length(s);
    757         assert(std::regex_search(BI(s), BI(s+ss), m, regex));
    758         assert(m.size() == 1);
    759         assert(!m.prefix().matched);
    760         assert(m.prefix().first == BI(s));
    761         assert(m.prefix().second == m[0].first);
    762         assert(!m.suffix().matched);
    763         assert(m.suffix().first == m[0].second);
    764         assert(m.suffix().second == m[0].second);
    765         assert(m.length(0) == 4);
    766         assert(m.position(0) == 0);
    767         assert(m.str(0) == s);
    768     }
    769     {
    770         std::cmatch m;
    771         const char s[] = "Jeff Jeffs ";
    772         assert(std::regex_search(s, m, std::regex("Jeff(?=s\\b)")));
    773         assert(m.size() == 1);
    774         assert(m.prefix().matched);
    775         assert(m.prefix().first == s);
    776         assert(m.prefix().second == m[0].first);
    777         assert(m.suffix().matched);
    778         assert(m.suffix().first == m[0].second);
    779         assert(m.suffix().second == s + std::char_traits<char>::length(s));
    780         assert(m.length(0) == 4);
    781         assert(m.position(0) == 5);
    782         assert(m.str(0) == "Jeff");
    783     }
    784     {
    785         std::cmatch m;
    786         const char s[] = "Jeffs Jeff";
    787         assert(std::regex_search(s, m, std::regex("Jeff(?!s\\b)")));
    788         assert(m.size() == 1);
    789         assert(m.prefix().matched);
    790         assert(m.prefix().first == s);
    791         assert(m.prefix().second == m[0].first);
    792         assert(!m.suffix().matched);
    793         assert(m.suffix().first == m[0].second);
    794         assert(m.suffix().second == s + std::char_traits<char>::length(s));
    795         assert(m.length(0) == 4);
    796         assert(m.position(0) == 6);
    797         assert(m.str(0) == "Jeff");
    798     }
    799     {
    800         std::cmatch m;
    801         const char s[] = "5%k";
    802         assert(std::regex_search(s, m, std::regex("\\d[\\W]k")));
    803         assert(m.size() == 1);
    804         assert(!m.prefix().matched);
    805         assert(m.prefix().first == s);
    806         assert(m.prefix().second == m[0].first);
    807         assert(!m.suffix().matched);
    808         assert(m.suffix().first == m[0].second);
    809         assert(m.suffix().second == s + std::char_traits<char>::length(s));
    810         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<char>::length(s));
    811         assert(m.position(0) == 0);
    812         assert(m.str(0) == s);
    813     }
    814 
    815     {
    816         std::wcmatch m;
    817         const wchar_t s[] = L"a";
    818         assert(std::regex_search(s, m, std::wregex(L"a")));
    819         assert(m.size() == 1);
    820         assert(!m.empty());
    821         assert(!m.prefix().matched);
    822         assert(m.prefix().first == s);
    823         assert(m.prefix().second == m[0].first);
    824         assert(!m.suffix().matched);
    825         assert(m.suffix().first == m[0].second);
    826         assert(m.suffix().second == s+1);
    827         assert(m.length(0) == 1);
    828         assert(m.position(0) == 0);
    829         assert(m.str(0) == L"a");
    830     }
    831     {
    832         std::wcmatch m;
    833         const wchar_t s[] = L"ab";
    834         assert(std::regex_search(s, m, std::wregex(L"ab")));
    835         assert(m.size() == 1);
    836         assert(!m.prefix().matched);
    837         assert(m.prefix().first == s);
    838         assert(m.prefix().second == m[0].first);
    839         assert(!m.suffix().matched);
    840         assert(m.suffix().first == m[0].second);
    841         assert(m.suffix().second == s+2);
    842         assert(m.length(0) == 2);
    843         assert(m.position(0) == 0);
    844         assert(m.str(0) == L"ab");
    845     }
    846     {
    847         std::wcmatch m;
    848         const wchar_t s[] = L"ab";
    849         assert(!std::regex_search(s, m, std::wregex(L"ba")));
    850         assert(m.size() == 0);
    851         assert(m.empty());
    852     }
    853     {
    854         std::wcmatch m;
    855         const wchar_t s[] = L"aab";
    856         assert(std::regex_search(s, m, std::wregex(L"ab")));
    857         assert(m.size() == 1);
    858         assert(m.prefix().matched);
    859         assert(m.prefix().first == s);
    860         assert(m.prefix().second == m[0].first);
    861         assert(!m.suffix().matched);
    862         assert(m.suffix().first == m[0].second);
    863         assert(m.suffix().second == s+3);
    864         assert(m.length(0) == 2);
    865         assert(m.position(0) == 1);
    866         assert(m.str(0) == L"ab");
    867     }
    868     {
    869         std::wcmatch m;
    870         const wchar_t s[] = L"aab";
    871         assert(!std::regex_search(s, m, std::wregex(L"ab"),
    872                                             std::regex_constants::match_continuous));
    873         assert(m.size() == 0);
    874     }
    875     {
    876         std::wcmatch m;
    877         const wchar_t s[] = L"abcd";
    878         assert(std::regex_search(s, m, std::wregex(L"bc")));
    879         assert(m.size() == 1);
    880         assert(m.prefix().matched);
    881         assert(m.prefix().first == s);
    882         assert(m.prefix().second == m[0].first);
    883         assert(m.suffix().matched);
    884         assert(m.suffix().first == m[0].second);
    885         assert(m.suffix().second == s+4);
    886         assert(m.length(0) == 2);
    887         assert(m.position(0) == 1);
    888         assert(m.str(0) == L"bc");
    889     }
    890     {
    891         std::wcmatch m;
    892         const wchar_t s[] = L"abbc";
    893         assert(std::regex_search(s, m, std::wregex(L"ab*c")));
    894         assert(m.size() == 1);
    895         assert(!m.prefix().matched);
    896         assert(m.prefix().first == s);
    897         assert(m.prefix().second == m[0].first);
    898         assert(!m.suffix().matched);
    899         assert(m.suffix().first == m[0].second);
    900         assert(m.suffix().second == s+4);
    901         assert(m.length(0) == 4);
    902         assert(m.position(0) == 0);
    903         assert(m.str(0) == s);
    904     }
    905     {
    906         std::wcmatch m;
    907         const wchar_t s[] = L"ababc";
    908         assert(std::regex_search(s, m, std::wregex(L"(ab)*c")));
    909         assert(m.size() == 2);
    910         assert(!m.prefix().matched);
    911         assert(m.prefix().first == s);
    912         assert(m.prefix().second == m[0].first);
    913         assert(!m.suffix().matched);
    914         assert(m.suffix().first == m[0].second);
    915         assert(m.suffix().second == s+5);
    916         assert(m.length(0) == 5);
    917         assert(m.position(0) == 0);
    918         assert(m.str(0) == s);
    919         assert(m.length(1) == 2);
    920         assert(m.position(1) == 2);
    921         assert(m.str(1) == L"ab");
    922     }
    923     {
    924         std::wcmatch m;
    925         const wchar_t s[] = L"abcdefghijk";
    926         assert(std::regex_search(s, m, std::wregex(L"cd((e)fg)hi")));
    927         assert(m.size() == 3);
    928         assert(m.prefix().matched);
    929         assert(m.prefix().first == s);
    930         assert(m.prefix().second == m[0].first);
    931         assert(m.suffix().matched);
    932         assert(m.suffix().first == m[0].second);
    933         assert(m.suffix().second == s+std::regex_traits<wchar_t>::length(s));
    934         assert(m.length(0) == 7);
    935         assert(m.position(0) == 2);
    936         assert(m.str(0) == L"cdefghi");
    937         assert(m.length(1) == 3);
    938         assert(m.position(1) == 4);
    939         assert(m.str(1) == L"efg");
    940         assert(m.length(2) == 1);
    941         assert(m.position(2) == 4);
    942         assert(m.str(2) == L"e");
    943     }
    944     {
    945         std::wcmatch m;
    946         const wchar_t s[] = L"abc";
    947         assert(std::regex_search(s, m, std::wregex(L"^abc")));
    948         assert(m.size() == 1);
    949         assert(!m.prefix().matched);
    950         assert(m.prefix().first == s);
    951         assert(m.prefix().second == m[0].first);
    952         assert(!m.suffix().matched);
    953         assert(m.suffix().first == m[0].second);
    954         assert(m.suffix().second == s+3);
    955         assert(m.length(0) == 3);
    956         assert(m.position(0) == 0);
    957         assert(m.str(0) == s);
    958     }
    959     {
    960         std::wcmatch m;
    961         const wchar_t s[] = L"abcd";
    962         assert(std::regex_search(s, m, std::wregex(L"^abc")));
    963         assert(m.size() == 1);
    964         assert(!m.prefix().matched);
    965         assert(m.prefix().first == s);
    966         assert(m.prefix().second == m[0].first);
    967         assert(m.suffix().matched);
    968         assert(m.suffix().first == m[0].second);
    969         assert(m.suffix().second == s+4);
    970         assert(m.length(0) == 3);
    971         assert(m.position(0) == 0);
    972         assert(m.str(0) == L"abc");
    973     }
    974     {
    975         std::wcmatch m;
    976         const wchar_t s[] = L"aabc";
    977         assert(!std::regex_search(s, m, std::wregex(L"^abc")));
    978         assert(m.size() == 0);
    979     }
    980     {
    981         std::wcmatch m;
    982         const wchar_t s[] = L"abc";
    983         assert(std::regex_search(s, m, std::wregex(L"abc$")));
    984         assert(m.size() == 1);
    985         assert(!m.prefix().matched);
    986         assert(m.prefix().first == s);
    987         assert(m.prefix().second == m[0].first);
    988         assert(!m.suffix().matched);
    989         assert(m.suffix().first == m[0].second);
    990         assert(m.suffix().second == s+3);
    991         assert(m.length(0) == 3);
    992         assert(m.position(0) == 0);
    993         assert(m.str(0) == s);
    994     }
    995     {
    996         std::wcmatch m;
    997         const wchar_t s[] = L"efabc";
    998         assert(std::regex_search(s, m, std::wregex(L"abc$")));
    999         assert(m.size() == 1);
   1000         assert(m.prefix().matched);
   1001         assert(m.prefix().first == s);
   1002         assert(m.prefix().second == m[0].first);
   1003         assert(!m.suffix().matched);
   1004         assert(m.suffix().first == m[0].second);
   1005         assert(m.suffix().second == s+5);
   1006         assert(m.length(0) == 3);
   1007         assert(m.position(0) == 2);
   1008         assert(m.str(0) == s+2);
   1009     }
   1010     {
   1011         std::wcmatch m;
   1012         const wchar_t s[] = L"efabcg";
   1013         assert(!std::regex_search(s, m, std::wregex(L"abc$")));
   1014         assert(m.size() == 0);
   1015     }
   1016     {
   1017         std::wcmatch m;
   1018         const wchar_t s[] = L"abc";
   1019         assert(std::regex_search(s, m, std::wregex(L"a.c")));
   1020         assert(m.size() == 1);
   1021         assert(!m.prefix().matched);
   1022         assert(m.prefix().first == s);
   1023         assert(m.prefix().second == m[0].first);
   1024         assert(!m.suffix().matched);
   1025         assert(m.suffix().first == m[0].second);
   1026         assert(m.suffix().second == s+3);
   1027         assert(m.length(0) == 3);
   1028         assert(m.position(0) == 0);
   1029         assert(m.str(0) == s);
   1030     }
   1031     {
   1032         std::wcmatch m;
   1033         const wchar_t s[] = L"acc";
   1034         assert(std::regex_search(s, m, std::wregex(L"a.c")));
   1035         assert(m.size() == 1);
   1036         assert(!m.prefix().matched);
   1037         assert(m.prefix().first == s);
   1038         assert(m.prefix().second == m[0].first);
   1039         assert(!m.suffix().matched);
   1040         assert(m.suffix().first == m[0].second);
   1041         assert(m.suffix().second == s+3);
   1042         assert(m.length(0) == 3);
   1043         assert(m.position(0) == 0);
   1044         assert(m.str(0) == s);
   1045     }
   1046     {
   1047         std::wcmatch m;
   1048         const wchar_t s[] = L"acc";
   1049         assert(std::regex_search(s, m, std::wregex(L"a.c")));
   1050         assert(m.size() == 1);
   1051         assert(!m.prefix().matched);
   1052         assert(m.prefix().first == s);
   1053         assert(m.prefix().second == m[0].first);
   1054         assert(!m.suffix().matched);
   1055         assert(m.suffix().first == m[0].second);
   1056         assert(m.suffix().second == s+3);
   1057         assert(m.length(0) == 3);
   1058         assert(m.position(0) == 0);
   1059         assert(m.str(0) == s);
   1060     }
   1061     {
   1062         std::wcmatch m;
   1063         const wchar_t s[] = L"abcdef";
   1064         assert(std::regex_search(s, m, std::wregex(L"(.*).*")));
   1065         assert(m.size() == 2);
   1066         assert(!m.prefix().matched);
   1067         assert(m.prefix().first == s);
   1068         assert(m.prefix().second == m[0].first);
   1069         assert(!m.suffix().matched);
   1070         assert(m.suffix().first == m[0].second);
   1071         assert(m.suffix().second == s+6);
   1072         assert(m.length(0) == 6);
   1073         assert(m.position(0) == 0);
   1074         assert(m.str(0) == s);
   1075         assert(m.length(1) == 6);
   1076         assert(m.position(1) == 0);
   1077         assert(m.str(1) == s);
   1078     }
   1079     {
   1080         std::wcmatch m;
   1081         const wchar_t s[] = L"bc";
   1082         assert(std::regex_search(s, m, std::wregex(L"(a*)*")));
   1083         assert(m.size() == 2);
   1084         assert(!m.prefix().matched);
   1085         assert(m.prefix().first == s);
   1086         assert(m.prefix().second == m[0].first);
   1087         assert(m.suffix().matched);
   1088         assert(m.suffix().first == m[0].second);
   1089         assert(m.suffix().second == s+2);
   1090         assert(m.length(0) == 0);
   1091         assert(m.position(0) == 0);
   1092         assert(m.str(0) == L"");
   1093         assert(m.length(1) == 0);
   1094         assert(m.position(1) == 0);
   1095         assert(m.str(1) == L"");
   1096     }
   1097     {
   1098         std::wcmatch m;
   1099         const wchar_t s[] = L"abbc";
   1100         assert(!std::regex_search(s, m, std::wregex(L"ab{3,5}c")));
   1101         assert(m.size() == 0);
   1102     }
   1103     {
   1104         std::wcmatch m;
   1105         const wchar_t s[] = L"abbbc";
   1106         assert(std::regex_search(s, m, std::wregex(L"ab{3,5}c")));
   1107         assert(m.size() == 1);
   1108         assert(!m.prefix().matched);
   1109         assert(m.prefix().first == s);
   1110         assert(m.prefix().second == m[0].first);
   1111         assert(!m.suffix().matched);
   1112         assert(m.suffix().first == m[0].second);
   1113         assert(m.suffix().second == m[0].second);
   1114         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1115         assert(m.position(0) == 0);
   1116         assert(m.str(0) == s);
   1117     }
   1118     {
   1119         std::wcmatch m;
   1120         const wchar_t s[] = L"abbbbc";
   1121         assert(std::regex_search(s, m, std::wregex(L"ab{3,5}c")));
   1122         assert(m.size() == 1);
   1123         assert(!m.prefix().matched);
   1124         assert(m.prefix().first == s);
   1125         assert(m.prefix().second == m[0].first);
   1126         assert(!m.suffix().matched);
   1127         assert(m.suffix().first == m[0].second);
   1128         assert(m.suffix().second == m[0].second);
   1129         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1130         assert(m.position(0) == 0);
   1131         assert(m.str(0) == s);
   1132     }
   1133     {
   1134         std::wcmatch m;
   1135         const wchar_t s[] = L"abbbbbc";
   1136         assert(std::regex_search(s, m, std::wregex(L"ab{3,5}c")));
   1137         assert(m.size() == 1);
   1138         assert(!m.prefix().matched);
   1139         assert(m.prefix().first == s);
   1140         assert(m.prefix().second == m[0].first);
   1141         assert(!m.suffix().matched);
   1142         assert(m.suffix().first == m[0].second);
   1143         assert(m.suffix().second == m[0].second);
   1144         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1145         assert(m.position(0) == 0);
   1146         assert(m.str(0) == s);
   1147     }
   1148     {
   1149         std::wcmatch m;
   1150         const wchar_t s[] = L"adefc";
   1151         assert(!std::regex_search(s, m, std::wregex(L"ab{3,5}c")));
   1152         assert(m.size() == 0);
   1153     }
   1154     {
   1155         std::wcmatch m;
   1156         const wchar_t s[] = L"abbbbbbc";
   1157         assert(!std::regex_search(s, m, std::wregex(L"ab{3,5}c")));
   1158         assert(m.size() == 0);
   1159     }
   1160     {
   1161         std::wcmatch m;
   1162         const wchar_t s[] = L"adec";
   1163         assert(!std::regex_search(s, m, std::wregex(L"a.{3,5}c")));
   1164         assert(m.size() == 0);
   1165     }
   1166     {
   1167         std::wcmatch m;
   1168         const wchar_t s[] = L"adefc";
   1169         assert(std::regex_search(s, m, std::wregex(L"a.{3,5}c")));
   1170         assert(m.size() == 1);
   1171         assert(!m.prefix().matched);
   1172         assert(m.prefix().first == s);
   1173         assert(m.prefix().second == m[0].first);
   1174         assert(!m.suffix().matched);
   1175         assert(m.suffix().first == m[0].second);
   1176         assert(m.suffix().second == m[0].second);
   1177         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1178         assert(m.position(0) == 0);
   1179         assert(m.str(0) == s);
   1180     }
   1181     {
   1182         std::wcmatch m;
   1183         const wchar_t s[] = L"adefgc";
   1184         assert(std::regex_search(s, m, std::wregex(L"a.{3,5}c")));
   1185         assert(m.size() == 1);
   1186         assert(!m.prefix().matched);
   1187         assert(m.prefix().first == s);
   1188         assert(m.prefix().second == m[0].first);
   1189         assert(!m.suffix().matched);
   1190         assert(m.suffix().first == m[0].second);
   1191         assert(m.suffix().second == m[0].second);
   1192         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1193         assert(m.position(0) == 0);
   1194         assert(m.str(0) == s);
   1195     }
   1196     {
   1197         std::wcmatch m;
   1198         const wchar_t s[] = L"adefghc";
   1199         assert(std::regex_search(s, m, std::wregex(L"a.{3,5}c")));
   1200         assert(m.size() == 1);
   1201         assert(!m.prefix().matched);
   1202         assert(m.prefix().first == s);
   1203         assert(m.prefix().second == m[0].first);
   1204         assert(!m.suffix().matched);
   1205         assert(m.suffix().first == m[0].second);
   1206         assert(m.suffix().second == m[0].second);
   1207         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1208         assert(m.position(0) == 0);
   1209         assert(m.str(0) == s);
   1210     }
   1211     {
   1212         std::wcmatch m;
   1213         const wchar_t s[] = L"adefghic";
   1214         assert(!std::regex_search(s, m, std::wregex(L"a.{3,5}c")));
   1215         assert(m.size() == 0);
   1216     }
   1217     {
   1218         std::wcmatch m;
   1219         const wchar_t s[] = L"tournament";
   1220         assert(std::regex_search(s, m, std::wregex(L"tour|to|tournament")));
   1221         assert(m.size() == 1);
   1222         assert(!m.prefix().matched);
   1223         assert(m.prefix().first == s);
   1224         assert(m.prefix().second == m[0].first);
   1225         assert(m.suffix().matched);
   1226         assert(m.suffix().first == m[0].second);
   1227         assert(m.suffix().second == s + std::char_traits<wchar_t>::length(s));
   1228         assert(m.length(0) == 4);
   1229         assert(m.position(0) == 0);
   1230         assert(m.str(0) == L"tour");
   1231     }
   1232     {
   1233         std::wcmatch m;
   1234         const wchar_t s[] = L"tournamenttotour";
   1235         assert(std::regex_search(s, m, std::wregex(L"(tour|to|tournament)+",
   1236                std::regex_constants::nosubs)));
   1237         assert(m.size() == 1);
   1238         assert(!m.prefix().matched);
   1239         assert(m.prefix().first == s);
   1240         assert(m.prefix().second == m[0].first);
   1241         assert(m.suffix().matched);
   1242         assert(m.suffix().first == m[0].second);
   1243         assert(m.suffix().second == s + std::char_traits<wchar_t>::length(s));
   1244         assert(m.length(0) == 4);
   1245         assert(m.position(0) == 0);
   1246         assert(m.str(0) == L"tour");
   1247     }
   1248     {
   1249         std::wcmatch m;
   1250         const wchar_t s[] = L"ttotour";
   1251         assert(std::regex_search(s, m, std::wregex(L"(tour|to|t)+")));
   1252         assert(m.size() == 2);
   1253         assert(!m.prefix().matched);
   1254         assert(m.prefix().first == s);
   1255         assert(m.prefix().second == m[0].first);
   1256         assert(!m.suffix().matched);
   1257         assert(m.suffix().first == m[0].second);
   1258         assert(m.suffix().second == m[0].second);
   1259         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1260         assert(m.position(0) == 0);
   1261         assert(m.str(0) == s);
   1262         assert(m.length(1) == 4);
   1263         assert(m.position(1) == 3);
   1264         assert(m.str(1) == L"tour");
   1265     }
   1266     {
   1267         std::wcmatch m;
   1268         const wchar_t s[] = L"-ab,ab-";
   1269         assert(!std::regex_search(s, m, std::wregex(L"-(.*),\1-")));
   1270         assert(m.size() == 0);
   1271     }
   1272     {
   1273         std::wcmatch m;
   1274         const wchar_t s[] = L"-ab,ab-";
   1275         assert(std::regex_search(s, m, std::wregex(L"-.*,.*-")));
   1276         assert(m.size() == 1);
   1277         assert(!m.prefix().matched);
   1278         assert(m.prefix().first == s);
   1279         assert(m.prefix().second == m[0].first);
   1280         assert(!m.suffix().matched);
   1281         assert(m.suffix().first == m[0].second);
   1282         assert(m.suffix().second == m[0].second);
   1283         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1284         assert(m.position(0) == 0);
   1285         assert(m.str(0) == s);
   1286     }
   1287     {
   1288         std::wcmatch m;
   1289         const wchar_t s[] = L"a";
   1290         assert(std::regex_search(s, m, std::wregex(L"^[a]$")));
   1291         assert(m.size() == 1);
   1292         assert(!m.prefix().matched);
   1293         assert(m.prefix().first == s);
   1294         assert(m.prefix().second == m[0].first);
   1295         assert(!m.suffix().matched);
   1296         assert(m.suffix().first == m[0].second);
   1297         assert(m.suffix().second == m[0].second);
   1298         assert(m.length(0) == 1);
   1299         assert(m.position(0) == 0);
   1300         assert(m.str(0) == L"a");
   1301     }
   1302     {
   1303         std::wcmatch m;
   1304         const wchar_t s[] = L"a";
   1305         assert(std::regex_search(s, m, std::wregex(L"^[ab]$")));
   1306         assert(m.size() == 1);
   1307         assert(!m.prefix().matched);
   1308         assert(m.prefix().first == s);
   1309         assert(m.prefix().second == m[0].first);
   1310         assert(!m.suffix().matched);
   1311         assert(m.suffix().first == m[0].second);
   1312         assert(m.suffix().second == m[0].second);
   1313         assert(m.length(0) == 1);
   1314         assert(m.position(0) == 0);
   1315         assert(m.str(0) == L"a");
   1316     }
   1317     {
   1318         std::wcmatch m;
   1319         const wchar_t s[] = L"c";
   1320         assert(std::regex_search(s, m, std::wregex(L"^[a-f]$")));
   1321         assert(m.size() == 1);
   1322         assert(!m.prefix().matched);
   1323         assert(m.prefix().first == s);
   1324         assert(m.prefix().second == m[0].first);
   1325         assert(!m.suffix().matched);
   1326         assert(m.suffix().first == m[0].second);
   1327         assert(m.suffix().second == m[0].second);
   1328         assert(m.length(0) == 1);
   1329         assert(m.position(0) == 0);
   1330         assert(m.str(0) == s);
   1331     }
   1332     {
   1333         std::wcmatch m;
   1334         const wchar_t s[] = L"g";
   1335         assert(!std::regex_search(s, m, std::wregex(L"^[a-f]$")));
   1336         assert(m.size() == 0);
   1337     }
   1338     {
   1339         std::wcmatch m;
   1340         const wchar_t s[] = L"Iraqi";
   1341         assert(std::regex_search(s, m, std::wregex(L"q[^u]")));
   1342         assert(m.size() == 1);
   1343         assert(m.prefix().matched);
   1344         assert(m.prefix().first == s);
   1345         assert(m.prefix().second == m[0].first);
   1346         assert(!m.suffix().matched);
   1347         assert(m.suffix().first == m[0].second);
   1348         assert(m.suffix().second == m[0].second);
   1349         assert(m.length(0) == 2);
   1350         assert(m.position(0) == 3);
   1351         assert(m.str(0) == L"qi");
   1352     }
   1353     {
   1354         std::wcmatch m;
   1355         const wchar_t s[] = L"Iraq";
   1356         assert(!std::regex_search(s, m, std::wregex(L"q[^u]")));
   1357         assert(m.size() == 0);
   1358     }
   1359     {
   1360         std::wcmatch m;
   1361         const wchar_t s[] = L"AmB";
   1362         assert(std::regex_search(s, m, std::wregex(L"A[[:lower:]]B")));
   1363         assert(m.size() == 1);
   1364         assert(!m.prefix().matched);
   1365         assert(m.prefix().first == s);
   1366         assert(m.prefix().second == m[0].first);
   1367         assert(!m.suffix().matched);
   1368         assert(m.suffix().first == m[0].second);
   1369         assert(m.suffix().second == m[0].second);
   1370         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1371         assert(m.position(0) == 0);
   1372         assert(m.str(0) == s);
   1373     }
   1374     {
   1375         std::wcmatch m;
   1376         const wchar_t s[] = L"AMB";
   1377         assert(!std::regex_search(s, m, std::wregex(L"A[[:lower:]]B")));
   1378         assert(m.size() == 0);
   1379     }
   1380     {
   1381         std::wcmatch m;
   1382         const wchar_t s[] = L"AMB";
   1383         assert(std::regex_search(s, m, std::wregex(L"A[^[:lower:]]B")));
   1384         assert(m.size() == 1);
   1385         assert(!m.prefix().matched);
   1386         assert(m.prefix().first == s);
   1387         assert(m.prefix().second == m[0].first);
   1388         assert(!m.suffix().matched);
   1389         assert(m.suffix().first == m[0].second);
   1390         assert(m.suffix().second == m[0].second);
   1391         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1392         assert(m.position(0) == 0);
   1393         assert(m.str(0) == s);
   1394     }
   1395     {
   1396         std::wcmatch m;
   1397         const wchar_t s[] = L"AmB";
   1398         assert(!std::regex_search(s, m, std::wregex(L"A[^[:lower:]]B")));
   1399         assert(m.size() == 0);
   1400     }
   1401     {
   1402         std::wcmatch m;
   1403         const wchar_t s[] = L"A5B";
   1404         assert(!std::regex_search(s, m, std::wregex(L"A[^[:lower:]0-9]B")));
   1405         assert(m.size() == 0);
   1406     }
   1407     {
   1408         std::wcmatch m;
   1409         const wchar_t s[] = L"A?B";
   1410         assert(std::regex_search(s, m, std::wregex(L"A[^[:lower:]0-9]B")));
   1411         assert(m.size() == 1);
   1412         assert(!m.prefix().matched);
   1413         assert(m.prefix().first == s);
   1414         assert(m.prefix().second == m[0].first);
   1415         assert(!m.suffix().matched);
   1416         assert(m.suffix().first == m[0].second);
   1417         assert(m.suffix().second == m[0].second);
   1418         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1419         assert(m.position(0) == 0);
   1420         assert(m.str(0) == s);
   1421     }
   1422     {
   1423         std::wcmatch m;
   1424         const wchar_t s[] = L"-";
   1425         assert(std::regex_search(s, m, std::wregex(L"[a[.hyphen.]z]")));
   1426         assert(m.size() == 1);
   1427         assert(!m.prefix().matched);
   1428         assert(m.prefix().first == s);
   1429         assert(m.prefix().second == m[0].first);
   1430         assert(!m.suffix().matched);
   1431         assert(m.suffix().first == m[0].second);
   1432         assert(m.suffix().second == m[0].second);
   1433         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1434         assert(m.position(0) == 0);
   1435         assert(m.str(0) == s);
   1436     }
   1437     {
   1438         std::wcmatch m;
   1439         const wchar_t s[] = L"z";
   1440         assert(std::regex_search(s, m, std::wregex(L"[a[.hyphen.]z]")));
   1441         assert(m.size() == 1);
   1442         assert(!m.prefix().matched);
   1443         assert(m.prefix().first == s);
   1444         assert(m.prefix().second == m[0].first);
   1445         assert(!m.suffix().matched);
   1446         assert(m.suffix().first == m[0].second);
   1447         assert(m.suffix().second == m[0].second);
   1448         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1449         assert(m.position(0) == 0);
   1450         assert(m.str(0) == s);
   1451     }
   1452     {
   1453         std::wcmatch m;
   1454         const wchar_t s[] = L"m";
   1455         assert(!std::regex_search(s, m, std::wregex(L"[a[.hyphen.]z]")));
   1456         assert(m.size() == 0);
   1457     }
   1458     std::locale::global(std::locale(LOCALE_cs_CZ_ISO8859_2));
   1459     {
   1460         std::wcmatch m;
   1461         const wchar_t s[] = L"m";
   1462         assert(std::regex_search(s, m, std::wregex(L"[a[=M=]z]")));
   1463         assert(m.size() == 1);
   1464         assert(!m.prefix().matched);
   1465         assert(m.prefix().first == s);
   1466         assert(m.prefix().second == m[0].first);
   1467         assert(!m.suffix().matched);
   1468         assert(m.suffix().first == m[0].second);
   1469         assert(m.suffix().second == m[0].second);
   1470         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1471         assert(m.position(0) == 0);
   1472         assert(m.str(0) == s);
   1473     }
   1474     {
   1475         std::wcmatch m;
   1476         const wchar_t s[] = L"Ch";
   1477         assert(std::regex_search(s, m, std::wregex(L"[a[.ch.]z]",
   1478                    std::regex_constants::icase)));
   1479         assert(m.size() == 1);
   1480         assert(!m.prefix().matched);
   1481         assert(m.prefix().first == s);
   1482         assert(m.prefix().second == m[0].first);
   1483         assert(!m.suffix().matched);
   1484         assert(m.suffix().first == m[0].second);
   1485         assert(m.suffix().second == m[0].second);
   1486         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1487         assert(m.position(0) == 0);
   1488         assert(m.str(0) == s);
   1489     }
   1490     std::locale::global(std::locale("C"));
   1491     {
   1492         std::wcmatch m;
   1493         const wchar_t s[] = L"m";
   1494         assert(!std::regex_search(s, m, std::wregex(L"[a[=M=]z]")));
   1495         assert(m.size() == 0);
   1496     }
   1497     {
   1498         std::wcmatch m;
   1499         const wchar_t s[] = L"01a45cef9";
   1500         assert(std::regex_search(s, m, std::wregex(L"[ace1-9]*")));
   1501         assert(m.size() == 1);
   1502         assert(!m.prefix().matched);
   1503         assert(m.prefix().first == s);
   1504         assert(m.prefix().second == m[0].first);
   1505         assert(m.suffix().matched);
   1506         assert(m.suffix().first == m[0].second);
   1507         assert(m.suffix().second == s + std::char_traits<wchar_t>::length(s));
   1508         assert(m.length(0) == 0);
   1509         assert(m.position(0) == 0);
   1510         assert(m.str(0) == L"");
   1511     }
   1512     {
   1513         std::wcmatch m;
   1514         const wchar_t s[] = L"01a45cef9";
   1515         assert(std::regex_search(s, m, std::wregex(L"[ace1-9]+")));
   1516         assert(m.size() == 1);
   1517         assert(m.prefix().matched);
   1518         assert(m.prefix().first == s);
   1519         assert(m.prefix().second == m[0].first);
   1520         assert(m.suffix().matched);
   1521         assert(m.suffix().first == m[0].second);
   1522         assert(m.suffix().second == s + std::char_traits<wchar_t>::length(s));
   1523         assert(m.length(0) == 6);
   1524         assert(m.position(0) == 1);
   1525         assert(m.str(0) == L"1a45ce");
   1526     }
   1527     {
   1528         const wchar_t r[] = L"^[-+]?[0-9]+[CF]$";
   1529         std::ptrdiff_t sr = std::char_traits<wchar_t>::length(r);
   1530         typedef forward_iterator<const wchar_t*> FI;
   1531         typedef bidirectional_iterator<const wchar_t*> BI;
   1532         std::wregex regex(FI(r), FI(r+sr));
   1533         std::match_results<BI> m;
   1534         const wchar_t s[] = L"-40C";
   1535         std::ptrdiff_t ss = std::char_traits<wchar_t>::length(s);
   1536         assert(std::regex_search(BI(s), BI(s+ss), m, regex));
   1537         assert(m.size() == 1);
   1538         assert(!m.prefix().matched);
   1539         assert(m.prefix().first == BI(s));
   1540         assert(m.prefix().second == m[0].first);
   1541         assert(!m.suffix().matched);
   1542         assert(m.suffix().first == m[0].second);
   1543         assert(m.suffix().second == m[0].second);
   1544         assert(m.length(0) == 4);
   1545         assert(m.position(0) == 0);
   1546         assert(m.str(0) == s);
   1547     }
   1548     {
   1549         std::wcmatch m;
   1550         const wchar_t s[] = L"Jeff Jeffs ";
   1551         assert(std::regex_search(s, m, std::wregex(L"Jeff(?=s\\b)")));
   1552         assert(m.size() == 1);
   1553         assert(m.prefix().matched);
   1554         assert(m.prefix().first == s);
   1555         assert(m.prefix().second == m[0].first);
   1556         assert(m.suffix().matched);
   1557         assert(m.suffix().first == m[0].second);
   1558         assert(m.suffix().second == s + std::char_traits<wchar_t>::length(s));
   1559         assert(m.length(0) == 4);
   1560         assert(m.position(0) == 5);
   1561         assert(m.str(0) == L"Jeff");
   1562     }
   1563     {
   1564         std::wcmatch m;
   1565         const wchar_t s[] = L"Jeffs Jeff";
   1566         assert(std::regex_search(s, m, std::wregex(L"Jeff(?!s\\b)")));
   1567         assert(m.size() == 1);
   1568         assert(m.prefix().matched);
   1569         assert(m.prefix().first == s);
   1570         assert(m.prefix().second == m[0].first);
   1571         assert(!m.suffix().matched);
   1572         assert(m.suffix().first == m[0].second);
   1573         assert(m.suffix().second == s + std::char_traits<wchar_t>::length(s));
   1574         assert(m.length(0) == 4);
   1575         assert(m.position(0) == 6);
   1576         assert(m.str(0) == L"Jeff");
   1577     }
   1578     {
   1579         std::wcmatch m;
   1580         const wchar_t s[] = L"5%k";
   1581         assert(std::regex_search(s, m, std::wregex(L"\\d[\\W]k")));
   1582         assert(m.size() == 1);
   1583         assert(!m.prefix().matched);
   1584         assert(m.prefix().first == s);
   1585         assert(m.prefix().second == m[0].first);
   1586         assert(!m.suffix().matched);
   1587         assert(m.suffix().first == m[0].second);
   1588         assert(m.suffix().second == s + std::char_traits<wchar_t>::length(s));
   1589         assert(m.length(0) >= 0 && static_cast<size_t>(m.length(0)) == std::char_traits<wchar_t>::length(s));
   1590         assert(m.position(0) == 0);
   1591         assert(m.str(0) == s);
   1592     }
   1593 }