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