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 // <locale>
10 
11 // class num_put<charT, OutputIterator>
12 
13 // iter_type put(iter_type s, ios_base& iob, char_type fill, long v) const;
14 
15 #include <locale>
16 #include <ios>
17 #include <cassert>
18 #include <streambuf>
19 #include "test_macros.h"
20 #include "test_iterators.h"
21 
22 typedef std::num_put<char, output_iterator<char*> > F;
23 
24 class my_facet
25     : public F
26 {
27 public:
my_facet(std::size_t refs=0)28     explicit my_facet(std::size_t refs = 0)
29         : F(refs) {}
30 };
31 
32 class my_numpunct
33     : public std::numpunct<char>
34 {
35 public:
my_numpunct()36     my_numpunct() : std::numpunct<char>() {}
37 
38 protected:
do_thousands_sep() const39     virtual char_type do_thousands_sep() const {return '_';}
do_grouping() const40     virtual std::string do_grouping() const {return std::string("\1\2\3");}
41 };
42 
main(int,char **)43 int main(int, char**)
44 {
45     const my_facet f(1);
46     {
47         std::ios ios(0);
48         long v = 0;
49         char str[50];
50         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
51         std::string ex(str, iter.base());
52         assert(ex == "0");
53     }
54     {
55         std::ios ios(0);
56         long v = 1;
57         char str[50];
58         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
59         std::string ex(str, iter.base());
60         assert(ex == "1");
61     }
62     {
63         std::ios ios(0);
64         long v = -1;
65         char str[50];
66         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
67         std::string ex(str, iter.base());
68         assert(ex == "-1");
69     }
70     {
71         std::ios ios(0);
72         long v = -1000;
73         char str[50];
74         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
75         std::string ex(str, iter.base());
76         assert(ex == "-1000");
77     }
78     {
79         std::ios ios(0);
80         long v = 1000;
81         char str[50];
82         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
83         std::string ex(str, iter.base());
84         assert(ex == "1000");
85     }
86     {
87         std::ios ios(0);
88         showpos(ios);
89         long v = 1000;
90         char str[50];
91         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
92         std::string ex(str, iter.base());
93         assert(ex == "+1000");
94     }
95     {
96         std::ios ios(0);
97         oct(ios);
98         long v = 1000;
99         char str[50];
100         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
101         std::string ex(str, iter.base());
102         assert(ex == "1750");
103     }
104     {
105         std::ios ios(0);
106         oct(ios);
107         showbase(ios);
108         long v = 1000;
109         char str[50];
110         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
111         std::string ex(str, iter.base());
112         assert(ex == "01750");
113     }
114     {
115         std::ios ios(0);
116         hex(ios);
117         long v = 1000;
118         char str[50];
119         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
120         std::string ex(str, iter.base());
121         assert(ex == "3e8");
122     }
123     {
124         std::ios ios(0);
125         hex(ios);
126         showbase(ios);
127         long v = 1000;
128         char str[50];
129         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
130         std::string ex(str, iter.base());
131         assert(ex == "0x3e8");
132     }
133     {
134         std::ios ios(0);
135         hex(ios);
136         showbase(ios);
137         uppercase(ios);
138         long v = 1000;
139         char str[50];
140         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
141         std::string ex(str, iter.base());
142         assert(ex == "0X3E8");
143     }
144     {
145         std::ios ios(0);
146         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
147         hex(ios);
148         showbase(ios);
149         uppercase(ios);
150         long v = 1000;
151         char str[50];
152         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
153         std::string ex(str, iter.base());
154         assert(ex == "0X3E_8");
155     }
156     {
157         std::ios ios(0);
158         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
159         hex(ios);
160         showbase(ios);
161         long v = 2147483647;
162         char str[50];
163         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
164         std::string ex(str, iter.base());
165         assert(ex == "0x7f_fff_ff_f");
166     }
167     {
168         std::ios ios(0);
169         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
170         oct(ios);
171         long v = 0123467;
172         char str[50];
173         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
174         std::string ex(str, iter.base());
175         assert(ex == "123_46_7");
176     }
177     {
178         std::ios ios(0);
179         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
180         oct(ios);
181         showbase(ios);
182         long v = 0123467;
183         char str[50];
184         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
185         std::string ex(str, iter.base());
186         assert(ex == "0_123_46_7");
187     }
188     {
189         std::ios ios(0);
190         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
191         oct(ios);
192         showbase(ios);
193         right(ios);
194         ios.width(15);
195         long v = 0123467;
196         char str[50];
197         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
198         std::string ex(str, iter.base());
199         assert(ex == "*****0_123_46_7");
200     }
201     {
202         std::ios ios(0);
203         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
204         oct(ios);
205         showbase(ios);
206         left(ios);
207         ios.width(15);
208         long v = 0123467;
209         char str[50];
210         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
211         std::string ex(str, iter.base());
212         assert(ex == "0_123_46_7*****");
213     }
214     {
215         std::ios ios(0);
216         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
217         oct(ios);
218         showbase(ios);
219         internal(ios);
220         ios.width(15);
221         long v = 0123467;
222         char str[50];
223         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
224         std::string ex(str, iter.base());
225         assert(ex == "*****0_123_46_7");
226         assert(ios.width() == 0);
227     }
228     {
229         std::ios ios(0);
230         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
231         hex(ios);
232         showbase(ios);
233         right(ios);
234         ios.width(15);
235         long v = 2147483647;
236         char str[50];
237         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
238         std::string ex(str, iter.base());
239         assert(ex == "**0x7f_fff_ff_f");
240     }
241     {
242         std::ios ios(0);
243         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
244         hex(ios);
245         showbase(ios);
246         left(ios);
247         ios.width(15);
248         long v = 2147483647;
249         char str[50];
250         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
251         std::string ex(str, iter.base());
252         assert(ex == "0x7f_fff_ff_f**");
253     }
254     {
255         std::ios ios(0);
256         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
257         hex(ios);
258         showbase(ios);
259         internal(ios);
260         ios.width(15);
261         long v = 2147483647;
262         char str[50];
263         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
264         std::string ex(str, iter.base());
265         assert(ex == "0x**7f_fff_ff_f");
266         assert(ios.width() == 0);
267     }
268     {
269         std::ios ios(0);
270         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
271         showpos(ios);
272         long v = 1000;
273         right(ios);
274         ios.width(10);
275         char str[50];
276         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
277         std::string ex(str, iter.base());
278         assert(ex == "***+1_00_0");
279         assert(ios.width() == 0);
280     }
281     {
282         std::ios ios(0);
283         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
284         showpos(ios);
285         long v = 1000;
286         left(ios);
287         ios.width(10);
288         char str[50];
289         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
290         std::string ex(str, iter.base());
291         assert(ex == "+1_00_0***");
292         assert(ios.width() == 0);
293     }
294     {
295         std::ios ios(0);
296         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
297         showpos(ios);
298         long v = 1000;
299         internal(ios);
300         ios.width(10);
301         char str[50];
302         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
303         std::string ex(str, iter.base());
304         assert(ex == "+***1_00_0");
305         assert(ios.width() == 0);
306     }
307     {
308         std::ios ios(0);
309         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
310         long v = -1000;
311         right(ios);
312         showpos(ios);
313         ios.width(10);
314         char str[50];
315         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
316         std::string ex(str, iter.base());
317         assert(ex == "***-1_00_0");
318         assert(ios.width() == 0);
319     }
320     {
321         std::ios ios(0);
322         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
323         long v = -1000;
324         left(ios);
325         ios.width(10);
326         char str[50];
327         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
328         std::string ex(str, iter.base());
329         assert(ex == "-1_00_0***");
330         assert(ios.width() == 0);
331     }
332     {
333         std::ios ios(0);
334         ios.imbue(std::locale(std::locale::classic(), new my_numpunct));
335         long v = -1000;
336         internal(ios);
337         ios.width(10);
338         char str[50];
339         output_iterator<char*> iter = f.put(output_iterator<char*>(str), ios, '*', v);
340         std::string ex(str, iter.base());
341         assert(ex == "-***1_00_0");
342         assert(ios.width() == 0);
343     }
344 
345   return 0;
346 }
347