]> 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 r300422:
[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 // XFAIL: with_system_cxx_lib=x86_64-apple-macosx10.7
11 // XFAIL: with_system_cxx_lib=x86_64-apple-macosx10.8
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     {
211         v = -1;
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)),
217                   ios, err, v);
218         assert(iter.base() == str+sizeof(str)-1);
219         assert(err == ios.failbit);
220         assert(v == HUGE_VAL);
221     }
222     {
223         v = -1;
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)),
229                   ios, err, v);
230         assert(iter.base() == str+sizeof(str)-1);
231         assert(err == ios.failbit);
232         assert(v == -HUGE_VAL);
233     }
234     ios.imbue(std::locale(std::locale(), new my_numpunct));
235     {
236         v = -1;
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)),
242                   ios, err, v);
243         assert(iter.base() == str+sizeof(str)-1);
244         assert(err == ios.goodbit);
245         assert(v == 123456789.125);
246     }
247     {
248         v = -1;
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)),
264                   ios, err, v);
265         assert(iter.base() == str+sizeof(str)-1);
266         assert(err == ios.failbit);
267     }
268     {
269         v = -1;
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)),
275                   ios, err, v);
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);
279     }
280 }