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 // 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 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 23 24 template <class CharT> 25 class testbuf 26 : public std::basic_streambuf<CharT> 27 { 28 typedef std::basic_streambuf<CharT> base; 29 std::basic_string<CharT> str_; 30 public: testbuf()31 testbuf() 32 { 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 56 #endif // _LIBCPP_HAS_NO_RVALUE_REFERENCES 57 main()58int main() 59 { 60 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES 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 // _LIBCPP_HAS_NO_RVALUE_REFERENCES 72 } 73