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 // XFAIL: with_system_lib=x86_64-apple-darwin11 11 // XFAIL: with_system_lib=x86_64-apple-darwin12 12 13 // <locale> 14 15 // class num_get<charT, InputIterator> 16 17 // iter_type get(iter_type in, iter_type end, ios_base&, 18 // ios_base::iostate& err, double& v) const; 19 20 #include <locale> 21 #include <ios> 22 #include <cassert> 23 #include <streambuf> 24 #include <cmath> 25 #include "test_iterators.h" 26 #include "hexfloat.h" 27 28 typedef std::num_get<char, input_iterator<const char*> > F; 29 30 class my_facet 31 : public F 32 { 33 public: 34 explicit my_facet(std::size_t refs = 0) 35 : F(refs) {} 36 }; 37 38 class my_numpunct 39 : public std::numpunct<char> 40 { 41 public: 42 my_numpunct() : std::numpunct<char>() {} 43 44 protected: 45 virtual char_type do_decimal_point() const {return ';';} 46 virtual char_type do_thousands_sep() const {return '_';} 47 virtual std::string do_grouping() const {return std::string("\1\2\3");} 48 }; 49 50 int main() 51 { 52 const my_facet f(1); 53 std::ios ios(0); 54 double v = -1; 55 { 56 const char str[] = "123"; 57 assert((ios.flags() & ios.basefield) == ios.dec); 58 assert(ios.getloc().name() == "C"); 59 std::ios_base::iostate err = ios.goodbit; 60 input_iterator<const char*> iter = 61 f.get(input_iterator<const char*>(str), 62 input_iterator<const char*>(str+sizeof(str)), 63 ios, err, v); 64 assert(iter.base() == str+sizeof(str)-1); 65 assert(err == ios.goodbit); 66 assert(v == 123); 67 } 68 { 69 const char str[] = "-123"; 70 std::ios_base::iostate err = ios.goodbit; 71 input_iterator<const char*> iter = 72 f.get(input_iterator<const char*>(str), 73 input_iterator<const char*>(str+sizeof(str)), 74 ios, err, v); 75 assert(iter.base() == str+sizeof(str)-1); 76 assert(err == ios.goodbit); 77 assert(v == -123); 78 } 79 { 80 const char str[] = "123.5"; 81 std::ios_base::iostate err = ios.goodbit; 82 input_iterator<const char*> iter = 83 f.get(input_iterator<const char*>(str), 84 input_iterator<const char*>(str+sizeof(str)), 85 ios, err, v); 86 assert(iter.base() == str+sizeof(str)-1); 87 assert(err == ios.goodbit); 88 assert(v == 123.5); 89 } 90 { 91 const char str[] = "125e-1"; 92 hex(ios); 93 std::ios_base::iostate err = ios.goodbit; 94 input_iterator<const char*> iter = 95 f.get(input_iterator<const char*>(str), 96 input_iterator<const char*>(str+sizeof(str)), 97 ios, err, v); 98 assert(iter.base() == str+sizeof(str)-1); 99 assert(err == ios.goodbit); 100 assert(v == 125e-1); 101 } 102 { 103 const char str[] = "0x125p-1"; 104 hex(ios); 105 std::ios_base::iostate err = ios.goodbit; 106 input_iterator<const char*> iter = 107 f.get(input_iterator<const char*>(str), 108 input_iterator<const char*>(str+sizeof(str)), 109 ios, err, v); 110 assert(iter.base() == str+sizeof(str)-1); 111 assert(err == ios.goodbit); 112 assert(v == hexfloat<double>(0x125, 0, -1)); 113 } 114 { 115 const char str[] = "inf"; 116 hex(ios); 117 std::ios_base::iostate err = ios.goodbit; 118 input_iterator<const char*> iter = 119 f.get(input_iterator<const char*>(str), 120 input_iterator<const char*>(str+sizeof(str)), 121 ios, err, v); 122 assert(iter.base() == str+sizeof(str)-1); 123 assert(err == ios.goodbit); 124 assert(v == INFINITY); 125 } 126 { 127 const char str[] = "INF"; 128 hex(ios); 129 std::ios_base::iostate err = ios.goodbit; 130 input_iterator<const char*> iter = 131 f.get(input_iterator<const char*>(str), 132 input_iterator<const char*>(str+sizeof(str)), 133 ios, err, v); 134 assert(iter.base() == str+sizeof(str)-1); 135 assert(err == ios.goodbit); 136 assert(v == INFINITY); 137 } 138 { 139 const char str[] = "-inf"; 140 hex(ios); 141 std::ios_base::iostate err = ios.goodbit; 142 input_iterator<const char*> iter = 143 f.get(input_iterator<const char*>(str), 144 input_iterator<const char*>(str+sizeof(str)), 145 ios, err, v); 146 assert(iter.base() == str+sizeof(str)-1); 147 assert(err == ios.goodbit); 148 assert(v == -INFINITY); 149 } 150 { 151 const char str[] = "-INF"; 152 hex(ios); 153 std::ios_base::iostate err = ios.goodbit; 154 input_iterator<const char*> iter = 155 f.get(input_iterator<const char*>(str), 156 input_iterator<const char*>(str+sizeof(str)), 157 ios, err, v); 158 assert(iter.base() == str+sizeof(str)-1); 159 assert(err == ios.goodbit); 160 assert(v == -INFINITY); 161 } 162 { 163 const char str[] = "nan"; 164 hex(ios); 165 std::ios_base::iostate err = ios.goodbit; 166 input_iterator<const char*> iter = 167 f.get(input_iterator<const char*>(str), 168 input_iterator<const char*>(str+sizeof(str)), 169 ios, err, v); 170 assert(iter.base() == str+sizeof(str)-1); 171 assert(err == ios.goodbit); 172 assert(std::isnan(v)); 173 } 174 { 175 const char str[] = "NAN"; 176 hex(ios); 177 std::ios_base::iostate err = ios.goodbit; 178 input_iterator<const char*> iter = 179 f.get(input_iterator<const char*>(str), 180 input_iterator<const char*>(str+sizeof(str)), 181 ios, err, v); 182 assert(iter.base() == str+sizeof(str)-1); 183 assert(err == ios.goodbit); 184 assert(std::isnan(v)); 185 } 186 { 187 v = -1; 188 const char str[] = "123_456_78_9;125"; 189 std::ios_base::iostate err = ios.goodbit; 190 input_iterator<const char*> iter = 191 f.get(input_iterator<const char*>(str), 192 input_iterator<const char*>(str+sizeof(str)), 193 ios, err, v); 194 assert(iter.base() == str+3); 195 assert(err == ios.goodbit); 196 assert(v == 123); 197 } 198 { 199 v = -1; 200 const char str[] = "2-"; 201 std::ios_base::iostate err = ios.goodbit; 202 input_iterator<const char*> iter = 203 f.get(input_iterator<const char*>(str), 204 input_iterator<const char*>(str+sizeof(str)), 205 ios, err, v); 206 assert(iter.base() == str+1); 207 assert(err == ios.goodbit); 208 assert(v == 2); 209 } 210 ios.imbue(std::locale(std::locale(), new my_numpunct)); 211 { 212 v = -1; 213 const char str[] = "123_456_78_9;125"; 214 std::ios_base::iostate err = ios.goodbit; 215 input_iterator<const char*> iter = 216 f.get(input_iterator<const char*>(str), 217 input_iterator<const char*>(str+sizeof(str)), 218 ios, err, v); 219 assert(iter.base() == str+sizeof(str)-1); 220 assert(err == ios.goodbit); 221 assert(v == 123456789.125); 222 } 223 { 224 v = -1; 225 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_" 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 "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_" 234 "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_" 235 "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_"; 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 } 244 { 245 v = -1; 246 const char str[] = "3;14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+10"; 247 std::ios_base::iostate err = ios.goodbit; 248 input_iterator<const char*> iter = 249 f.get(input_iterator<const char*>(str), 250 input_iterator<const char*>(str+sizeof(str)), 251 ios, err, v); 252 assert(iter.base() == str+sizeof(str)-1); 253 assert(err == ios.goodbit); 254 assert(std::abs(v - 3.14159265358979e+10)/3.14159265358979e+10 < 1.e-8); 255 } 256 } 257