brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.4 KiB · 63e2293 Raw
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