111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// The LLVM Compiler Infrastructure 411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// This file is dual licensed under the MIT and the University of Illinois Open 611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// Source Licenses. See LICENSE.TXT for details. 711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// 811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert//===----------------------------------------------------------------------===// 911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// <sstream> 1111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 1311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// class basic_stringbuf 1411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert// int_type pbackfail(int_type c = traits::eof()); 1611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 1711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <sstream> 1811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert#include <cassert> 1911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2011cd02dfb91661c65134cac258cf5924270e9d2Dan Alberttemplate <class CharT> 2111cd02dfb91661c65134cac258cf5924270e9d2Dan Albertstruct testbuf 2211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : public std::basic_stringbuf<CharT> 2311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 2411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typedef std::basic_stringbuf<CharT> base; 2511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert explicit testbuf(const std::basic_string<CharT>& str, 2611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert std::ios_base::openmode which = std::ios_base::in | std::ios_base::out) 2711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert : base(str, which) {} 2811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 2911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert typename base::int_type 3011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert pbackfail(typename base::int_type c = base::traits_type::eof()) 3111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert {return base::pbackfail(c);} 3211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert void pbump(int n) {base::pbump(n);} 3411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert}; 3511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert 3611cd02dfb91661c65134cac258cf5924270e9d2Dan Albertint main() 3711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert{ 3811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { // sanity check 3911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert testbuf<char> tb("");; 4011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert tb.pbackfail(); 4111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 4211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 4311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert testbuf<char> sb("123", std::ios_base::in); 4411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.sgetc() == '1'); 4511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.snextc() == '2'); 4611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.snextc() == '3'); 4711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.sgetc() == '3'); 4811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.snextc() == std::char_traits<char>::eof()); 4911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail('3') == '3'); 5011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail('3') == std::char_traits<char>::eof()); 5111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail('2') == '2'); 5211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(std::char_traits<char>::eof()) != std::char_traits<char>::eof()); 5311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(std::char_traits<char>::eof()) == std::char_traits<char>::eof()); 5411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.str() == "123"); 5511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 5611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 5711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert testbuf<char> sb("123"); 5811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.sgetc() == '1'); 5911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.snextc() == '2'); 6011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.snextc() == '3'); 6111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.sgetc() == '3'); 6211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.snextc() == std::char_traits<char>::eof()); 6311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail('3') == '3'); 6411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail('3') == '3'); 6511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(std::char_traits<char>::eof()) != std::char_traits<char>::eof()); 6611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(std::char_traits<char>::eof()) == std::char_traits<char>::eof()); 6711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.str() == "133"); 6811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 6911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 7011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert testbuf<wchar_t> sb(L"123", std::ios_base::in); 7111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.sgetc() == L'1'); 7211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.snextc() == L'2'); 7311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.snextc() == L'3'); 7411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.sgetc() == L'3'); 7511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.snextc() == std::char_traits<wchar_t>::eof()); 7611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(L'3') == L'3'); 7711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(L'3') == std::char_traits<wchar_t>::eof()); 7811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(L'2') == L'2'); 7911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(std::char_traits<wchar_t>::eof()) != std::char_traits<wchar_t>::eof()); 8011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(std::char_traits<wchar_t>::eof()) == std::char_traits<wchar_t>::eof()); 8111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.str() == L"123"); 8211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 8311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert { 8411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert testbuf<wchar_t> sb(L"123"); 8511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.sgetc() == L'1'); 8611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.snextc() == L'2'); 8711cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.snextc() == L'3'); 8811cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.sgetc() == L'3'); 8911cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.snextc() == std::char_traits<wchar_t>::eof()); 9011cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(L'3') == L'3'); 9111cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(L'3') == L'3'); 9211cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(std::char_traits<wchar_t>::eof()) != std::char_traits<wchar_t>::eof()); 9311cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.pbackfail(std::char_traits<wchar_t>::eof()) == std::char_traits<wchar_t>::eof()); 9411cd02dfb91661c65134cac258cf5924270e9d2Dan Albert assert(sb.str() == L"133"); 9511cd02dfb91661c65134cac258cf5924270e9d2Dan Albert } 9611cd02dfb91661c65134cac258cf5924270e9d2Dan Albert} 97