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