brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.9 KiB · c4e6891 Raw
146 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++17, c++20, c++2310 11// <sstream>12 13// template <class charT, class traits = char_traits<charT>, class Allocator = allocator<charT>>14// class basic_ostringstream15 16// template<class T>17//   basic_ostringstream(const T& t, const Allocator& a);18 19#include <cassert>20#include <concepts>21#include <memory>22#include <sstream>23#include <string>24#include <string_view>25 26#include "constexpr_char_traits.h"27#include "nasty_string.h"28#include "test_allocator.h"29#include "test_convertible.h"30#include "test_macros.h"31 32#include "../../helper_string_macros.h"33#include "../../helper_types.h"34 35template <typename AllocT = std::allocator<nasty_char>>36void test_sfinae_with_nasty_char() {37  // nasty_char*38  using NStrStream = std::basic_ostringstream<nasty_char, nasty_char_traits, AllocT>;39 40  static_assert(std::constructible_from<NStrStream, nasty_char*, AllocT>);41  static_assert(test_convertible<NStrStream, nasty_char*, const AllocT>());42 43  // const nasty_char*44  static_assert(std::constructible_from<NStrStream, const nasty_char*, AllocT>);45  static_assert(test_convertible<NStrStream, const nasty_char*, const AllocT>());46}47 48template <typename CharT, typename TraitsT = std::char_traits<CharT>, typename AllocT = std::allocator<CharT>>49void test_sfinae() {50  using StrStream = std::basic_ostringstream<CharT, TraitsT, AllocT>;51 52  // `CharT*`53  static_assert(std::constructible_from<StrStream, CharT*, const AllocT>);54  static_assert(test_convertible<StrStream, CharT*, const AllocT>());55 56  // `const CharT*`57  static_assert(std::constructible_from<StrStream, const CharT*, const AllocT>);58  static_assert(test_convertible<StrStream, const CharT*, const AllocT>());59 60  // `std::basic_string_view<CharT>`61  static_assert(std::constructible_from<StrStream, const std::basic_string_view<CharT, TraitsT>, const AllocT>);62  static_assert(test_convertible<StrStream, std::basic_string_view<CharT, TraitsT>, const AllocT>());63 64  // `std::basic_string<CharT>`65  static_assert(std::constructible_from<StrStream, const std::basic_string<CharT, TraitsT>, const AllocT>);66  static_assert(test_convertible<StrStream, const std::basic_string<CharT, TraitsT>, const AllocT>());67 68  // ConstConvertibleStringView<CharT>69  static_assert(std::constructible_from<StrStream, const ConstConvertibleStringView<CharT, TraitsT>, const AllocT>);70  static_assert(test_convertible<StrStream, const ConstConvertibleStringView<CharT, TraitsT>, const AllocT>());71 72  // NonConstConvertibleStringView<CharT>73  static_assert(!std::constructible_from<StrStream, NonConstConvertibleStringView<CharT, TraitsT>, const AllocT>);74  static_assert(!test_convertible<StrStream, NonConstConvertibleStringView<CharT, TraitsT>, const AllocT>());75 76  static_assert(!std::constructible_from<StrStream, const NonConstConvertibleStringView<CharT, TraitsT>, const AllocT>);77  static_assert(!test_convertible<StrStream, const NonConstConvertibleStringView<CharT, TraitsT>, const AllocT>());78 79  // Non-`string-view-like`80  static_assert(!std::constructible_from<StrStream, const SomeObject, const AllocT>);81  static_assert(!test_convertible<StrStream, const SomeObject, const AllocT>());82 83  // Non-allocator84  static_assert(!std::constructible_from<StrStream, const std::basic_string_view<CharT, TraitsT>, const NonAllocator>);85  static_assert(!test_convertible<StrStream, const std::basic_string_view<CharT, TraitsT>, const NonAllocator>());86}87 88template <typename CharT, typename TraitsT = std::char_traits<CharT>, typename AllocT = std::allocator<CharT>>89void test() {90  using StrStream = std::basic_ostringstream<CharT, TraitsT, AllocT>;91 92  const AllocT allocator;93 94  // const CharT*95  {96    StrStream ss(CS("zmt"), allocator);97    assert(ss.str() == CS("zmt"));98    assert(ss.rdbuf()->get_allocator() == allocator);99  }100  // std::basic_string_view<CharT>101  {102    const std::basic_string_view<CharT, TraitsT> csv = SV("zmt");103    StrStream ss(csv, allocator);104    assert(ss.str() == CS("zmt"));105    assert(ss.rdbuf()->get_allocator() == allocator);106  }107  // std::basic_string<CharT>108  {109    const std::basic_string<CharT, TraitsT, AllocT> cs = ST("zmt", allocator);110    StrStream ss(cs, allocator);111    assert(ss.str() == CS("zmt"));112    assert(ss.rdbuf()->get_allocator() == allocator);113  }114  // ConstConvertibleStringView<CharT>115  {116    const ConstConvertibleStringView<CharT, TraitsT> sv{CS("zmt")};117    StrStream ss(sv, allocator);118    assert(ss.str() == CS("zmt"));119    assert(ss.rdbuf()->get_allocator() == allocator);120  }121}122 123int main(int, char**) {124  test_sfinae_with_nasty_char();125  test_sfinae_with_nasty_char<test_allocator<nasty_char>>();126  test_sfinae<char>();127  test_sfinae<char, constexpr_char_traits<char>, std::allocator<char>>();128  test_sfinae<char, std::char_traits<char>, test_allocator<char>>();129  test_sfinae<char, constexpr_char_traits<char>, test_allocator<char>>();130  test<char>();131  test<char, constexpr_char_traits<char>, std::allocator<char>>();132  test<char, std::char_traits<char>, test_allocator<char>>();133  test<char, constexpr_char_traits<char>, test_allocator<char>>();134#ifndef TEST_HAS_NO_WIDE_CHARACTERS135  test_sfinae<wchar_t>();136  test_sfinae<wchar_t, constexpr_char_traits<wchar_t>, std::allocator<wchar_t>>();137  test_sfinae<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t>>();138  test_sfinae<wchar_t, constexpr_char_traits<wchar_t>, test_allocator<wchar_t>>();139  test<wchar_t>();140  test<wchar_t, constexpr_char_traits<wchar_t>, std::allocator<wchar_t>>();141  test<wchar_t, std::char_traits<wchar_t>, test_allocator<wchar_t>>();142  test<wchar_t, constexpr_char_traits<wchar_t>, test_allocator<wchar_t>>();143#endif144  return 0;145}146