get_float.pass.cpp revision 83e2c4d877fe2d7793868b1c6a5d9525a7c4d431
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <locale> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// class num_get<charT, InputIterator> 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// iter_type get(iter_type in, iter_type end, ios_base&, 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// ios_base::iostate& err, float& v) const; 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <locale> 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <ios> 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <streambuf> 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cmath> 2283e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "test_iterators.h" 2383e2c4d877fe2d7793868b1c6a5d9525a7c4d431Marshall Clow#include "hexfloat.h" 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttypedef std::num_get<char, input_iterator<const char*> > F; 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantclass my_facet 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : public F 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantpublic: 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant explicit my_facet(std::size_t refs = 0) 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : F(refs) {} 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const my_facet f(1); 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ios ios(0); 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant float v = -1; 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char str[] = "123"; 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert((ios.flags() & ios.basefield) == ios.dec); 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(ios.getloc().name() == "C"); 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ios_base::iostate err = ios.goodbit; 4522a74dcf50ff4338767607fa5a9d2916c2c85525Howard Hinnant input_iterator<const char*> iter = 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.get(input_iterator<const char*>(str), 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator<const char*>(str+sizeof(str)), 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ios, err, v); 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(iter.base() == str+sizeof(str)-1); 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(err == ios.goodbit); 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(v == 123); 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char str[] = "-123"; 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ios_base::iostate err = ios.goodbit; 5622a74dcf50ff4338767607fa5a9d2916c2c85525Howard Hinnant input_iterator<const char*> iter = 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.get(input_iterator<const char*>(str), 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator<const char*>(str+sizeof(str)), 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ios, err, v); 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(iter.base() == str+sizeof(str)-1); 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(err == ios.goodbit); 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(v == -123); 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char str[] = "123.5"; 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ios_base::iostate err = ios.goodbit; 6722a74dcf50ff4338767607fa5a9d2916c2c85525Howard Hinnant input_iterator<const char*> iter = 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.get(input_iterator<const char*>(str), 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator<const char*>(str+sizeof(str)), 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ios, err, v); 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(iter.base() == str+sizeof(str)-1); 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(err == ios.goodbit); 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(v == 123.5); 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char str[] = "125e-1"; 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant hex(ios); 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ios_base::iostate err = ios.goodbit; 7922a74dcf50ff4338767607fa5a9d2916c2c85525Howard Hinnant input_iterator<const char*> iter = 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.get(input_iterator<const char*>(str), 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator<const char*>(str+sizeof(str)), 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ios, err, v); 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(iter.base() == str+sizeof(str)-1); 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(err == ios.goodbit); 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(v == 125e-1); 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char str[] = "0x125p-1"; 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant hex(ios); 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ios_base::iostate err = ios.goodbit; 9122a74dcf50ff4338767607fa5a9d2916c2c85525Howard Hinnant input_iterator<const char*> iter = 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.get(input_iterator<const char*>(str), 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator<const char*>(str+sizeof(str)), 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ios, err, v); 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(iter.base() == str+sizeof(str)-1); 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(err == ios.goodbit); 970a111118a60290ec0c650fbd0327403c4b118bddHoward Hinnant assert(v == hexfloat<float>(0x125, 0, -1)); 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char str[] = "inf"; 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant hex(ios); 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ios_base::iostate err = ios.goodbit; 10322a74dcf50ff4338767607fa5a9d2916c2c85525Howard Hinnant input_iterator<const char*> iter = 104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.get(input_iterator<const char*>(str), 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator<const char*>(str+sizeof(str)), 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ios, err, v); 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(iter.base() == str+sizeof(str)-1); 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(err == ios.goodbit); 109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(v == INFINITY); 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char str[] = "INF"; 113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant hex(ios); 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ios_base::iostate err = ios.goodbit; 11522a74dcf50ff4338767607fa5a9d2916c2c85525Howard Hinnant input_iterator<const char*> iter = 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.get(input_iterator<const char*>(str), 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator<const char*>(str+sizeof(str)), 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ios, err, v); 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(iter.base() == str+sizeof(str)-1); 120bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(err == ios.goodbit); 121bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(v == INFINITY); 122bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 123bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 124bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char str[] = "-inf"; 125bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant hex(ios); 126bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ios_base::iostate err = ios.goodbit; 12722a74dcf50ff4338767607fa5a9d2916c2c85525Howard Hinnant input_iterator<const char*> iter = 128bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.get(input_iterator<const char*>(str), 129bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator<const char*>(str+sizeof(str)), 130bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ios, err, v); 131bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(iter.base() == str+sizeof(str)-1); 132bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(err == ios.goodbit); 133bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(v == -INFINITY); 134bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 135bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 136bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char str[] = "-INF"; 137bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant hex(ios); 138bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ios_base::iostate err = ios.goodbit; 13922a74dcf50ff4338767607fa5a9d2916c2c85525Howard Hinnant input_iterator<const char*> iter = 140bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.get(input_iterator<const char*>(str), 141bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator<const char*>(str+sizeof(str)), 142bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ios, err, v); 143bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(iter.base() == str+sizeof(str)-1); 144bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(err == ios.goodbit); 145bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(v == -INFINITY); 146bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 147bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 148bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char str[] = "nan"; 149bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant hex(ios); 150bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ios_base::iostate err = ios.goodbit; 15122a74dcf50ff4338767607fa5a9d2916c2c85525Howard Hinnant input_iterator<const char*> iter = 152bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.get(input_iterator<const char*>(str), 153bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator<const char*>(str+sizeof(str)), 154bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ios, err, v); 155bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(iter.base() == str+sizeof(str)-1); 156bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(err == ios.goodbit); 157bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::isnan(v)); 158bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 159bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 160bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant const char str[] = "NAN"; 161bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant hex(ios); 162bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant std::ios_base::iostate err = ios.goodbit; 16322a74dcf50ff4338767607fa5a9d2916c2c85525Howard Hinnant input_iterator<const char*> iter = 164bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.get(input_iterator<const char*>(str), 165bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant input_iterator<const char*>(str+sizeof(str)), 166bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant ios, err, v); 167bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(iter.base() == str+sizeof(str)-1); 168bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(err == ios.goodbit); 169bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(std::isnan(v)); 170bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 171bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 172