• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 // <istream>
11 
12 // basic_istream<charT,traits>& get(basic_streambuf<char_type,traits>& sb);
13 
14 #include <istream>
15 #include <cassert>
16 
17 template <class CharT>
18 class testbuf
19     : public std::basic_streambuf<CharT>
20 {
21     typedef std::basic_streambuf<CharT> base;
22     std::basic_string<CharT> str_;
23 public:
testbuf()24     testbuf()
25     {
26     }
testbuf(const std::basic_string<CharT> & str)27     testbuf(const std::basic_string<CharT>& str)
28         : str_(str)
29     {
30         base::setg(const_cast<CharT*>(str_.data()),
31                    const_cast<CharT*>(str_.data()),
32                    const_cast<CharT*>(str_.data() + str_.size()));
33     }
34 
str() const35     std::basic_string<CharT> str() const
36         {return std::basic_string<CharT>(base::pbase(), base::pptr());}
37 
38 protected:
39 
40     virtual typename base::int_type
overflow(typename base::int_type __c=base::traits_type::eof ())41         overflow(typename base::int_type __c = base::traits_type::eof())
42         {
43             if (__c != base::traits_type::eof())
44             {
45                 int n = str_.size();
46                 str_.push_back(__c);
47                 str_.resize(str_.capacity());
48                 base::setp(const_cast<CharT*>(str_.data()),
49                            const_cast<CharT*>(str_.data() + str_.size()));
50                 base::pbump(n+1);
51             }
52             return __c;
53         }
54 };
55 
main()56 int main()
57 {
58     {
59         testbuf<char> sb("testing\n...");
60         std::istream is(&sb);
61         testbuf<char> sb2;
62         is.get(sb2);
63         assert(sb2.str() == "testing");
64         assert(is.good());
65         assert(is.gcount() == 7);
66         assert(is.get() == '\n');
67         is.get(sb2);
68         assert(sb2.str() == "testing...");
69         assert(is.eof());
70         assert(!is.fail());
71         assert(is.gcount() == 3);
72     }
73     {
74         testbuf<wchar_t> sb(L"testing\n...");
75         std::wistream is(&sb);
76         testbuf<wchar_t> sb2;
77         is.get(sb2);
78         assert(sb2.str() == L"testing");
79         assert(is.good());
80         assert(is.gcount() == 7);
81         assert(is.get() == L'\n');
82         is.get(sb2);
83         assert(sb2.str() == L"testing...");
84         assert(is.eof());
85         assert(!is.fail());
86         assert(is.gcount() == 3);
87     }
88 }
89