underflow.pass.cpp revision f5256e16dfc425c1d466f6308d4026d529ce9e0b
1bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 2bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 3f5256e16dfc425c1d466f6308d4026d529ce9e0bHoward Hinnant// The LLVM Compiler Infrastructure 4bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 5bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// This file is distributed under the University of Illinois Open Source 6bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// License. See LICENSE.TXT for details. 7bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// 8bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant//===----------------------------------------------------------------------===// 9bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 10bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// <fstream> 11bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 12bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// int_type underflow(); 13bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 14bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant// This test is not entirely portable 15bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 16bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <fstream> 17bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant#include <cassert> 18bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 19bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnanttemplate <class CharT> 20bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantstruct test_buf 21bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant : public std::basic_filebuf<CharT> 22bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 23bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef std::basic_filebuf<CharT> base; 24bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename base::char_type char_type; 25bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant typedef typename base::int_type int_type; 26bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 27bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char_type* eback() const {return base::eback();} 28bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char_type* gptr() const {return base::gptr();} 29bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant char_type* egptr() const {return base::egptr();} 30bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant void gbump(int n) {base::gbump(n);} 31bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 32bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant virtual int_type underflow() {return base::underflow();} 33bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant}; 34bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant 35bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnantint main() 36bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant{ 37bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 38bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test_buf<char> f; 39bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.open("underflow.dat", std::ios_base::in) != 0); 40bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.is_open()); 41bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == 0); 42bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.gptr() == 0); 43bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() == 0); 44bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.underflow() == '1'); 45bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() != 0); 46bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == f.gptr()); 47bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(*f.gptr() == '1'); 48bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() - f.eback() == 9); 49bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 50bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 51bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test_buf<char> f; 52bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.open("underflow.dat", std::ios_base::in) != 0); 53bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.pubsetbuf(0, 0)); 54bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.is_open()); 55bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == 0); 56bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.gptr() == 0); 57bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() == 0); 58bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.underflow() == '1'); 59bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() != 0); 60bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == f.gptr()); 61bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(*f.gptr() == '1'); 62bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() - f.eback() == 8); 63bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.gbump(8); 64bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.sgetc() == '9'); 65bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[0] == '5'); 66bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[1] == '6'); 67bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[2] == '7'); 68bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[3] == '8'); 69bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.gptr() - f.eback() == 4); 70bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(*f.gptr() == '9'); 71bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() - f.gptr() == 1); 72bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 73bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 74bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test_buf<wchar_t> f; 75bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.open("underflow.dat", std::ios_base::in) != 0); 76bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.is_open()); 77bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == 0); 78bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.gptr() == 0); 79bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() == 0); 80bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.underflow() == L'1'); 81bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() != 0); 82bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == f.gptr()); 83bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(*f.gptr() == L'1'); 84bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() - f.eback() == 9); 85bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 86bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 87bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test_buf<wchar_t> f; 88bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.pubsetbuf(0, 0)); 89bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.open("underflow.dat", std::ios_base::in) != 0); 90bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.is_open()); 91bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == 0); 92bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.gptr() == 0); 93bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() == 0); 94bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.underflow() == L'1'); 95bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() != 0); 96bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback() == f.gptr()); 97bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(*f.gptr() == L'1'); 98bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() - f.eback() == 8); 99bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.gbump(8); 100bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.sgetc() == L'9'); 101bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[0] == L'5'); 102bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[1] == L'6'); 103bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[2] == L'7'); 104bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.eback()[3] == L'8'); 105bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.gptr() - f.eback() == 4); 106bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(*f.gptr() == L'9'); 107bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.egptr() - f.gptr() == 1); 108bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 109bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant { 110bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant test_buf<wchar_t> f; 111bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant f.pubimbue(std::locale("en_US.UTF-8")); 112bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.open("underflow_utf8.dat", std::ios_base::in) != 0); 113bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.is_open()); 114bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.sbumpc() == 0x4E51); 115bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.sbumpc() == 0x4E52); 116bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.sbumpc() == 0x4E53); 117bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant assert(f.sbumpc() == -1); 118bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant } 119bc8d3f97eb5c958007f2713238472e0c1c8fe02Howard Hinnant} 120