]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/std/localization/locale.categories/category.numeric/locale.num.get/facet.num.get.members/get_double.pass.cpp
Vendor import of libc++ trunk r302418:
[FreeBSD/FreeBSD.git] / test / std / localization / locale.categories / category.numeric / locale.num.get / facet.num.get.members / get_double.pass.cpp
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 // PR11871
11 // XFAIL: with_system_cxx_lib=macosx10.7
12 // PR15445
13 // XFAIL: with_system_cxx_lib=macosx10.8
14
15 // <locale>
16
17 // class num_get<charT, InputIterator>
18
19 // iter_type get(iter_type in, iter_type end, ios_base&,
20 //               ios_base::iostate& err, double& v) const;
21
22 #include <locale>
23 #include <ios>
24 #include <cassert>
25 #include <streambuf>
26 #include <cmath>
27 #include "test_iterators.h"
28 #include "hexfloat.h"
29
30 typedef std::num_get<char, input_iterator<const char*> > F;
31
32 class my_facet
33     : public F
34 {
35 public:
36     explicit my_facet(std::size_t refs = 0)
37         : F(refs) {}
38 };
39
40 class my_numpunct
41     : public std::numpunct<char>
42 {
43 public:
44     my_numpunct() : std::numpunct<char>() {}
45
46 protected:
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");}
50 };
51
52 int main()
53 {
54     const my_facet f(1);
55     std::ios ios(0);
56     double v = -1;
57     {
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)),
65                   ios, err, v);
66         assert(iter.base() == str+sizeof(str)-1);
67         assert(err == ios.goodbit);
68         assert(v == 123);
69     }
70     {
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)),
76                   ios, err, v);
77         assert(iter.base() == str+sizeof(str)-1);
78         assert(err == ios.goodbit);
79         assert(v == -123);
80     }
81     {
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)),
87                   ios, err, v);
88         assert(iter.base() == str+sizeof(str)-1);
89         assert(err == ios.goodbit);
90         assert(v == 123.5);
91     }
92     {
93         const char str[] = "125e-1";
94         hex(ios);
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)),
99                   ios, err, v);
100         assert(iter.base() == str+sizeof(str)-1);
101         assert(err == ios.goodbit);
102         assert(v == 125e-1);
103     }
104     {
105         const char str[] = "0x125p-1";
106         hex(ios);
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)),
111                   ios, err, v);
112         assert(iter.base() == str+sizeof(str)-1);
113         assert(err == ios.goodbit);
114         assert(v == hexfloat<double>(0x125, 0, -1));
115     }
116     {
117         const char str[] = "inf";
118         hex(ios);
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)),
123                   ios, err, v);
124         assert(iter.base() == str+sizeof(str)-1);
125         assert(err == ios.goodbit);
126         assert(v == INFINITY);
127     }
128     {
129         const char str[] = "INF";
130         hex(ios);
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)),
135                   ios, err, v);
136         assert(iter.base() == str+sizeof(str)-1);
137         assert(err == ios.goodbit);
138         assert(v == INFINITY);
139     }
140     {
141         const char str[] = "-inf";
142         hex(ios);
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)),
147                   ios, err, v);
148         assert(iter.base() == str+sizeof(str)-1);
149         assert(err == ios.goodbit);
150         assert(v == -INFINITY);
151     }
152     {
153         const char str[] = "-INF";
154         hex(ios);
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)),
159                   ios, err, v);
160         assert(iter.base() == str+sizeof(str)-1);
161         assert(err == ios.goodbit);
162         assert(v == -INFINITY);
163     }
164     {
165         const char str[] = "nan";
166         hex(ios);
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)),
171                   ios, err, v);
172         assert(iter.base() == str+sizeof(str)-1);
173         assert(err == ios.goodbit);
174         assert(std::isnan(v));
175     }
176     {
177         const char str[] = "NAN";
178         hex(ios);
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)),
183                   ios, err, v);
184         assert(iter.base() == str+sizeof(str)-1);
185         assert(err == ios.goodbit);
186         assert(std::isnan(v));
187     }
188     {
189         v = -1;
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)),
195                   ios, err, v);
196         assert(iter.base() == str+3);
197         assert(err == ios.goodbit);
198         assert(v == 123);
199     }
200     {
201         v = -1;
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)),
207                   ios, err, v);
208         assert(iter.base() == str+1);
209         assert(err == ios.goodbit);
210         assert(v == 2);
211     }
212     {
213         v = -1;
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)),
219                   ios, err, v);
220         assert(iter.base() == str+sizeof(str)-1);
221         assert(err == ios.failbit);
222         assert(v == HUGE_VAL);
223     }
224     {
225         v = -1;
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)),
231                   ios, err, v);
232         assert(iter.base() == str+sizeof(str)-1);
233         assert(err == ios.failbit);
234         assert(v == -HUGE_VAL);
235     }
236     ios.imbue(std::locale(std::locale(), new my_numpunct));
237     {
238         v = -1;
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)),
244                   ios, err, v);
245         assert(iter.base() == str+sizeof(str)-1);
246         assert(err == ios.goodbit);
247         assert(v == 123456789.125);
248     }
249     {
250         v = -1;
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)),
266                   ios, err, v);
267         assert(iter.base() == str+sizeof(str)-1);
268         assert(err == ios.failbit);
269     }
270     {
271         v = -1;
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)),
277                   ios, err, v);
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);
281     }
282 }