15a83710eSEric Fiselier //===----------------------------------------------------------------------===// 25a83710eSEric Fiselier // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 65a83710eSEric Fiselier // 75a83710eSEric Fiselier //===----------------------------------------------------------------------===// 85a83710eSEric Fiselier 95a83710eSEric Fiselier // <sstream> 105a83710eSEric Fiselier 115a83710eSEric Fiselier // template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> > 125a83710eSEric Fiselier // class basic_stringbuf 135a83710eSEric Fiselier 145a83710eSEric Fiselier // int_type underflow(); 155a83710eSEric Fiselier 165a83710eSEric Fiselier #include <sstream> 175a83710eSEric Fiselier #include <cassert> 185a83710eSEric Fiselier 197fc6a556SMarshall Clow #include "test_macros.h" 207fc6a556SMarshall Clow 215a83710eSEric Fiselier template <class CharT> 225a83710eSEric Fiselier struct testbuf 235a83710eSEric Fiselier : public std::basic_stringbuf<CharT> 245a83710eSEric Fiselier { 255a83710eSEric Fiselier typedef std::basic_stringbuf<CharT> base; testbuftestbuf265a83710eSEric Fiselier explicit testbuf(const std::basic_string<CharT>& str) 275a83710eSEric Fiselier : base(str) {} 285a83710eSEric Fiselier underflowtestbuf295a83710eSEric Fiselier typename base::int_type underflow() {return base::underflow();} pbumptestbuf305a83710eSEric Fiselier void pbump(int n) {base::pbump(n);} 315a83710eSEric Fiselier }; 325a83710eSEric Fiselier main(int,char **)332df59c50SJF Bastienint main(int, char**) 345a83710eSEric Fiselier { 355a83710eSEric Fiselier { 365a83710eSEric Fiselier testbuf<char> sb("123"); 375a83710eSEric Fiselier sb.pbump(3); 385a83710eSEric Fiselier assert(sb.underflow() == '1'); 395a83710eSEric Fiselier assert(sb.underflow() == '1'); 405a83710eSEric Fiselier assert(sb.snextc() == '2'); 415a83710eSEric Fiselier assert(sb.underflow() == '2'); 425a83710eSEric Fiselier assert(sb.underflow() == '2'); 435a83710eSEric Fiselier assert(sb.snextc() == '3'); 445a83710eSEric Fiselier assert(sb.underflow() == '3'); 455a83710eSEric Fiselier assert(sb.underflow() == '3'); 465a83710eSEric Fiselier assert(sb.snextc() == std::char_traits<char>::eof()); 475a83710eSEric Fiselier assert(sb.underflow() == std::char_traits<char>::eof()); 485a83710eSEric Fiselier assert(sb.underflow() == std::char_traits<char>::eof()); 495a83710eSEric Fiselier sb.sputc('4'); 505a83710eSEric Fiselier assert(sb.underflow() == '4'); 515a83710eSEric Fiselier assert(sb.underflow() == '4'); 525a83710eSEric Fiselier } 53*f4c1258dSLouis Dionne #ifndef TEST_HAS_NO_WIDE_CHARACTERS 545a83710eSEric Fiselier { 555a83710eSEric Fiselier testbuf<wchar_t> sb(L"123"); 565a83710eSEric Fiselier sb.pbump(3); 575a83710eSEric Fiselier assert(sb.underflow() == L'1'); 585a83710eSEric Fiselier assert(sb.underflow() == L'1'); 595a83710eSEric Fiselier assert(sb.snextc() == L'2'); 605a83710eSEric Fiselier assert(sb.underflow() == L'2'); 615a83710eSEric Fiselier assert(sb.underflow() == L'2'); 625a83710eSEric Fiselier assert(sb.snextc() == L'3'); 635a83710eSEric Fiselier assert(sb.underflow() == L'3'); 645a83710eSEric Fiselier assert(sb.underflow() == L'3'); 655a83710eSEric Fiselier assert(sb.snextc() == std::char_traits<wchar_t>::eof()); 665a83710eSEric Fiselier assert(sb.underflow() == std::char_traits<wchar_t>::eof()); 675a83710eSEric Fiselier assert(sb.underflow() == std::char_traits<wchar_t>::eof()); 685a83710eSEric Fiselier sb.sputc(L'4'); 695a83710eSEric Fiselier assert(sb.underflow() == L'4'); 705a83710eSEric Fiselier assert(sb.underflow() == L'4'); 715a83710eSEric Fiselier } 72*f4c1258dSLouis Dionne #endif // TEST_HAS_NO_WIDE_CHARACTERS 732df59c50SJF Bastien 742df59c50SJF Bastien return 0; 755a83710eSEric Fiselier } 76