ctor.pass.cpp revision 72215c2dbf0bbff4ad9f73879d346be95facdd83
1//===----------------------------------------------------------------------===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10// <istream> 11 12// template <class charT, class traits = char_traits<charT> > 13// class basic_istream::sentry; 14 15// explicit sentry(basic_istream<charT,traits>& is, bool noskipws = false); 16 17#include <istream> 18#include <cassert> 19 20int sync_called = 0; 21 22template <class CharT> 23struct testbuf 24 : public std::basic_streambuf<CharT> 25{ 26 typedef std::basic_string<CharT> string_type; 27 typedef std::basic_streambuf<CharT> base; 28private: 29 string_type str_; 30public: 31 32 testbuf() {} 33 testbuf(const string_type& str) 34 : str_(str) 35 { 36 base::setg(const_cast<CharT*>(str_.data()), 37 const_cast<CharT*>(str_.data()), 38 const_cast<CharT*>(str_.data()) + str_.size()); 39 } 40 41 CharT* eback() const {return base::eback();} 42 CharT* gptr() const {return base::gptr();} 43 CharT* egptr() const {return base::egptr();} 44protected: 45 46 int virtual sync() 47 { 48 ++sync_called; 49 return 1; 50 } 51}; 52 53int main() 54{ 55 { 56 std::istream is((testbuf<char>*)0); 57 std::istream::sentry sen(is, true); 58 assert(!(bool)sen); 59 assert(!is.good()); 60 assert(is.gcount() == 0); 61 assert(sync_called == 0); 62 } 63 { 64 std::wistream is((testbuf<wchar_t>*)0); 65 std::wistream::sentry sen(is, true); 66 assert(!(bool)sen); 67 assert(!is.good()); 68 assert(is.gcount() == 0); 69 assert(sync_called == 0); 70 } 71 { 72 testbuf<char> sb(" 123"); 73 std::istream is(&sb); 74 std::istream::sentry sen(is, true); 75 assert((bool)sen); 76 assert(is.good()); 77 assert(is.gcount() == 0); 78 assert(sync_called == 0); 79 assert(sb.gptr() == sb.eback()); 80 } 81 { 82 testbuf<wchar_t> sb(L" 123"); 83 std::wistream is(&sb); 84 std::wistream::sentry sen(is, true); 85 assert((bool)sen); 86 assert(is.good()); 87 assert(is.gcount() == 0); 88 assert(sync_called == 0); 89 assert(sb.gptr() == sb.eback()); 90 } 91 { 92 testbuf<char> sb(" 123"); 93 std::istream is(&sb); 94 std::istream::sentry sen(is); 95 assert((bool)sen); 96 assert(is.good()); 97 assert(sync_called == 0); 98 assert(sb.gptr() == sb.eback() + 3); 99 } 100 { 101 testbuf<wchar_t> sb(L" 123"); 102 std::wistream is(&sb); 103 std::wistream::sentry sen(is); 104 assert((bool)sen); 105 assert(is.good()); 106 assert(sync_called == 0); 107 assert(sb.gptr() == sb.eback() + 3); 108 } 109 { 110 testbuf<char> sb(" "); 111 std::istream is(&sb); 112 std::istream::sentry sen(is); 113 assert(!(bool)sen); 114 assert(is.fail()); 115 assert(is.eof()); 116 assert(sync_called == 0); 117 assert(sb.gptr() == sb.eback() + 6); 118 } 119 { 120 testbuf<char> sb(" "); 121 std::istream is(&sb); 122 std::istream::sentry sen(is, true); 123 assert((bool)sen); 124 assert(is.good()); 125 assert(sync_called == 0); 126 assert(sb.gptr() == sb.eback()); 127 } 128} 129