1c0a5b147SPiotr Fusik //===----------------------------------------------------------------------===//
2c0a5b147SPiotr Fusik //
3c0a5b147SPiotr Fusik // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4c0a5b147SPiotr Fusik // See https://llvm.org/LICENSE.txt for license information.
5c0a5b147SPiotr Fusik // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6c0a5b147SPiotr Fusik //
7c0a5b147SPiotr Fusik //===----------------------------------------------------------------------===//
8c0a5b147SPiotr Fusik 
9c0a5b147SPiotr Fusik // UNSUPPORTED: c++03, c++11, c++14, c++17
10c0a5b147SPiotr Fusik 
11c0a5b147SPiotr Fusik // <sstream>
12c0a5b147SPiotr Fusik 
13c0a5b147SPiotr Fusik // template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >
14c0a5b147SPiotr Fusik // class basic_stringbuf
15c0a5b147SPiotr Fusik 
16c0a5b147SPiotr Fusik // void swap(basic_stringbuf& rhs)
17c0a5b147SPiotr Fusik //   noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||
18c0a5b147SPiotr Fusik //            allocator_traits<allocator_type>::is_always_equal::value);
19c0a5b147SPiotr Fusik 
20c0a5b147SPiotr Fusik #include <sstream>
21c0a5b147SPiotr Fusik #include <cassert>
22c0a5b147SPiotr Fusik 
23c0a5b147SPiotr Fusik #include "test_macros.h"
24c0a5b147SPiotr Fusik 
25c0a5b147SPiotr Fusik template <class T>
26c0a5b147SPiotr Fusik struct test_alloc {
27c0a5b147SPiotr Fusik   using value_type = T;
28c0a5b147SPiotr Fusik 
allocatetest_alloc29c0a5b147SPiotr Fusik   [[nodiscard]] constexpr T* allocate(std::size_t) { return nullptr; }
deallocatetest_alloc30bcb917ebSStephan T. Lavavej   void deallocate(void*, std::size_t) {}
31c0a5b147SPiotr Fusik };
32c0a5b147SPiotr Fusik 
33c0a5b147SPiotr Fusik template <class T>
34c0a5b147SPiotr Fusik struct test_alloc_propagate_on_container_swap : test_alloc<T> {
35c0a5b147SPiotr Fusik   using propagate_on_container_swap = std::true_type;
36c0a5b147SPiotr Fusik };
37c0a5b147SPiotr Fusik 
38c0a5b147SPiotr Fusik template <class T>
39c0a5b147SPiotr Fusik struct test_alloc_is_always_equal : test_alloc<T> {
40c0a5b147SPiotr Fusik   using is_always_equal = std::true_type;
41c0a5b147SPiotr Fusik };
42c0a5b147SPiotr Fusik 
43c0a5b147SPiotr Fusik template <class T>
44c0a5b147SPiotr Fusik struct test_alloc_propagate_on_container_swap_is_always_equal : test_alloc<T> {
45c0a5b147SPiotr Fusik   using propagate_on_container_swap = std::true_type;
46c0a5b147SPiotr Fusik   using is_always_equal             = std::true_type;
47c0a5b147SPiotr Fusik };
48c0a5b147SPiotr Fusik 
49c0a5b147SPiotr Fusik template <class T>
50c0a5b147SPiotr Fusik struct test_alloc_not_empty : test_alloc<T> {
51c0a5b147SPiotr Fusik   bool dummy;
52c0a5b147SPiotr Fusik };
53c0a5b147SPiotr Fusik 
54c0a5b147SPiotr Fusik template <class T>
55c0a5b147SPiotr Fusik struct test_alloc_propagate_on_container_swap_not_empty : test_alloc<T> {
56c0a5b147SPiotr Fusik   using propagate_on_container_swap = std::true_type;
57c0a5b147SPiotr Fusik   bool dummy;
58c0a5b147SPiotr Fusik };
59c0a5b147SPiotr Fusik 
60c0a5b147SPiotr Fusik template <class CharT>
test()61c0a5b147SPiotr Fusik static void test() {
62c0a5b147SPiotr Fusik   {
63c0a5b147SPiotr Fusik     std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc<CharT>> buf1;
64c0a5b147SPiotr Fusik     std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc<CharT>> buf;
65c0a5b147SPiotr Fusik     static_assert(noexcept(buf.swap(buf1)));
66c0a5b147SPiotr Fusik   }
67c0a5b147SPiotr Fusik   {
68c0a5b147SPiotr Fusik     std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_propagate_on_container_swap<CharT>> buf1;
69c0a5b147SPiotr Fusik     std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_propagate_on_container_swap<CharT>> buf;
70c0a5b147SPiotr Fusik     static_assert(noexcept(buf.swap(buf1)));
71c0a5b147SPiotr Fusik   }
72c0a5b147SPiotr Fusik   {
73c0a5b147SPiotr Fusik     std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_is_always_equal<CharT>> buf1;
74c0a5b147SPiotr Fusik     std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_is_always_equal<CharT>> buf;
75c0a5b147SPiotr Fusik     static_assert(noexcept(buf.swap(buf1)));
76c0a5b147SPiotr Fusik   }
77c0a5b147SPiotr Fusik   {
78c0a5b147SPiotr Fusik     std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_propagate_on_container_swap_is_always_equal<CharT>>
79c0a5b147SPiotr Fusik         buf1;
80c0a5b147SPiotr Fusik     std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_propagate_on_container_swap_is_always_equal<CharT>>
81c0a5b147SPiotr Fusik         buf;
82c0a5b147SPiotr Fusik     static_assert(noexcept(buf.swap(buf1)));
83c0a5b147SPiotr Fusik   }
84c0a5b147SPiotr Fusik   {
85c0a5b147SPiotr Fusik     std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_not_empty<CharT>> buf1;
86c0a5b147SPiotr Fusik     std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_not_empty<CharT>> buf;
87*67c40333SStephan T. Lavavej     LIBCPP_STATIC_ASSERT(!noexcept(buf.swap(buf1)));
88c0a5b147SPiotr Fusik   }
89c0a5b147SPiotr Fusik   {
90c0a5b147SPiotr Fusik     std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_propagate_on_container_swap_not_empty<CharT>> buf1;
91c0a5b147SPiotr Fusik     std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_propagate_on_container_swap_not_empty<CharT>> buf;
92c0a5b147SPiotr Fusik     static_assert(noexcept(buf.swap(buf1)));
93c0a5b147SPiotr Fusik   }
94c0a5b147SPiotr Fusik }
95c0a5b147SPiotr Fusik 
main(int,char **)96c0a5b147SPiotr Fusik int main(int, char**) {
97c0a5b147SPiotr Fusik   test<char>();
98c0a5b147SPiotr Fusik #ifndef TEST_HAS_NO_WIDE_CHARACTERS
99c0a5b147SPiotr Fusik   test<wchar_t>();
100c0a5b147SPiotr Fusik #endif
101c0a5b147SPiotr Fusik   return 0;
102c0a5b147SPiotr Fusik }
103