ostream.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// <ostream>
11
12// template <class charT, class traits = char_traits<charT> >
13//   class basic_ostream;
14
15// basic_ostream<charT,traits>& operator<<
16//           (basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&))
17
18#include <ostream>
19#include <cassert>
20
21template <class CharT>
22class testbuf
23    : public std::basic_streambuf<CharT>
24{
25    typedef std::basic_streambuf<CharT> base;
26    std::basic_string<CharT> str_;
27public:
28    testbuf()
29    {
30    }
31
32    std::basic_string<CharT> str() const
33        {return std::basic_string<CharT>(base::pbase(), base::pptr());}
34
35protected:
36
37    virtual typename base::int_type
38        overflow(typename base::int_type __c = base::traits_type::eof())
39        {
40            if (__c != base::traits_type::eof())
41            {
42                int n = str_.size();
43                str_.push_back(__c);
44                str_.resize(str_.capacity());
45                base::setp(const_cast<CharT*>(str_.data()),
46                           const_cast<CharT*>(str_.data() + str_.size()));
47                base::pbump(n+1);
48            }
49            return __c;
50        }
51};
52
53template <class CharT>
54std::basic_ostream<CharT>&
55f(std::basic_ostream<CharT>& os)
56{
57    os << "testing...";
58    return os;
59}
60
61int main()
62{
63    {
64        testbuf<char> sb;
65        std::ostream os(&sb);
66        os << f;
67        assert(sb.str() == "testing...");
68    }
69}
70