brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.9 KiB · 7ca60b7 Raw
74 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>& seekp(off_type off, ios_base::seekdir dir);15 16#include <ostream>17#include <cassert>18 19#include "test_macros.h"20 21int seekoff_called = 0;22 23template <class CharT>24struct testbuf25    : public std::basic_streambuf<CharT>26{27    typedef std::basic_streambuf<CharT> base;28    testbuf() {}29 30protected:31 32    typename base::pos_type33    seekoff(typename base::off_type off, std::ios_base::seekdir way,34                                         std::ios_base::openmode which)35    {36        ++seekoff_called;37        assert(way == std::ios_base::beg);38        assert(which == std::ios_base::out);39        return off;40    }41};42 43int main(int, char**)44{45    {46        seekoff_called = 0;47        std::ostream os((std::streambuf*)0);48        assert(&os.seekp(5, std::ios_base::beg) == &os);49        assert(seekoff_called == 0);50    }51    {52        seekoff_called = 0;53        testbuf<char> sb;54        std::ostream os(&sb);55        assert(&os.seekp(10, std::ios_base::beg) == &os);56        assert(seekoff_called == 1);57        assert(os.good());58        assert(&os.seekp(-1, std::ios_base::beg) == &os);59        assert(seekoff_called == 2);60        assert(os.fail());61    }62    { // See https://llvm.org/PR2136163        seekoff_called = 0;64        testbuf<char> sb;65        std::ostream os(&sb);66        os.setstate(std::ios_base::eofbit);67        assert(&os.seekp(10, std::ios_base::beg) == &os);68        assert(seekoff_called == 1);69        assert(os.rdstate() == std::ios_base::eofbit);70    }71 72  return 0;73}74