1 //===----------------------------------------------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is dual licensed under the MIT and the University of Illinois Open
6 // Source Licenses. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
11 // XFAIL: with_system_cxx_lib=macosx10.7
13 // XFAIL: with_system_cxx_lib=macosx10.8
17 // class num_get<charT, InputIterator>
19 // iter_type get(iter_type in, iter_type end, ios_base&,
20 // ios_base::iostate& err, double& v) const;
27 #include "test_iterators.h"
30 typedef std::num_get<char, input_iterator<const char*> > F;
36 explicit my_facet(std::size_t refs = 0)
41 : public std::numpunct<char>
44 my_numpunct() : std::numpunct<char>() {}
47 virtual char_type do_decimal_point() const {return ';';}
48 virtual char_type do_thousands_sep() const {return '_';}
49 virtual std::string do_grouping() const {return std::string("\1\2\3");}
58 const char str[] = "123";
59 assert((ios.flags() & ios.basefield) == ios.dec);
60 assert(ios.getloc().name() == "C");
61 std::ios_base::iostate err = ios.goodbit;
62 input_iterator<const char*> iter =
63 f.get(input_iterator<const char*>(str),
64 input_iterator<const char*>(str+sizeof(str)),
66 assert(iter.base() == str+sizeof(str)-1);
67 assert(err == ios.goodbit);
71 const char str[] = "-123";
72 std::ios_base::iostate err = ios.goodbit;
73 input_iterator<const char*> iter =
74 f.get(input_iterator<const char*>(str),
75 input_iterator<const char*>(str+sizeof(str)),
77 assert(iter.base() == str+sizeof(str)-1);
78 assert(err == ios.goodbit);
82 const char str[] = "123.5";
83 std::ios_base::iostate err = ios.goodbit;
84 input_iterator<const char*> iter =
85 f.get(input_iterator<const char*>(str),
86 input_iterator<const char*>(str+sizeof(str)),
88 assert(iter.base() == str+sizeof(str)-1);
89 assert(err == ios.goodbit);
93 const char str[] = "125e-1";
95 std::ios_base::iostate err = ios.goodbit;
96 input_iterator<const char*> iter =
97 f.get(input_iterator<const char*>(str),
98 input_iterator<const char*>(str+sizeof(str)),
100 assert(iter.base() == str+sizeof(str)-1);
101 assert(err == ios.goodbit);
105 const char str[] = "0x125p-1";
107 std::ios_base::iostate err = ios.goodbit;
108 input_iterator<const char*> iter =
109 f.get(input_iterator<const char*>(str),
110 input_iterator<const char*>(str+sizeof(str)),
112 assert(iter.base() == str+sizeof(str)-1);
113 assert(err == ios.goodbit);
114 assert(v == hexfloat<double>(0x125, 0, -1));
117 const char str[] = "inf";
119 std::ios_base::iostate err = ios.goodbit;
120 input_iterator<const char*> iter =
121 f.get(input_iterator<const char*>(str),
122 input_iterator<const char*>(str+sizeof(str)),
124 assert(iter.base() == str+sizeof(str)-1);
125 assert(err == ios.goodbit);
126 assert(v == INFINITY);
129 const char str[] = "INF";
131 std::ios_base::iostate err = ios.goodbit;
132 input_iterator<const char*> iter =
133 f.get(input_iterator<const char*>(str),
134 input_iterator<const char*>(str+sizeof(str)),
136 assert(iter.base() == str+sizeof(str)-1);
137 assert(err == ios.goodbit);
138 assert(v == INFINITY);
141 const char str[] = "-inf";
143 std::ios_base::iostate err = ios.goodbit;
144 input_iterator<const char*> iter =
145 f.get(input_iterator<const char*>(str),
146 input_iterator<const char*>(str+sizeof(str)),
148 assert(iter.base() == str+sizeof(str)-1);
149 assert(err == ios.goodbit);
150 assert(v == -INFINITY);
153 const char str[] = "-INF";
155 std::ios_base::iostate err = ios.goodbit;
156 input_iterator<const char*> iter =
157 f.get(input_iterator<const char*>(str),
158 input_iterator<const char*>(str+sizeof(str)),
160 assert(iter.base() == str+sizeof(str)-1);
161 assert(err == ios.goodbit);
162 assert(v == -INFINITY);
165 const char str[] = "nan";
167 std::ios_base::iostate err = ios.goodbit;
168 input_iterator<const char*> iter =
169 f.get(input_iterator<const char*>(str),
170 input_iterator<const char*>(str+sizeof(str)),
172 assert(iter.base() == str+sizeof(str)-1);
173 assert(err == ios.goodbit);
174 assert(std::isnan(v));
177 const char str[] = "NAN";
179 std::ios_base::iostate err = ios.goodbit;
180 input_iterator<const char*> iter =
181 f.get(input_iterator<const char*>(str),
182 input_iterator<const char*>(str+sizeof(str)),
184 assert(iter.base() == str+sizeof(str)-1);
185 assert(err == ios.goodbit);
186 assert(std::isnan(v));
190 const char str[] = "123_456_78_9;125";
191 std::ios_base::iostate err = ios.goodbit;
192 input_iterator<const char*> iter =
193 f.get(input_iterator<const char*>(str),
194 input_iterator<const char*>(str+sizeof(str)),
196 assert(iter.base() == str+3);
197 assert(err == ios.goodbit);
202 const char str[] = "2-";
203 std::ios_base::iostate err = ios.goodbit;
204 input_iterator<const char*> iter =
205 f.get(input_iterator<const char*>(str),
206 input_iterator<const char*>(str+sizeof(str)),
208 assert(iter.base() == str+1);
209 assert(err == ios.goodbit);
214 const char str[] = "1.79779e+309"; // unrepresentable
215 std::ios_base::iostate err = ios.goodbit;
216 input_iterator<const char*> iter =
217 f.get(input_iterator<const char*>(str),
218 input_iterator<const char*>(str+sizeof(str)),
220 assert(iter.base() == str+sizeof(str)-1);
221 assert(err == ios.failbit);
222 assert(v == HUGE_VAL);
226 const char str[] = "-1.79779e+308"; // unrepresentable
227 std::ios_base::iostate err = ios.goodbit;
228 input_iterator<const char*> iter =
229 f.get(input_iterator<const char*>(str),
230 input_iterator<const char*>(str+sizeof(str)),
232 assert(iter.base() == str+sizeof(str)-1);
233 assert(err == ios.failbit);
234 assert(v == -HUGE_VAL);
236 ios.imbue(std::locale(std::locale(), new my_numpunct));
239 const char str[] = "123_456_78_9;125";
240 std::ios_base::iostate err = ios.goodbit;
241 input_iterator<const char*> iter =
242 f.get(input_iterator<const char*>(str),
243 input_iterator<const char*>(str+sizeof(str)),
245 assert(iter.base() == str+sizeof(str)-1);
246 assert(err == ios.goodbit);
247 assert(v == 123456789.125);
251 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_"
252 "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_"
253 "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_"
254 "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_"
255 "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_"
256 "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_"
257 "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_"
258 "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_"
259 "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_"
260 "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_"
261 "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_";
262 std::ios_base::iostate err = ios.goodbit;
263 input_iterator<const char*> iter =
264 f.get(input_iterator<const char*>(str),
265 input_iterator<const char*>(str+sizeof(str)),
267 assert(iter.base() == str+sizeof(str)-1);
268 assert(err == ios.failbit);
272 const char str[] = "3;14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+10";
273 std::ios_base::iostate err = ios.goodbit;
274 input_iterator<const char*> iter =
275 f.get(input_iterator<const char*>(str),
276 input_iterator<const char*>(str+sizeof(str)),
278 assert(iter.base() == str+sizeof(str)-1);
279 assert(err == ios.goodbit);
280 assert(std::abs(v - 3.14159265358979e+10)/3.14159265358979e+10 < 1.e-8);