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 //===----------------------------------------------------------------------===//
10 // XFAIL: with_system_cxx_lib=x86_64-apple-macosx10.7
11 // XFAIL: with_system_cxx_lib=x86_64-apple-macosx10.8
15 // class num_get<charT, InputIterator>
17 // iter_type get(iter_type in, iter_type end, ios_base&,
18 // ios_base::iostate& err, double& v) const;
25 #include "test_iterators.h"
28 typedef std::num_get<char, input_iterator<const char*> > F;
34 explicit my_facet(std::size_t refs = 0)
39 : public std::numpunct<char>
42 my_numpunct() : std::numpunct<char>() {}
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");}
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)),
64 assert(iter.base() == str+sizeof(str)-1);
65 assert(err == ios.goodbit);
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)),
75 assert(iter.base() == str+sizeof(str)-1);
76 assert(err == ios.goodbit);
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)),
86 assert(iter.base() == str+sizeof(str)-1);
87 assert(err == ios.goodbit);
91 const char str[] = "125e-1";
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)),
98 assert(iter.base() == str+sizeof(str)-1);
99 assert(err == ios.goodbit);
103 const char str[] = "0x125p-1";
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)),
110 assert(iter.base() == str+sizeof(str)-1);
111 assert(err == ios.goodbit);
112 assert(v == hexfloat<double>(0x125, 0, -1));
115 const char str[] = "inf";
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)),
122 assert(iter.base() == str+sizeof(str)-1);
123 assert(err == ios.goodbit);
124 assert(v == INFINITY);
127 const char str[] = "INF";
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)),
134 assert(iter.base() == str+sizeof(str)-1);
135 assert(err == ios.goodbit);
136 assert(v == INFINITY);
139 const char str[] = "-inf";
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)),
146 assert(iter.base() == str+sizeof(str)-1);
147 assert(err == ios.goodbit);
148 assert(v == -INFINITY);
151 const char str[] = "-INF";
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)),
158 assert(iter.base() == str+sizeof(str)-1);
159 assert(err == ios.goodbit);
160 assert(v == -INFINITY);
163 const char str[] = "nan";
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)),
170 assert(iter.base() == str+sizeof(str)-1);
171 assert(err == ios.goodbit);
172 assert(std::isnan(v));
175 const char str[] = "NAN";
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)),
182 assert(iter.base() == str+sizeof(str)-1);
183 assert(err == ios.goodbit);
184 assert(std::isnan(v));
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)),
194 assert(iter.base() == str+3);
195 assert(err == ios.goodbit);
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)),
206 assert(iter.base() == str+1);
207 assert(err == ios.goodbit);
212 const char str[] = "1.79779e+309"; // unrepresentable
213 std::ios_base::iostate err = ios.goodbit;
214 input_iterator<const char*> iter =
215 f.get(input_iterator<const char*>(str),
216 input_iterator<const char*>(str+sizeof(str)),
218 assert(iter.base() == str+sizeof(str)-1);
219 assert(err == ios.failbit);
220 assert(v == HUGE_VAL);
224 const char str[] = "-1.79779e+308"; // unrepresentable
225 std::ios_base::iostate err = ios.goodbit;
226 input_iterator<const char*> iter =
227 f.get(input_iterator<const char*>(str),
228 input_iterator<const char*>(str+sizeof(str)),
230 assert(iter.base() == str+sizeof(str)-1);
231 assert(err == ios.failbit);
232 assert(v == -HUGE_VAL);
234 ios.imbue(std::locale(std::locale(), new my_numpunct));
237 const char str[] = "123_456_78_9;125";
238 std::ios_base::iostate err = ios.goodbit;
239 input_iterator<const char*> iter =
240 f.get(input_iterator<const char*>(str),
241 input_iterator<const char*>(str+sizeof(str)),
243 assert(iter.base() == str+sizeof(str)-1);
244 assert(err == ios.goodbit);
245 assert(v == 123456789.125);
249 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_"
250 "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_"
251 "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 std::ios_base::iostate err = ios.goodbit;
261 input_iterator<const char*> iter =
262 f.get(input_iterator<const char*>(str),
263 input_iterator<const char*>(str+sizeof(str)),
265 assert(iter.base() == str+sizeof(str)-1);
266 assert(err == ios.failbit);
270 const char str[] = "3;14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+10";
271 std::ios_base::iostate err = ios.goodbit;
272 input_iterator<const char*> iter =
273 f.get(input_iterator<const char*>(str),
274 input_iterator<const char*>(str+sizeof(str)),
276 assert(iter.base() == str+sizeof(str)-1);
277 assert(err == ios.goodbit);
278 assert(std::abs(v - 3.14159265358979e+10)/3.14159265358979e+10 < 1.e-8);