get_double.pass.cpp revision 239e341c94184e2ed2357f2e054c84fbb1fbed2a
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, double& v) const; 16 17#include <locale> 18#include <ios> 19#include <cassert> 20#include <streambuf> 21#include <cmath> 22#include "../../../../../iterators.h" 23#include "../../../../../hexfloat.h" 24 25typedef std::num_get<char, input_iterator<const char*> > F; 26 27class my_facet 28 : public F 29{ 30public: 31 explicit my_facet(std::size_t refs = 0) 32 : F(refs) {} 33}; 34 35class my_numpunct 36 : public std::numpunct<char> 37{ 38public: 39 my_numpunct() : std::numpunct<char>() {} 40 41protected: 42 virtual char_type do_decimal_point() const {return ';';} 43 virtual char_type do_thousands_sep() const {return '_';} 44 virtual std::string do_grouping() const {return std::string("\1\2\3");} 45}; 46 47int main() 48{ 49 const my_facet f(1); 50 std::ios ios(0); 51 double v = -1; 52 { 53 const char str[] = "123"; 54 assert((ios.flags() & ios.basefield) == ios.dec); 55 assert(ios.getloc().name() == "C"); 56 std::ios_base::iostate err = ios.goodbit; 57 input_iterator<const char*> iter = 58 f.get(input_iterator<const char*>(str), 59 input_iterator<const char*>(str+sizeof(str)), 60 ios, err, v); 61 assert(iter.base() == str+sizeof(str)-1); 62 assert(err == ios.goodbit); 63 assert(v == 123); 64 } 65 { 66 const char str[] = "-123"; 67 std::ios_base::iostate err = ios.goodbit; 68 input_iterator<const char*> iter = 69 f.get(input_iterator<const char*>(str), 70 input_iterator<const char*>(str+sizeof(str)), 71 ios, err, v); 72 assert(iter.base() == str+sizeof(str)-1); 73 assert(err == ios.goodbit); 74 assert(v == -123); 75 } 76 { 77 const char str[] = "123.5"; 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+sizeof(str)-1); 84 assert(err == ios.goodbit); 85 assert(v == 123.5); 86 } 87 { 88 const char str[] = "125e-1"; 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+sizeof(str)-1); 96 assert(err == ios.goodbit); 97 assert(v == 125e-1); 98 } 99 { 100 const char str[] = "0x125p-1"; 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 == hexfloat<double>(0x125, 0, -1)); 110 } 111 { 112 const char str[] = "inf"; 113 hex(ios); 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 == INFINITY); 122 } 123 { 124 const char str[] = "INF"; 125 hex(ios); 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 == INFINITY); 134 } 135 { 136 const char str[] = "-inf"; 137 hex(ios); 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 == -INFINITY); 146 } 147 { 148 const char str[] = "-INF"; 149 hex(ios); 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+sizeof(str)-1); 156 assert(err == ios.goodbit); 157 assert(v == -INFINITY); 158 } 159 { 160 const char str[] = "nan"; 161 hex(ios); 162 std::ios_base::iostate err = ios.goodbit; 163 input_iterator<const char*> iter = 164 f.get(input_iterator<const char*>(str), 165 input_iterator<const char*>(str+sizeof(str)), 166 ios, err, v); 167 assert(iter.base() == str+sizeof(str)-1); 168 assert(err == ios.goodbit); 169 assert(std::isnan(v)); 170 } 171 { 172 const char str[] = "NAN"; 173 hex(ios); 174 std::ios_base::iostate err = ios.goodbit; 175 input_iterator<const char*> iter = 176 f.get(input_iterator<const char*>(str), 177 input_iterator<const char*>(str+sizeof(str)), 178 ios, err, v); 179 assert(iter.base() == str+sizeof(str)-1); 180 assert(err == ios.goodbit); 181 assert(std::isnan(v)); 182 } 183 { 184 v = -1; 185 const char str[] = "123_456_78_9;125"; 186 std::ios_base::iostate err = ios.goodbit; 187 input_iterator<const char*> iter = 188 f.get(input_iterator<const char*>(str), 189 input_iterator<const char*>(str+sizeof(str)), 190 ios, err, v); 191 assert(iter.base() == str+3); 192 assert(err == ios.goodbit); 193 assert(v == 123); 194 } 195 { 196 v = -1; 197 const char str[] = "2-"; 198 std::ios_base::iostate err = ios.goodbit; 199 input_iterator<const char*> iter = 200 f.get(input_iterator<const char*>(str), 201 input_iterator<const char*>(str+sizeof(str)), 202 ios, err, v); 203 assert(iter.base() == str+1); 204 assert(err == ios.goodbit); 205 assert(v == 2); 206 } 207 ios.imbue(std::locale(std::locale(), new my_numpunct)); 208 { 209 v = -1; 210 const char str[] = "123_456_78_9;125"; 211 std::ios_base::iostate err = ios.goodbit; 212 input_iterator<const char*> iter = 213 f.get(input_iterator<const char*>(str), 214 input_iterator<const char*>(str+sizeof(str)), 215 ios, err, v); 216 assert(iter.base() == str+sizeof(str)-1); 217 assert(err == ios.goodbit); 218 assert(v == 123456789.125); 219 } 220 { 221 v = -1; 222 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_" 223 "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_" 224 "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_" 225 "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_" 226 "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_" 227 "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_" 228 "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_" 229 "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_" 230 "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_" 231 "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_" 232 "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_"; 233 std::ios_base::iostate err = ios.goodbit; 234 input_iterator<const char*> iter = 235 f.get(input_iterator<const char*>(str), 236 input_iterator<const char*>(str+sizeof(str)), 237 ios, err, v); 238 assert(iter.base() == str+sizeof(str)-1); 239 assert(err == ios.failbit); 240 } 241} 242