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