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// <istream>
11
12// basic_istream<charT,traits>& seekg(off_type off, ios_base::seekdir dir);
13
14#include <istream>
15#include <cassert>
16
17int seekoff_called = 0;
18
19template <class CharT>
20struct testbuf
21    : public std::basic_streambuf<CharT>
22{
23    typedef std::basic_string<CharT> string_type;
24    typedef std::basic_streambuf<CharT> base;
25private:
26    string_type str_;
27public:
28
29    testbuf() {}
30    testbuf(const string_type& str)
31        : str_(str)
32    {
33        base::setg(const_cast<CharT*>(str_.data()),
34                   const_cast<CharT*>(str_.data()),
35                   const_cast<CharT*>(str_.data()) + str_.size());
36    }
37
38    CharT* eback() const {return base::eback();}
39    CharT* gptr() const {return base::gptr();}
40    CharT* egptr() const {return base::egptr();}
41protected:
42    typename base::pos_type seekoff(typename base::off_type off,
43                                    std::ios_base::seekdir way,
44                                    std::ios_base::openmode which)
45    {
46        assert(which == std::ios_base::in);
47        ++seekoff_called;
48        return off;
49    }
50};
51
52int main()
53{
54    {
55        testbuf<char> sb(" 123456789");
56        std::istream is(&sb);
57        is.seekg(5, std::ios_base::cur);
58        assert(is.good());
59        assert(seekoff_called == 1);
60        is.seekg(-1, std::ios_base::beg);
61        assert(is.fail());
62        assert(seekoff_called == 2);
63    }
64    {
65        testbuf<wchar_t> sb(L" 123456789");
66        std::wistream is(&sb);
67        is.seekg(5, std::ios_base::cur);
68        assert(is.good());
69        assert(seekoff_called == 3);
70        is.seekg(-1, std::ios_base::beg);
71        assert(is.fail());
72        assert(seekoff_called == 4);
73    }
74}
75