16ed40418SPiotr Fusik //===----------------------------------------------------------------------===//
26ed40418SPiotr Fusik //
36ed40418SPiotr Fusik // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
46ed40418SPiotr Fusik // See https://llvm.org/LICENSE.txt for license information.
56ed40418SPiotr Fusik // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
66ed40418SPiotr Fusik //
76ed40418SPiotr Fusik //===----------------------------------------------------------------------===//
86ed40418SPiotr Fusik
96ed40418SPiotr Fusik // UNSUPPORTED: c++03, c++11, c++14, c++17
106ed40418SPiotr Fusik
116ed40418SPiotr Fusik // <sstream>
126ed40418SPiotr Fusik
136ed40418SPiotr Fusik // template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT>>
146ed40418SPiotr Fusik // class basic_ostringstream
156ed40418SPiotr Fusik
166ed40418SPiotr Fusik // basic_string<charT, traits, Allocator> str() &&;
176ed40418SPiotr Fusik
186ed40418SPiotr Fusik #include <sstream>
196ed40418SPiotr Fusik #include <cassert>
206ed40418SPiotr Fusik
216ed40418SPiotr Fusik #include "make_string.h"
226ed40418SPiotr Fusik #include "test_macros.h"
236ed40418SPiotr Fusik
246ed40418SPiotr Fusik #define STR(S) MAKE_STRING(CharT, S)
256ed40418SPiotr Fusik
266ed40418SPiotr Fusik template <class CharT>
test()276ed40418SPiotr Fusik static void test() {
286ed40418SPiotr Fusik {
296ed40418SPiotr Fusik std::basic_ostringstream<CharT> ss(STR("testing"));
306ed40418SPiotr Fusik std::basic_string<CharT> s = std::move(ss).str();
316ed40418SPiotr Fusik assert(s == STR("testing"));
326ed40418SPiotr Fusik assert(ss.view().empty());
336ed40418SPiotr Fusik }
34f418cb1aSPiotr Fusik {
35f418cb1aSPiotr Fusik std::basic_ostringstream<CharT> ss;
36f418cb1aSPiotr Fusik std::basic_string<CharT> s = std::move(ss).str();
37f418cb1aSPiotr Fusik assert(s.empty());
38f418cb1aSPiotr Fusik assert(ss.view().empty());
39f418cb1aSPiotr Fusik }
40*838f2890SAmirreza Ashouri {
41*838f2890SAmirreza Ashouri std::basic_ostringstream<CharT> ss(
42*838f2890SAmirreza Ashouri STR("a very long string that exceeds the small string optimization buffer length"));
43*838f2890SAmirreza Ashouri const CharT* p = ss.view().data();
44*838f2890SAmirreza Ashouri std::basic_string<CharT> s = std::move(ss).str();
45*838f2890SAmirreza Ashouri assert(s.data() == p); // the allocation was pilfered
46*838f2890SAmirreza Ashouri assert(ss.view().empty());
47*838f2890SAmirreza Ashouri }
486ed40418SPiotr Fusik }
496ed40418SPiotr Fusik
main(int,char **)506ed40418SPiotr Fusik int main(int, char**) {
516ed40418SPiotr Fusik test<char>();
526ed40418SPiotr Fusik #ifndef TEST_HAS_NO_WIDE_CHARACTERS
536ed40418SPiotr Fusik test<wchar_t>();
546ed40418SPiotr Fusik #endif
556ed40418SPiotr Fusik return 0;
566ed40418SPiotr Fusik }
57