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