88 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9// <ostream>10 11// template <class charT, class traits = char_traits<charT> >12// class basic_ostream;13 14// basic_ostream<charT,traits>& put(char_type c);15 16#include <ostream>17#include <cassert>18 19#include "test_macros.h"20 21template <class CharT>22class testbuf23 : 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() const33 {return std::basic_string<CharT>(base::pbase(), base::pptr());}34 35protected:36 37 virtual typename base::int_type38 overflow(typename base::int_type ch = base::traits_type::eof())39 {40 if (ch != base::traits_type::eof())41 {42 int n = static_cast<int>(str_.size());43 str_.push_back(static_cast<CharT>(ch));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 ch;50 }51};52 53int main(int, char**)54{55 {56 std::ostream os((std::streambuf*)0);57 char c = 'a';58 os.put(c);59 assert(os.bad());60 }61 {62 testbuf<char> sb;63 std::ostream os(&sb);64 char c = 'a';65 os.put(c);66 assert(sb.str() == "a");67 assert(os.good());68 }69#ifndef TEST_HAS_NO_WIDE_CHARACTERS70 {71 std::wostream os((std::wstreambuf*)0);72 wchar_t c = L'a';73 os.put(c);74 assert(os.bad());75 }76 {77 testbuf<wchar_t> sb;78 std::wostream os(&sb);79 wchar_t c = L'a';80 os.put(c);81 assert(sb.str() == L"a");82 assert(os.good());83 }84#endif85 86 return 0;87}88