get_unsigned_long.pass.cpp revision 002a98494836085a3c84e2e844147468d4d39cc7
146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//===----------------------------------------------------------------------===//
246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//
346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//                     The LLVM Compiler Infrastructure
446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//
546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// This file is dual licensed under the MIT and the University of Illinois Open
646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Source Licenses. See LICENSE.TXT for details.
746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//
846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//===----------------------------------------------------------------------===//
946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// <locale>
1146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// class num_get<charT, InputIterator>
1346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// iter_type get(iter_type in, iter_type end, ios_base&,
1546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)//               ios_base::iostate& err, unsigned long& v) const;
1646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
1746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <locale>
1846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <ios>
1946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <cassert>
2046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include <streambuf>
2146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)#include "../../../../iterators.h"
2246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)typedef std::num_get<char, input_iterator<const char*> > F;
2446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
2546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class my_facet
2646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : public F
2746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles){
2846d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)public:
2946d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    explicit my_facet(std::size_t refs = 0)
3046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)        : F(refs) {}
3146d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)};
3246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
3346d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)class my_numpunct
3446d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    : public std::numpunct<char>
3546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles){
3646d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)public:
3746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)    my_numpunct() : std::numpunct<char>() {}
38
39protected:
40    virtual char_type do_thousands_sep() const {return '_';}
41    virtual std::string do_grouping() const {return std::string("\1\2\3");}
42};
43
44int main()
45{
46    const my_facet f(1);
47    std::ios ios(0);
48    unsigned long v = -1;
49    {
50        const char str[] = "0";
51        std::ios_base::iostate err = ios.goodbit;
52        input_iterator<const char*> iter =
53            f.get(input_iterator<const char*>(str),
54                  input_iterator<const char*>(str+sizeof(str)),
55                  ios, err, v);
56        assert(iter.base() == str+sizeof(str)-1);
57        assert(err == ios.goodbit);
58        assert(v == 0);
59    }
60    {
61        const char str[] = "1";
62        std::ios_base::iostate err = ios.goodbit;
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, v);
67        assert(iter.base() == str+sizeof(str)-1);
68        assert(err == ios.goodbit);
69        assert(v == 1);
70    }
71    hex(ios);
72    {
73        const char str[] = "0xFFFFFFFF";
74        std::ios_base::iostate err = ios.goodbit;
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, v);
79        assert(iter.base() == str+sizeof(str)-1);
80        assert(err == ios.goodbit);
81        assert(v == 0xFFFFFFFF);
82    }
83}
84