blob: f5c7c1277c31a63cdb0a3d929da0778ac602e457 [file] [log] [blame]
Dan Albert287553d2017-02-16 10:47:51 -08001//===----------------------------------------------------------------------===//
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
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}