181ad5a5cSPiotr Fusik //===----------------------------------------------------------------------===//
281ad5a5cSPiotr Fusik //
381ad5a5cSPiotr Fusik // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
481ad5a5cSPiotr Fusik // See https://llvm.org/LICENSE.txt for license information.
581ad5a5cSPiotr Fusik // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
681ad5a5cSPiotr Fusik //
781ad5a5cSPiotr Fusik //===----------------------------------------------------------------------===//
881ad5a5cSPiotr Fusik 
981ad5a5cSPiotr Fusik // UNSUPPORTED: c++03, c++11, c++14, c++17
1081ad5a5cSPiotr Fusik 
1181ad5a5cSPiotr Fusik // <sstream>
1281ad5a5cSPiotr Fusik 
1381ad5a5cSPiotr Fusik // template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
1481ad5a5cSPiotr Fusik // class basic_stringbuf
1581ad5a5cSPiotr Fusik 
1681ad5a5cSPiotr Fusik // basic_string<charT, traits, Allocator> str() &&;
1781ad5a5cSPiotr Fusik 
1881ad5a5cSPiotr Fusik #include <sstream>
1981ad5a5cSPiotr Fusik #include <cassert>
2081ad5a5cSPiotr Fusik 
2181ad5a5cSPiotr Fusik #include "make_string.h"
2281ad5a5cSPiotr Fusik #include "test_macros.h"
2381ad5a5cSPiotr Fusik 
2481ad5a5cSPiotr Fusik #define STR(S) MAKE_STRING(CharT, S)
2581ad5a5cSPiotr Fusik 
2681ad5a5cSPiotr Fusik template <class CharT>
test()2781ad5a5cSPiotr Fusik static void test() {
2881ad5a5cSPiotr Fusik   {
2981ad5a5cSPiotr Fusik     std::basic_stringbuf<CharT> buf(STR("testing"));
3081ad5a5cSPiotr Fusik     std::basic_string<CharT> s = std::move(buf).str();
3181ad5a5cSPiotr Fusik     assert(s == STR("testing"));
3281ad5a5cSPiotr Fusik     assert(buf.view().empty());
3381ad5a5cSPiotr Fusik   }
34f418cb1aSPiotr Fusik   {
35f418cb1aSPiotr Fusik     std::basic_stringbuf<CharT> buf;
36f418cb1aSPiotr Fusik     std::basic_string<CharT> s = std::move(buf).str();
37f418cb1aSPiotr Fusik     assert(s.empty());
38f418cb1aSPiotr Fusik     assert(buf.view().empty());
39f418cb1aSPiotr Fusik   }
40*838f2890SAmirreza Ashouri   {
41*838f2890SAmirreza Ashouri     std::basic_stringbuf<CharT> buf(STR("a very long string that exceeds the small string optimization buffer length"));
42*838f2890SAmirreza Ashouri     const CharT* p             = buf.view().data();
43*838f2890SAmirreza Ashouri     std::basic_string<CharT> s = std::move(buf).str();
44*838f2890SAmirreza Ashouri     assert(s.data() == p); // the allocation was pilfered
45*838f2890SAmirreza Ashouri     assert(buf.view().empty());
46*838f2890SAmirreza Ashouri   }
47*838f2890SAmirreza Ashouri }
48*838f2890SAmirreza Ashouri 
49*838f2890SAmirreza Ashouri struct StringBuf : std::stringbuf {
50*838f2890SAmirreza Ashouri   using basic_stringbuf::basic_stringbuf;
public_setgStringBuf51*838f2890SAmirreza Ashouri   void public_setg(int a, int b, int c) {
52*838f2890SAmirreza Ashouri     char* p = eback();
53*838f2890SAmirreza Ashouri     this->setg(p + a, p + b, p + c);
54*838f2890SAmirreza Ashouri   }
55*838f2890SAmirreza Ashouri };
56*838f2890SAmirreza Ashouri 
test_altered_sequence_pointers()57*838f2890SAmirreza Ashouri static void test_altered_sequence_pointers() {
58*838f2890SAmirreza Ashouri   {
59*838f2890SAmirreza Ashouri     auto src = StringBuf("hello world", std::ios_base::in);
60*838f2890SAmirreza Ashouri     src.public_setg(4, 6, 9);
61*838f2890SAmirreza Ashouri     std::stringbuf dest;
62*838f2890SAmirreza Ashouri     dest             = std::move(src);
63*838f2890SAmirreza Ashouri     std::string view = std::string(dest.view());
64*838f2890SAmirreza Ashouri     std::string str  = std::move(dest).str();
65*838f2890SAmirreza Ashouri     assert(view == str);
66*838f2890SAmirreza Ashouri     LIBCPP_ASSERT(str == "o wor");
67*838f2890SAmirreza Ashouri     assert(dest.str().empty());
68*838f2890SAmirreza Ashouri     assert(dest.view().empty());
69*838f2890SAmirreza Ashouri   }
70*838f2890SAmirreza Ashouri   {
71*838f2890SAmirreza Ashouri     auto src = StringBuf("hello world", std::ios_base::in);
72*838f2890SAmirreza Ashouri     src.public_setg(4, 6, 9);
73*838f2890SAmirreza Ashouri     std::stringbuf dest;
74*838f2890SAmirreza Ashouri     dest.swap(src);
75*838f2890SAmirreza Ashouri     std::string view = std::string(dest.view());
76*838f2890SAmirreza Ashouri     std::string str  = std::move(dest).str();
77*838f2890SAmirreza Ashouri     assert(view == str);
78*838f2890SAmirreza Ashouri     LIBCPP_ASSERT(str == "o wor");
79*838f2890SAmirreza Ashouri     assert(dest.str().empty());
80*838f2890SAmirreza Ashouri     assert(dest.view().empty());
81*838f2890SAmirreza Ashouri   }
8281ad5a5cSPiotr Fusik }
8381ad5a5cSPiotr Fusik 
main(int,char **)8481ad5a5cSPiotr Fusik int main(int, char**) {
8581ad5a5cSPiotr Fusik   test<char>();
8681ad5a5cSPiotr Fusik #ifndef TEST_HAS_NO_WIDE_CHARACTERS
8781ad5a5cSPiotr Fusik   test<wchar_t>();
8881ad5a5cSPiotr Fusik #endif
89*838f2890SAmirreza Ashouri   test_altered_sequence_pointers();
9081ad5a5cSPiotr Fusik   return 0;
9181ad5a5cSPiotr Fusik }
92