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