get_double.pass.cpp revision bb3a0acf93b79cb2ce6abbec04b7b7b7f48b7da9
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_lib=x86_64-apple-darwin11
11// XFAIL: with_system_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
28typedef std::num_get<char, input_iterator<const char*> > F;
29
30class my_facet
31    : public F
32{
33public:
34    explicit my_facet(std::size_t refs = 0)
35        : F(refs) {}
36};
37
38class my_numpunct
39    : public std::numpunct<char>
40{
41public:
42    my_numpunct() : std::numpunct<char>() {}
43
44protected:
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
50int 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