xref: /llvm-project/libcxx/test/std/re/re.results/re.results.form/form1.pass.cpp (revision 5f26d8636f506b487962cd2a9b0e32940e93fa9b)
1 //===----------------------------------------------------------------------===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 // <regex>
10 
11 // class match_results<BidirectionalIterator, Allocator>
12 
13 // template <class OutputIter>
14 //   OutputIter
15 //   format(OutputIter out, const char_type* fmt_first, const char_type* fmt_last,
16 //          regex_constants::match_flag_type flags = regex_constants::format_default) const;
17 
18 #include <regex>
19 #include <cassert>
20 
21 #include "test_macros.h"
22 #include "test_iterators.h"
23 
main(int,char **)24 int main(int, char**)
25 {
26     {
27         std::match_results<const char*> m;
28         const char s[] = "abcdefghijk";
29         assert(std::regex_search(s, m, std::regex("cd((e)fg)hi")));
30 
31         char out[100] = {0};
32         const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";
33         auto r = m.format(cpp17_output_iterator<char*>(out),
34                     fmt, fmt + std::char_traits<char>::length(fmt));
35         assert(base(r) == out + 58);
36         assert(std::string(out) == "prefix: ab, match: cdefghi, suffix: jk, m[1]: efg, m[2]: e");
37     }
38     {
39         std::match_results<const char*> m;
40         const char s[] = "abcdefghijk";
41         assert(std::regex_search(s, m, std::regex("cd((e)fg)hi",
42                                                   std::regex_constants::nosubs)));
43 
44         char out[100] = {0};
45         const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";
46         auto r = m.format(cpp17_output_iterator<char*>(out),
47                     fmt, fmt + std::char_traits<char>::length(fmt));
48         assert(base(r) == out + 54);
49         assert(std::string(out) == "prefix: ab, match: cdefghi, suffix: jk, m[1]: , m[2]: ");
50     }
51     {
52         std::match_results<const char*> m;
53         const char s[] = "abcdefghijk";
54         assert(std::regex_search(s, m, std::regex("cdefghi")));
55 
56         char out[100] = {0};
57         const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";
58         auto r = m.format(cpp17_output_iterator<char*>(out),
59                     fmt, fmt + std::char_traits<char>::length(fmt));
60         assert(base(r) == out + 54);
61         assert(std::string(out) == "prefix: ab, match: cdefghi, suffix: jk, m[1]: , m[2]: ");
62     }
63     {
64         std::match_results<const char*> m;
65         const char s[] = "abcdefghijk";
66         assert(std::regex_search(s, m, std::regex("cd((e)fg)hi")));
67 
68         char out[100] = {0};
69         const char fmt[] = "prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";
70         auto r = m.format(cpp17_output_iterator<char*>(out),
71                     fmt, fmt + std::char_traits<char>::length(fmt),
72                     std::regex_constants::format_sed);
73         assert(base(r) == out + 59);
74         assert(std::string(out) == "prefix: $`, match: $cdefghi, suffix: $', m[1]: $1, m[2]: $2");
75     }
76     {
77         std::match_results<const char*> m;
78         const char s[] = "abcdefghijk";
79         assert(std::regex_search(s, m, std::regex("cd((e)fg)hi")));
80 
81         char out[100] = {0};
82         const char fmt[] = "match: &, m[1]: \\1, m[2]: \\2";
83         auto r = m.format(cpp17_output_iterator<char*>(out),
84                     fmt, fmt + std::char_traits<char>::length(fmt),
85                     std::regex_constants::format_sed);
86         assert(base(r) == out + 34);
87         assert(std::string(out) == "match: cdefghi, m[1]: efg, m[2]: e");
88     }
89     {
90         std::match_results<const char*> m;
91         const char s[] = "abcdefghijk";
92         assert(std::regex_search(s, m, std::regex("cd((e)fg)hi",
93                                                   std::regex_constants::nosubs)));
94 
95         char out[100] = {0};
96         const char fmt[] = "match: &, m[1]: \\1, m[2]: \\2";
97         auto r = m.format(cpp17_output_iterator<char*>(out),
98                     fmt, fmt + std::char_traits<char>::length(fmt),
99                     std::regex_constants::format_sed);
100         assert(base(r) == out + 30);
101         assert(std::string(out) == "match: cdefghi, m[1]: , m[2]: ");
102     }
103     {
104         std::match_results<const char*> m;
105         const char s[] = "abcdefghijk";
106         assert(std::regex_search(s, m, std::regex("cdefghi")));
107 
108         char out[100] = {0};
109         const char fmt[] = "match: &, m[1]: \\1, m[2]: \\2";
110         auto r = m.format(cpp17_output_iterator<char*>(out),
111                     fmt, fmt + std::char_traits<char>::length(fmt),
112                     std::regex_constants::format_sed);
113         assert(base(r) == out + 30);
114         assert(std::string(out) == "match: cdefghi, m[1]: , m[2]: ");
115     }
116 
117 #ifndef TEST_HAS_NO_WIDE_CHARACTERS
118     {
119         std::match_results<const wchar_t*> m;
120         const wchar_t s[] = L"abcdefghijk";
121         assert(std::regex_search(s, m, std::wregex(L"cd((e)fg)hi")));
122 
123         wchar_t out[100] = {0};
124         const wchar_t fmt[] = L"prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";
125         auto r = m.format(cpp17_output_iterator<wchar_t*>(out),
126                     fmt, fmt + std::char_traits<wchar_t>::length(fmt));
127         assert(base(r) == out + 58);
128         assert(std::wstring(out) == L"prefix: ab, match: cdefghi, suffix: jk, m[1]: efg, m[2]: e");
129     }
130     {
131         std::match_results<const wchar_t*> m;
132         const wchar_t s[] = L"abcdefghijk";
133         assert(std::regex_search(s, m, std::wregex(L"cd((e)fg)hi")));
134 
135         wchar_t out[100] = {0};
136         const wchar_t fmt[] = L"prefix: $`, match: $&, suffix: $', m[1]: $1, m[2]: $2";
137         auto r = m.format(cpp17_output_iterator<wchar_t*>(out),
138                     fmt, fmt + std::char_traits<wchar_t>::length(fmt),
139                     std::regex_constants::format_sed);
140         assert(base(r) == out + 59);
141         assert(std::wstring(out) == L"prefix: $`, match: $cdefghi, suffix: $', m[1]: $1, m[2]: $2");
142     }
143     {
144         std::match_results<const wchar_t*> m;
145         const wchar_t s[] = L"abcdefghijk";
146         assert(std::regex_search(s, m, std::wregex(L"cd((e)fg)hi")));
147 
148         wchar_t out[100] = {0};
149         const wchar_t fmt[] = L"match: &, m[1]: \\1, m[2]: \\2";
150         auto r = m.format(cpp17_output_iterator<wchar_t*>(out),
151                     fmt, fmt + std::char_traits<wchar_t>::length(fmt),
152                     std::regex_constants::format_sed);
153         assert(base(r) == out + 34);
154         assert(std::wstring(out) == L"match: cdefghi, m[1]: efg, m[2]: e");
155     }
156 #endif // TEST_HAS_NO_WIDE_CHARACTERS
157 
158   return 0;
159 }
160