get_bool.pass.cpp revision b64f8b07c104c6cc986570ac8ee0ed16a9f23976
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, bool& v) const;
16
17#include <locale>
18#include <ios>
19#include <cassert>
20#include <streambuf>
21#include "iterators.h"
22
23typedef std::num_get<char, input_iterator<const char*> > F;
24
25class my_facet
26    : public F
27{
28public:
29    explicit my_facet(std::size_t refs = 0)
30        : F(refs) {}
31};
32
33class p1
34    : public std::numpunct<char>
35{
36public:
37    p1() : std::numpunct<char>() {}
38
39protected:
40    virtual string_type do_truename() const {return "a";}
41    virtual string_type do_falsename() const {return "abb";}
42};
43
44class p2
45    : public std::numpunct<char>
46{
47public:
48    p2() : std::numpunct<char>() {}
49
50protected:
51    virtual string_type do_truename() const {return "a";}
52    virtual string_type do_falsename() const {return "ab";}
53};
54
55int main()
56{
57    const my_facet f(1);
58    std::ios ios(0);
59    {
60        const char str[] = "1";
61        std::ios_base::iostate err = ios.goodbit;
62        bool b;
63        input_iterator<const char*> iter =
64            f.get(input_iterator<const char*>(str),
65                  input_iterator<const char*>(str+sizeof(str)),
66                  ios, err, b);
67        assert(iter.base() == str+sizeof(str)-1);
68        assert(err == ios.goodbit);
69        assert(b == true);
70    }
71    {
72        const char str[] = "0";
73        std::ios_base::iostate err = ios.goodbit;
74        bool b;
75        input_iterator<const char*> iter =
76            f.get(input_iterator<const char*>(str),
77                  input_iterator<const char*>(str+sizeof(str)),
78                  ios, err, b);
79        assert(iter.base() == str+sizeof(str)-1);
80        assert(err == ios.goodbit);
81        assert(b == false);
82    }
83    {
84        const char str[] = "12";
85        std::ios_base::iostate err = ios.goodbit;
86        bool b;
87        input_iterator<const char*> iter =
88            f.get(input_iterator<const char*>(str),
89                  input_iterator<const char*>(str+sizeof(str)),
90                  ios, err, b);
91        assert(iter.base() == str+sizeof(str)-1);
92        assert(err == ios.failbit);
93        assert(b == true);
94    }
95    {
96        const char str[] = "*12";
97        std::ios_base::iostate err = ios.goodbit;
98        bool b;
99        input_iterator<const char*> iter =
100            f.get(input_iterator<const char*>(str),
101                  input_iterator<const char*>(str+sizeof(str)),
102                  ios, err, b);
103        assert(iter.base() == str+0);
104        assert(err == ios.failbit);
105        assert(b == false);
106    }
107    boolalpha(ios);
108    {
109        const char str[] = "1";
110        std::ios_base::iostate err = ios.goodbit;
111        bool b;
112        input_iterator<const char*> iter =
113            f.get(input_iterator<const char*>(str),
114                  input_iterator<const char*>(str+sizeof(str)),
115                  ios, err, b);
116        assert(iter.base() == str+0);
117        assert(err == ios.failbit);
118        assert(b == false);
119    }
120    {
121        const char str[] = "true";
122        std::ios_base::iostate err = ios.goodbit;
123        bool b;
124        input_iterator<const char*> iter =
125            f.get(input_iterator<const char*>(str),
126                  input_iterator<const char*>(str+sizeof(str)),
127                  ios, err, b);
128        assert(iter.base() == str+sizeof(str)-1);
129        assert(err == ios.goodbit);
130        assert(b == true);
131    }
132    {
133        const char str[] = "false";
134        std::ios_base::iostate err = ios.goodbit;
135        bool b;
136        input_iterator<const char*> iter =
137            f.get(input_iterator<const char*>(str),
138                  input_iterator<const char*>(str+sizeof(str)),
139                  ios, err, b);
140        assert(iter.base() == str+sizeof(str)-1);
141        assert(err == ios.goodbit);
142        assert(b == false);
143    }
144    ios.imbue(std::locale(ios.getloc(), new p1));
145    {
146        const char str[] = "a";
147        std::ios_base::iostate err = ios.goodbit;
148        bool b;
149        input_iterator<const char*> iter =
150            f.get(input_iterator<const char*>(str),
151                  input_iterator<const char*>(str+1),
152                  ios, err, b);
153        assert(iter.base() == str+1);
154        assert(err == ios.eofbit);
155        assert(b == true);
156    }
157    {
158        const char str[] = "abc";
159        std::ios_base::iostate err = ios.goodbit;
160        bool b;
161        input_iterator<const char*> iter =
162            f.get(input_iterator<const char*>(str),
163                  input_iterator<const char*>(str+3),
164                  ios, err, b);
165        assert(iter.base() == str+2);
166        assert(err == ios.failbit);
167        assert(b == false);
168    }
169    {
170        const char str[] = "acc";
171        std::ios_base::iostate err = ios.goodbit;
172        bool b;
173        input_iterator<const char*> iter =
174            f.get(input_iterator<const char*>(str),
175                  input_iterator<const char*>(str+3),
176                  ios, err, b);
177        assert(iter.base() == str+1);
178        assert(err == ios.goodbit);
179        assert(b == true);
180    }
181    ios.imbue(std::locale(ios.getloc(), new p2));
182    {
183        const char str[] = "a";
184        std::ios_base::iostate err = ios.goodbit;
185        bool b;
186        input_iterator<const char*> iter =
187            f.get(input_iterator<const char*>(str),
188                  input_iterator<const char*>(str+1),
189                  ios, err, b);
190        assert(iter.base() == str+1);
191        assert(err == ios.eofbit);
192        assert(b == true);
193    }
194    {
195        const char str[] = "ab";
196        std::ios_base::iostate err = ios.goodbit;
197        bool b;
198        input_iterator<const char*> iter =
199            f.get(input_iterator<const char*>(str),
200                  input_iterator<const char*>(str+2),
201                  ios, err, b);
202        assert(iter.base() == str+2);
203        assert(err == ios.eofbit);
204        assert(b == false);
205    }
206    {
207        const char str[] = "abc";
208        std::ios_base::iostate err = ios.goodbit;
209        bool b;
210        input_iterator<const char*> iter =
211            f.get(input_iterator<const char*>(str),
212                  input_iterator<const char*>(str+3),
213                  ios, err, b);
214        assert(iter.base() == str+2);
215        assert(err == ios.goodbit);
216        assert(b == false);
217    }
218    {
219        const char str[] = "ac";
220        std::ios_base::iostate err = ios.goodbit;
221        bool b;
222        input_iterator<const char*> iter =
223            f.get(input_iterator<const char*>(str),
224                  input_iterator<const char*>(str+2),
225                  ios, err, b);
226        assert(iter.base() == str+1);
227        assert(err == ios.goodbit);
228        assert(b == true);
229    }
230}
231