brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.3 KiB · b0f3889 Raw
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& write(const char_type* s, streamsize n);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        const char s[] = "123456790";58        os.write(s, sizeof(s)/sizeof(s[0])-1);59        assert(os.bad());60    }61    {62        testbuf<char> sb;63        std::ostream os(&sb);64        const char s[] = "123456790";65        os.write(s, sizeof(s)/sizeof(s[0])-1);66        assert(sb.str() == s);67        assert(os.good());68    }69#ifndef TEST_HAS_NO_WIDE_CHARACTERS70    {71        std::wostream os((std::wstreambuf*)0);72        const wchar_t s[] = L"123456790";73        os.write(s, sizeof(s)/sizeof(s[0])-1);74        assert(os.bad());75    }76    {77        testbuf<wchar_t> sb;78        std::wostream os(&sb);79        const wchar_t s[] = L"123456790";80        os.write(s, sizeof(s)/sizeof(s[0])-1);81        assert(os.good());82        assert(sb.str() == s);83    }84#endif85 86  return 0;87}88