get_double.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
1//===----------------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. 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 24typedef std::num_get<char, input_iterator<const char*> > F; 25 26class my_facet 27 : public F 28{ 29public: 30 explicit my_facet(std::size_t refs = 0) 31 : F(refs) {} 32}; 33 34class my_numpunct 35 : public std::numpunct<char> 36{ 37public: 38 my_numpunct() : std::numpunct<char>() {} 39 40protected: 41 virtual char_type do_decimal_point() const {return ';';} 42 virtual char_type do_thousands_sep() const {return '_';} 43 virtual std::string do_grouping() const {return std::string("\1\2\3");} 44}; 45 46int main() 47{ 48 const my_facet f(1); 49 std::ios ios(0); 50 double v = -1; 51 { 52 const char str[] = "123"; 53 assert((ios.flags() & ios.basefield) == ios.dec); 54 assert(ios.getloc().name() == "C"); 55 std::ios_base::iostate err = ios.goodbit; 56 input_iterator<const char*> iter = 57 f.get(input_iterator<const char*>(str), 58 input_iterator<const char*>(str+sizeof(str)), 59 ios, err, v); 60 assert(iter.base() == str+sizeof(str)-1); 61 assert(err == ios.goodbit); 62 assert(v == 123); 63 } 64 { 65 const char str[] = "-123"; 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+sizeof(str)-1); 72 assert(err == ios.goodbit); 73 assert(v == -123); 74 } 75 { 76 const char str[] = "123.5"; 77 std::ios_base::iostate err = ios.goodbit; 78 input_iterator<const char*> iter = 79 f.get(input_iterator<const char*>(str), 80 input_iterator<const char*>(str+sizeof(str)), 81 ios, err, v); 82 assert(iter.base() == str+sizeof(str)-1); 83 assert(err == ios.goodbit); 84 assert(v == 123.5); 85 } 86 { 87 const char str[] = "125e-1"; 88 hex(ios); 89 std::ios_base::iostate err = ios.goodbit; 90 input_iterator<const char*> iter = 91 f.get(input_iterator<const char*>(str), 92 input_iterator<const char*>(str+sizeof(str)), 93 ios, err, v); 94 assert(iter.base() == str+sizeof(str)-1); 95 assert(err == ios.goodbit); 96 assert(v == 125e-1); 97 } 98 { 99 const char str[] = "0x125p-1"; 100 hex(ios); 101 std::ios_base::iostate err = ios.goodbit; 102 input_iterator<const char*> iter = 103 f.get(input_iterator<const char*>(str), 104 input_iterator<const char*>(str+sizeof(str)), 105 ios, err, v); 106 assert(iter.base() == str+sizeof(str)-1); 107 assert(err == ios.goodbit); 108 assert(v == 0x125p-1); 109 } 110 { 111 const char str[] = "inf"; 112 hex(ios); 113 std::ios_base::iostate err = ios.goodbit; 114 input_iterator<const char*> iter = 115 f.get(input_iterator<const char*>(str), 116 input_iterator<const char*>(str+sizeof(str)), 117 ios, err, v); 118 assert(iter.base() == str+sizeof(str)-1); 119 assert(err == ios.goodbit); 120 assert(v == INFINITY); 121 } 122 { 123 const char str[] = "INF"; 124 hex(ios); 125 std::ios_base::iostate err = ios.goodbit; 126 input_iterator<const char*> iter = 127 f.get(input_iterator<const char*>(str), 128 input_iterator<const char*>(str+sizeof(str)), 129 ios, err, v); 130 assert(iter.base() == str+sizeof(str)-1); 131 assert(err == ios.goodbit); 132 assert(v == INFINITY); 133 } 134 { 135 const char str[] = "-inf"; 136 hex(ios); 137 std::ios_base::iostate err = ios.goodbit; 138 input_iterator<const char*> iter = 139 f.get(input_iterator<const char*>(str), 140 input_iterator<const char*>(str+sizeof(str)), 141 ios, err, v); 142 assert(iter.base() == str+sizeof(str)-1); 143 assert(err == ios.goodbit); 144 assert(v == -INFINITY); 145 } 146 { 147 const char str[] = "-INF"; 148 hex(ios); 149 std::ios_base::iostate err = ios.goodbit; 150 input_iterator<const char*> iter = 151 f.get(input_iterator<const char*>(str), 152 input_iterator<const char*>(str+sizeof(str)), 153 ios, err, v); 154 assert(iter.base() == str+sizeof(str)-1); 155 assert(err == ios.goodbit); 156 assert(v == -INFINITY); 157 } 158 { 159 const char str[] = "nan"; 160 hex(ios); 161 std::ios_base::iostate err = ios.goodbit; 162 input_iterator<const char*> iter = 163 f.get(input_iterator<const char*>(str), 164 input_iterator<const char*>(str+sizeof(str)), 165 ios, err, v); 166 assert(iter.base() == str+sizeof(str)-1); 167 assert(err == ios.goodbit); 168 assert(std::isnan(v)); 169 } 170 { 171 const char str[] = "NAN"; 172 hex(ios); 173 std::ios_base::iostate err = ios.goodbit; 174 input_iterator<const char*> iter = 175 f.get(input_iterator<const char*>(str), 176 input_iterator<const char*>(str+sizeof(str)), 177 ios, err, v); 178 assert(iter.base() == str+sizeof(str)-1); 179 assert(err == ios.goodbit); 180 assert(std::isnan(v)); 181 } 182 { 183 v = -1; 184 const char str[] = "123_456_78_9;125"; 185 std::ios_base::iostate err = ios.goodbit; 186 input_iterator<const char*> iter = 187 f.get(input_iterator<const char*>(str), 188 input_iterator<const char*>(str+sizeof(str)), 189 ios, err, v); 190 assert(iter.base() == str+3); 191 assert(err == ios.goodbit); 192 assert(v == 123); 193 } 194 ios.imbue(std::locale(std::locale(), new my_numpunct)); 195 { 196 v = -1; 197 const char str[] = "123_456_78_9;125"; 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+sizeof(str)-1); 204 assert(err == ios.goodbit); 205 assert(v == 123456789.125); 206 } 207 { 208 v = -1; 209 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_" 210 "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_" 211 "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_" 212 "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_" 213 "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_" 214 "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_" 215 "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_" 216 "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_" 217 "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_" 218 "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_" 219 "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_"; 220 std::ios_base::iostate err = ios.goodbit; 221 input_iterator<const char*> iter = 222 f.get(input_iterator<const char*>(str), 223 input_iterator<const char*>(str+sizeof(str)), 224 ios, err, v); 225 assert(iter.base() == str+sizeof(str)-1); 226 assert(err == ios.failbit); 227 } 228} 229