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-darwin11
11 // XFAIL: with_system_cxx_lib=x86_64-apple-darwin12
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:
my_facet(std::size_t refs=0)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:
my_numpunct()42     my_numpunct() : std::numpunct<char>() {}
43 
44 protected:
do_decimal_point() const45     virtual char_type do_decimal_point() const {return ';';}
do_thousands_sep() const46     virtual char_type do_thousands_sep() const {return '_';}
do_grouping() const47     virtual std::string do_grouping() const {return std::string("\1\2\3");}
48 };
49 
main()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     ios.imbue(std::locale(std::locale(), new my_numpunct));
211     {
212         v = -1;
213         const char str[] = "123_456_78_9;125";
214         std::ios_base::iostate err = ios.goodbit;
215         input_iterator<const char*> iter =
216             f.get(input_iterator<const char*>(str),
217                   input_iterator<const char*>(str+sizeof(str)),
218                   ios, err, v);
219         assert(iter.base() == str+sizeof(str)-1);
220         assert(err == ios.goodbit);
221         assert(v == 123456789.125);
222     }
223     {
224         v = -1;
225         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_"
226                            "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_"
227                            "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_"
228                            "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_"
229                            "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_"
230                            "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_"
231                            "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_"
232                            "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_"
233                            "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_"
234                            "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_"
235                            "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_";
236         std::ios_base::iostate err = ios.goodbit;
237         input_iterator<const char*> iter =
238             f.get(input_iterator<const char*>(str),
239                   input_iterator<const char*>(str+sizeof(str)),
240                   ios, err, v);
241         assert(iter.base() == str+sizeof(str)-1);
242         assert(err == ios.failbit);
243     }
244     {
245         v = -1;
246         const char str[] = "3;14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+10";
247         std::ios_base::iostate err = ios.goodbit;
248         input_iterator<const char*> iter =
249             f.get(input_iterator<const char*>(str),
250                   input_iterator<const char*>(str+sizeof(str)),
251                   ios, err, v);
252         assert(iter.base() == str+sizeof(str)-1);
253         assert(err == ios.goodbit);
254         assert(std::abs(v - 3.14159265358979e+10)/3.14159265358979e+10 < 1.e-8);
255     }
256 }
257