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