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_stringbuf(basic_stringbuf&& rhs, const Allocator& a);
1781ad5a5cSPiotr Fusik
1881ad5a5cSPiotr Fusik #include <sstream>
1981ad5a5cSPiotr Fusik #include <cassert>
20*d6a92611SPiotr Fusik #include <utility>
2181ad5a5cSPiotr Fusik
2281ad5a5cSPiotr Fusik #include "make_string.h"
2381ad5a5cSPiotr Fusik #include "test_allocator.h"
2481ad5a5cSPiotr Fusik #include "test_macros.h"
2581ad5a5cSPiotr Fusik
2681ad5a5cSPiotr Fusik #define STR(S) MAKE_STRING(CharT, S)
2781ad5a5cSPiotr Fusik #define SV(S) MAKE_STRING_VIEW(CharT, S)
2881ad5a5cSPiotr Fusik
2981ad5a5cSPiotr Fusik template <class CharT>
30*d6a92611SPiotr Fusik struct test_stringbuf : std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>> {
31*d6a92611SPiotr Fusik using std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>>::basic_stringbuf;
32*d6a92611SPiotr Fusik
33*d6a92611SPiotr Fusik // Checks the following requirement after being moved from:
34*d6a92611SPiotr Fusik // The six pointers of std::basic_streambuf in *this are guaranteed to be different
35*d6a92611SPiotr Fusik // from the corresponding pointers in the moved-from rhs unless null.
check_different_pointerstest_stringbuf36*d6a92611SPiotr Fusik void check_different_pointers(test_stringbuf<CharT> const& other) const {
37*d6a92611SPiotr Fusik assert(this->eback() == nullptr || this->eback() != other.eback());
38*d6a92611SPiotr Fusik assert(this->gptr() == nullptr || this->gptr() != other.gptr());
39*d6a92611SPiotr Fusik assert(this->egptr() == nullptr || this->egptr() != other.egptr());
40*d6a92611SPiotr Fusik assert(this->pbase() == nullptr || this->pbase() != other.pbase());
41*d6a92611SPiotr Fusik assert(this->pptr() == nullptr || this->pptr() != other.pptr());
42*d6a92611SPiotr Fusik assert(this->epptr() == nullptr || this->epptr() != other.epptr());
43*d6a92611SPiotr Fusik }
44*d6a92611SPiotr Fusik };
45*d6a92611SPiotr Fusik
46*d6a92611SPiotr Fusik template <class CharT>
test()47*d6a92611SPiotr Fusik void test() {
48*d6a92611SPiotr Fusik std::basic_string<CharT> strings[] = {STR(""), STR("short"), STR("loooooooooooooooooooong")};
49*d6a92611SPiotr Fusik for (std::basic_string<CharT> const& s : strings) {
50*d6a92611SPiotr Fusik using StringBuf = std::basic_stringbuf<CharT, std::char_traits<CharT>, test_allocator<CharT>>;
51*d6a92611SPiotr Fusik {
52*d6a92611SPiotr Fusik test_stringbuf<CharT> buf1(s);
5381ad5a5cSPiotr Fusik const test_allocator<CharT> a(2);
54*d6a92611SPiotr Fusik test_stringbuf<CharT> buf(std::move(static_cast<StringBuf&>(buf1)), a);
5581ad5a5cSPiotr Fusik assert(buf.get_allocator() == a);
56*d6a92611SPiotr Fusik assert(buf.view() == s);
57*d6a92611SPiotr Fusik assert(buf1.view().empty());
58*d6a92611SPiotr Fusik buf.check_different_pointers(buf1);
59*d6a92611SPiotr Fusik }
60*d6a92611SPiotr Fusik {
61*d6a92611SPiotr Fusik test_stringbuf<CharT> buf1(s, std::ios_base::in);
62*d6a92611SPiotr Fusik const test_allocator<CharT> a(2);
63*d6a92611SPiotr Fusik test_stringbuf<CharT> buf(std::move(static_cast<StringBuf&>(buf1)), a);
64*d6a92611SPiotr Fusik assert(buf.get_allocator() == a);
65*d6a92611SPiotr Fusik assert(buf.view() == s);
66*d6a92611SPiotr Fusik assert(buf1.view().empty());
67*d6a92611SPiotr Fusik buf.check_different_pointers(buf1);
68*d6a92611SPiotr Fusik }
69*d6a92611SPiotr Fusik {
70*d6a92611SPiotr Fusik test_stringbuf<CharT> buf1(s, std::ios_base::out);
71*d6a92611SPiotr Fusik const test_allocator<CharT> a(2);
72*d6a92611SPiotr Fusik test_stringbuf<CharT> buf(std::move(static_cast<StringBuf&>(buf1)), a);
73*d6a92611SPiotr Fusik assert(buf.get_allocator() == a);
74*d6a92611SPiotr Fusik assert(buf.view() == s);
75*d6a92611SPiotr Fusik assert(buf1.view().empty());
76*d6a92611SPiotr Fusik buf.check_different_pointers(buf1);
77*d6a92611SPiotr Fusik }
78*d6a92611SPiotr Fusik {
79*d6a92611SPiotr Fusik test_stringbuf<CharT> buf1;
80*d6a92611SPiotr Fusik const test_allocator<CharT> a(2);
81*d6a92611SPiotr Fusik test_stringbuf<CharT> buf(std::move(static_cast<StringBuf&>(buf1)), a);
82*d6a92611SPiotr Fusik assert(buf.get_allocator() == a);
83*d6a92611SPiotr Fusik assert(buf.view().empty());
84*d6a92611SPiotr Fusik assert(buf1.view().empty());
85*d6a92611SPiotr Fusik buf.check_different_pointers(buf1);
86*d6a92611SPiotr Fusik }
87*d6a92611SPiotr Fusik // Use the constructor from an actual std::stringbuf, not test_stringbuf
88*d6a92611SPiotr Fusik {
89*d6a92611SPiotr Fusik StringBuf buf1(s);
90*d6a92611SPiotr Fusik const test_allocator<CharT> a(2);
91*d6a92611SPiotr Fusik StringBuf buf(std::move(buf1), a);
92*d6a92611SPiotr Fusik assert(buf.get_allocator() == a);
93*d6a92611SPiotr Fusik assert(buf.view() == s);
94*d6a92611SPiotr Fusik assert(buf1.view().empty());
95*d6a92611SPiotr Fusik }
96*d6a92611SPiotr Fusik }
9781ad5a5cSPiotr Fusik }
9881ad5a5cSPiotr Fusik
main(int,char **)9981ad5a5cSPiotr Fusik int main(int, char**) {
10081ad5a5cSPiotr Fusik test<char>();
10181ad5a5cSPiotr Fusik #ifndef TEST_HAS_NO_WIDE_CHARACTERS
10281ad5a5cSPiotr Fusik test<wchar_t>();
10381ad5a5cSPiotr Fusik #endif
10481ad5a5cSPiotr Fusik return 0;
10581ad5a5cSPiotr Fusik }
106