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_get<charT, InputIterator>
13 
14 // iter_type get(iter_type in, iter_type end, ios_base&,
15 //               ios_base::iostate& err, long& v) const;
16 
17 #include <locale>
18 #include <ios>
19 #include <cassert>
20 #include <streambuf>
21 #include "test_iterators.h"
22 
23 typedef std::num_get<char, input_iterator<const char*> > F;
24 
25 class my_facet
26     : public F
27 {
28 public:
my_facet(std::size_t refs=0)29     explicit my_facet(std::size_t refs = 0)
30         : F(refs) {}
31 };
32 
33 class my_numpunct
34     : public std::numpunct<char>
35 {
36 public:
my_numpunct()37     my_numpunct() : std::numpunct<char>() {}
38 
39 protected:
do_thousands_sep() const40     virtual char_type do_thousands_sep() const {return '_';}
do_grouping() const41     virtual std::string do_grouping() const {return std::string("\1\2\3");}
42 };
43 
main()44 int main()
45 {
46     const my_facet f(1);
47     std::ios ios(0);
48     long v = -1;
49     {
50         const char str[] = "123";
51         assert((ios.flags() & ios.basefield) == ios.dec);
52         assert(ios.getloc().name() == "C");
53         std::ios_base::iostate err = ios.goodbit;
54         input_iterator<const char*> iter =
55             f.get(input_iterator<const char*>(str),
56                   input_iterator<const char*>(str+sizeof(str)),
57                   ios, err, v);
58         assert(iter.base() == str+3);
59         assert(err == ios.goodbit);
60         assert(v == 123);
61     }
62     {
63         const char str[] = "-123";
64         assert((ios.flags() & ios.basefield) == ios.dec);
65         assert(ios.getloc().name() == "C");
66         std::ios_base::iostate err = ios.goodbit;
67         input_iterator<const char*> iter =
68             f.get(input_iterator<const char*>(str),
69                   input_iterator<const char*>(str+sizeof(str)),
70                   ios, err, v);
71         assert(iter.base() == str+4);
72         assert(err == ios.goodbit);
73         assert(v == -123);
74     }
75     {
76         const char str[] = "123";
77         oct(ios);
78         std::ios_base::iostate err = ios.goodbit;
79         input_iterator<const char*> iter =
80             f.get(input_iterator<const char*>(str),
81                   input_iterator<const char*>(str+sizeof(str)),
82                   ios, err, v);
83         assert(iter.base() == str+3);
84         assert(err == ios.goodbit);
85         assert(v == 83);
86     }
87     {
88         const char str[] = "123";
89         hex(ios);
90         std::ios_base::iostate err = ios.goodbit;
91         input_iterator<const char*> iter =
92             f.get(input_iterator<const char*>(str),
93                   input_iterator<const char*>(str+sizeof(str)),
94                   ios, err, v);
95         assert(iter.base() == str+3);
96         assert(err == ios.goodbit);
97         assert(v == 291);
98     }
99     {
100         const char str[] = "0x123";
101         hex(ios);
102         std::ios_base::iostate err = ios.goodbit;
103         input_iterator<const char*> iter =
104             f.get(input_iterator<const char*>(str),
105                   input_iterator<const char*>(str+sizeof(str)),
106                   ios, err, v);
107         assert(iter.base() == str+sizeof(str)-1);
108         assert(err == ios.goodbit);
109         assert(v == 291);
110     }
111     {
112         const char str[] = "123";
113         ios.setf(0, ios.basefield);
114         std::ios_base::iostate err = ios.goodbit;
115         input_iterator<const char*> iter =
116             f.get(input_iterator<const char*>(str),
117                   input_iterator<const char*>(str+sizeof(str)),
118                   ios, err, v);
119         assert(iter.base() == str+sizeof(str)-1);
120         assert(err == ios.goodbit);
121         assert(v == 123);
122     }
123     {
124         const char str[] = "0x123";
125         ios.setf(0, ios.basefield);
126         std::ios_base::iostate err = ios.goodbit;
127         input_iterator<const char*> iter =
128             f.get(input_iterator<const char*>(str),
129                   input_iterator<const char*>(str+sizeof(str)),
130                   ios, err, v);
131         assert(iter.base() == str+sizeof(str)-1);
132         assert(err == ios.goodbit);
133         assert(v == 291);
134     }
135     {
136         const char str[] = "0123";
137         ios.setf(0, ios.basefield);
138         std::ios_base::iostate err = ios.goodbit;
139         input_iterator<const char*> iter =
140             f.get(input_iterator<const char*>(str),
141                   input_iterator<const char*>(str+sizeof(str)),
142                   ios, err, v);
143         assert(iter.base() == str+sizeof(str)-1);
144         assert(err == ios.goodbit);
145         assert(v == 83);
146     }
147     {
148         const char str[] = "2-";
149         ios.setf(0, ios.basefield);
150         std::ios_base::iostate err = ios.goodbit;
151         input_iterator<const char*> iter =
152             f.get(input_iterator<const char*>(str),
153                   input_iterator<const char*>(str+sizeof(str)),
154                   ios, err, v);
155         assert(iter.base() == str+1);
156         assert(err == ios.goodbit);
157         assert(v == 2);
158     }
159     dec(ios);
160     ios.imbue(std::locale(std::locale(), new my_numpunct));
161     {
162         v = -1;
163         const char str[] = "123";
164         std::ios_base::iostate err = ios.goodbit;
165         input_iterator<const char*> iter =
166             f.get(input_iterator<const char*>(str),
167                   input_iterator<const char*>(str+sizeof(str)),
168                   ios, err, v);
169         assert(iter.base() == str+sizeof(str)-1);
170         assert(err == ios.failbit);
171         assert(v == 123);
172     }
173     {
174         v = -1;
175         const char str[] = "+1";
176         std::ios_base::iostate err = ios.goodbit;
177         input_iterator<const char*> iter =
178             f.get(input_iterator<const char*>(str),
179                   input_iterator<const char*>(str+sizeof(str)),
180                   ios, err, v);
181         assert(iter.base() == str+sizeof(str)-1);
182         assert(err == ios.goodbit);
183         assert(v == 1);
184     }
185     {
186         v = -1;
187         const char str[] = "+1_";
188         std::ios_base::iostate err = ios.goodbit;
189         input_iterator<const char*> iter =
190             f.get(input_iterator<const char*>(str),
191                   input_iterator<const char*>(str+sizeof(str)),
192                   ios, err, v);
193         assert(iter.base() == str+sizeof(str)-1);
194         assert(err == ios.failbit);
195         assert(v == 1);
196     }
197     {
198         v = -1;
199         const char str[] = "+_1";
200         std::ios_base::iostate err = ios.goodbit;
201         input_iterator<const char*> iter =
202             f.get(input_iterator<const char*>(str),
203                   input_iterator<const char*>(str+sizeof(str)),
204                   ios, err, v);
205         assert(iter.base() == str+sizeof(str)-1);
206         assert(err == ios.failbit);
207         assert(v == 1);
208     }
209     {
210         v = -1;
211         const char str[] = "_+1";
212         std::ios_base::iostate err = ios.goodbit;
213         input_iterator<const char*> iter =
214             f.get(input_iterator<const char*>(str),
215                   input_iterator<const char*>(str+sizeof(str)),
216                   ios, err, v);
217         assert(iter.base() == str+sizeof(str)-1);
218         assert(err == ios.failbit);
219         assert(v == 1);
220     }
221     {
222         v = -1;
223         const char str[] = "+1__";
224         std::ios_base::iostate err = ios.goodbit;
225         input_iterator<const char*> iter =
226             f.get(input_iterator<const char*>(str),
227                   input_iterator<const char*>(str+sizeof(str)),
228                   ios, err, v);
229         assert(iter.base() == str+sizeof(str)-1);
230         assert(err == ios.failbit);
231         assert(v == 1);
232     }
233     {
234         v = -1;
235         const char str[] = "+_1_";
236         std::ios_base::iostate err = ios.goodbit;
237         input_iterator<const char*> iter =
238             f.get(input_iterator<const char*>(str),
239                   input_iterator<const char*>(str+sizeof(str)),
240                   ios, err, v);
241         assert(iter.base() == str+sizeof(str)-1);
242         assert(err == ios.failbit);
243         assert(v == 1);
244     }
245     {
246         v = -1;
247         const char str[] = "_+1_";
248         std::ios_base::iostate err = ios.goodbit;
249         input_iterator<const char*> iter =
250             f.get(input_iterator<const char*>(str),
251                   input_iterator<const char*>(str+sizeof(str)),
252                   ios, err, v);
253         assert(iter.base() == str+sizeof(str)-1);
254         assert(err == ios.failbit);
255         assert(v == 1);
256     }
257     {
258         v = -1;
259         const char str[] = "+__1";
260         std::ios_base::iostate err = ios.goodbit;
261         input_iterator<const char*> iter =
262             f.get(input_iterator<const char*>(str),
263                   input_iterator<const char*>(str+sizeof(str)),
264                   ios, err, v);
265         assert(iter.base() == str+sizeof(str)-1);
266         assert(err == ios.failbit);
267         assert(v == 1);
268     }
269     {
270         v = -1;
271         const char str[] = "_+_1";
272         std::ios_base::iostate err = ios.goodbit;
273         input_iterator<const char*> iter =
274             f.get(input_iterator<const char*>(str),
275                   input_iterator<const char*>(str+sizeof(str)),
276                   ios, err, v);
277         assert(iter.base() == str+sizeof(str)-1);
278         assert(err == ios.failbit);
279         assert(v == 1);
280     }
281     {
282         v = -1;
283         const char str[] = "__+1";
284         std::ios_base::iostate err = ios.goodbit;
285         input_iterator<const char*> iter =
286             f.get(input_iterator<const char*>(str),
287                   input_iterator<const char*>(str+sizeof(str)),
288                   ios, err, v);
289         assert(iter.base() == str+sizeof(str)-1);
290         assert(err == ios.failbit);
291         assert(v == 1);
292     }
293     {
294         v = -1;
295         const char str[] = "+1_2";
296         std::ios_base::iostate err = ios.goodbit;
297         input_iterator<const char*> iter =
298             f.get(input_iterator<const char*>(str),
299                   input_iterator<const char*>(str+sizeof(str)),
300                   ios, err, v);
301         assert(iter.base() == str+sizeof(str)-1);
302         assert(err == ios.goodbit);
303         assert(v == 12);
304     }
305     {
306         v = -1;
307         const char str[] = "+12_";
308         std::ios_base::iostate err = ios.goodbit;
309         input_iterator<const char*> iter =
310             f.get(input_iterator<const char*>(str),
311                   input_iterator<const char*>(str+sizeof(str)),
312                   ios, err, v);
313         assert(iter.base() == str+sizeof(str)-1);
314         assert(err == ios.failbit);
315         assert(v == 12);
316     }
317     {
318         v = -1;
319         const char str[] = "+_12";
320         std::ios_base::iostate err = ios.goodbit;
321         input_iterator<const char*> iter =
322             f.get(input_iterator<const char*>(str),
323                   input_iterator<const char*>(str+sizeof(str)),
324                   ios, err, v);
325         assert(iter.base() == str+sizeof(str)-1);
326         assert(err == ios.failbit);
327         assert(v == 12);
328     }
329     {
330         v = -1;
331         const char str[] = "+1__2";
332         std::ios_base::iostate err = ios.goodbit;
333         input_iterator<const char*> iter =
334             f.get(input_iterator<const char*>(str),
335                   input_iterator<const char*>(str+sizeof(str)),
336                   ios, err, v);
337         assert(iter.base() == str+sizeof(str)-1);
338         assert(err == ios.failbit);
339         assert(v == 12);
340     }
341     {
342         v = -1;
343         const char str[] = "+12_3";
344         std::ios_base::iostate err = ios.goodbit;
345         input_iterator<const char*> iter =
346             f.get(input_iterator<const char*>(str),
347                   input_iterator<const char*>(str+sizeof(str)),
348                   ios, err, v);
349         assert(iter.base() == str+sizeof(str)-1);
350         assert(err == ios.goodbit);
351         assert(v == 123);
352     }
353     {
354         v = -1;
355         const char str[] = "+1_23";
356         std::ios_base::iostate err = ios.goodbit;
357         input_iterator<const char*> iter =
358             f.get(input_iterator<const char*>(str),
359                   input_iterator<const char*>(str+sizeof(str)),
360                   ios, err, v);
361         assert(iter.base() == str+sizeof(str)-1);
362         assert(err == ios.failbit);
363         assert(v == 123);
364     }
365     {
366         v = -1;
367         const char str[] = "+1_23_4";
368         std::ios_base::iostate err = ios.goodbit;
369         input_iterator<const char*> iter =
370             f.get(input_iterator<const char*>(str),
371                   input_iterator<const char*>(str+sizeof(str)),
372                   ios, err, v);
373         assert(iter.base() == str+sizeof(str)-1);
374         assert(err == ios.goodbit);
375         assert(v == 1234);
376     }
377     {
378         v = -1;
379         const char str[] = "+123_4";
380         std::ios_base::iostate err = ios.goodbit;
381         input_iterator<const char*> iter =
382             f.get(input_iterator<const char*>(str),
383                   input_iterator<const char*>(str+sizeof(str)),
384                   ios, err, v);
385         assert(iter.base() == str+sizeof(str)-1);
386         assert(err == ios.failbit);
387         assert(v == 1234);
388     }
389     {
390         v = -1;
391         const char str[] = "+12_34";
392         std::ios_base::iostate err = ios.goodbit;
393         input_iterator<const char*> iter =
394             f.get(input_iterator<const char*>(str),
395                   input_iterator<const char*>(str+sizeof(str)),
396                   ios, err, v);
397         assert(iter.base() == str+sizeof(str)-1);
398         assert(err == ios.failbit);
399         assert(v == 1234);
400     }
401     {
402         v = -1;
403         const char str[] = "+12_34_5";
404         std::ios_base::iostate err = ios.goodbit;
405         input_iterator<const char*> iter =
406             f.get(input_iterator<const char*>(str),
407                   input_iterator<const char*>(str+sizeof(str)),
408                   ios, err, v);
409         assert(iter.base() == str+sizeof(str)-1);
410         assert(err == ios.goodbit);
411         assert(v == 12345);
412     }
413     {
414         v = -1;
415         const char str[] = "+123_45_6";
416         std::ios_base::iostate err = ios.goodbit;
417         input_iterator<const char*> iter =
418             f.get(input_iterator<const char*>(str),
419                   input_iterator<const char*>(str+sizeof(str)),
420                   ios, err, v);
421         assert(iter.base() == str+sizeof(str)-1);
422         assert(err == ios.goodbit);
423         assert(v == 123456);
424     }
425     {
426         v = -1;
427         const char str[] = "+1_23_45_6";
428         std::ios_base::iostate err = ios.goodbit;
429         input_iterator<const char*> iter =
430             f.get(input_iterator<const char*>(str),
431                   input_iterator<const char*>(str+sizeof(str)),
432                   ios, err, v);
433         assert(iter.base() == str+sizeof(str)-1);
434         assert(err == ios.failbit);
435         assert(v == 123456);
436     }
437     {
438         v = -1;
439         const char str[] = "+1_234_56_7";
440         std::ios_base::iostate err = ios.goodbit;
441         input_iterator<const char*> iter =
442             f.get(input_iterator<const char*>(str),
443                   input_iterator<const char*>(str+sizeof(str)),
444                   ios, err, v);
445         assert(iter.base() == str+sizeof(str)-1);
446         assert(err == ios.goodbit);
447         assert(v == 1234567);
448     }
449     {
450         v = -1;
451         const char str[] = "+1_234_567_89_0";
452         std::ios_base::iostate err = ios.goodbit;
453         input_iterator<const char*> iter =
454             f.get(input_iterator<const char*>(str),
455                   input_iterator<const char*>(str+sizeof(str)),
456                   ios, err, v);
457         assert(iter.base() == str+sizeof(str)-1);
458         assert(err == ios.goodbit);
459         assert(v == 1234567890);
460     }
461     {
462         v = -1;
463         const char str[] = "-1_234_567_89_0";
464         std::ios_base::iostate err = ios.goodbit;
465         input_iterator<const char*> iter =
466             f.get(input_iterator<const char*>(str),
467                   input_iterator<const char*>(str+sizeof(str)),
468                   ios, err, v);
469         assert(iter.base() == str+sizeof(str)-1);
470         assert(err == ios.goodbit);
471         assert(v == -1234567890);
472     }
473     {
474         v = -1;
475         const char str[] = "1_234_567_89_0";
476         std::ios_base::iostate err = ios.goodbit;
477         input_iterator<const char*> iter =
478             f.get(input_iterator<const char*>(str),
479                   input_iterator<const char*>(str+sizeof(str)),
480                   ios, err, v);
481         assert(iter.base() == str+sizeof(str)-1);
482         assert(err == ios.goodbit);
483         assert(v == 1234567890);
484     }
485     {
486         v = -1;
487         const char str[] = "1234_567_89_0";
488         std::ios_base::iostate err = ios.goodbit;
489         input_iterator<const char*> iter =
490             f.get(input_iterator<const char*>(str),
491                   input_iterator<const char*>(str+sizeof(str)),
492                   ios, err, v);
493         assert(iter.base() == str+sizeof(str)-1);
494         assert(err == ios.failbit);
495         assert(v == 1234567890);
496     }
497     {
498         v = -1;
499         const char str[] = "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
500                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
501                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
502                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
503                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
504                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
505                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
506                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
507                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
508                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_"
509                            "1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_1_2_3_4_5_6_7_8_9_0_";
510         std::ios_base::iostate err = ios.goodbit;
511         input_iterator<const char*> iter =
512             f.get(input_iterator<const char*>(str),
513                   input_iterator<const char*>(str+sizeof(str)),
514                   ios, err, v);
515         assert(iter.base() == str+sizeof(str)-1);
516         assert(err == ios.failbit);
517         assert(v == std::numeric_limits<long>::max());
518     }
519 }
520