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