1*4684ddb6SLionel Sambuc //===----------------------------------------------------------------------===//
2*4684ddb6SLionel Sambuc //
3*4684ddb6SLionel Sambuc //                     The LLVM Compiler Infrastructure
4*4684ddb6SLionel Sambuc //
5*4684ddb6SLionel Sambuc // This file is dual licensed under the MIT and the University of Illinois Open
6*4684ddb6SLionel Sambuc // Source Licenses. See LICENSE.TXT for details.
7*4684ddb6SLionel Sambuc //
8*4684ddb6SLionel Sambuc //===----------------------------------------------------------------------===//
9*4684ddb6SLionel Sambuc //
10*4684ddb6SLionel Sambuc // XFAIL: with_system_lib=x86_64-apple-darwin11
11*4684ddb6SLionel Sambuc // XFAIL: with_system_lib=x86_64-apple-darwin12
12*4684ddb6SLionel Sambuc 
13*4684ddb6SLionel Sambuc // <locale>
14*4684ddb6SLionel Sambuc 
15*4684ddb6SLionel Sambuc // class num_get<charT, InputIterator>
16*4684ddb6SLionel Sambuc 
17*4684ddb6SLionel Sambuc // iter_type get(iter_type in, iter_type end, ios_base&,
18*4684ddb6SLionel Sambuc //               ios_base::iostate& err, double& v) const;
19*4684ddb6SLionel Sambuc 
20*4684ddb6SLionel Sambuc #include <locale>
21*4684ddb6SLionel Sambuc #include <ios>
22*4684ddb6SLionel Sambuc #include <cassert>
23*4684ddb6SLionel Sambuc #include <streambuf>
24*4684ddb6SLionel Sambuc #include <cmath>
25*4684ddb6SLionel Sambuc #include "test_iterators.h"
26*4684ddb6SLionel Sambuc #include "hexfloat.h"
27*4684ddb6SLionel Sambuc 
28*4684ddb6SLionel Sambuc typedef std::num_get<char, input_iterator<const char*> > F;
29*4684ddb6SLionel Sambuc 
30*4684ddb6SLionel Sambuc class my_facet
31*4684ddb6SLionel Sambuc     : public F
32*4684ddb6SLionel Sambuc {
33*4684ddb6SLionel Sambuc public:
my_facet(std::size_t refs=0)34*4684ddb6SLionel Sambuc     explicit my_facet(std::size_t refs = 0)
35*4684ddb6SLionel Sambuc         : F(refs) {}
36*4684ddb6SLionel Sambuc };
37*4684ddb6SLionel Sambuc 
38*4684ddb6SLionel Sambuc class my_numpunct
39*4684ddb6SLionel Sambuc     : public std::numpunct<char>
40*4684ddb6SLionel Sambuc {
41*4684ddb6SLionel Sambuc public:
my_numpunct()42*4684ddb6SLionel Sambuc     my_numpunct() : std::numpunct<char>() {}
43*4684ddb6SLionel Sambuc 
44*4684ddb6SLionel Sambuc protected:
do_decimal_point() const45*4684ddb6SLionel Sambuc     virtual char_type do_decimal_point() const {return ';';}
do_thousands_sep() const46*4684ddb6SLionel Sambuc     virtual char_type do_thousands_sep() const {return '_';}
do_grouping() const47*4684ddb6SLionel Sambuc     virtual std::string do_grouping() const {return std::string("\1\2\3");}
48*4684ddb6SLionel Sambuc };
49*4684ddb6SLionel Sambuc 
main()50*4684ddb6SLionel Sambuc int main()
51*4684ddb6SLionel Sambuc {
52*4684ddb6SLionel Sambuc     const my_facet f(1);
53*4684ddb6SLionel Sambuc     std::ios ios(0);
54*4684ddb6SLionel Sambuc     double v = -1;
55*4684ddb6SLionel Sambuc     {
56*4684ddb6SLionel Sambuc         const char str[] = "123";
57*4684ddb6SLionel Sambuc         assert((ios.flags() & ios.basefield) == ios.dec);
58*4684ddb6SLionel Sambuc         assert(ios.getloc().name() == "C");
59*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
60*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
61*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
62*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
63*4684ddb6SLionel Sambuc                   ios, err, v);
64*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
65*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
66*4684ddb6SLionel Sambuc         assert(v == 123);
67*4684ddb6SLionel Sambuc     }
68*4684ddb6SLionel Sambuc     {
69*4684ddb6SLionel Sambuc         const char str[] = "-123";
70*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
71*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
72*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
73*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
74*4684ddb6SLionel Sambuc                   ios, err, v);
75*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
76*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
77*4684ddb6SLionel Sambuc         assert(v == -123);
78*4684ddb6SLionel Sambuc     }
79*4684ddb6SLionel Sambuc     {
80*4684ddb6SLionel Sambuc         const char str[] = "123.5";
81*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
82*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
83*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
84*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
85*4684ddb6SLionel Sambuc                   ios, err, v);
86*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
87*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
88*4684ddb6SLionel Sambuc         assert(v == 123.5);
89*4684ddb6SLionel Sambuc     }
90*4684ddb6SLionel Sambuc     {
91*4684ddb6SLionel Sambuc         const char str[] = "125e-1";
92*4684ddb6SLionel Sambuc         hex(ios);
93*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
94*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
95*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
96*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
97*4684ddb6SLionel Sambuc                   ios, err, v);
98*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
99*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
100*4684ddb6SLionel Sambuc         assert(v == 125e-1);
101*4684ddb6SLionel Sambuc     }
102*4684ddb6SLionel Sambuc     {
103*4684ddb6SLionel Sambuc         const char str[] = "0x125p-1";
104*4684ddb6SLionel Sambuc         hex(ios);
105*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
106*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
107*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
108*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
109*4684ddb6SLionel Sambuc                   ios, err, v);
110*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
111*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
112*4684ddb6SLionel Sambuc         assert(v == hexfloat<double>(0x125, 0, -1));
113*4684ddb6SLionel Sambuc     }
114*4684ddb6SLionel Sambuc     {
115*4684ddb6SLionel Sambuc         const char str[] = "inf";
116*4684ddb6SLionel Sambuc         hex(ios);
117*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
118*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
119*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
120*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
121*4684ddb6SLionel Sambuc                   ios, err, v);
122*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
123*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
124*4684ddb6SLionel Sambuc         assert(v == INFINITY);
125*4684ddb6SLionel Sambuc     }
126*4684ddb6SLionel Sambuc     {
127*4684ddb6SLionel Sambuc         const char str[] = "INF";
128*4684ddb6SLionel Sambuc         hex(ios);
129*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
130*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
131*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
132*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
133*4684ddb6SLionel Sambuc                   ios, err, v);
134*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
135*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
136*4684ddb6SLionel Sambuc         assert(v == INFINITY);
137*4684ddb6SLionel Sambuc     }
138*4684ddb6SLionel Sambuc     {
139*4684ddb6SLionel Sambuc         const char str[] = "-inf";
140*4684ddb6SLionel Sambuc         hex(ios);
141*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
142*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
143*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
144*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
145*4684ddb6SLionel Sambuc                   ios, err, v);
146*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
147*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
148*4684ddb6SLionel Sambuc         assert(v == -INFINITY);
149*4684ddb6SLionel Sambuc     }
150*4684ddb6SLionel Sambuc     {
151*4684ddb6SLionel Sambuc         const char str[] = "-INF";
152*4684ddb6SLionel Sambuc         hex(ios);
153*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
154*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
155*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
156*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
157*4684ddb6SLionel Sambuc                   ios, err, v);
158*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
159*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
160*4684ddb6SLionel Sambuc         assert(v == -INFINITY);
161*4684ddb6SLionel Sambuc     }
162*4684ddb6SLionel Sambuc     {
163*4684ddb6SLionel Sambuc         const char str[] = "nan";
164*4684ddb6SLionel Sambuc         hex(ios);
165*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
166*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
167*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
168*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
169*4684ddb6SLionel Sambuc                   ios, err, v);
170*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
171*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
172*4684ddb6SLionel Sambuc         assert(std::isnan(v));
173*4684ddb6SLionel Sambuc     }
174*4684ddb6SLionel Sambuc     {
175*4684ddb6SLionel Sambuc         const char str[] = "NAN";
176*4684ddb6SLionel Sambuc         hex(ios);
177*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
178*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
179*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
180*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
181*4684ddb6SLionel Sambuc                   ios, err, v);
182*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
183*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
184*4684ddb6SLionel Sambuc         assert(std::isnan(v));
185*4684ddb6SLionel Sambuc     }
186*4684ddb6SLionel Sambuc     {
187*4684ddb6SLionel Sambuc         v = -1;
188*4684ddb6SLionel Sambuc         const char str[] = "123_456_78_9;125";
189*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
190*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
191*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
192*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
193*4684ddb6SLionel Sambuc                   ios, err, v);
194*4684ddb6SLionel Sambuc         assert(iter.base() == str+3);
195*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
196*4684ddb6SLionel Sambuc         assert(v == 123);
197*4684ddb6SLionel Sambuc     }
198*4684ddb6SLionel Sambuc     {
199*4684ddb6SLionel Sambuc         v = -1;
200*4684ddb6SLionel Sambuc         const char str[] = "2-";
201*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
202*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
203*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
204*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
205*4684ddb6SLionel Sambuc                   ios, err, v);
206*4684ddb6SLionel Sambuc         assert(iter.base() == str+1);
207*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
208*4684ddb6SLionel Sambuc         assert(v == 2);
209*4684ddb6SLionel Sambuc     }
210*4684ddb6SLionel Sambuc     ios.imbue(std::locale(std::locale(), new my_numpunct));
211*4684ddb6SLionel Sambuc     {
212*4684ddb6SLionel Sambuc         v = -1;
213*4684ddb6SLionel Sambuc         const char str[] = "123_456_78_9;125";
214*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
215*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
216*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
217*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
218*4684ddb6SLionel Sambuc                   ios, err, v);
219*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
220*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
221*4684ddb6SLionel Sambuc         assert(v == 123456789.125);
222*4684ddb6SLionel Sambuc     }
223*4684ddb6SLionel Sambuc     {
224*4684ddb6SLionel Sambuc         v = -1;
225*4684ddb6SLionel Sambuc         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*4684ddb6SLionel Sambuc                            "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*4684ddb6SLionel Sambuc                            "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*4684ddb6SLionel Sambuc                            "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*4684ddb6SLionel Sambuc                            "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*4684ddb6SLionel Sambuc                            "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*4684ddb6SLionel Sambuc                            "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*4684ddb6SLionel Sambuc                            "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*4684ddb6SLionel Sambuc                            "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*4684ddb6SLionel Sambuc                            "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*4684ddb6SLionel Sambuc                            "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*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
237*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
238*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
239*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
240*4684ddb6SLionel Sambuc                   ios, err, v);
241*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
242*4684ddb6SLionel Sambuc         assert(err == ios.failbit);
243*4684ddb6SLionel Sambuc     }
244*4684ddb6SLionel Sambuc     {
245*4684ddb6SLionel Sambuc         v = -1;
246*4684ddb6SLionel Sambuc         const char str[] = "3;14159265358979323846264338327950288419716939937510582097494459230781640628620899862803482534211706798214808651e+10";
247*4684ddb6SLionel Sambuc         std::ios_base::iostate err = ios.goodbit;
248*4684ddb6SLionel Sambuc         input_iterator<const char*> iter =
249*4684ddb6SLionel Sambuc             f.get(input_iterator<const char*>(str),
250*4684ddb6SLionel Sambuc                   input_iterator<const char*>(str+sizeof(str)),
251*4684ddb6SLionel Sambuc                   ios, err, v);
252*4684ddb6SLionel Sambuc         assert(iter.base() == str+sizeof(str)-1);
253*4684ddb6SLionel Sambuc         assert(err == ios.goodbit);
254*4684ddb6SLionel Sambuc         assert(std::abs(v - 3.14159265358979e+10)/3.14159265358979e+10 < 1.e-8);
255*4684ddb6SLionel Sambuc     }
256*4684ddb6SLionel Sambuc }
257