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 money_get<charT, InputIterator> 13 14 // iter_type get(iter_type b, iter_type e, bool intl, ios_base& iob, 15 // ios_base::iostate& err, long double& v) const; 16 17 #include <locale> 18 #include <ios> 19 #include <streambuf> 20 #include <cassert> 21 #include "test_iterators.h" 22 23 #include "platform_support.h" // locale name macros 24 25 typedef std::money_get<char, input_iterator<const char*> > Fn; 26 27 class my_facet 28 : public Fn 29 { 30 public: 31 explicit my_facet(std::size_t refs = 0) 32 : Fn(refs) {} 33 }; 34 35 typedef std::money_get<wchar_t, input_iterator<const wchar_t*> > Fw; 36 37 class my_facetw 38 : public Fw 39 { 40 public: 41 explicit my_facetw(std::size_t refs = 0) 42 : Fw(refs) {} 43 }; 44 45 int main() 46 { 47 std::ios ios(0); 48 std::string loc_name(LOCALE_zh_CN_UTF_8); 49 ios.imbue(std::locale(ios.getloc(), 50 new std::moneypunct_byname<char, false>(loc_name))); 51 ios.imbue(std::locale(ios.getloc(), 52 new std::moneypunct_byname<char, true>(loc_name))); 53 ios.imbue(std::locale(ios.getloc(), 54 new std::moneypunct_byname<wchar_t, false>(loc_name))); 55 ios.imbue(std::locale(ios.getloc(), 56 new std::moneypunct_byname<wchar_t, true>(loc_name))); 57 { 58 const my_facet f(1); 59 // char, national 60 { // zero 61 std::string v = "0.00"; 62 typedef input_iterator<const char*> I; 63 long double ex; 64 std::ios_base::iostate err = std::ios_base::goodbit; 65 I iter = f.get(I(v.data()), I(v.data() + v.size()), 66 false, ios, err, ex); 67 assert(iter.base() == v.data() + v.size()); 68 assert(err == std::ios_base::eofbit); 69 assert(ex == 0); 70 } 71 { // negative one 72 std::string v = "-0.01"; 73 typedef input_iterator<const char*> I; 74 long double ex; 75 std::ios_base::iostate err = std::ios_base::goodbit; 76 I iter = f.get(I(v.data()), I(v.data() + v.size()), 77 false, ios, err, ex); 78 assert(iter.base() == v.data() + v.size()); 79 assert(err == std::ios_base::eofbit); 80 assert(ex == -1); 81 } 82 { // positive 83 std::string v = "1,234,567.89"; 84 typedef input_iterator<const char*> I; 85 long double ex; 86 std::ios_base::iostate err = std::ios_base::goodbit; 87 I iter = f.get(I(v.data()), I(v.data() + v.size()), 88 false, ios, err, ex); 89 assert(iter.base() == v.data() + v.size()); 90 assert(err == std::ios_base::eofbit); 91 assert(ex == 123456789); 92 } 93 { // negative 94 std::string v = "-1,234,567.89"; 95 typedef input_iterator<const char*> I; 96 long double ex; 97 std::ios_base::iostate err = std::ios_base::goodbit; 98 I iter = f.get(I(v.data()), I(v.data() + v.size()), 99 false, ios, err, ex); 100 assert(iter.base() == v.data() + v.size()); 101 assert(err == std::ios_base::eofbit); 102 assert(ex == -123456789); 103 } 104 { // negative 105 std::string v = "-1234567.89"; 106 typedef input_iterator<const char*> I; 107 long double ex; 108 std::ios_base::iostate err = std::ios_base::goodbit; 109 I iter = f.get(I(v.data()), I(v.data() + v.size()), 110 false, ios, err, ex); 111 assert(iter.base() == v.data() + v.size()); 112 assert(err == std::ios_base::eofbit); 113 assert(ex == -123456789); 114 } 115 { // zero, showbase 116 std::string v = "\xEF\xBF\xA5""0.00"; 117 typedef input_iterator<const char*> I; 118 long double ex; 119 std::ios_base::iostate err = std::ios_base::goodbit; 120 I iter = f.get(I(v.data()), I(v.data() + v.size()), 121 false, ios, err, ex); 122 assert(iter.base() == v.data() + v.size()); 123 assert(err == std::ios_base::eofbit); 124 assert(ex == 0); 125 } 126 { // zero, showbase 127 std::string v = "\xEF\xBF\xA5""0.00"; 128 showbase(ios); 129 typedef input_iterator<const char*> I; 130 long double ex; 131 std::ios_base::iostate err = std::ios_base::goodbit; 132 I iter = f.get(I(v.data()), I(v.data() + v.size()), 133 false, ios, err, ex); 134 assert(iter.base() == v.data() + v.size()); 135 assert(err == std::ios_base::eofbit); 136 assert(ex == 0); 137 noshowbase(ios); 138 } 139 { // negative one, showbase 140 std::string v = "\xEF\xBF\xA5""-0.01"; 141 typedef input_iterator<const char*> I; 142 long double ex; 143 std::ios_base::iostate err = std::ios_base::goodbit; 144 I iter = f.get(I(v.data()), I(v.data() + v.size()), 145 false, ios, err, ex); 146 assert(iter.base() == v.data() + v.size()); 147 assert(err == std::ios_base::eofbit); 148 assert(ex == -1); 149 } 150 { // negative one, showbase 151 std::string v = "\xEF\xBF\xA5""-0.01"; 152 showbase(ios); 153 typedef input_iterator<const char*> I; 154 long double ex; 155 std::ios_base::iostate err = std::ios_base::goodbit; 156 I iter = f.get(I(v.data()), I(v.data() + v.size()), 157 false, ios, err, ex); 158 assert(iter.base() == v.data() + v.size()); 159 assert(err == std::ios_base::eofbit); 160 assert(ex == -1); 161 noshowbase(ios); 162 } 163 { // positive, showbase 164 std::string v = "\xEF\xBF\xA5""1,234,567.89"; 165 typedef input_iterator<const char*> I; 166 long double ex; 167 std::ios_base::iostate err = std::ios_base::goodbit; 168 I iter = f.get(I(v.data()), I(v.data() + v.size()), 169 false, ios, err, ex); 170 assert(iter.base() == v.data() + v.size()); 171 assert(err == std::ios_base::eofbit); 172 assert(ex == 123456789); 173 } 174 { // positive, showbase 175 std::string v = "\xEF\xBF\xA5""1,234,567.89"; 176 showbase(ios); 177 typedef input_iterator<const char*> I; 178 long double ex; 179 std::ios_base::iostate err = std::ios_base::goodbit; 180 I iter = f.get(I(v.data()), I(v.data() + v.size()), 181 false, ios, err, ex); 182 assert(iter.base() == v.data() + v.size()); 183 assert(err == std::ios_base::eofbit); 184 assert(ex == 123456789); 185 noshowbase(ios); 186 } 187 { // negative, showbase 188 std::string v = "\xEF\xBF\xA5""-1,234,567.89"; 189 showbase(ios); 190 typedef input_iterator<const char*> I; 191 long double ex; 192 std::ios_base::iostate err = std::ios_base::goodbit; 193 I iter = f.get(I(v.data()), I(v.data() + v.size()), 194 false, ios, err, ex); 195 assert(iter.base() == v.data() + v.size()); 196 assert(err == std::ios_base::eofbit); 197 assert(ex == -123456789); 198 noshowbase(ios); 199 } 200 { // negative, showbase 201 std::string v = "CNY -1,234,567.89"; 202 showbase(ios); 203 typedef input_iterator<const char*> I; 204 long double ex; 205 std::ios_base::iostate err = std::ios_base::goodbit; 206 I iter = f.get(I(v.data()), I(v.data() + v.size()), 207 false, ios, err, ex); 208 assert(iter.base() == v.data() + 0); 209 assert(err == std::ios_base::failbit); 210 noshowbase(ios); 211 } 212 { // negative, showbase 213 std::string v = "CNY -1,234,567.89"; 214 typedef input_iterator<const char*> I; 215 long double ex; 216 std::ios_base::iostate err = std::ios_base::goodbit; 217 I iter = f.get(I(v.data()), I(v.data() + v.size()), 218 false, ios, err, ex); 219 assert(iter.base() == v.data() + 0); 220 assert(err == std::ios_base::failbit); 221 } 222 } 223 { 224 const my_facet f(1); 225 // char, international 226 { // zero 227 std::string v = "0.00"; 228 typedef input_iterator<const char*> I; 229 long double ex; 230 std::ios_base::iostate err = std::ios_base::goodbit; 231 I iter = f.get(I(v.data()), I(v.data() + v.size()), 232 true, ios, err, ex); 233 assert(iter.base() == v.data() + v.size()); 234 assert(err == std::ios_base::eofbit); 235 assert(ex == 0); 236 } 237 { // negative one 238 std::string v = "-0.01"; 239 typedef input_iterator<const char*> I; 240 long double ex; 241 std::ios_base::iostate err = std::ios_base::goodbit; 242 I iter = f.get(I(v.data()), I(v.data() + v.size()), 243 true, ios, err, ex); 244 assert(iter.base() == v.data() + v.size()); 245 assert(err == std::ios_base::eofbit); 246 assert(ex == -1); 247 } 248 { // positive 249 std::string v = "1,234,567.89"; 250 typedef input_iterator<const char*> I; 251 long double ex; 252 std::ios_base::iostate err = std::ios_base::goodbit; 253 I iter = f.get(I(v.data()), I(v.data() + v.size()), 254 true, ios, err, ex); 255 assert(iter.base() == v.data() + v.size()); 256 assert(err == std::ios_base::eofbit); 257 assert(ex == 123456789); 258 } 259 { // negative 260 std::string v = "-1,234,567.89"; 261 typedef input_iterator<const char*> I; 262 long double ex; 263 std::ios_base::iostate err = std::ios_base::goodbit; 264 I iter = f.get(I(v.data()), I(v.data() + v.size()), 265 true, ios, err, ex); 266 assert(iter.base() == v.data() + v.size()); 267 assert(err == std::ios_base::eofbit); 268 assert(ex == -123456789); 269 } 270 { // negative 271 std::string v = "-1234567.89"; 272 typedef input_iterator<const char*> I; 273 long double ex; 274 std::ios_base::iostate err = std::ios_base::goodbit; 275 I iter = f.get(I(v.data()), I(v.data() + v.size()), 276 true, ios, err, ex); 277 assert(iter.base() == v.data() + v.size()); 278 assert(err == std::ios_base::eofbit); 279 assert(ex == -123456789); 280 } 281 { // zero, showbase 282 std::string v = "CNY 0.00"; 283 typedef input_iterator<const char*> I; 284 long double ex; 285 std::ios_base::iostate err = std::ios_base::goodbit; 286 I iter = f.get(I(v.data()), I(v.data() + v.size()), 287 true, ios, err, ex); 288 assert(iter.base() == v.data() + v.size()); 289 assert(err == std::ios_base::eofbit); 290 assert(ex == 0); 291 } 292 { // zero, showbase 293 std::string v = "CNY 0.00"; 294 showbase(ios); 295 typedef input_iterator<const char*> I; 296 long double ex; 297 std::ios_base::iostate err = std::ios_base::goodbit; 298 I iter = f.get(I(v.data()), I(v.data() + v.size()), 299 true, ios, err, ex); 300 assert(iter.base() == v.data() + v.size()); 301 assert(err == std::ios_base::eofbit); 302 assert(ex == 0); 303 noshowbase(ios); 304 } 305 { // negative one, showbase 306 std::string v = "CNY -0.01"; 307 typedef input_iterator<const char*> I; 308 long double ex; 309 std::ios_base::iostate err = std::ios_base::goodbit; 310 I iter = f.get(I(v.data()), I(v.data() + v.size()), 311 true, ios, err, ex); 312 assert(iter.base() == v.data() + v.size()); 313 assert(err == std::ios_base::eofbit); 314 assert(ex == -1); 315 } 316 { // negative one, showbase 317 std::string v = "CNY -0.01"; 318 showbase(ios); 319 typedef input_iterator<const char*> I; 320 long double ex; 321 std::ios_base::iostate err = std::ios_base::goodbit; 322 I iter = f.get(I(v.data()), I(v.data() + v.size()), 323 true, ios, err, ex); 324 assert(iter.base() == v.data() + v.size()); 325 assert(err == std::ios_base::eofbit); 326 assert(ex == -1); 327 noshowbase(ios); 328 } 329 { // positive, showbase 330 std::string v = "CNY 1,234,567.89"; 331 typedef input_iterator<const char*> I; 332 long double ex; 333 std::ios_base::iostate err = std::ios_base::goodbit; 334 I iter = f.get(I(v.data()), I(v.data() + v.size()), 335 true, ios, err, ex); 336 assert(iter.base() == v.data() + v.size()); 337 assert(err == std::ios_base::eofbit); 338 assert(ex == 123456789); 339 } 340 { // positive, showbase 341 std::string v = "CNY 1,234,567.89"; 342 showbase(ios); 343 typedef input_iterator<const char*> I; 344 long double ex; 345 std::ios_base::iostate err = std::ios_base::goodbit; 346 I iter = f.get(I(v.data()), I(v.data() + v.size()), 347 true, ios, err, ex); 348 assert(iter.base() == v.data() + v.size()); 349 assert(err == std::ios_base::eofbit); 350 assert(ex == 123456789); 351 noshowbase(ios); 352 } 353 { // negative, showbase 354 std::string v = "CNY -1,234,567.89"; 355 showbase(ios); 356 typedef input_iterator<const char*> I; 357 long double ex; 358 std::ios_base::iostate err = std::ios_base::goodbit; 359 I iter = f.get(I(v.data()), I(v.data() + v.size()), 360 true, ios, err, ex); 361 assert(iter.base() == v.data() + v.size()); 362 assert(err == std::ios_base::eofbit); 363 assert(ex == -123456789); 364 noshowbase(ios); 365 } 366 { // negative, showbase 367 std::string v = "\xEF\xBF\xA5""-1,234,567.89"; 368 showbase(ios); 369 typedef input_iterator<const char*> I; 370 long double ex; 371 std::ios_base::iostate err = std::ios_base::goodbit; 372 I iter = f.get(I(v.data()), I(v.data() + v.size()), 373 true, ios, err, ex); 374 assert(iter.base() == v.data() + 0); 375 assert(err == std::ios_base::failbit); 376 noshowbase(ios); 377 } 378 { // negative, showbase 379 std::string v = "\xEF\xBF\xA5""-1,234,567.89"; 380 typedef input_iterator<const char*> I; 381 long double ex; 382 std::ios_base::iostate err = std::ios_base::goodbit; 383 I iter = f.get(I(v.data()), I(v.data() + v.size()), 384 true, ios, err, ex); 385 assert(iter.base() == v.data() + 0); 386 assert(err == std::ios_base::failbit); 387 } 388 } 389 { 390 const my_facetw f(1); 391 // wchar_t, national 392 { // zero 393 std::wstring v = L"0.00"; 394 typedef input_iterator<const wchar_t*> I; 395 long double ex; 396 std::ios_base::iostate err = std::ios_base::goodbit; 397 I iter = f.get(I(v.data()), I(v.data() + v.size()), 398 false, ios, err, ex); 399 assert(iter.base() == v.data() + v.size()); 400 assert(err == std::ios_base::eofbit); 401 assert(ex == 0); 402 } 403 { // negative one 404 std::wstring v = L"-0.01"; 405 typedef input_iterator<const wchar_t*> I; 406 long double ex; 407 std::ios_base::iostate err = std::ios_base::goodbit; 408 I iter = f.get(I(v.data()), I(v.data() + v.size()), 409 false, ios, err, ex); 410 assert(iter.base() == v.data() + v.size()); 411 assert(err == std::ios_base::eofbit); 412 assert(ex == -1); 413 } 414 { // positive 415 std::wstring v = L"1,234,567.89"; 416 typedef input_iterator<const wchar_t*> I; 417 long double ex; 418 std::ios_base::iostate err = std::ios_base::goodbit; 419 I iter = f.get(I(v.data()), I(v.data() + v.size()), 420 false, ios, err, ex); 421 assert(iter.base() == v.data() + v.size()); 422 assert(err == std::ios_base::eofbit); 423 assert(ex == 123456789); 424 } 425 { // negative 426 std::wstring v = L"-1,234,567.89"; 427 typedef input_iterator<const wchar_t*> I; 428 long double ex; 429 std::ios_base::iostate err = std::ios_base::goodbit; 430 I iter = f.get(I(v.data()), I(v.data() + v.size()), 431 false, ios, err, ex); 432 assert(iter.base() == v.data() + v.size()); 433 assert(err == std::ios_base::eofbit); 434 assert(ex == -123456789); 435 } 436 { // negative 437 std::wstring v = L"-1234567.89"; 438 typedef input_iterator<const wchar_t*> I; 439 long double ex; 440 std::ios_base::iostate err = std::ios_base::goodbit; 441 I iter = f.get(I(v.data()), I(v.data() + v.size()), 442 false, ios, err, ex); 443 assert(iter.base() == v.data() + v.size()); 444 assert(err == std::ios_base::eofbit); 445 assert(ex == -123456789); 446 } 447 { // zero, showbase 448 std::wstring v = L"\xFFE5""0.00"; 449 typedef input_iterator<const wchar_t*> I; 450 long double ex; 451 std::ios_base::iostate err = std::ios_base::goodbit; 452 I iter = f.get(I(v.data()), I(v.data() + v.size()), 453 false, ios, err, ex); 454 assert(iter.base() == v.data() + v.size()); 455 assert(err == std::ios_base::eofbit); 456 assert(ex == 0); 457 } 458 { // zero, showbase 459 std::wstring v = L"\xFFE5""0.00"; 460 showbase(ios); 461 typedef input_iterator<const wchar_t*> I; 462 long double ex; 463 std::ios_base::iostate err = std::ios_base::goodbit; 464 I iter = f.get(I(v.data()), I(v.data() + v.size()), 465 false, ios, err, ex); 466 assert(iter.base() == v.data() + v.size()); 467 assert(err == std::ios_base::eofbit); 468 assert(ex == 0); 469 noshowbase(ios); 470 } 471 { // negative one, showbase 472 std::wstring v = L"\xFFE5""-0.01"; 473 typedef input_iterator<const wchar_t*> I; 474 long double ex; 475 std::ios_base::iostate err = std::ios_base::goodbit; 476 I iter = f.get(I(v.data()), I(v.data() + v.size()), 477 false, ios, err, ex); 478 assert(iter.base() == v.data() + v.size()); 479 assert(err == std::ios_base::eofbit); 480 assert(ex == -1); 481 } 482 { // negative one, showbase 483 std::wstring v = L"\xFFE5""-0.01"; 484 showbase(ios); 485 typedef input_iterator<const wchar_t*> I; 486 long double ex; 487 std::ios_base::iostate err = std::ios_base::goodbit; 488 I iter = f.get(I(v.data()), I(v.data() + v.size()), 489 false, ios, err, ex); 490 assert(iter.base() == v.data() + v.size()); 491 assert(err == std::ios_base::eofbit); 492 assert(ex == -1); 493 noshowbase(ios); 494 } 495 { // positive, showbase 496 std::wstring v = L"\xFFE5""1,234,567.89"; 497 typedef input_iterator<const wchar_t*> I; 498 long double ex; 499 std::ios_base::iostate err = std::ios_base::goodbit; 500 I iter = f.get(I(v.data()), I(v.data() + v.size()), 501 false, ios, err, ex); 502 assert(iter.base() == v.data() + v.size()); 503 assert(err == std::ios_base::eofbit); 504 assert(ex == 123456789); 505 } 506 { // positive, showbase 507 std::wstring v = L"\xFFE5""1,234,567.89"; 508 showbase(ios); 509 typedef input_iterator<const wchar_t*> I; 510 long double ex; 511 std::ios_base::iostate err = std::ios_base::goodbit; 512 I iter = f.get(I(v.data()), I(v.data() + v.size()), 513 false, ios, err, ex); 514 assert(iter.base() == v.data() + v.size()); 515 assert(err == std::ios_base::eofbit); 516 assert(ex == 123456789); 517 noshowbase(ios); 518 } 519 { // negative, showbase 520 std::wstring v = L"\xFFE5""-1,234,567.89"; 521 showbase(ios); 522 typedef input_iterator<const wchar_t*> I; 523 long double ex; 524 std::ios_base::iostate err = std::ios_base::goodbit; 525 I iter = f.get(I(v.data()), I(v.data() + v.size()), 526 false, ios, err, ex); 527 assert(iter.base() == v.data() + v.size()); 528 assert(err == std::ios_base::eofbit); 529 assert(ex == -123456789); 530 noshowbase(ios); 531 } 532 { // negative, showbase 533 std::wstring v = L"CNY -1,234,567.89"; 534 showbase(ios); 535 typedef input_iterator<const wchar_t*> I; 536 long double ex; 537 std::ios_base::iostate err = std::ios_base::goodbit; 538 I iter = f.get(I(v.data()), I(v.data() + v.size()), 539 false, ios, err, ex); 540 assert(iter.base() == v.data() + 0); 541 assert(err == std::ios_base::failbit); 542 noshowbase(ios); 543 } 544 { // negative, showbase 545 std::wstring v = L"CNY -1,234,567.89"; 546 typedef input_iterator<const wchar_t*> I; 547 long double ex; 548 std::ios_base::iostate err = std::ios_base::goodbit; 549 I iter = f.get(I(v.data()), I(v.data() + v.size()), 550 false, ios, err, ex); 551 assert(iter.base() == v.data() + 0); 552 assert(err == std::ios_base::failbit); 553 } 554 } 555 { 556 const my_facetw f(1); 557 // wchar_t, international 558 { // zero 559 std::wstring v = L"0.00"; 560 typedef input_iterator<const wchar_t*> I; 561 long double ex; 562 std::ios_base::iostate err = std::ios_base::goodbit; 563 I iter = f.get(I(v.data()), I(v.data() + v.size()), 564 true, ios, err, ex); 565 assert(iter.base() == v.data() + v.size()); 566 assert(err == std::ios_base::eofbit); 567 assert(ex == 0); 568 } 569 { // negative one 570 std::wstring v = L"-0.01"; 571 typedef input_iterator<const wchar_t*> I; 572 long double ex; 573 std::ios_base::iostate err = std::ios_base::goodbit; 574 I iter = f.get(I(v.data()), I(v.data() + v.size()), 575 true, ios, err, ex); 576 assert(iter.base() == v.data() + v.size()); 577 assert(err == std::ios_base::eofbit); 578 assert(ex == -1); 579 } 580 { // positive 581 std::wstring v = L"1,234,567.89"; 582 typedef input_iterator<const wchar_t*> I; 583 long double ex; 584 std::ios_base::iostate err = std::ios_base::goodbit; 585 I iter = f.get(I(v.data()), I(v.data() + v.size()), 586 true, ios, err, ex); 587 assert(iter.base() == v.data() + v.size()); 588 assert(err == std::ios_base::eofbit); 589 assert(ex == 123456789); 590 } 591 { // negative 592 std::wstring v = L"-1,234,567.89"; 593 typedef input_iterator<const wchar_t*> I; 594 long double ex; 595 std::ios_base::iostate err = std::ios_base::goodbit; 596 I iter = f.get(I(v.data()), I(v.data() + v.size()), 597 true, ios, err, ex); 598 assert(iter.base() == v.data() + v.size()); 599 assert(err == std::ios_base::eofbit); 600 assert(ex == -123456789); 601 } 602 { // negative 603 std::wstring v = L"-1234567.89"; 604 typedef input_iterator<const wchar_t*> I; 605 long double ex; 606 std::ios_base::iostate err = std::ios_base::goodbit; 607 I iter = f.get(I(v.data()), I(v.data() + v.size()), 608 true, ios, err, ex); 609 assert(iter.base() == v.data() + v.size()); 610 assert(err == std::ios_base::eofbit); 611 assert(ex == -123456789); 612 } 613 { // zero, showbase 614 std::wstring v = L"CNY 0.00"; 615 typedef input_iterator<const wchar_t*> I; 616 long double ex; 617 std::ios_base::iostate err = std::ios_base::goodbit; 618 I iter = f.get(I(v.data()), I(v.data() + v.size()), 619 true, ios, err, ex); 620 assert(iter.base() == v.data() + v.size()); 621 assert(err == std::ios_base::eofbit); 622 assert(ex == 0); 623 } 624 { // zero, showbase 625 std::wstring v = L"CNY 0.00"; 626 showbase(ios); 627 typedef input_iterator<const wchar_t*> I; 628 long double ex; 629 std::ios_base::iostate err = std::ios_base::goodbit; 630 I iter = f.get(I(v.data()), I(v.data() + v.size()), 631 true, ios, err, ex); 632 assert(iter.base() == v.data() + v.size()); 633 assert(err == std::ios_base::eofbit); 634 assert(ex == 0); 635 noshowbase(ios); 636 } 637 { // negative one, showbase 638 std::wstring v = L"CNY -0.01"; 639 typedef input_iterator<const wchar_t*> I; 640 long double ex; 641 std::ios_base::iostate err = std::ios_base::goodbit; 642 I iter = f.get(I(v.data()), I(v.data() + v.size()), 643 true, ios, err, ex); 644 assert(iter.base() == v.data() + v.size()); 645 assert(err == std::ios_base::eofbit); 646 assert(ex == -1); 647 } 648 { // negative one, showbase 649 std::wstring v = L"CNY -0.01"; 650 showbase(ios); 651 typedef input_iterator<const wchar_t*> I; 652 long double ex; 653 std::ios_base::iostate err = std::ios_base::goodbit; 654 I iter = f.get(I(v.data()), I(v.data() + v.size()), 655 true, ios, err, ex); 656 assert(iter.base() == v.data() + v.size()); 657 assert(err == std::ios_base::eofbit); 658 assert(ex == -1); 659 noshowbase(ios); 660 } 661 { // positive, showbase 662 std::wstring v = L"CNY 1,234,567.89"; 663 typedef input_iterator<const wchar_t*> I; 664 long double ex; 665 std::ios_base::iostate err = std::ios_base::goodbit; 666 I iter = f.get(I(v.data()), I(v.data() + v.size()), 667 true, ios, err, ex); 668 assert(iter.base() == v.data() + v.size()); 669 assert(err == std::ios_base::eofbit); 670 assert(ex == 123456789); 671 } 672 { // positive, showbase 673 std::wstring v = L"CNY 1,234,567.89"; 674 showbase(ios); 675 typedef input_iterator<const wchar_t*> I; 676 long double ex; 677 std::ios_base::iostate err = std::ios_base::goodbit; 678 I iter = f.get(I(v.data()), I(v.data() + v.size()), 679 true, ios, err, ex); 680 assert(iter.base() == v.data() + v.size()); 681 assert(err == std::ios_base::eofbit); 682 assert(ex == 123456789); 683 noshowbase(ios); 684 } 685 { // negative, showbase 686 std::wstring v = L"CNY -1,234,567.89"; 687 showbase(ios); 688 typedef input_iterator<const wchar_t*> I; 689 long double ex; 690 std::ios_base::iostate err = std::ios_base::goodbit; 691 I iter = f.get(I(v.data()), I(v.data() + v.size()), 692 true, ios, err, ex); 693 assert(iter.base() == v.data() + v.size()); 694 assert(err == std::ios_base::eofbit); 695 assert(ex == -123456789); 696 noshowbase(ios); 697 } 698 { // negative, showbase 699 std::wstring v = L"\xFFE5""-1,234,567.89"; 700 showbase(ios); 701 typedef input_iterator<const wchar_t*> I; 702 long double ex; 703 std::ios_base::iostate err = std::ios_base::goodbit; 704 I iter = f.get(I(v.data()), I(v.data() + v.size()), 705 true, ios, err, ex); 706 assert(iter.base() == v.data() + 0); 707 assert(err == std::ios_base::failbit); 708 noshowbase(ios); 709 } 710 { // negative, showbase 711 std::wstring v = L"\xFFE5""-1,234,567.89"; 712 typedef input_iterator<const wchar_t*> I; 713 long double ex; 714 std::ios_base::iostate err = std::ios_base::goodbit; 715 I iter = f.get(I(v.data()), I(v.data() + v.size()), 716 true, ios, err, ex); 717 assert(iter.base() == v.data() + 0); 718 assert(err == std::ios_base::failbit); 719 } 720 } 721 } 722