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