CharT_pointer.pass.cpp revision bc8d3f97eb5c958007f2713238472e0c1c8fe02c
1//===----------------------------------------------------------------------===//
2//
3// ��������������������The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. 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// template <class charT, class traits, class T>
16//   basic_ostream<charT, traits>&
17//   operator<<(basic_ostream<charT, traits>&& os, const T& x);
18
19#include <ostream>
20#include <cassert>
21
22#ifdef _LIBCPP_MOVE
23
24template <class CharT>
25class testbuf
26    : public std::basic_streambuf<CharT>
27{
28    typedef std::basic_streambuf<CharT> base;
29    std::basic_string<CharT> str_;
30public:
31    testbuf()
32    {
33    }
34
35    std::basic_string<CharT> str() const
36        {return std::basic_string<CharT>(base::pbase(), base::pptr());}
37
38protected:
39
40    virtual typename base::int_type
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
56#endif
57
58int main()
59{
60#ifdef _LIBCPP_MOVE
61    {
62        testbuf<char> sb;
63        std::ostream(&sb) << "testing...";
64        assert(sb.str() == "testing...");
65    }
66    {
67        testbuf<wchar_t> sb;
68        std::wostream(&sb) << L"123";
69        assert(sb.str() == L"123");
70    }
71#endif
72}
73