103 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: c++03, c++11, c++14, c++1710 11// <sstream>12 13// template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT> >14// class basic_stringbuf15 16// void swap(basic_stringbuf& rhs)17// noexcept(allocator_traits<allocator_type>::propagate_on_container_swap::value ||18// allocator_traits<allocator_type>::is_always_equal::value);19 20#include <sstream>21#include <cassert>22 23#include "test_macros.h"24 25template <class T>26struct test_alloc {27 using value_type = T;28 29 [[nodiscard]] constexpr T* allocate(std::size_t) { return nullptr; }30 void deallocate(void*, std::size_t) {}31};32 33template <class T>34struct test_alloc_propagate_on_container_swap : test_alloc<T> {35 using propagate_on_container_swap = std::true_type;36};37 38template <class T>39struct test_alloc_is_always_equal : test_alloc<T> {40 using is_always_equal = std::true_type;41};42 43template <class T>44struct test_alloc_propagate_on_container_swap_is_always_equal : test_alloc<T> {45 using propagate_on_container_swap = std::true_type;46 using is_always_equal = std::true_type;47};48 49template <class T>50struct test_alloc_not_empty : test_alloc<T> {51 bool dummy;52};53 54template <class T>55struct test_alloc_propagate_on_container_swap_not_empty : test_alloc<T> {56 using propagate_on_container_swap = std::true_type;57 bool dummy;58};59 60template <class CharT>61static void test() {62 {63 std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc<CharT>> buf1;64 std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc<CharT>> buf;65 static_assert(noexcept(buf.swap(buf1)));66 }67 {68 std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_propagate_on_container_swap<CharT>> buf1;69 std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_propagate_on_container_swap<CharT>> buf;70 static_assert(noexcept(buf.swap(buf1)));71 }72 {73 std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_is_always_equal<CharT>> buf1;74 std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_is_always_equal<CharT>> buf;75 static_assert(noexcept(buf.swap(buf1)));76 }77 {78 std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_propagate_on_container_swap_is_always_equal<CharT>>79 buf1;80 std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_propagate_on_container_swap_is_always_equal<CharT>>81 buf;82 static_assert(noexcept(buf.swap(buf1)));83 }84 {85 std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_not_empty<CharT>> buf1;86 std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_not_empty<CharT>> buf;87 LIBCPP_STATIC_ASSERT(!noexcept(buf.swap(buf1)));88 }89 {90 std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_propagate_on_container_swap_not_empty<CharT>> buf1;91 std::basic_stringbuf<CharT, std::char_traits<CharT>, test_alloc_propagate_on_container_swap_not_empty<CharT>> buf;92 static_assert(noexcept(buf.swap(buf1)));93 }94}95 96int main(int, char**) {97 test<char>();98#ifndef TEST_HAS_NO_WIDE_CHARACTERS99 test<wchar_t>();100#endif101 return 0;102}103