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: 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: 37 my_numpunct() : std::numpunct<char>() {} 38 39 protected: 40 virtual char_type do_thousands_sep() const {return '_';} 41 virtual std::string do_grouping() const {return std::string("\1\2\3");} 42 }; 43 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